diff options
Diffstat (limited to '3rdparty/bgfx/src/renderer_d3d9.cpp')
-rw-r--r-- | 3rdparty/bgfx/src/renderer_d3d9.cpp | 569 |
1 files changed, 315 insertions, 254 deletions
diff --git a/3rdparty/bgfx/src/renderer_d3d9.cpp b/3rdparty/bgfx/src/renderer_d3d9.cpp index 21dbef68ff2..ff1a2cf0aec 100644 --- a/3rdparty/bgfx/src/renderer_d3d9.cpp +++ b/3rdparty/bgfx/src/renderer_d3d9.cpp @@ -1,6 +1,6 @@ /* - * Copyright 2011-2018 Branimir Karadzic. All rights reserved. - * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause + * Copyright 2011-2022 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE */ #include "bgfx_p.h" @@ -12,7 +12,7 @@ namespace bgfx { namespace d3d9 { 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]; struct PrimInfo { @@ -183,12 +183,20 @@ namespace bgfx { namespace d3d9 { D3DFMT_UNKNOWN }, // ATC, { D3DFMT_UNKNOWN }, // ATCE, { D3DFMT_UNKNOWN }, // ATCI, - { D3DFMT_UNKNOWN }, // ASTC4x4, - { D3DFMT_UNKNOWN }, // ASTC5x5, - { D3DFMT_UNKNOWN }, // ASTC6x6, - { D3DFMT_UNKNOWN }, // ASTC8x5, - { D3DFMT_UNKNOWN }, // ASTC8x6, - { D3DFMT_UNKNOWN }, // ASTC10x5, + { D3DFMT_UNKNOWN }, // ASTC4x4 + { D3DFMT_UNKNOWN }, // ASTC5x4 + { D3DFMT_UNKNOWN }, // ASTC5x5 + { D3DFMT_UNKNOWN }, // ASTC6x5 + { D3DFMT_UNKNOWN }, // ASTC6x6 + { D3DFMT_UNKNOWN }, // ASTC8x5 + { D3DFMT_UNKNOWN }, // ASTC8x6 + { D3DFMT_UNKNOWN }, // ASTC8x8 + { D3DFMT_UNKNOWN }, // ASTC10x5 + { D3DFMT_UNKNOWN }, // ASTC10x6 + { D3DFMT_UNKNOWN }, // ASTC10x8 + { D3DFMT_UNKNOWN }, // ASTC10x10 + { D3DFMT_UNKNOWN }, // ASTC12x10 + { D3DFMT_UNKNOWN }, // ASTC12x12 { D3DFMT_UNKNOWN }, // Unknown { D3DFMT_A1 }, // R1 { D3DFMT_A8 }, // A8 @@ -234,8 +242,11 @@ namespace bgfx { namespace d3d9 { D3DFMT_UNKNOWN }, // RGBA32I { D3DFMT_UNKNOWN }, // RGBA32U { D3DFMT_A32B32G32R32F }, // RGBA32F + { D3DFMT_R5G6B5 }, // B5G6R5 { D3DFMT_R5G6B5 }, // R5G6B5 + { D3DFMT_A4R4G4B4 }, // BGRA4 { D3DFMT_A4R4G4B4 }, // RGBA4 + { D3DFMT_A1R5G5B5 }, // BGR5A1 { D3DFMT_A1R5G5B5 }, // RGB5A1 { D3DFMT_A2B10G10R10 }, // RGB10A2 { D3DFMT_UNKNOWN }, // RG11B10F @@ -335,25 +346,25 @@ namespace bgfx { namespace d3d9 }; BX_STATIC_ASSERT(AttribType::Count == BX_COUNTOF(s_attribType) ); - static D3DVERTEXELEMENT9* fillVertexDecl(uint8_t _stream, D3DVERTEXELEMENT9* _out, const VertexDecl& _decl) + static D3DVERTEXELEMENT9* fillVertexLayout(uint8_t _stream, D3DVERTEXELEMENT9* _out, const VertexLayout& _layout) { D3DVERTEXELEMENT9* 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]) { uint8_t num; 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); bx::memCopy(elem, &s_attrib[attr], sizeof(D3DVERTEXELEMENT9) ); elem->Stream = _stream; elem->Type = s_attribType[type][num-1][normalized]; - elem->Offset = _decl.m_offset[attr]; + elem->Offset = _layout.m_offset[attr]; ++elem; } } @@ -373,6 +384,35 @@ namespace bgfx { namespace d3d9 ; } + inline bool useD3D9Pitch(bimg::TextureFormat::Enum _format) + { + // Reference(s): + // - For BC4 and B5 in DX9 LockRect returns wrong number of + // bytes. If actual mip size is used it causes memory corruption. + // https://web.archive.org/web/20190207230133/http://www.aras-p.info/texts/D3D9GPUHacks.html + return true + && _format != bimg::TextureFormat::BC4 + && _format != bimg::TextureFormat::BC5 + ; + } + + static inline uint32_t calcRowPitch(const bimg::ImageBlockInfo& _blockInfo, uint8_t _lod, uint32_t _width) + { + const uint8_t blockWidth = _blockInfo.blockWidth; + const uint8_t blockHeight = _blockInfo.blockHeight; + const uint8_t minBlockX = _blockInfo.minBlockX; + const uint8_t bitsPerPixel = _blockInfo.bitsPerPixel; + + // Calculate the row pitch + const uint32_t minBlkWidth = minBlockX; + const uint32_t lodBlkWidth = (((_width >> _lod) + blockWidth - 1) / blockWidth); + const uint32_t rowBlkWidth = bx::max<uint32_t>(minBlkWidth, lodBlkWidth); + const uint32_t pixBlkWidth = rowBlkWidth * blockWidth * blockHeight; + const uint32_t rowPitch = pixBlkWidth * bitsPerPixel / 8u; + + return rowPitch; + } + struct RendererContextD3D9 : public RendererContextI { RendererContextD3D9() @@ -420,34 +460,40 @@ namespace bgfx { namespace d3d9 D3DFORMAT adapterFormat = D3DFMT_X8R8G8B8; - // http://msdn.microsoft.com/en-us/library/windows/desktop/bb172588%28v=vs.85%29.aspx + // Reference(s): + // - https://web.archive.org/web/20190207230309/https://docs.microsoft.com/en-us/windows/desktop/direct3d9/d3dpresent-parameters bx::memSet(&m_params, 0, sizeof(m_params) ); - m_params.BackBufferWidth = _init.resolution.width; - m_params.BackBufferHeight = _init.resolution.height; - m_params.BackBufferFormat = adapterFormat; - m_params.BackBufferCount = bx::clamp<uint8_t>(_init.resolution.numBackBuffers, 2, BGFX_CONFIG_MAX_BACK_BUFFERS); - m_params.MultiSampleType = D3DMULTISAMPLE_NONE; - m_params.MultiSampleQuality = 0; + m_params.BackBufferWidth = _init.resolution.width; + m_params.BackBufferHeight = _init.resolution.height; + m_params.BackBufferFormat = adapterFormat; + m_params.BackBufferCount = bx::clamp<uint8_t>(_init.resolution.numBackBuffers, 2, BGFX_CONFIG_MAX_BACK_BUFFERS); + m_params.MultiSampleType = D3DMULTISAMPLE_NONE; + m_params.MultiSampleQuality = 0; m_params.EnableAutoDepthStencil = TRUE; m_params.AutoDepthStencilFormat = D3DFMT_D24S8; - m_params.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL; + m_params.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL; m_params.FullScreen_RefreshRateInHz = 0; - m_params.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - m_params.SwapEffect = D3DSWAPEFFECT_DISCARD; - m_params.hDeviceWindow = NULL; - m_params.Windowed = true; - - RECT rect; - GetWindowRect( (HWND)g_platformData.nwh, &rect); - m_params.BackBufferWidth = rect.right-rect.left; - m_params.BackBufferHeight = rect.bottom-rect.top; + m_params.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + m_params.SwapEffect = D3DSWAPEFFECT_DISCARD; + m_params.hDeviceWindow = NULL; + m_params.Windowed = true; + m_params.BackBufferWidth = _init.resolution.width; + m_params.BackBufferHeight = _init.resolution.height; + + const char* d3d9DllName = +#if BX_PLATFORM_LINUX + "d3d9.so" +#else + "d3d9.dll" +#endif // BX_PLATFORM_LINUX + ; - m_d3d9Dll = bx::dlopen("d3d9.dll"); + m_d3d9Dll = bx::dlopen(d3d9DllName); if (NULL == m_d3d9Dll) { - BX_TRACE("Init error: Failed to load d3d9.dll."); + BX_TRACE("Init error: Failed to load %s.", d3d9DllName); goto error; } @@ -455,17 +501,22 @@ namespace bgfx { namespace d3d9 m_nvapi.init(); - if (BX_ENABLED(BGFX_CONFIG_DEBUG_PIX) ) + if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) ) { 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; + } } m_d3d9ex = NULL; @@ -675,10 +726,10 @@ namespace bgfx { namespace d3d9 | BGFX_CAPS_VERTEX_ATTRIB_UINT10 | BGFX_CAPS_FRAGMENT_DEPTH | BGFX_CAPS_SWAP_CHAIN - | ( (UINT16_MAX < m_caps.MaxVertexIndex) ? BGFX_CAPS_INDEX32 : 0) | ( (m_caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) ? BGFX_CAPS_TEXTURE_BLIT : 0) | BGFX_CAPS_TEXTURE_READ_BACK | (m_occlusionQuerySupport ? BGFX_CAPS_OCCLUSION_QUERY : 0) + | ((m_caps.MaxVertexIndex > UINT16_MAX) ? BGFX_CAPS_INDEX32 : 0) ); m_caps.NumSimultaneousRTs = bx::uint32_min(m_caps.NumSimultaneousRTs, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS); @@ -963,20 +1014,20 @@ namespace bgfx { namespace d3d9 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); + m_vertexBuffers[_handle.idx].create(_mem->size, _mem->data, _layoutHandle); } void destroyVertexBuffer(VertexBufferHandle _handle) override @@ -1001,8 +1052,8 @@ namespace bgfx { namespace d3d9 void createDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _size, uint16_t /*_flags*/) override { - VertexDeclHandle decl = BGFX_INVALID_HANDLE; - m_vertexBuffers[_handle.idx].create(_size, NULL, decl); + VertexLayoutHandle layoutHandle = BGFX_INVALID_HANDLE; + m_vertexBuffers[_handle.idx].create(_size, NULL, layoutHandle); } void updateDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _offset, uint32_t _size, const Memory* _mem) override @@ -1100,7 +1151,7 @@ namespace bgfx { namespace d3d9 bx::StaticMemoryBlockWriter writer(mem->data, mem->size); uint32_t magic = BGFX_CHUNK_MAGIC_TEX; - bx::write(&writer, magic); + bx::write(&writer, magic, bx::ErrorAssert{}); TextureCreate tc; tc.m_width = _width; @@ -1111,7 +1162,7 @@ namespace bgfx { namespace d3d9 tc.m_format = TextureFormat::Enum(texture.m_requestedFormat); tc.m_cubeMap = false; tc.m_mem = NULL; - bx::write(&writer, tc); + bx::write(&writer, tc, bx::ErrorAssert{}); texture.destroy(true); texture.create(mem, texture.m_flags, 0); @@ -1178,7 +1229,7 @@ namespace bgfx { namespace d3d9 BX_FREE(g_allocator, m_uniforms[_handle.idx]); } - uint32_t size = BX_ALIGN_16(g_uniformTypeSize[_type]*_num); + const uint32_t size = bx::alignUp(g_uniformTypeSize[_type]*_num, 16); void* data = BX_ALLOC(g_allocator, size); bx::memSet(data, 0, size); m_uniforms[_handle.idx] = data; @@ -1194,6 +1245,7 @@ namespace bgfx { namespace d3d9 void requestScreenShot(FrameBufferHandle _handle, const char* _filePath) override { +#if BX_PLATFORM_WINDOWS IDirect3DSwapChain9* swapChain = isValid(_handle) ? m_frameBuffers[_handle.idx].m_swapChain : m_swapChain @@ -1257,11 +1309,15 @@ namespace bgfx { namespace d3d9 DX_CHECK(surface->UnlockRect() ); DX_RELEASE(surface, 0); +#else + BX_TRACE("Screenshot not supported!"); + BX_UNUSED(_handle, _filePath); +#endif // BX_PLATFORM_WINDOWS } 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 @@ -1280,25 +1336,26 @@ namespace bgfx { namespace d3d9 bx::memCopy(m_uniforms[_loc], _data, _size); } - void setMarker(const char* _marker, uint32_t _size) override + void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override { -#if 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); -#endif // BGFX_CONFIG_DEBUG_PIX - BX_UNUSED(_marker, _size); + 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); + mbstowcs(name, _marker, size); + name[_len] = L'\0'; + 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 { - BX_UNUSED(_handle, _name) + BX_UNUSED(_handle, _name, _len) } void submitBlit(BlitState& _bs, uint16_t _view); @@ -1337,9 +1394,9 @@ namespace bgfx { namespace d3d9 DX_CHECK(device->SetPixelShader(program.m_fsh->m_pixelShader) ); VertexBufferD3D9& vb = m_vertexBuffers[_blitter.m_vb->handle.idx]; - VertexDecl& vertexDecl = m_vertexDecls[_blitter.m_vb->decl.idx]; - DX_CHECK(device->SetStreamSource(0, vb.m_ptr, 0, vertexDecl.m_stride) ); - setInputLayout(vertexDecl, 0); + VertexLayout& layout = m_vertexLayouts[_blitter.m_vb->layoutHandle.idx]; + DX_CHECK(device->SetStreamSource(0, vb.m_ptr, 0, layout.m_stride) ); + setInputLayout(layout, 0); IndexBufferD3D9& ib = m_indexBuffers[_blitter.m_ib->handle.idx]; DX_CHECK(device->SetIndices(ib.m_ptr) ); @@ -1360,7 +1417,7 @@ namespace bgfx { namespace d3d9 if (0 < numVertices) { 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); DX_CHECK(m_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST , 0 @@ -1481,7 +1538,7 @@ namespace bgfx { namespace d3d9 void setShaderUniform(uint8_t _flags, uint32_t _regIndex, const void* _val, uint32_t _numRegs) { - if (_flags&BGFX_UNIFORM_FRAGMENTBIT) + if (_flags&kUniformFragmentBit) { DX_CHECK(m_device->SetPixelShaderConstantF(_regIndex, (const float*)_val, _numRegs) ); } @@ -1530,11 +1587,6 @@ namespace bgfx { namespace d3d9 { if (NULL != m_swapChain) { - if (NULL != m_deviceEx) - { - DX_CHECK(m_deviceEx->WaitForVBlank(0) ); - } - for (uint32_t ii = 0, num = m_numWindows; ii < num; ++ii) { HRESULT hr = S_OK; @@ -1698,10 +1750,10 @@ namespace bgfx { namespace d3d9 } } - void setSamplerState(uint8_t _stage, uint32_t _flags, const float _rgba[4]) + void setSamplerState(uint8_t _stage, uint64_t _flags, const float _rgba[4]) { - const uint32_t flags = _flags&( (~BGFX_SAMPLER_RESERVED_MASK) | BGFX_SAMPLER_BITS_MASK | BGFX_TEXTURE_SRGB); - BX_CHECK(_stage < BX_COUNTOF(m_samplerFlags), ""); + const uint64_t flags = _flags&( (~BGFX_SAMPLER_RESERVED_MASK) | BGFX_SAMPLER_BITS_MASK | BGFX_TEXTURE_SRGB); + BX_ASSERT(_stage < BX_COUNTOF(m_samplerFlags), ""); if (m_samplerFlags[_stage] != flags) { m_samplerFlags[_stage] = flags; @@ -1866,7 +1918,7 @@ namespace bgfx { namespace d3d9 } \ break; \ \ - case UniformType::_uniform|BGFX_UNIFORM_FRAGMENTBIT: \ + case UniformType::_uniform|kUniformFragmentBit: \ { \ _type* value = (_type*)data; \ DX_CHECK(device->SetPixelShaderConstant##_dxsuffix(loc, value, num) ); \ @@ -1898,7 +1950,7 @@ namespace bgfx { namespace d3d9 } break; - case UniformType::Mat3|BGFX_UNIFORM_FRAGMENTBIT: + case UniformType::Mat3|kUniformFragmentBit: { float* value = (float*)data; for (uint32_t ii = 0, count = num/3; ii < count; ++ii, loc += 3, value += 9) @@ -1921,9 +1973,9 @@ namespace bgfx { namespace d3d9 } 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; @@ -2051,54 +2103,25 @@ namespace bgfx { namespace d3d9 DX_CHECK(device->SetRenderState(D3DRS_STENCILENABLE, FALSE) ); } - VertexBufferD3D9& vb = m_vertexBuffers[_clearQuad.m_vb->handle.idx]; - VertexDecl& vertexDecl = m_vertexDecls[_clearQuad.m_vb->decl.idx]; - uint32_t stride = _clearQuad.m_decl.m_stride; - - { - struct Vertex - { - float m_x; - float m_y; - float m_z; - }; - - 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; - } - - vb.update(0, 4*stride, _clearQuad.m_vb->data); + VertexBufferD3D9& vb = m_vertexBuffers[_clearQuad.m_vb.idx]; + VertexLayout& layout = _clearQuad.m_layout; + uint32_t stride = _clearQuad.m_layout.m_stride; ProgramD3D9& program = m_program[_clearQuad.m_program[numMrt-1].idx]; device->SetVertexShader(program.m_vsh->m_vertexShader); device->SetPixelShader(program.m_fsh->m_pixelShader); - float mrtClear[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS][4]; + float mrtClearDepth[4] = { _clear.m_depth }; + DX_CHECK(device->SetVertexShaderConstantF(0, mrtClearDepth, 1)); + + float mrtClearColor[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS][4]; if (BGFX_CLEAR_COLOR_USE_PALETTE & _clear.m_flags) { 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); } } else @@ -2113,16 +2136,16 @@ namespace bgfx { namespace d3d9 for (uint32_t ii = 0; ii < numMrt; ++ii) { - bx::memCopy(mrtClear[ii], rgba, 16); + bx::memCopy(mrtClearColor[ii], rgba, 16); } } - DX_CHECK(device->SetPixelShaderConstantF(0, mrtClear[0], numMrt)); + DX_CHECK(device->SetPixelShaderConstantF(0, mrtClearColor[0], numMrt)); DX_CHECK(device->SetStreamSource(0, vb.m_ptr, 0, stride) ); DX_CHECK(device->SetStreamSourceFreq(0, 1) ); DX_CHECK(device->SetStreamSource(1, NULL, 0, 0) ); - setInputLayout(vertexDecl, 0); + setInputLayout(layout, 0); DX_CHECK(device->SetIndices(NULL) ); DX_CHECK(device->DrawPrimitive(D3DPT_TRIANGLESTRIP , 0 @@ -2131,14 +2154,14 @@ namespace bgfx { namespace d3d9 } } - void setInputLayout(uint8_t _numStreams, const VertexDecl** _vertexDecls, uint16_t _numInstanceData) + void setInputLayout(uint8_t _numStreams, const VertexLayout** _layouts, 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 = murmur.end(); @@ -2150,7 +2173,7 @@ namespace bgfx { namespace d3d9 for (uint8_t stream = 0; stream < _numStreams; ++stream) { - elem = fillVertexDecl(stream, elem, *_vertexDecls[stream]); + elem = fillVertexLayout(stream, elem, *_layouts[stream]); } const D3DVERTEXELEMENT9 inst = { _numStreams, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }; @@ -2173,10 +2196,10 @@ namespace bgfx { namespace d3d9 DX_CHECK(m_device->SetVertexDeclaration(layout) ); } - void setInputLayout(const VertexDecl& _vertexDecl, uint16_t _numInstanceData) + void setInputLayout(const VertexLayout& _layout, uint16_t _numInstanceData) { - const VertexDecl* decls[1] = { &_vertexDecl }; - setInputLayout(BX_COUNTOF(decls), decls, _numInstanceData); + const VertexLayout* layouts[1] = { &_layout }; + setInputLayout(BX_COUNTOF(layouts), layouts, _numInstanceData); } D3DCAPS9 m_caps; @@ -2230,12 +2253,12 @@ namespace bgfx { namespace d3d9 ShaderD3D9 m_shaders[BGFX_CONFIG_MAX_SHADERS]; ProgramD3D9 m_program[BGFX_CONFIG_MAX_PROGRAMS]; TextureD3D9 m_textures[BGFX_CONFIG_MAX_TEXTURES]; - VertexDecl m_vertexDecls[BGFX_CONFIG_MAX_VERTEX_DECLS]; + VertexLayout m_vertexLayouts[BGFX_CONFIG_MAX_VERTEX_LAYOUTS]; FrameBufferD3D9 m_frameBuffers[BGFX_CONFIG_MAX_FRAME_BUFFERS]; UniformRegistry m_uniformReg; void* m_uniforms[BGFX_CONFIG_MAX_UNIFORMS]; - uint32_t m_samplerFlags[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS]; + uint64_t m_samplerFlags[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS]; TextureD3D9* m_updateTexture; uint8_t* m_updateTextureBits; @@ -2334,10 +2357,10 @@ namespace bgfx { namespace d3d9 } } - void VertexBufferD3D9::create(uint32_t _size, void* _data, VertexDeclHandle _declHandle) + void VertexBufferD3D9::create(uint32_t _size, void* _data, VertexLayoutHandle _layoutHandle) { m_size = _size; - m_decl = _declHandle; + m_layoutHandle = _layoutHandle; uint32_t usage = D3DUSAGE_WRITEONLY; D3DPOOL pool = s_renderD3D9->m_pool; @@ -2391,13 +2414,15 @@ namespace bgfx { namespace d3d9 { bx::MemoryReader reader(_mem->data, _mem->size); + bx::ErrorAssert err; + uint32_t magic; - bx::read(&reader, magic); + bx::read(&reader, magic, &err); const bool fragment = isShaderType(magic, 'F'); uint32_t hashIn; - bx::read(&reader, hashIn); + bx::read(&reader, hashIn, &err); uint32_t hashOut; @@ -2407,40 +2432,52 @@ namespace bgfx { namespace d3d9 } else { - bx::read(&reader, hashOut); + bx::read(&reader, hashOut, &err); } uint16_t count; - bx::read(&reader, count); + bx::read(&reader, count, &err); m_numPredefined = 0; BX_TRACE("Shader consts %d", count); - uint8_t fragmentBit = fragment ? BGFX_UNIFORM_FRAGMENTBIT : 0; + uint8_t fragmentBit = fragment ? kUniformFragmentBit : 0; if (0 < count) { for (uint32_t ii = 0; ii < count; ++ii) { uint8_t nameSize = 0; - bx::read(&reader, nameSize); + bx::read(&reader, nameSize, &err); char name[256] = {}; - bx::read(&reader, &name, nameSize); + bx::read(&reader, &name, nameSize, &err); name[nameSize] = '\0'; uint8_t type = 0; - bx::read(&reader, type); + bx::read(&reader, type, &err); uint8_t num = 0; - bx::read(&reader, num); + bx::read(&reader, num, &err); uint16_t regIndex = 0; - bx::read(&reader, regIndex); + bx::read(&reader, regIndex, &err); uint16_t regCount = 0; - bx::read(&reader, regCount); + bx::read(&reader, regCount, &err); + + if (!isShaderVerLess(magic, 8) ) + { + uint16_t texInfo = 0; + bx::read(&reader, texInfo, &err); + } + + if (!isShaderVerLess(magic, 10) ) + { + uint16_t texFormat = 0; + bx::read(&reader, texFormat, &err); + } const char* kind = "invalid"; @@ -2453,7 +2490,7 @@ namespace bgfx { namespace d3d9 m_predefined[m_numPredefined].m_type = uint8_t(predefined|fragmentBit); m_numPredefined++; } - else if (0 == (BGFX_UNIFORM_SAMPLERBIT & type) ) + else if (0 == (kUniformSamplerBit & type) ) { const UniformRegInfo* info = s_renderD3D9->m_uniformReg.find(name); BX_WARN(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name); @@ -2477,7 +2514,7 @@ namespace bgfx { namespace d3d9 BX_TRACE("\t%s: %s (%s), num %2d, r.index %3d, r.count %2d" , kind , name - , getUniformTypeName(UniformType::Enum(type&~BGFX_UNIFORM_MASK) ) + , getUniformTypeName(UniformType::Enum(type&~kUniformMask) ) , num , regIndex , regCount @@ -2492,7 +2529,7 @@ namespace bgfx { namespace d3d9 } uint32_t shaderSize; - bx::read(&reader, shaderSize); + bx::read(&reader, shaderSize, &err); const DWORD* code = (const DWORD*)reader.getDataPtr(); @@ -2796,7 +2833,7 @@ namespace bgfx { namespace d3d9 } } - BX_CHECK(false, "You should not be here."); + BX_ASSERT(false, "You should not be here."); _pitch = 0; _slicePitch = 0; return NULL; @@ -2830,7 +2867,7 @@ namespace bgfx { namespace d3d9 return; } - BX_CHECK(false, "You should not be here."); + BX_ASSERT(false, "You should not be here."); } void TextureD3D9::dirty(uint8_t _side, const Rect& _rect, uint16_t _z, uint16_t _depth) @@ -2873,7 +2910,7 @@ namespace bgfx { namespace d3d9 return; } - BX_CHECK(false, "You should not be here."); + BX_ASSERT(false, "You should not be here."); } IDirect3DSurface9* TextureD3D9::getSurface(uint8_t _side, uint8_t _mip) const @@ -2887,7 +2924,7 @@ namespace bgfx { namespace d3d9 break; case Texture3D: - BX_CHECK(false, ""); + BX_ASSERT(false, ""); break; case TextureCube: @@ -2904,18 +2941,28 @@ namespace bgfx { namespace d3d9 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 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 = textureWidth; - m_height = textureHeight; - m_depth = imageContainer.m_depth; - m_numMips = numMips; + m_width = ti.width; + m_height = ti.height; + m_depth = ti.depth; + m_numMips = ti.numMips; m_requestedFormat = uint8_t(imageContainer.m_format); m_textureFormat = uint8_t(getViableTextureFormat(imageContainer) ); const bool convert = m_textureFormat != m_requestedFormat; @@ -2924,23 +2971,23 @@ namespace bgfx { namespace d3d9 if (imageContainer.m_cubeMap) { - createCubeTexture(textureWidth, numMips); + createCubeTexture(ti.width, ti.numMips); } else if (imageContainer.m_depth > 1) { - createVolumeTexture(textureWidth, textureHeight, imageContainer.m_depth, numMips); + createVolumeTexture(ti.width, ti.height, ti.depth, ti.numMips); } else { - createTexture(textureWidth, textureHeight, numMips); + createTexture(ti.width, ti.height, ti.numMips); } BX_TRACE("Texture %3d: %s (requested: %s), %dx%d%s%s." , this - s_renderD3D9->m_textures , getName( (TextureFormat::Enum)m_textureFormat) , getName( (TextureFormat::Enum)m_requestedFormat) - , textureWidth - , textureHeight + , ti.width + , ti.height , imageContainer.m_cubeMap ? "x6" : "" , 0 != (m_flags&BGFX_TEXTURE_RT_MASK) ? " (render target)" : "" ); @@ -2950,29 +2997,22 @@ namespace bgfx { namespace d3d9 return; } - // For BC4 and B5 in DX9 LockRect returns wrong number of - // bytes. If actual mip size is used it causes memory corruption. - // http://www.aras-p.info/texts/D3D9GPUHacks.html#3dc - const bool useMipSize = true - && imageContainer.m_format != bimg::TextureFormat::BC4 - && imageContainer.m_format != bimg::TextureFormat::BC5 - ; - + const bool useMipSize = useD3D9Pitch(imageContainer.m_format); for (uint8_t side = 0, numSides = imageContainer.m_cubeMap ? 6 : 1; side < numSides; ++side) { - uint32_t width = textureWidth; - uint32_t height = textureHeight; - uint32_t depth = imageContainer.m_depth; - uint32_t mipWidth = imageContainer.m_width; - uint32_t mipHeight = imageContainer.m_height; + uint32_t width = ti.width; + uint32_t height = ti.height; + uint32_t depth = ti.depth; + uint32_t mipWidth = ti.width; + uint32_t mipHeight = ti.height; - for (uint8_t lod = 0, num = numMips; lod < num; ++lod) + for (uint8_t lod = 0, num = ti.numMips; lod < num; ++lod) { - width = bx::uint32_max(1, width); - height = bx::uint32_max(1, height); - depth = bx::uint32_max(1, depth); - mipWidth = bx::uint32_max(blockInfo.blockWidth, mipWidth); - mipHeight = bx::uint32_max(blockInfo.blockHeight, mipHeight); + width = bx::max<uint32_t>(1, width); + height = bx::max<uint32_t>(1, height); + depth = bx::max<uint32_t>(1, depth); + mipWidth = bx::max<uint32_t>(blockInfo.blockWidth, mipWidth); + mipHeight = bx::max<uint32_t>(blockInfo.blockHeight, mipHeight); uint32_t mipSize = width*height*depth*bpp/8; bimg::ImageMip mip; @@ -3000,7 +3040,7 @@ namespace bgfx { namespace d3d9 , mip.m_format ); - bx::memCopy(bits, temp, pitch, height, srcpitch, pitch); + bx::memCopy(bits, pitch, temp, srcpitch, pitch, height); BX_FREE(g_allocator, temp); } @@ -3014,14 +3054,18 @@ namespace bgfx { namespace d3d9 uint32_t size = useMipSize ? mip.m_size : mipSize; switch (m_textureFormat) { - case TextureFormat::RGB5A1: - bimg::imageConvert(bits, 16, bx::packBgr5a1, mip.m_data, bx::unpackRgb5a1, size); + case TextureFormat::R5G6B5: + bimg::imageConvert(bits, 16, bx::packB5G6R5, mip.m_data, bx::unpackR5G6B5, size); break; case TextureFormat::RGBA4: bimg::imageConvert(bits, 16, bx::packBgra4, mip.m_data, bx::unpackRgba4, size); break; + case TextureFormat::RGB5A1: + bimg::imageConvert(bits, 16, bx::packBgr5a1, mip.m_data, bx::unpackRgb5a1, size); + break; + default: bx::memCopy(bits, mip.m_data, size); break; @@ -3051,11 +3095,14 @@ namespace bgfx { namespace d3d9 void TextureD3D9::update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem) { - const uint32_t bpp = bimg::getBitsPerPixel(bimg::TextureFormat::Enum(m_textureFormat) ); - const uint32_t rectpitch = _rect.m_width*bpp/8; - const uint32_t srcpitch = UINT16_MAX == _pitch ? rectpitch : _pitch; - const uint32_t dstpitch = s_renderD3D9->m_updateTexturePitch; - uint8_t* bits = s_renderD3D9->m_updateTextureBits + _rect.m_y*dstpitch + _rect.m_x*bpp/8; + const bimg::ImageBlockInfo & blockInfo = bimg::getBlockInfo(bimg::TextureFormat::Enum(m_textureFormat) ); + const uint16_t blockHeight = blockInfo.blockHeight; + const uint16_t bpp = blockInfo.bitsPerPixel; + const bool useLockedPitch = useD3D9Pitch(bimg::TextureFormat::Enum(m_textureFormat) ); + const uint32_t rectpitch = calcRowPitch(blockInfo, 0, _rect.m_width); + const uint32_t srcpitch = UINT16_MAX == _pitch ? rectpitch : _pitch; + const uint32_t dstpitch = (useLockedPitch) ? s_renderD3D9->m_updateTexturePitch : calcRowPitch(blockInfo, _mip, m_width); + uint8_t* bits = s_renderD3D9->m_updateTextureBits + _rect.m_y*dstpitch/blockHeight + _rect.m_x*blockHeight*bpp/8; const bool convert = m_textureFormat != m_requestedFormat; @@ -3072,18 +3119,22 @@ namespace bgfx { namespace d3d9 { uint8_t* src = data; uint8_t* dst = bits; - for (uint32_t yy = 0, height = _rect.m_height; yy < height; ++yy) + for (uint32_t yy = 0, height = _rect.m_height; yy < height; yy += blockHeight) { switch (m_textureFormat) { - case TextureFormat::RGB5A1: - bimg::imageConvert(dst, 16, bx::packBgr5a1, src, bx::unpackRgb5a1, rectpitch); + case TextureFormat::R5G6B5: + bimg::imageConvert(dst, 16, bx::packB5G6R5, src, bx::unpackR5G6B5, rectpitch); break; case TextureFormat::RGBA4: bimg::imageConvert(dst, 16, bx::packBgra4, src, bx::unpackRgba4, rectpitch); break; + case TextureFormat::RGB5A1: + bimg::imageConvert(dst, 16, bx::packBgr5a1, src, bx::unpackRgb5a1, rectpitch); + break; + default: bx::memCopy(dst, src, rectpitch); break; @@ -3111,9 +3162,8 @@ namespace bgfx { namespace d3d9 void TextureD3D9::commit(uint8_t _stage, uint32_t _flags, const float _palette[][4]) { - const uint32_t flags = 0 == (BGFX_SAMPLER_INTERNAL_DEFAULT & _flags) - ? _flags - : uint32_t(m_flags) + const uint64_t flags = (m_flags & BGFX_TEXTURE_SRGB) + | (0 == (BGFX_SAMPLER_INTERNAL_DEFAULT & _flags) ? _flags : uint32_t(m_flags) ) ; uint32_t index = (flags & BGFX_SAMPLER_BORDER_COLOR_MASK) >> BGFX_SAMPLER_BORDER_COLOR_SHIFT; s_renderD3D9->setSamplerState(_stage, flags, _palette[index]); @@ -3252,9 +3302,11 @@ namespace bgfx { namespace d3d9 D3DPRESENT_PARAMETERS params; bx::memCopy(¶ms, &s_renderD3D9->m_params, sizeof(D3DPRESENT_PARAMETERS) ); - params.BackBufferFormat = TextureFormat::Count == _format ? params.BackBufferFormat : s_textureFormat[_format].m_fmt; - params.BackBufferWidth = m_width; - params.BackBufferHeight = m_height; + params.BackBufferFormat = TextureFormat::Count == _format ? params.BackBufferFormat : s_textureFormat[_format].m_fmt; + params.BackBufferWidth = m_width; + params.BackBufferHeight = m_height; + params.MultiSampleType = s_msaa[0].m_type; + params.MultiSampleQuality = s_msaa[0].m_quality; DX_CHECK(s_renderD3D9->m_device->CreateAdditionalSwapChain(¶ms, &m_swapChain) ); DX_CHECK(m_swapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &m_surface[0]) ); @@ -3404,7 +3456,7 @@ namespace bgfx { namespace d3d9 } else { - BX_CHECK(false, ""); + BX_ASSERT(false, ""); } } } @@ -3499,7 +3551,7 @@ namespace bgfx { namespace d3d9 } } - uint32_t TimerQueryD3D9::begin(uint32_t _resultIdx) + uint32_t TimerQueryD3D9::begin(uint32_t _resultIdx, uint32_t _frameNum) { while (0 == m_control.reserve(1) ) { @@ -3513,6 +3565,7 @@ namespace bgfx { namespace d3d9 Query& query = m_query[idx]; query.m_resultIdx = _resultIdx; query.m_ready = false; + query.m_frameNum = _frameNum; query.m_disjoint->Issue(D3DISSUE_BEGIN); query.m_begin->Issue(D3DISSUE_END); @@ -3563,6 +3616,7 @@ namespace bgfx { namespace d3d9 Result& result = m_result[query.m_resultIdx]; --result.m_pending; + result.m_frameNum = query.m_frameNum; result.m_frequency = freq; result.m_begin = timeBegin; @@ -3659,15 +3713,8 @@ namespace bgfx { namespace d3d9 const TextureD3D9& src = m_textures[blit.m_src.idx]; const TextureD3D9& dst = m_textures[blit.m_dst.idx]; - uint32_t srcWidth = bx::uint32_min(src.m_width, blit.m_srcX + blit.m_width) - blit.m_srcX; - uint32_t srcHeight = bx::uint32_min(src.m_height, blit.m_srcY + blit.m_height) - blit.m_srcY; - uint32_t dstWidth = bx::uint32_min(dst.m_width, blit.m_dstX + blit.m_width) - blit.m_dstX; - uint32_t dstHeight = bx::uint32_min(dst.m_height, blit.m_dstY + blit.m_height) - blit.m_dstY; - uint32_t width = bx::uint32_min(srcWidth, dstWidth); - uint32_t height = bx::uint32_min(srcHeight, dstHeight); - - RECT srcRect = { LONG(blit.m_srcX), LONG(blit.m_srcY), LONG(blit.m_srcX + width), LONG(blit.m_srcY + height) }; - RECT dstRect = { LONG(blit.m_dstX), LONG(blit.m_dstY), LONG(blit.m_dstX + width), LONG(blit.m_dstY + height) }; + RECT srcRect = { LONG(blit.m_srcX), LONG(blit.m_srcY), LONG(blit.m_srcX + blit.m_width), LONG(blit.m_srcY + blit.m_height) }; + RECT dstRect = { LONG(blit.m_dstX), LONG(blit.m_dstY), LONG(blit.m_dstX + blit.m_width), LONG(blit.m_dstY + blit.m_height) }; IDirect3DSurface9* srcSurface = src.getSurface(uint8_t(blit.m_srcZ), blit.m_srcMip); IDirect3DSurface9* dstSurface = dst.getSurface(uint8_t(blit.m_dstZ), blit.m_dstMip); @@ -3708,10 +3755,10 @@ namespace bgfx { namespace d3d9 { IDirect3DDevice9* device = m_device; - PIX_BEGINEVENT(D3DCOLOR_FRAME, L"rendererSubmit"); - updateResolution(_render->m_resolution); + BGFX_D3D9_PROFILER_BEGIN_LITERAL("rendererSubmit", kColorView); + int64_t timeBegin = bx::getHPCounter(); int64_t captureElapsed = 0; @@ -3720,17 +3767,19 @@ namespace bgfx { namespace d3d9 device->BeginScene(); if (m_timerQuerySupport) { - frameQueryIdx = m_gpuTimer.begin(BGFX_CONFIG_MAX_VIEWS); + frameQueryIdx = m_gpuTimer.begin(BGFX_CONFIG_MAX_VIEWS, _render->m_frameNum); } 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); } @@ -3745,10 +3794,11 @@ namespace bgfx { namespace d3d9 RenderBind currentBind; currentBind.clear(); - ViewState viewState(_render, false); + static ViewState viewState; + viewState.reset(_render); DX_CHECK(device->SetRenderState(D3DRS_FILLMODE, _render->m_debug&BGFX_DEBUG_WIREFRAME ? D3DFILL_WIREFRAME : D3DFILL_SOLID) ); - uint16_t programIdx = kInvalidHandle; + ProgramHandle currentProgram = BGFX_INVALID_HANDLE; SortKey key; uint16_t view = UINT16_MAX; FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS }; @@ -3797,7 +3847,7 @@ namespace bgfx { namespace d3d9 if (isCompute) { - BX_CHECK(false, "Compute is not supported on DirectX 9."); + BX_ASSERT(false, "Compute is not supported on DirectX 9."); continue; } @@ -3838,22 +3888,23 @@ namespace bgfx { namespace d3d9 currentState.m_stencil = newStencil; view = key.m_view; - programIdx = kInvalidHandle; - - if (_render->m_view[view].m_fbh.idx != fbh.idx) - { - fbh = _render->m_view[view].m_fbh; - setFrameBuffer(fbh); - } + currentProgram = BGFX_INVALID_HANDLE; - PIX_ENDEVENT(); if (item > 0) { profiler.end(); } + BGFX_D3D9_PROFILER_END(); + BGFX_D3D9_PROFILER_BEGIN(view, kColorView); + profiler.begin(view); - PIX_BEGINEVENT(D3DCOLOR_VIEW, s_viewNameW[view]); + + if (_render->m_view[view].m_fbh.idx != fbh.idx) + { + fbh = _render->m_view[view].m_fbh; + setFrameBuffer(fbh); + } viewState.m_rect = _render->m_view[view].m_rect; const Rect& scissorRect = _render->m_view[view].m_scissor; @@ -3976,6 +4027,7 @@ namespace bgfx { namespace d3d9 if ( (0 | BGFX_STATE_CULL_MASK +// | BGFX_STATE_FRONT_CCW | BGFX_STATE_WRITE_Z | BGFX_STATE_DEPTH_TEST_MASK | BGFX_STATE_WRITE_RGB @@ -4114,18 +4166,18 @@ namespace bgfx { namespace d3d9 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) ) { device->SetVertexShader(NULL); device->SetPixelShader(NULL); } else { - ProgramD3D9& program = m_program[programIdx]; + ProgramD3D9& program = m_program[currentProgram.idx]; device->SetVertexShader(program.m_vsh->m_vertexShader); device->SetPixelShader(NULL == program.m_fsh ? NULL @@ -4137,9 +4189,9 @@ namespace bgfx { namespace d3d9 constantsChanged = true; } - if (kInvalidHandle != programIdx) + if (isValid(currentProgram) ) { - ProgramD3D9& program = m_program[programIdx]; + ProgramD3D9& program = m_program[currentProgram.idx]; if (constantsChanged) { @@ -4159,7 +4211,7 @@ namespace bgfx { namespace d3d9 } } - viewState.setPredefined<4>(this, view, 0, program, _render, draw); + viewState.setPredefined<4>(this, view, program, _render, draw); } { @@ -4196,7 +4248,7 @@ namespace bgfx { namespace d3d9 currentState.m_instanceDataOffset = draw.m_instanceDataOffset; currentState.m_instanceDataStride = draw.m_instanceDataStride; - const VertexDecl* decls[BGFX_CONFIG_MAX_VERTEX_STREAMS]; + const VertexLayout* layouts[BGFX_CONFIG_MAX_VERTEX_STREAMS]; const bool instanced = true && isValid(draw.m_instanceDataBuffer) @@ -4210,25 +4262,28 @@ namespace bgfx { namespace d3d9 uint32_t numVertices = draw.m_numVertices; uint8_t numStreams = 0; - 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 VertexBufferD3D9& 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; - decls[numStreams] = &vertexDecl; + layouts[numStreams] = &layout; numVertices = bx::uint32_min(UINT32_MAX == draw.m_numVertices ? vb.m_size/stride @@ -4240,8 +4295,6 @@ namespace bgfx { namespace d3d9 DX_CHECK(device->SetStreamSource(numStreams, vb.m_ptr, 0, stride) ); } - currentState.m_numVertices = numVertices; - if (0 < numStreams) { if (instanced) @@ -4249,12 +4302,12 @@ namespace bgfx { namespace d3d9 const VertexBufferD3D9& inst = m_vertexBuffers[draw.m_instanceDataBuffer.idx]; DX_CHECK(device->SetStreamSourceFreq(numStreams, UINT(D3DSTREAMSOURCE_INSTANCEDATA|1) ) ); DX_CHECK(device->SetStreamSource(numStreams, inst.m_ptr, draw.m_instanceDataOffset, draw.m_instanceDataStride) ); - setInputLayout(numStreams, decls, draw.m_instanceDataStride/16); + setInputLayout(numStreams, layouts, draw.m_instanceDataStride/16); } else { DX_CHECK(device->SetStreamSource(numStreams, NULL, 0, 0) ); - setInputLayout(numStreams, decls, 0); + setInputLayout(numStreams, layouts, 0); } } else @@ -4298,7 +4351,8 @@ namespace bgfx { namespace d3d9 if (UINT32_MAX == draw.m_numIndices) { const IndexBufferD3D9& ib = m_indexBuffers[draw.m_indexBuffer.idx]; - const uint32_t indexSize = 0 == (ib.m_flags & BGFX_BUFFER_INDEX32) ? 2 : 4; + const bool isIndex16 = draw.isIndex16(); + const uint32_t indexSize = isIndex16 ? 2 : 4; numIndices = ib.m_size/indexSize; numPrimsSubmitted = numIndices/prim.m_div - prim.m_sub; numInstances = draw.m_numInstances; @@ -4369,7 +4423,7 @@ namespace bgfx { namespace d3d9 } } - PIX_ENDEVENT(); + BGFX_D3D9_PROFILER_END(); int64_t timeEnd = bx::getHPCounter(); int64_t frameTime = timeEnd - timeBegin; @@ -4409,12 +4463,13 @@ namespace bgfx { namespace d3d9 perfStats.numCompute = statsKeyType[1]; perfStats.numBlit = _render->m_numBlitItems; perfStats.maxGpuLatency = maxGpuLatency; + perfStats.gpuFrameNum = result.m_frameNum; bx::memCopy(perfStats.numPrims, statsNumPrimsRendered, sizeof(perfStats.numPrims) ); m_nvapi.getMemoryInfo(perfStats.gpuMemoryUsed, perfStats.gpuMemoryMax); if (_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) ) { - PIX_BEGINEVENT(D3DCOLOR_FRAME, L"debugstats"); + BGFX_D3D9_PROFILER_BEGIN_LITERAL("debugstats", kColorFrame); m_needPresent = true; TextVideoMem& tvm = m_textVideoMem; @@ -4431,8 +4486,14 @@ namespace bgfx { namespace d3d9 tvm.clear(); uint16_t pos = 0; tvm.printf(0, pos++, BGFX_CONFIG_DEBUG ? 0x8c : 0x8f - , " %s / " BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME " " + , " %s / " BX_COMPILER_NAME + " / " BX_CPU_NAME + " / " BX_ARCH_NAME + " / " BX_PLATFORM_NAME + " / Version 1.%d.%d (commit: " BGFX_REV_SHA1 ")" , getRendererName() + , BGFX_API_VERSION + , BGFX_REV_NUMBER ); const D3DADAPTER_IDENTIFIER9& identifier = m_identifier; @@ -4512,15 +4573,15 @@ namespace bgfx { namespace d3d9 blit(this, _textVideoMemBlitter, tvm); - PIX_ENDEVENT(); + BGFX_D3D9_PROFILER_END(); } else if (_render->m_debug & BGFX_DEBUG_TEXT) { - PIX_BEGINEVENT(D3DCOLOR_FRAME, L"debugtext"); + BGFX_D3D9_PROFILER_BEGIN_LITERAL("debugtext", kColorFrame); blit(this, _textVideoMemBlitter, _render->m_textVideoMem); - PIX_ENDEVENT(); + BGFX_D3D9_PROFILER_END(); } device->EndScene(); |