summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/src/renderer_d3d11.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d11.cpp')
-rw-r--r--3rdparty/bgfx/src/renderer_d3d11.cpp617
1 files changed, 308 insertions, 309 deletions
diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp
index 7fc4e8777e4..bf1f13622b9 100644
--- a/3rdparty/bgfx/src/renderer_d3d11.cpp
+++ b/3rdparty/bgfx/src/renderer_d3d11.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2018 Branimir Karadzic. All rights reserved.
+ * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
@@ -11,7 +11,22 @@
namespace bgfx { namespace d3d11
{
static wchar_t s_viewNameW[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
- static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
+ static char s_viewName [BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
+
+ inline void setViewType(ViewId _view, const bx::StringView _str)
+ {
+ if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION | BGFX_CONFIG_PROFILER) )
+ {
+ const uint32_t len = _str.getLength();
+
+ bx::memCopy(&s_viewName[_view][3], _str.getPtr(), len);
+
+ wchar_t tmpW[16];
+ mbstowcs(tmpW, _str.getPtr(), len);
+
+ bx::memCopy(&s_viewNameW[_view][3], tmpW, len*2);
+ }
+ }
struct PrimInfo
{
@@ -333,19 +348,19 @@ namespace bgfx { namespace d3d11
};
BX_STATIC_ASSERT(AttribType::Count == BX_COUNTOF(s_attribType) );
- static D3D11_INPUT_ELEMENT_DESC* fillVertexDecl(uint8_t _stream, D3D11_INPUT_ELEMENT_DESC* _out, const VertexDecl& _decl)
+ static D3D11_INPUT_ELEMENT_DESC* fillVertexLayout(uint8_t _stream, D3D11_INPUT_ELEMENT_DESC* _out, const VertexLayout& _layout)
{
D3D11_INPUT_ELEMENT_DESC* elem = _out;
for (uint32_t attr = 0; attr < Attrib::Count; ++attr)
{
- if (UINT16_MAX != _decl.m_attributes[attr])
+ if (UINT16_MAX != _layout.m_attributes[attr])
{
bx::memCopy(elem, &s_attrib[attr], sizeof(D3D11_INPUT_ELEMENT_DESC) );
elem->InputSlot = _stream;
- if (0 == _decl.m_attributes[attr])
+ if (0 == _layout.m_attributes[attr])
{
elem->AlignedByteOffset = 0;
}
@@ -355,9 +370,9 @@ namespace bgfx { namespace d3d11
AttribType::Enum type;
bool normalized;
bool asInt;
- _decl.decode(Attrib::Enum(attr), num, type, normalized, asInt);
+ _layout.decode(Attrib::Enum(attr), num, type, normalized, asInt);
elem->Format = s_attribType[type][num-1][normalized];
- elem->AlignedByteOffset = _decl.m_offset[attr];
+ elem->AlignedByteOffset = _layout.m_offset[attr];
}
++elem;
@@ -376,12 +391,14 @@ namespace bgfx { namespace d3d11
void clear()
{
- bx::memSet(m_srv, 0, sizeof(m_srv) );
+ bx::memSet(m_uav, 0, sizeof(m_uav) );
+ bx::memSet(m_srv, 0, sizeof(m_srv) );
bx::memSet(m_sampler, 0, sizeof(m_sampler) );
}
- ID3D11ShaderResourceView* m_srv[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
- ID3D11SamplerState* m_sampler[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
+ ID3D11UnorderedAccessView* m_uav[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
+ ID3D11ShaderResourceView* m_srv[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
+ ID3D11SamplerState* m_sampler[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
};
BX_PRAGMA_DIAGNOSTIC_PUSH();
@@ -798,21 +815,30 @@ namespace bgfx { namespace d3d11
m_d3d9Dll = NULL;
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
+ if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) )
{
// D3D11_1.h has ID3DUserDefinedAnnotation
- // http://msdn.microsoft.com/en-us/library/windows/desktop/hh446881%28v=vs.85%29.aspx
+ // https://web.archive.org/web/20190207230424/https://docs.microsoft.com/en-us/windows/desktop/api/d3d11_1/nn-d3d11_1-id3duserdefinedannotation
m_d3d9Dll = bx::dlopen("d3d9.dll");
if (NULL != m_d3d9Dll)
{
D3DPERF_SetMarker = (PFN_D3DPERF_SET_MARKER )bx::dlsym(m_d3d9Dll, "D3DPERF_SetMarker" );
D3DPERF_BeginEvent = (PFN_D3DPERF_BEGIN_EVENT)bx::dlsym(m_d3d9Dll, "D3DPERF_BeginEvent");
D3DPERF_EndEvent = (PFN_D3DPERF_END_EVENT )bx::dlsym(m_d3d9Dll, "D3DPERF_EndEvent" );
- BX_CHECK(NULL != D3DPERF_SetMarker
- && NULL != D3DPERF_BeginEvent
- && NULL != D3DPERF_EndEvent
- , "Failed to initialize PIX events."
- );
+
+ if (NULL == D3DPERF_SetMarker
+ || NULL == D3DPERF_BeginEvent
+ || NULL == D3DPERF_EndEvent)
+ {
+ BX_TRACE("Failed to initialize PIX events.");
+
+ D3DPERF_SetMarker = NULL;
+ D3DPERF_BeginEvent = NULL;
+ D3DPERF_EndEvent = NULL;
+
+ bx::dlclose(m_d3d9Dll);
+ m_d3d9Dll = NULL;
+ }
}
}
@@ -980,7 +1006,10 @@ namespace bgfx { namespace d3d11
bx::memSet(&m_scd, 0, sizeof(m_scd) );
m_scd.width = _init.resolution.width;
m_scd.height = _init.resolution.height;
- m_scd.format = s_textureFormat[_init.resolution.format].m_fmt;
+ m_scd.format = (_init.resolution.reset & BGFX_RESET_SRGB_BACKBUFFER)
+ ? s_textureFormat[_init.resolution.format].m_fmtSrgb
+ : s_textureFormat[_init.resolution.format].m_fmt
+ ;
updateMsaa(m_scd.format);
m_scd.sampleDesc = s_msaa[(_init.resolution.reset&BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT];
@@ -1081,7 +1110,7 @@ namespace bgfx { namespace d3d11
m_numWindows = 1;
#if USE_D3D11_DYNAMIC_LIB
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
+ if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) )
{
HRESULT hr = m_deviceCtx->QueryInterface(IID_ID3DUserDefinedAnnotation, (void**)&m_annotation);
@@ -1154,6 +1183,9 @@ namespace bgfx { namespace d3d11
: 0)
| BGFX_CAPS_TEXTURE_2D_ARRAY
| BGFX_CAPS_TEXTURE_CUBE_ARRAY
+ | ((m_featureLevel >= D3D_FEATURE_LEVEL_11_1)
+ ? BGFX_CAPS_FRAMEBUFFER_RW
+ : 0)
);
m_timerQuerySupport = m_featureLevel >= D3D_FEATURE_LEVEL_10_0;
@@ -1656,20 +1688,20 @@ namespace bgfx { namespace d3d11
m_indexBuffers[_handle.idx].destroy();
}
- void createVertexDecl(VertexDeclHandle _handle, const VertexDecl& _decl) override
+ void createVertexLayout(VertexLayoutHandle _handle, const VertexLayout& _layout) override
{
- VertexDecl& decl = m_vertexDecls[_handle.idx];
- bx::memCopy(&decl, &_decl, sizeof(VertexDecl) );
- dump(decl);
+ VertexLayout& layout = m_vertexLayouts[_handle.idx];
+ bx::memCopy(&layout, &_layout, sizeof(VertexLayout) );
+ dump(layout);
}
- void destroyVertexDecl(VertexDeclHandle /*_handle*/) override
+ void destroyVertexLayout(VertexLayoutHandle /*_handle*/) override
{
}
- void createVertexBuffer(VertexBufferHandle _handle, const Memory* _mem, VertexDeclHandle _declHandle, uint16_t _flags) override
+ void createVertexBuffer(VertexBufferHandle _handle, const Memory* _mem, VertexLayoutHandle _layoutHandle, uint16_t _flags) override
{
- m_vertexBuffers[_handle.idx].create(_mem->size, _mem->data, _declHandle, _flags);
+ m_vertexBuffers[_handle.idx].create(_mem->size, _mem->data, _layoutHandle, _flags);
}
void destroyVertexBuffer(VertexBufferHandle _handle) override
@@ -1694,8 +1726,8 @@ namespace bgfx { namespace d3d11
void createDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _size, uint16_t _flags) override
{
- VertexDeclHandle decl = BGFX_INVALID_HANDLE;
- m_vertexBuffers[_handle.idx].create(_size, NULL, decl, _flags);
+ VertexLayoutHandle layoutHandle = BGFX_INVALID_HANDLE;
+ m_vertexBuffers[_handle.idx].create(_size, NULL, layoutHandle, _flags);
}
void updateDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _offset, uint32_t _size, const Memory* _mem) override
@@ -1962,7 +1994,7 @@ namespace bgfx { namespace d3d11
void updateViewName(ViewId _id, const char* _name) override
{
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
+ if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) )
{
mbstowcs(&s_viewNameW[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED]
, _name
@@ -1981,32 +2013,41 @@ namespace bgfx { namespace d3d11
bx::memCopy(m_uniforms[_loc], _data, _size);
}
- void setMarker(const char* _marker, uint32_t _size) override
+ void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override
{
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
- {
- uint32_t size = _size*sizeof(wchar_t);
- wchar_t* name = (wchar_t*)alloca(size);
- mbstowcs(name, _marker, size-2);
- PIX_SETMARKER(D3DCOLOR_MARKER, name);
- }
+ m_occlusionQuery.invalidate(_handle);
}
- void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override
+ void setMarker(const char* _marker, uint16_t _len) override
{
- m_occlusionQuery.invalidate(_handle);
+ if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) )
+ {
+ uint32_t size = _len*sizeof(wchar_t);
+ wchar_t* name = (wchar_t*)alloca(size+2);
+ name[_len] = L'\0';
+ mbstowcs(name, _marker, _len);
+ PIX_SETMARKER(kColorMarker, name);
+ }
}
- virtual void setName(Handle _handle, const char* _name) override
+ virtual void setName(Handle _handle, const char* _name, uint16_t _len) override
{
switch (_handle.type)
{
+ case Handle::IndexBuffer:
+ setDebugObjectName(m_indexBuffers[_handle.idx].m_ptr, "%.*s", _len, _name);
+ break;
+
case Handle::Shader:
- setDebugObjectName(m_shaders[_handle.idx].m_ptr, "%s", _name);
+ setDebugObjectName(m_shaders[_handle.idx].m_ptr, "%.*s", _len, _name);
break;
case Handle::Texture:
- setDebugObjectName(m_textures[_handle.idx].m_ptr, "%s", _name);
+ setDebugObjectName(m_textures[_handle.idx].m_ptr, "%.*s", _len, _name);
+ break;
+
+ case Handle::VertexBuffer:
+ setDebugObjectName(m_vertexBuffers[_handle.idx].m_ptr, "%.*s", _len, _name);
break;
default:
@@ -2054,11 +2095,11 @@ namespace bgfx { namespace d3d11
deviceCtx->PSSetConstantBuffers(0, 1, &program.m_fsh->m_buffer);
VertexBufferD3D11& vb = m_vertexBuffers[_blitter.m_vb->handle.idx];
- VertexDecl& vertexDecl = m_vertexDecls[_blitter.m_vb->decl.idx];
- uint32_t stride = vertexDecl.m_stride;
+ VertexLayout& layout = m_vertexLayouts[_blitter.m_vb->layoutHandle.idx];
+ uint32_t stride = layout.m_stride;
uint32_t offset = 0;
deviceCtx->IASetVertexBuffers(0, 1, &vb.m_ptr, &stride, &offset);
- setInputLayout(vertexDecl, program, 0);
+ setInputLayout(layout, program, 0);
IndexBufferD3D11& ib = m_indexBuffers[_blitter.m_ib->handle.idx];
deviceCtx->IASetIndexBuffer(ib.m_ptr, DXGI_FORMAT_R16_UINT, 0);
@@ -2083,7 +2124,7 @@ namespace bgfx { namespace d3d11
ID3D11DeviceContext* deviceCtx = m_deviceCtx;
m_indexBuffers [_blitter.m_ib->handle.idx].update(0, _numIndices*2, _blitter.m_ib->data, true);
- m_vertexBuffers[_blitter.m_vb->handle.idx].update(0, numVertices*_blitter.m_decl.m_stride, _blitter.m_vb->data, true);
+ m_vertexBuffers[_blitter.m_vb->handle.idx].update(0, numVertices*_blitter.m_layout.m_stride, _blitter.m_vb->data, true);
deviceCtx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
deviceCtx->DrawIndexed(_numIndices, 0, 0);
@@ -2470,7 +2511,15 @@ namespace bgfx { namespace d3d11
m_currentColor = m_backBufferColor;
m_currentDepthStencil = m_backBufferDepthStencil;
- m_deviceCtx->OMSetRenderTargets(1, &m_currentColor, m_currentDepthStencil);
+ m_deviceCtx->OMSetRenderTargetsAndUnorderedAccessViews(
+ 1
+ , &m_currentColor
+ , m_currentDepthStencil
+ , 1
+ , 0
+ , NULL
+ , NULL
+ );
m_needPresent |= _needPresent;
}
else
@@ -2529,19 +2578,19 @@ namespace bgfx { namespace d3d11
}
}
- void setInputLayout(uint8_t _numStreams, const VertexDecl** _vertexDecls, const ProgramD3D11& _program, uint16_t _numInstanceData)
+ void setInputLayout(uint8_t _numStreams, const VertexLayout** _layouts, const ProgramD3D11& _program, uint16_t _numInstanceData)
{
bx::HashMurmur2A murmur;
murmur.begin();
murmur.add(_numInstanceData);
for (uint8_t stream = 0; stream < _numStreams; ++stream)
{
- murmur.add(_vertexDecls[stream]->m_hash);
+ murmur.add(_layouts[stream]->m_hash);
}
uint64_t layoutHash = (uint64_t(_program.m_vsh->m_hash)<<32) | murmur.end();
- ID3D11InputLayout* layout = m_inputLayoutCache.find(layoutHash);
- if (NULL == layout)
+ ID3D11InputLayout* inputLayout = m_inputLayoutCache.find(layoutHash);
+ if (NULL == inputLayout)
{
D3D11_INPUT_ELEMENT_DESC vertexElements[Attrib::Count+1+BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT];
D3D11_INPUT_ELEMENT_DESC* elem = vertexElements;
@@ -2551,19 +2600,19 @@ namespace bgfx { namespace d3d11
for (uint8_t stream = 0; stream < _numStreams; ++stream)
{
- VertexDecl decl;
- bx::memCopy(&decl, _vertexDecls[stream], sizeof(VertexDecl) );
+ VertexLayout layout;
+ bx::memCopy(&layout, _layouts[stream], sizeof(VertexLayout) );
const bool last = stream == _numStreams-1;
for (uint32_t ii = 0; ii < Attrib::Count; ++ii)
{
uint16_t mask = attrMask[ii];
- uint16_t attr = (decl.m_attributes[ii] & mask);
+ uint16_t attr = (layout.m_attributes[ii] & mask);
if (0 == attr
|| UINT16_MAX == attr)
{
- decl.m_attributes[ii] = last ? ~attr : UINT16_MAX;
+ layout.m_attributes[ii] = last ? ~attr : UINT16_MAX;
}
else
{
@@ -2571,7 +2620,7 @@ namespace bgfx { namespace d3d11
}
}
- elem = fillVertexDecl(stream, elem, decl);
+ elem = fillVertexLayout(stream, elem, layout);
}
uint32_t num = uint32_t(elem-vertexElements);
@@ -2611,18 +2660,18 @@ namespace bgfx { namespace d3d11
, num
, _program.m_vsh->m_code->data
, _program.m_vsh->m_code->size
- , &layout
+ , &inputLayout
) );
- m_inputLayoutCache.add(layoutHash, layout);
+ m_inputLayoutCache.add(layoutHash, inputLayout);
}
- m_deviceCtx->IASetInputLayout(layout);
+ m_deviceCtx->IASetInputLayout(inputLayout);
}
- void setInputLayout(const VertexDecl& _vertexDecl, const ProgramD3D11& _program, uint16_t _numInstanceData)
+ void setInputLayout(const VertexLayout& _layout, const ProgramD3D11& _program, uint16_t _numInstanceData)
{
- const VertexDecl* decls[1] = { &_vertexDecl };
- setInputLayout(BX_COUNTOF(decls), decls, _program, _numInstanceData);
+ const VertexLayout* layouts[1] = { &_layout };
+ setInputLayout(BX_COUNTOF(layouts), layouts, _program, _numInstanceData);
}
void setBlendState(uint64_t _state, uint32_t _rgba = 0)
@@ -3036,16 +3085,16 @@ namespace bgfx { namespace d3d11
switch (texture.m_type)
{
case TextureD3D11::Texture2D:
- if (1 < texture.m_depth)
+ if (1 < texture.m_numLayers)
{
desc.ViewDimension = msaaSample
? D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY
: D3D11_SRV_DIMENSION_TEXTURE2DARRAY
;
desc.Texture2DArray.MostDetailedMip = _mip;
- desc.Texture2DArray.MipLevels = 1;
+ desc.Texture2DArray.MipLevels = 1;
desc.Texture2DArray.FirstArraySlice = 0;
- desc.Texture2DArray.ArraySize = texture.m_depth;
+ desc.Texture2DArray.ArraySize = texture.m_numLayers;
}
else
{
@@ -3054,7 +3103,7 @@ namespace bgfx { namespace d3d11
: D3D11_SRV_DIMENSION_TEXTURE2D
;
desc.Texture2D.MostDetailedMip = _mip;
- desc.Texture2D.MipLevels = 1;
+ desc.Texture2D.MipLevels = 1;
}
break;
@@ -3242,9 +3291,9 @@ namespace bgfx { namespace d3d11
}
break;
- CASE_IMPLEMENT_UNIFORM(Int1, I, int);
- CASE_IMPLEMENT_UNIFORM(Vec4, F, float);
- CASE_IMPLEMENT_UNIFORM(Mat4, F, float);
+ CASE_IMPLEMENT_UNIFORM(Sampler, I, int);
+ CASE_IMPLEMENT_UNIFORM(Vec4, F, float);
+ CASE_IMPLEMENT_UNIFORM(Mat4, F, float);
case UniformType::End:
break;
@@ -3314,24 +3363,27 @@ namespace bgfx { namespace d3d11
ProgramD3D11& program = m_program[_clearQuad.m_program[numMrt-1].idx];
m_currentProgram = &program;
- deviceCtx->VSSetShader(program.m_vsh->m_vertexShader, NULL, 0);
- deviceCtx->VSSetConstantBuffers(0, 1, s_zero.m_buffer);
+
+ const ShaderD3D11* vsh = program.m_vsh;
+ deviceCtx->VSSetShader(vsh->m_vertexShader, NULL, 0);
+ deviceCtx->VSSetConstantBuffers(0, 1, &vsh->m_buffer);
+ float mrtClearDepth[4] = { _clear.m_depth };
+ deviceCtx->UpdateSubresource(vsh->m_buffer, 0, 0, mrtClearDepth, 0, 0);
+
if (NULL != m_currentColor)
{
const ShaderD3D11* fsh = program.m_fsh;
deviceCtx->PSSetShader(fsh->m_pixelShader, NULL, 0);
deviceCtx->PSSetConstantBuffers(0, 1, &fsh->m_buffer);
+ float mrtClearColor[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS][4];
if (BGFX_CLEAR_COLOR_USE_PALETTE & _clear.m_flags)
{
- float mrtClear[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS][4];
for (uint32_t ii = 0; ii < numMrt; ++ii)
{
uint8_t index = (uint8_t)bx::uint32_min(BGFX_CONFIG_MAX_COLOR_PALETTE-1, _clear.m_index[ii]);
- bx::memCopy(mrtClear[ii], _palette[index], 16);
+ bx::memCopy(mrtClearColor[ii], _palette[index], 16);
}
-
- deviceCtx->UpdateSubresource(fsh->m_buffer, 0, 0, mrtClear, 0, 0);
}
else
{
@@ -3343,52 +3395,27 @@ namespace bgfx { namespace d3d11
_clear.m_index[3]*1.0f/255.0f,
};
- deviceCtx->UpdateSubresource(fsh->m_buffer, 0, 0, rgba, 0, 0);
+ for (uint32_t ii = 0; ii < numMrt; ++ii)
+ {
+ bx::memCopy(mrtClearColor[ii], rgba, 16);
+ }
}
+
+ deviceCtx->UpdateSubresource(fsh->m_buffer, 0, 0, mrtClearColor, 0, 0);
}
else
{
deviceCtx->PSSetShader(NULL, NULL, 0);
}
- VertexBufferD3D11& vb = m_vertexBuffers[_clearQuad.m_vb->handle.idx];
- const VertexDecl& vertexDecl = m_vertexDecls[_clearQuad.m_vb->decl.idx];
- const uint32_t stride = vertexDecl.m_stride;
- const uint32_t offset = 0;
-
- {
- struct Vertex
- {
- float m_x;
- float m_y;
- float m_z;
- };
+ VertexBufferD3D11& vb = m_vertexBuffers[_clearQuad.m_vb.idx];
+ const VertexLayout& layout = _clearQuad.m_layout;
- Vertex* vertex = (Vertex*)_clearQuad.m_vb->data;
- BX_CHECK(stride == sizeof(Vertex), "Stride/Vertex mismatch (stride %d, sizeof(Vertex) %d)", stride, sizeof(Vertex) );
-
- const float depth = _clear.m_depth;
-
- vertex->m_x = -1.0f;
- vertex->m_y = -1.0f;
- vertex->m_z = depth;
- vertex++;
- vertex->m_x = 1.0f;
- vertex->m_y = -1.0f;
- vertex->m_z = depth;
- vertex++;
- vertex->m_x = -1.0f;
- vertex->m_y = 1.0f;
- vertex->m_z = depth;
- vertex++;
- vertex->m_x = 1.0f;
- vertex->m_y = 1.0f;
- vertex->m_z = depth;
- }
+ const uint32_t stride = layout.m_stride;
+ const uint32_t offset = 0;
- m_vertexBuffers[_clearQuad.m_vb->handle.idx].update(0, 4*_clearQuad.m_decl.m_stride, _clearQuad.m_vb->data);
deviceCtx->IASetVertexBuffers(0, 1, &vb.m_ptr, &stride, &offset);
- setInputLayout(vertexDecl, program, 0);
+ setInputLayout(layout, program, 0);
deviceCtx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
deviceCtx->Draw(4, 0);
@@ -3446,7 +3473,7 @@ namespace bgfx { namespace d3d11
ShaderD3D11 m_shaders[BGFX_CONFIG_MAX_SHADERS];
ProgramD3D11 m_program[BGFX_CONFIG_MAX_PROGRAMS];
TextureD3D11 m_textures[BGFX_CONFIG_MAX_TEXTURES];
- VertexDecl m_vertexDecls[BGFX_CONFIG_MAX_VERTEX_DECLS];
+ VertexLayout m_vertexLayouts[BGFX_CONFIG_MAX_VERTEX_LAYOUTS];
FrameBufferD3D11 m_frameBuffers[BGFX_CONFIG_MAX_FRAME_BUFFERS];
void* m_uniforms[BGFX_CONFIG_MAX_UNIFORMS];
Matrix4 m_predefinedUniforms[PredefinedUniform::Count];
@@ -3562,15 +3589,15 @@ namespace bgfx { namespace d3d11
static const UavFormat s_uavFormat[] =
{ // BGFX_BUFFER_COMPUTE_TYPE_INT, BGFX_BUFFER_COMPUTE_TYPE_UINT, BGFX_BUFFER_COMPUTE_TYPE_FLOAT
{ { DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN }, 0 }, // ignored
- { { DXGI_FORMAT_R8_SINT, DXGI_FORMAT_R8_UINT, DXGI_FORMAT_UNKNOWN }, 1 }, // BGFX_BUFFER_COMPUTE_FORMAT_8x1
- { { DXGI_FORMAT_R8G8_SINT, DXGI_FORMAT_R8G8_UINT, DXGI_FORMAT_UNKNOWN }, 2 }, // BGFX_BUFFER_COMPUTE_FORMAT_8x2
- { { DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_UNKNOWN }, 4 }, // BGFX_BUFFER_COMPUTE_FORMAT_8x4
- { { DXGI_FORMAT_R16_SINT, DXGI_FORMAT_R16_UINT, DXGI_FORMAT_R16_FLOAT }, 2 }, // BGFX_BUFFER_COMPUTE_FORMAT_16x1
- { { DXGI_FORMAT_R16G16_SINT, DXGI_FORMAT_R16G16_UINT, DXGI_FORMAT_R16G16_FLOAT }, 4 }, // BGFX_BUFFER_COMPUTE_FORMAT_16x2
- { { DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_FLOAT }, 8 }, // BGFX_BUFFER_COMPUTE_FORMAT_16x4
- { { DXGI_FORMAT_R32_SINT, DXGI_FORMAT_R32_UINT, DXGI_FORMAT_R32_FLOAT }, 4 }, // BGFX_BUFFER_COMPUTE_FORMAT_32x1
- { { DXGI_FORMAT_R32G32_SINT, DXGI_FORMAT_R32G32_UINT, DXGI_FORMAT_R32G32_FLOAT }, 8 }, // BGFX_BUFFER_COMPUTE_FORMAT_32x2
- { { DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_FLOAT }, 16 }, // BGFX_BUFFER_COMPUTE_FORMAT_32x4
+ { { DXGI_FORMAT_R8_SINT, DXGI_FORMAT_R8_UINT, DXGI_FORMAT_UNKNOWN }, 1 }, // BGFX_BUFFER_COMPUTE_FORMAT_8X1
+ { { DXGI_FORMAT_R8G8_SINT, DXGI_FORMAT_R8G8_UINT, DXGI_FORMAT_UNKNOWN }, 2 }, // BGFX_BUFFER_COMPUTE_FORMAT_8X2
+ { { DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_UNKNOWN }, 4 }, // BGFX_BUFFER_COMPUTE_FORMAT_8X4
+ { { DXGI_FORMAT_R16_SINT, DXGI_FORMAT_R16_UINT, DXGI_FORMAT_R16_FLOAT }, 2 }, // BGFX_BUFFER_COMPUTE_FORMAT_16X1
+ { { DXGI_FORMAT_R16G16_SINT, DXGI_FORMAT_R16G16_UINT, DXGI_FORMAT_R16G16_FLOAT }, 4 }, // BGFX_BUFFER_COMPUTE_FORMAT_16X2
+ { { DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_FLOAT }, 8 }, // BGFX_BUFFER_COMPUTE_FORMAT_16X4
+ { { DXGI_FORMAT_R32_SINT, DXGI_FORMAT_R32_UINT, DXGI_FORMAT_R32_FLOAT }, 4 }, // BGFX_BUFFER_COMPUTE_FORMAT_32X1
+ { { DXGI_FORMAT_R32G32_SINT, DXGI_FORMAT_R32G32_UINT, DXGI_FORMAT_R32G32_FLOAT }, 8 }, // BGFX_BUFFER_COMPUTE_FORMAT_32X2
+ { { DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_FLOAT }, 16 }, // BGFX_BUFFER_COMPUTE_FORMAT_32X4
};
void BufferD3D11::create(uint32_t _size, void* _data, uint16_t _flags, uint16_t _stride, bool _vertex)
@@ -3800,11 +3827,11 @@ namespace bgfx { namespace d3d11
#endif // 0
}
- void VertexBufferD3D11::create(uint32_t _size, void* _data, VertexDeclHandle _declHandle, uint16_t _flags)
+ void VertexBufferD3D11::create(uint32_t _size, void* _data, VertexLayoutHandle _layoutHandle, uint16_t _flags)
{
- m_decl = _declHandle;
- uint16_t stride = isValid(_declHandle)
- ? s_renderD3D11->m_vertexDecls[_declHandle.idx].m_stride
+ m_layoutHandle = _layoutHandle;
+ uint16_t stride = isValid(_layoutHandle)
+ ? s_renderD3D11->m_vertexLayouts[_layoutHandle.idx].m_stride
: 0
;
@@ -4086,21 +4113,28 @@ namespace bgfx { namespace d3d11
if (bimg::imageParse(imageContainer, _mem->data, _mem->size) )
{
- uint8_t numMips = imageContainer.m_numMips;
- const uint8_t startLod = uint8_t(bx::uint32_min(_skip, numMips-1) );
- numMips -= startLod;
const bimg::ImageBlockInfo& blockInfo = bimg::getBlockInfo(bimg::TextureFormat::Enum(imageContainer.m_format) );
- const uint32_t textureWidth = bx::uint32_max(blockInfo.blockWidth, imageContainer.m_width >>startLod);
- const uint32_t textureHeight = bx::uint32_max(blockInfo.blockHeight, imageContainer.m_height>>startLod);
- const uint16_t numLayers = imageContainer.m_numLayers;
-
- m_flags = _flags;
- m_width = textureWidth;
- m_height = textureHeight;
- m_depth = 1 < imageContainer.m_depth
- ? imageContainer.m_depth
- : imageContainer.m_numLayers
- ;
+ const uint8_t startLod = bx::min<uint8_t>(_skip, imageContainer.m_numMips-1);
+
+ bimg::TextureInfo ti;
+ bimg::imageGetSize(
+ &ti
+ , uint16_t(imageContainer.m_width >>startLod)
+ , uint16_t(imageContainer.m_height>>startLod)
+ , uint16_t(imageContainer.m_depth >>startLod)
+ , imageContainer.m_cubeMap
+ , 1 < imageContainer.m_numMips
+ , imageContainer.m_numLayers
+ , imageContainer.m_format
+ );
+ ti.numMips = bx::min<uint8_t>(imageContainer.m_numMips-startLod, ti.numMips);
+
+ m_flags = _flags;
+ m_width = ti.width;
+ m_height = ti.height;
+ m_depth = ti.depth;
+ m_numLayers = ti.numLayers;
+
m_requestedFormat = uint8_t(imageContainer.m_format);
m_textureFormat = uint8_t(getViableTextureFormat(imageContainer) );
const bool convert = m_textureFormat != m_requestedFormat;
@@ -4119,10 +4153,10 @@ namespace bgfx { namespace d3d11
m_type = Texture2D;
}
- m_numMips = numMips;
+ m_numMips = ti.numMips;
- const uint16_t numSides = numLayers * (imageContainer.m_cubeMap ? 6 : 1);
- const uint32_t numSrd = numSides * numMips;
+ const uint16_t numSides = ti.numLayers * (imageContainer.m_cubeMap ? 6 : 1);
+ const uint32_t numSrd = numSides * ti.numMips;
D3D11_SUBRESOURCE_DATA* srd = (D3D11_SUBRESOURCE_DATA*)alloca(numSrd*sizeof(D3D11_SUBRESOURCE_DATA) );
uint32_t kk = 0;
@@ -4134,9 +4168,9 @@ namespace bgfx { namespace d3d11
, getHandle()
, getName( (TextureFormat::Enum)m_textureFormat)
, getName( (TextureFormat::Enum)m_requestedFormat)
- , numLayers
- , textureWidth
- , textureHeight
+ , ti.numLayers
+ , ti.width
+ , ti.height
, imageContainer.m_cubeMap ? "x6" : ""
, 0 != (m_flags&BGFX_TEXTURE_RT_MASK) ? " (render target)" : ""
, swizzle ? " (swizzle BGRA8 -> RGBA8)" : ""
@@ -4144,7 +4178,7 @@ namespace bgfx { namespace d3d11
for (uint16_t side = 0; side < numSides; ++side)
{
- for (uint8_t lod = 0, num = numMips; lod < num; ++lod)
+ for (uint8_t lod = 0, num = ti.numMips; lod < num; ++lod)
{
bimg::ImageMip mip;
if (bimg::imageGetRawData(imageContainer, side, lod+startLod, _mem->data, _mem->size, mip) )
@@ -4154,7 +4188,7 @@ namespace bgfx { namespace d3d11
if (convert)
{
uint32_t srcpitch = mip.m_width*bpp/8;
- uint8_t* temp = (uint8_t*)BX_ALLOC(g_allocator, mip.m_width*mip.m_height*bpp/8);
+ uint8_t* temp = (uint8_t*)BX_ALLOC(g_allocator, srcpitch*mip.m_height);
bimg::imageDecodeToBgra8(g_allocator, temp, mip.m_data, mip.m_width, mip.m_height, srcpitch, mip.m_format);
srd[kk].pSysMem = temp;
@@ -4231,9 +4265,9 @@ namespace bgfx { namespace d3d11
case TextureCube:
{
D3D11_TEXTURE2D_DESC desc = {};
- desc.Width = textureWidth;
- desc.Height = textureHeight;
- desc.MipLevels = numMips;
+ desc.Width = ti.width;
+ desc.Height = ti.height;
+ desc.MipLevels = ti.numMips;
desc.ArraySize = numSides;
desc.Format = format;
desc.SampleDesc = msaa;
@@ -4252,7 +4286,7 @@ namespace bgfx { namespace d3d11
desc.BindFlags |= D3D11_BIND_RENDER_TARGET;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.MiscFlags |= 0
- | (1 < numMips ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0)
+ | (1 < ti.numMips ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0)
;
}
@@ -4272,26 +4306,26 @@ namespace bgfx { namespace d3d11
if (imageContainer.m_cubeMap)
{
desc.MiscFlags |= D3D11_RESOURCE_MISC_TEXTURECUBE;
- if (1 < numLayers)
+ if (1 < ti.numLayers)
{
srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY;
- srvd.TextureCubeArray.MipLevels = numMips;
- srvd.TextureCubeArray.NumCubes = numLayers;
+ srvd.TextureCubeArray.MipLevels = ti.numMips;
+ srvd.TextureCubeArray.NumCubes = ti.numLayers;
}
else
{
srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
- srvd.TextureCube.MipLevels = numMips;
+ srvd.TextureCube.MipLevels = ti.numMips;
}
}
else
{
if (msaaSample)
{
- if (1 < numLayers)
+ if (1 < ti.numLayers)
{
srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY;
- srvd.Texture2DMSArray.ArraySize = numLayers;
+ srvd.Texture2DMSArray.ArraySize = ti.numLayers;
}
else
{
@@ -4300,16 +4334,16 @@ namespace bgfx { namespace d3d11
}
else
{
- if (1 < numLayers)
+ if (1 < ti.numLayers)
{
srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
- srvd.Texture2DArray.MipLevels = numMips;
- srvd.Texture2DArray.ArraySize = numLayers;
+ srvd.Texture2DArray.MipLevels = ti.numMips;
+ srvd.Texture2DArray.ArraySize = ti.numLayers;
}
else
{
srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
- srvd.Texture2D.MipLevels = numMips;
+ srvd.Texture2D.MipLevels = ti.numMips;
}
}
}
@@ -4335,10 +4369,10 @@ namespace bgfx { namespace d3d11
case Texture3D:
{
D3D11_TEXTURE3D_DESC desc = {};
- desc.Width = textureWidth;
- desc.Height = textureHeight;
- desc.Depth = imageContainer.m_depth;
- desc.MipLevels = imageContainer.m_numMips;
+ desc.Width = ti.width;
+ desc.Height = ti.height;
+ desc.Depth = ti.depth;
+ desc.MipLevels = ti.numMips;
desc.Format = format;
desc.Usage = kk == 0 || blit ? D3D11_USAGE_DEFAULT : D3D11_USAGE_IMMUTABLE;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
@@ -4350,7 +4384,7 @@ namespace bgfx { namespace d3d11
desc.BindFlags |= D3D11_BIND_RENDER_TARGET;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.MiscFlags |= 0
- | (1 < numMips ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0)
+ | (1 < ti.numMips ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0)
;
}
@@ -4368,7 +4402,7 @@ namespace bgfx { namespace d3d11
}
srvd.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
- srvd.Texture3D.MipLevels = numMips;
+ srvd.Texture3D.MipLevels = ti.numMips;
if (directAccess)
{
@@ -4398,7 +4432,7 @@ namespace bgfx { namespace d3d11
kk = 0;
for (uint16_t side = 0; side < numSides; ++side)
{
- for (uint32_t lod = 0, num = numMips; lod < num; ++lod)
+ for (uint32_t lod = 0, num = ti.numMips; lod < num; ++lod)
{
BX_FREE(g_allocator, const_cast<void*>(srd[kk].pSysMem) );
++kk;
@@ -4561,6 +4595,12 @@ namespace bgfx { namespace d3d11
{
m_rtv[ii] = NULL;
}
+
+ for (uint32_t ii = 0; ii < BX_COUNTOF(m_uav); ++ii)
+ {
+ m_uav[ii] = NULL;
+ }
+
m_dsv = NULL;
m_swapChain = NULL;
@@ -4576,11 +4616,12 @@ namespace bgfx { namespace d3d11
{
SwapChainDesc scd;
bx::memCopy(&scd, &s_renderD3D11->m_scd, sizeof(SwapChainDesc) );
- scd.format = TextureFormat::Count == _format ? scd.format : s_textureFormat[_format].m_fmt;
- scd.width = _width;
- scd.height = _height;
- scd.nwh = _nwh;
- scd.ndt = NULL;
+ scd.format = TextureFormat::Count == _format ? scd.format : s_textureFormat[_format].m_fmt;
+ scd.width = _width;
+ scd.height = _height;
+ scd.nwh = _nwh;
+ scd.ndt = NULL;
+ scd.sampleDesc = s_msaa[0];
ID3D11Device* device = s_renderD3D11->m_device;
@@ -4670,7 +4711,9 @@ namespace bgfx { namespace d3d11
if (0 < m_numTh)
{
- m_num = 0;
+ m_num = 0;
+ m_numUav = 0;
+
for (uint32_t ii = 0; ii < m_numTh; ++ii)
{
const Attachment& at = m_attachment[ii];
@@ -4765,11 +4808,11 @@ namespace bgfx { namespace d3d11
case TextureD3D11::Texture2D:
if (1 < msaa.Count)
{
- if (1 < texture.m_depth)
+ if (1 < texture.m_numLayers)
{
desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY;
desc.Texture2DMSArray.FirstArraySlice = at.layer;
- desc.Texture2DMSArray.ArraySize = 1;
+ desc.Texture2DMSArray.ArraySize = 1;
}
else
{
@@ -4778,12 +4821,12 @@ namespace bgfx { namespace d3d11
}
else
{
- if (1 < texture.m_depth)
+ if (1 < texture.m_numLayers)
{
desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
desc.Texture2DArray.FirstArraySlice = at.layer;
- desc.Texture2DArray.ArraySize = 1;
- desc.Texture2DArray.MipSlice = at.mip;
+ desc.Texture2DArray.ArraySize = 1;
+ desc.Texture2DArray.MipSlice = at.mip;
}
else
{
@@ -4813,6 +4856,7 @@ namespace bgfx { namespace d3d11
desc.Texture2DArray.FirstArraySlice = at.layer;
desc.Texture2DArray.MipSlice = at.mip;
}
+
DX_CHECK(s_renderD3D11->m_device->CreateRenderTargetView(texture.m_ptr, &desc, &m_rtv[m_num]) );
break;
@@ -4821,6 +4865,7 @@ namespace bgfx { namespace d3d11
desc.Texture3D.MipSlice = at.mip;
desc.Texture3D.WSize = 1;
desc.Texture3D.FirstWSlice = at.layer;
+
DX_CHECK(s_renderD3D11->m_device->CreateRenderTargetView(texture.m_ptr, &desc, &m_rtv[m_num]) );
break;
}
@@ -4830,7 +4875,7 @@ namespace bgfx { namespace d3d11
}
else
{
- BX_CHECK(false, "");
+ m_uav[m_numUav++] = texture.m_uav;
}
}
}
@@ -4903,7 +4948,23 @@ namespace bgfx { namespace d3d11
void FrameBufferD3D11::set()
{
- s_renderD3D11->m_deviceCtx->OMSetRenderTargets(m_num, m_rtv, m_dsv);
+ if (0 < m_numUav)
+ {
+ s_renderD3D11->m_deviceCtx->OMSetRenderTargetsAndUnorderedAccessViews(
+ m_num
+ , m_rtv
+ , m_dsv
+ , 16
+ , m_numUav
+ , m_uav
+ , NULL
+ );
+ }
+ else
+ {
+ s_renderD3D11->m_deviceCtx->OMSetRenderTargets(m_num, m_rtv, m_dsv);
+ }
+
m_needPresent = UINT16_MAX != m_denseIdx;
s_renderD3D11->m_currentColor = m_rtv[0];
s_renderD3D11->m_currentDepthStencil = m_dsv;
@@ -5213,7 +5274,7 @@ namespace bgfx { namespace d3d11
renderDocTriggerCapture();
}
- PIX_BEGINEVENT(D3DCOLOR_FRAME, L"rendererSubmit");
+ BGFX_D3D11_PROFILER_BEGIN_LITERAL("rendererSubmit", kColorView);
ID3D11DeviceContext* deviceCtx = m_deviceCtx;
@@ -5229,12 +5290,14 @@ namespace bgfx { namespace d3d11
if (0 < _render->m_iboffset)
{
+ BGFX_PROFILER_SCOPE("bgfx/Update transient index buffer", kColorResource);
TransientIndexBuffer* ib = _render->m_transientIb;
m_indexBuffers[ib->handle.idx].update(0, _render->m_iboffset, ib->data, true);
}
if (0 < _render->m_vboffset)
{
+ BGFX_PROFILER_SCOPE("bgfx/Update transient vertex buffer", kColorResource);
TransientVertexBuffer* vb = _render->m_transientVb;
m_vertexBuffers[vb->handle.idx].update(0, _render->m_vboffset, vb->data, true);
}
@@ -5249,15 +5312,14 @@ namespace bgfx { namespace d3d11
RenderBind currentBind;
currentBind.clear();
- const bool hmdEnabled = false;
static ViewState viewState;
- viewState.reset(_render, hmdEnabled);
+ viewState.reset(_render);
bool wireframe = !!(_render->m_debug&BGFX_DEBUG_WIREFRAME);
bool scissorEnabled = false;
setDebugWireframe(wireframe);
- uint16_t programIdx = kInvalidHandle;
+ ProgramHandle currentProgram = BGFX_INVALID_HANDLE;
SortKey key;
uint16_t view = UINT16_MAX;
FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
@@ -5299,13 +5361,10 @@ namespace bgfx { namespace d3d11
// if we don't do this we'll only see one frame of output and then nothing
setFrameBuffer(BGFX_INVALID_HANDLE, true, false);
- bool viewRestart = false;
- uint8_t eye = 0;
- uint8_t restartState = 0;
viewState.m_rect = _render->m_view[0].m_rect;
-
int32_t numItems = _render->m_numRenderItems;
- for (int32_t item = 0, restartItem = numItems; item < numItems || restartItem < numItems;)
+
+ for (int32_t item = 0; item < numItems;)
{
const uint64_t encodedKey = _render->m_sortKeys[item];
const bool isCompute = key.decode(encodedKey, _render->m_viewRemap);
@@ -5323,77 +5382,27 @@ namespace bgfx { namespace d3d11
if (viewChanged)
{
- if (1 == restartState)
- {
- restartState = 2;
- item = restartItem;
- restartItem = numItems;
- view = UINT16_MAX;
- continue;
- }
-
view = key.m_view;
- programIdx = kInvalidHandle;
+ currentProgram = BGFX_INVALID_HANDLE;
- if (_render->m_view[view].m_fbh.idx != fbh.idx)
+ if (item > 1)
{
- fbh = _render->m_view[view].m_fbh;
- setFrameBuffer(fbh);
+ profiler.end();
}
- viewRestart = ( (BGFX_VIEW_STEREO == (_render->m_view[view].m_flags & BGFX_VIEW_STEREO) ) );
- viewRestart &= hmdEnabled;
- if (viewRestart)
- {
- if (0 == restartState)
- {
- restartState = 1;
- restartItem = item - 1;
- }
+ BGFX_D3D11_PROFILER_END();
+ setViewType(view, " ");
+ BGFX_D3D11_PROFILER_BEGIN(view, kColorView);
- eye = (restartState - 1) & 1;
- restartState &= 1;
- }
- else
- {
- eye = 0;
- }
+ profiler.begin(view);
- PIX_ENDEVENT();
- if (item > 1)
+ if (_render->m_view[view].m_fbh.idx != fbh.idx)
{
- profiler.end();
+ fbh = _render->m_view[view].m_fbh;
+ setFrameBuffer(fbh);
}
- profiler.begin(view);
viewState.m_rect = _render->m_view[view].m_rect;
- if (viewRestart)
- {
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
- {
- wchar_t* viewNameW = s_viewNameW[view];
- viewNameW[3] = L' ';
- viewNameW[4] = eye ? L'R' : L'L';
- PIX_BEGINEVENT(0 == ( (view*2+eye)&1)
- ? D3DCOLOR_VIEW_L
- : D3DCOLOR_VIEW_R
- , viewNameW
- );
- }
-
- viewState.m_rect.m_x = eye * (viewState.m_rect.m_width+1)/2;
- viewState.m_rect.m_width /= 2;
- }
- else
- {
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
- {
- wchar_t* viewNameW = s_viewNameW[view];
- viewNameW[3] = L' ';
- viewNameW[4] = L' ';
- PIX_BEGINEVENT(D3DCOLOR_VIEW, viewNameW);
- }
- }
const Rect& scissorRect = _render->m_view[view].m_scissor;
viewHasScissor = !scissorRect.isZero();
@@ -5424,13 +5433,9 @@ namespace bgfx { namespace d3d11
{
wasCompute = true;
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
- {
- wchar_t* viewNameW = s_viewNameW[view];
- viewNameW[3] = L'C';
- PIX_ENDEVENT();
- PIX_BEGINEVENT(D3DCOLOR_COMPUTE, viewNameW);
- }
+ setViewType(view, "C");
+ BGFX_D3D11_PROFILER_END();
+ BGFX_D3D11_PROFILER_BEGIN(view, kColorCompute);
deviceCtx->IASetVertexBuffers(0, 2, s_zero.m_buffer, s_zero.m_zero, s_zero.m_zero);
deviceCtx->IASetIndexBuffer(NULL, DXGI_FORMAT_R16_UINT, 0);
@@ -5444,21 +5449,15 @@ namespace bgfx { namespace d3d11
const RenderCompute& compute = renderItem.compute;
- if (0 != eye
- && BGFX_SUBMIT_EYE_LEFT == (compute.m_submitFlags&BGFX_SUBMIT_EYE_MASK) )
- {
- continue;
- }
-
bool programChanged = false;
bool constantsChanged = compute.m_uniformBegin < compute.m_uniformEnd;
rendererUpdateUniforms(this, _render->m_uniformBuffer[compute.m_uniformIdx], compute.m_uniformBegin, compute.m_uniformEnd);
- if (key.m_program != programIdx)
+ if (key.m_program.idx != currentProgram.idx)
{
- programIdx = key.m_program;
+ currentProgram = key.m_program;
- ProgramD3D11& program = m_program[key.m_program];
+ ProgramD3D11& program = m_program[currentProgram.idx];
m_currentProgram = &program;
deviceCtx->CSSetShader(program.m_vsh->m_computeShader, NULL, 0);
@@ -5468,9 +5467,9 @@ namespace bgfx { namespace d3d11
constantsChanged = true;
}
- if (kInvalidHandle != programIdx)
+ if (isValid(currentProgram) )
{
- ProgramD3D11& program = m_program[programIdx];
+ ProgramD3D11& program = m_program[currentProgram.idx];
if (constantsChanged)
{
@@ -5481,7 +5480,7 @@ namespace bgfx { namespace d3d11
}
}
- viewState.setPredefined<4>(this, view, eye, program, _render, compute);
+ viewState.setPredefined<4>(this, view, program, _render, compute);
if (constantsChanged
|| program.m_numPredefined > 0)
@@ -5543,6 +5542,11 @@ namespace bgfx { namespace d3d11
break;
}
}
+ else
+ {
+ m_textureStage.m_srv[stage] = NULL;
+ m_textureStage.m_sampler[stage] = NULL;
+ }
}
if (BX_ENABLED(BGFX_CONFIG_DEBUG) )
@@ -5584,15 +5588,11 @@ namespace bgfx { namespace d3d11
if (wasCompute)
{
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
- {
- wchar_t* viewNameW = s_viewNameW[view];
- viewNameW[3] = L' ';
- PIX_ENDEVENT();
- PIX_BEGINEVENT(D3DCOLOR_DRAW, viewNameW);
- }
+ setViewType(view, " ");
+ BGFX_D3D11_PROFILER_END();
+ BGFX_D3D11_PROFILER_BEGIN(view, kColorDraw);
- programIdx = kInvalidHandle;
+ currentProgram = BGFX_INVALID_HANDLE;
m_currentProgram = NULL;
invalidateCompute();
@@ -5743,11 +5743,11 @@ namespace bgfx { namespace d3d11
bool constantsChanged = draw.m_uniformBegin < draw.m_uniformEnd;
rendererUpdateUniforms(this, _render->m_uniformBuffer[draw.m_uniformIdx], draw.m_uniformBegin, draw.m_uniformEnd);
- if (key.m_program != programIdx)
+ if (key.m_program.idx != currentProgram.idx)
{
- programIdx = key.m_program;
+ currentProgram = key.m_program;
- if (kInvalidHandle == programIdx)
+ if (!isValid(currentProgram) )
{
m_currentProgram = NULL;
@@ -5756,7 +5756,7 @@ namespace bgfx { namespace d3d11
}
else
{
- ProgramD3D11& program = m_program[programIdx];
+ ProgramD3D11& program = m_program[currentProgram.idx];
m_currentProgram = &program;
const ShaderD3D11* vsh = program.m_vsh;
@@ -5780,9 +5780,9 @@ namespace bgfx { namespace d3d11
constantsChanged = true;
}
- if (kInvalidHandle != programIdx)
+ if (isValid(currentProgram) )
{
- ProgramD3D11& program = m_program[programIdx];
+ ProgramD3D11& program = m_program[currentProgram.idx];
if (constantsChanged)
{
@@ -5802,7 +5802,7 @@ namespace bgfx { namespace d3d11
}
}
- viewState.setPredefined<4>(this, view, eye, program, _render, draw);
+ viewState.setPredefined<4>(this, view, program, _render, draw);
if (constantsChanged
|| program.m_numPredefined > 0)
@@ -5877,35 +5877,38 @@ namespace bgfx { namespace d3d11
ID3D11Buffer* buffers[BGFX_CONFIG_MAX_VERTEX_STREAMS];
uint32_t strides[BGFX_CONFIG_MAX_VERTEX_STREAMS];
uint32_t offsets[BGFX_CONFIG_MAX_VERTEX_STREAMS];
- const VertexDecl* decls[BGFX_CONFIG_MAX_VERTEX_STREAMS];
+ const VertexLayout* layouts[BGFX_CONFIG_MAX_VERTEX_STREAMS];
uint32_t numVertices = draw.m_numVertices;
uint8_t numStreams = 0;
if (UINT8_MAX != draw.m_streamMask)
{
- for (uint32_t idx = 0, streamMask = draw.m_streamMask, ntz = bx::uint32_cnttz(streamMask)
+ for (uint32_t idx = 0, streamMask = draw.m_streamMask
; 0 != streamMask
- ; streamMask >>= 1, idx += 1, ntz = bx::uint32_cnttz(streamMask), ++numStreams
+ ; streamMask >>= 1, idx += 1, ++numStreams
)
{
+ const uint32_t ntz = bx::uint32_cnttz(streamMask);
streamMask >>= ntz;
idx += ntz;
- currentState.m_stream[idx].m_decl = draw.m_stream[idx].m_decl;
- currentState.m_stream[idx].m_handle = draw.m_stream[idx].m_handle;
- currentState.m_stream[idx].m_startVertex = draw.m_stream[idx].m_startVertex;
+ currentState.m_stream[idx].m_layoutHandle = draw.m_stream[idx].m_layoutHandle;
+ currentState.m_stream[idx].m_handle = draw.m_stream[idx].m_handle;
+ currentState.m_stream[idx].m_startVertex = draw.m_stream[idx].m_startVertex;
const uint16_t handle = draw.m_stream[idx].m_handle.idx;
const VertexBufferD3D11& vb = m_vertexBuffers[handle];
- const uint16_t decl = !isValid(vb.m_decl) ? draw.m_stream[idx].m_decl.idx : vb.m_decl.idx;
- const VertexDecl& vertexDecl = m_vertexDecls[decl];
- const uint32_t stride = vertexDecl.m_stride;
+ const uint16_t layoutIdx = isValid(draw.m_stream[idx].m_layoutHandle)
+ ? draw.m_stream[idx].m_layoutHandle.idx
+ : vb.m_layoutHandle.idx;
+ const VertexLayout& layout = m_vertexLayouts[layoutIdx];
+ const uint32_t stride = layout.m_stride;
buffers[numStreams] = vb.m_ptr;
strides[numStreams] = stride;
offsets[numStreams] = draw.m_stream[idx].m_startVertex * stride;
- decls[numStreams] = &vertexDecl;
+ layouts[numStreams] = &layout;
numVertices = bx::uint32_min(UINT32_MAX == draw.m_numVertices
? vb.m_size/stride
@@ -5926,12 +5929,12 @@ namespace bgfx { namespace d3d11
const VertexBufferD3D11& inst = m_vertexBuffers[draw.m_instanceDataBuffer.idx];
const uint32_t instStride = draw.m_instanceDataStride;
deviceCtx->IASetVertexBuffers(numStreams, 1, &inst.m_ptr, &instStride, &draw.m_instanceDataOffset);
- setInputLayout(numStreams, decls, m_program[programIdx], uint16_t(instStride/16) );
+ setInputLayout(numStreams, layouts, m_program[currentProgram.idx], uint16_t(instStride/16) );
}
else
{
deviceCtx->IASetVertexBuffers(numStreams, 1, s_zero.m_buffer, s_zero.m_zero, s_zero.m_zero);
- setInputLayout(numStreams, decls, m_program[programIdx], 0);
+ setInputLayout(numStreams, layouts, m_program[currentProgram.idx], 0);
}
}
else
@@ -5943,7 +5946,7 @@ namespace bgfx { namespace d3d11
const VertexBufferD3D11& inst = m_vertexBuffers[draw.m_instanceDataBuffer.idx];
const uint32_t instStride = draw.m_instanceDataStride;
deviceCtx->IASetVertexBuffers(0, 1, &inst.m_ptr, &instStride, &draw.m_instanceDataOffset);
- setInputLayout(0, NULL, m_program[programIdx], uint16_t(instStride/16) );
+ setInputLayout(0, NULL, m_program[currentProgram.idx], uint16_t(instStride/16) );
}
else
{
@@ -6112,13 +6115,9 @@ namespace bgfx { namespace d3d11
if (wasCompute)
{
- if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) )
- {
- wchar_t* viewNameW = s_viewNameW[view];
- viewNameW[3] = L'C';
- PIX_ENDEVENT();
- PIX_BEGINEVENT(D3DCOLOR_DRAW, viewNameW);
- }
+ setViewType(view, "C");
+ BGFX_D3D11_PROFILER_END();
+ BGFX_D3D11_PROFILER_BEGIN(view, kColorCompute);
invalidateCompute();
}
@@ -6140,7 +6139,7 @@ namespace bgfx { namespace d3d11
}
}
- PIX_ENDEVENT();
+ BGFX_D3D11_PROFILER_END();
int64_t timeEnd = bx::getHPCounter();
int64_t frameTime = timeEnd - timeBegin;
@@ -6185,7 +6184,7 @@ namespace bgfx { namespace d3d11
if (_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) )
{
- PIX_BEGINEVENT(D3DCOLOR_FRAME, L"debugstats");
+ BGFX_D3D11_PROFILER_BEGIN_LITERAL("debugstats", kColorFrame);
m_needPresent = true;
TextVideoMem& tvm = m_textVideoMem;
@@ -6313,15 +6312,15 @@ namespace bgfx { namespace d3d11
blit(this, _textVideoMemBlitter, tvm);
- PIX_ENDEVENT();
+ BGFX_D3D11_PROFILER_END();
}
else if (_render->m_debug & BGFX_DEBUG_TEXT)
{
- PIX_BEGINEVENT(D3DCOLOR_FRAME, L"debugtext");
+ BGFX_D3D11_PROFILER_BEGIN_LITERAL("debugtext", kColorFrame);
blit(this, _textVideoMemBlitter, _render->m_textVideoMem);
- PIX_ENDEVENT();
+ BGFX_D3D11_PROFILER_END();
}
m_deviceCtx->OMSetRenderTargets(1, s_zero.m_rtv, NULL);