From 3452eb6fe6c1a7f4994652e898d839d4e3fda7a3 Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Thu, 27 Dec 2018 08:52:19 -0800 Subject: Fix for memory access violation when reading debug name from d3d11 textures --- .../GraphicsEngineD3D11/src/Texture1D_D3D11.cpp | 69 +++++++++++++--------- .../GraphicsEngineD3D11/src/Texture2D_D3D11.cpp | 67 ++++++++++++--------- .../GraphicsEngineD3D11/src/Texture3D_D3D11.cpp | 66 ++++++++++++--------- 3 files changed, 117 insertions(+), 85 deletions(-) (limited to 'Graphics/GraphicsEngineD3D11') diff --git a/Graphics/GraphicsEngineD3D11/src/Texture1D_D3D11.cpp b/Graphics/GraphicsEngineD3D11/src/Texture1D_D3D11.cpp index e7a2d679..1a1da97f 100644 --- a/Graphics/GraphicsEngineD3D11/src/Texture1D_D3D11.cpp +++ b/Graphics/GraphicsEngineD3D11/src/Texture1D_D3D11.cpp @@ -70,38 +70,49 @@ Texture1D_D3D11 :: Texture1D_D3D11(IReferenceCounters* pRefCounters, } } -static TextureDesc TexDescFromD3D11Texture1D(ID3D11Texture1D *pd3d11Texture) +namespace { - D3D11_TEXTURE1D_DESC D3D11TexDesc; - pd3d11Texture->GetDesc(&D3D11TexDesc); - - TextureDesc TexDesc; - UINT DataSize = 0; - pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, nullptr); - std::vector ObjectName; - if (DataSize > 0) +class TexDescFromD3D11Texture1D +{ +public: + TextureDesc operator() (ID3D11Texture1D* pd3d11Texture) { - ObjectName.resize(DataSize+1); // Null terminator is not reported in DataSize - pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, ObjectName.data()); - TexDesc.Name = ObjectName.data(); + D3D11_TEXTURE1D_DESC D3D11TexDesc; + pd3d11Texture->GetDesc(&D3D11TexDesc); + + TextureDesc TexDesc; + + UINT DataSize = 0; + pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, nullptr); + if (DataSize > 0) + { + ObjectName.resize(DataSize+1); // Null terminator is not reported in DataSize + pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, ObjectName.data()); + TexDesc.Name = ObjectName.data(); + } + else + TexDesc.Name = "Texture1D_D3D11 from native d3d11 texture"; + + TexDesc.Type = D3D11TexDesc.ArraySize > 1 ? RESOURCE_DIM_TEX_1D_ARRAY : RESOURCE_DIM_TEX_1D; + TexDesc.Width = Uint32{D3D11TexDesc.Width}; + TexDesc.Height = 1; + TexDesc.ArraySize = Uint32{D3D11TexDesc.ArraySize}; + TexDesc.Format = DXGI_FormatToTexFormat(D3D11TexDesc.Format); + TexDesc.MipLevels = Uint32{D3D11TexDesc.MipLevels}; + TexDesc.SampleCount = 1; + TexDesc.Usage = D3D11UsageToUsage(D3D11TexDesc.Usage); + TexDesc.BindFlags = D3D11BindFlagsToBindFlags(D3D11TexDesc.BindFlags); + TexDesc.CPUAccessFlags = D3D11CPUAccessFlagsToCPUAccessFlags(D3D11TexDesc.CPUAccessFlags); + TexDesc.MiscFlags = D3D11MiscFlagsToMiscTextureFlags(D3D11TexDesc.MiscFlags); + + return TexDesc; } - else - TexDesc.Name = "Texture1D_D3D11 from native d3d11 texture"; - - TexDesc.Type = D3D11TexDesc.ArraySize > 1 ? RESOURCE_DIM_TEX_1D_ARRAY : RESOURCE_DIM_TEX_1D; - TexDesc.Width = Uint32{D3D11TexDesc.Width}; - TexDesc.Height = 1; - TexDesc.ArraySize = Uint32{D3D11TexDesc.ArraySize}; - TexDesc.Format = DXGI_FormatToTexFormat(D3D11TexDesc.Format); - TexDesc.MipLevels = Uint32{D3D11TexDesc.MipLevels}; - TexDesc.SampleCount = 1; - TexDesc.Usage = D3D11UsageToUsage(D3D11TexDesc.Usage); - TexDesc.BindFlags = D3D11BindFlagsToBindFlags(D3D11TexDesc.BindFlags); - TexDesc.CPUAccessFlags = D3D11CPUAccessFlagsToCPUAccessFlags(D3D11TexDesc.CPUAccessFlags); - TexDesc.MiscFlags = D3D11MiscFlagsToMiscTextureFlags(D3D11TexDesc.MiscFlags); - - return TexDesc; + +private: + std::vector ObjectName; +}; + } Texture1D_D3D11 :: Texture1D_D3D11(IReferenceCounters* pRefCounters, @@ -109,7 +120,7 @@ Texture1D_D3D11 :: Texture1D_D3D11(IReferenceCounters* pRefCounters, RenderDeviceD3D11Impl* pDeviceD3D11, RESOURCE_STATE InitialState, ID3D11Texture1D* pd3d11Texture) : - TextureBaseD3D11(pRefCounters, TexViewObjAllocator, pDeviceD3D11, TexDescFromD3D11Texture1D(pd3d11Texture), TextureData()) + TextureBaseD3D11(pRefCounters, TexViewObjAllocator, pDeviceD3D11, TexDescFromD3D11Texture1D{}(pd3d11Texture), TextureData{}) { m_pd3d11Texture = pd3d11Texture; SetState(InitialState); diff --git a/Graphics/GraphicsEngineD3D11/src/Texture2D_D3D11.cpp b/Graphics/GraphicsEngineD3D11/src/Texture2D_D3D11.cpp index 91d264a7..c3e43bc3 100644 --- a/Graphics/GraphicsEngineD3D11/src/Texture2D_D3D11.cpp +++ b/Graphics/GraphicsEngineD3D11/src/Texture2D_D3D11.cpp @@ -75,37 +75,48 @@ Texture2D_D3D11 :: Texture2D_D3D11(IReferenceCounters* pRefCounters, } } -static TextureDesc TexDescFromD3D11Texture2D(ID3D11Texture2D *pd3d11Texture) +namespace { - D3D11_TEXTURE2D_DESC D3D11TexDesc; - pd3d11Texture->GetDesc(&D3D11TexDesc); - TextureDesc TexDesc; - UINT DataSize = 0; - pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, nullptr); - std::vector ObjectName; - if (DataSize > 0) +class TexDescFromD3D11Texture2D +{ +public: + TextureDesc operator ()(ID3D11Texture2D* pd3d11Texture) { - ObjectName.resize(DataSize+1); // Null terminator is not reported in DataSize - pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, ObjectName.data()); - TexDesc.Name = ObjectName.data(); + D3D11_TEXTURE2D_DESC D3D11TexDesc; + pd3d11Texture->GetDesc(&D3D11TexDesc); + + TextureDesc TexDesc; + UINT DataSize = 0; + pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, nullptr); + if (DataSize > 0) + { + ObjectName.resize(DataSize+1); // Null terminator is not reported in DataSize + pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, ObjectName.data()); + TexDesc.Name = ObjectName.data(); + } + else + TexDesc.Name = "Texture2D_D3D11 from native d3d11 texture"; + + TexDesc.Type = D3D11TexDesc.ArraySize > 1 ? RESOURCE_DIM_TEX_2D_ARRAY : RESOURCE_DIM_TEX_2D; + TexDesc.Width = Uint32{D3D11TexDesc.Width}; + TexDesc.Height = Uint32{D3D11TexDesc.Height}; + TexDesc.ArraySize = Uint32{D3D11TexDesc.ArraySize}; + TexDesc.Format = DXGI_FormatToTexFormat(D3D11TexDesc.Format); + TexDesc.MipLevels = Uint32{D3D11TexDesc.MipLevels}; + TexDesc.SampleCount = Uint32{D3D11TexDesc.SampleDesc.Count}; + TexDesc.Usage = D3D11UsageToUsage(D3D11TexDesc.Usage); + TexDesc.BindFlags = D3D11BindFlagsToBindFlags(D3D11TexDesc.BindFlags); + TexDesc.CPUAccessFlags = D3D11CPUAccessFlagsToCPUAccessFlags(D3D11TexDesc.CPUAccessFlags); + TexDesc.MiscFlags = D3D11MiscFlagsToMiscTextureFlags(D3D11TexDesc.MiscFlags); + + return TexDesc; } - else - TexDesc.Name = "Texture2D_D3D11 from native d3d11 texture"; - - TexDesc.Type = D3D11TexDesc.ArraySize > 1 ? RESOURCE_DIM_TEX_2D_ARRAY : RESOURCE_DIM_TEX_2D; - TexDesc.Width = Uint32{D3D11TexDesc.Width}; - TexDesc.Height = Uint32{D3D11TexDesc.Height}; - TexDesc.ArraySize = Uint32{D3D11TexDesc.ArraySize}; - TexDesc.Format = DXGI_FormatToTexFormat(D3D11TexDesc.Format); - TexDesc.MipLevels = Uint32{D3D11TexDesc.MipLevels}; - TexDesc.SampleCount = Uint32{ D3D11TexDesc.SampleDesc.Count }; - TexDesc.Usage = D3D11UsageToUsage(D3D11TexDesc.Usage); - TexDesc.BindFlags = D3D11BindFlagsToBindFlags(D3D11TexDesc.BindFlags); - TexDesc.CPUAccessFlags = D3D11CPUAccessFlagsToCPUAccessFlags(D3D11TexDesc.CPUAccessFlags); - TexDesc.MiscFlags = D3D11MiscFlagsToMiscTextureFlags(D3D11TexDesc.MiscFlags); - - return TexDesc; + +private: + std::vector ObjectName; +}; + } Texture2D_D3D11 :: Texture2D_D3D11(IReferenceCounters* pRefCounters, @@ -113,7 +124,7 @@ Texture2D_D3D11 :: Texture2D_D3D11(IReferenceCounters* pRefCounters, RenderDeviceD3D11Impl* pDeviceD3D11, RESOURCE_STATE InitialState, ID3D11Texture2D* pd3d11Texture) : - TextureBaseD3D11(pRefCounters, TexViewObjAllocator, pDeviceD3D11, TexDescFromD3D11Texture2D(pd3d11Texture), TextureData()) + TextureBaseD3D11(pRefCounters, TexViewObjAllocator, pDeviceD3D11, TexDescFromD3D11Texture2D{}(pd3d11Texture), TextureData{}) { m_pd3d11Texture = pd3d11Texture; SetState(InitialState); diff --git a/Graphics/GraphicsEngineD3D11/src/Texture3D_D3D11.cpp b/Graphics/GraphicsEngineD3D11/src/Texture3D_D3D11.cpp index 3a6e9051..591be330 100644 --- a/Graphics/GraphicsEngineD3D11/src/Texture3D_D3D11.cpp +++ b/Graphics/GraphicsEngineD3D11/src/Texture3D_D3D11.cpp @@ -71,37 +71,47 @@ Texture3D_D3D11 :: Texture3D_D3D11(IReferenceCounters* pRefCounters, } } -static TextureDesc TexDescFromD3D11Texture3D(ID3D11Texture3D* pd3d11Texture) +namespace { - D3D11_TEXTURE3D_DESC D3D11TexDesc; - pd3d11Texture->GetDesc(&D3D11TexDesc); - TextureDesc TexDesc; - UINT DataSize = 0; - pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, nullptr); - std::vector ObjectName; - if (DataSize > 0) +class TexDescFromD3D11Texture3D +{ +public: + TextureDesc operator() (ID3D11Texture3D* pd3d11Texture) { - ObjectName.resize(DataSize+1); // Null terminator is not reported in - pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, ObjectName.data()); - TexDesc.Name = ObjectName.data(); + D3D11_TEXTURE3D_DESC D3D11TexDesc; + pd3d11Texture->GetDesc(&D3D11TexDesc); + + TextureDesc TexDesc; + UINT DataSize = 0; + pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, nullptr); + if (DataSize > 0) + { + ObjectName.resize(DataSize+1); // Null terminator is not reported in + pd3d11Texture->GetPrivateData(WKPDID_D3DDebugObjectName, &DataSize, ObjectName.data()); + TexDesc.Name = ObjectName.data(); + } + else + TexDesc.Name = "Texture3D_D3D11 from native d3d11 texture"; + + TexDesc.Type = RESOURCE_DIM_TEX_3D; + TexDesc.Width = Uint32{D3D11TexDesc.Width}; + TexDesc.Height = Uint32{D3D11TexDesc.Height}; + TexDesc.Depth = Uint32{D3D11TexDesc.Depth}; + TexDesc.Format = DXGI_FormatToTexFormat(D3D11TexDesc.Format); + TexDesc.MipLevels = Uint32{D3D11TexDesc.MipLevels}; + TexDesc.SampleCount = 1; + TexDesc.Usage = D3D11UsageToUsage(D3D11TexDesc.Usage); + TexDesc.BindFlags = D3D11BindFlagsToBindFlags(D3D11TexDesc.BindFlags); + TexDesc.CPUAccessFlags = D3D11CPUAccessFlagsToCPUAccessFlags(D3D11TexDesc.CPUAccessFlags); + TexDesc.MiscFlags = D3D11MiscFlagsToMiscTextureFlags(D3D11TexDesc.MiscFlags); + + return TexDesc; } - else - TexDesc.Name = "Texture3D_D3D11 from native d3d11 texture"; - - TexDesc.Type = RESOURCE_DIM_TEX_3D; - TexDesc.Width = Uint32{D3D11TexDesc.Width}; - TexDesc.Height = Uint32{D3D11TexDesc.Height}; - TexDesc.Depth = Uint32{D3D11TexDesc.Depth}; - TexDesc.Format = DXGI_FormatToTexFormat(D3D11TexDesc.Format); - TexDesc.MipLevels = Uint32{D3D11TexDesc.MipLevels}; - TexDesc.SampleCount = 1; - TexDesc.Usage = D3D11UsageToUsage(D3D11TexDesc.Usage); - TexDesc.BindFlags = D3D11BindFlagsToBindFlags(D3D11TexDesc.BindFlags); - TexDesc.CPUAccessFlags = D3D11CPUAccessFlagsToCPUAccessFlags(D3D11TexDesc.CPUAccessFlags); - TexDesc.MiscFlags = D3D11MiscFlagsToMiscTextureFlags(D3D11TexDesc.MiscFlags); - - return TexDesc; +private: + std::vector ObjectName; +}; + } Texture3D_D3D11 :: Texture3D_D3D11(IReferenceCounters* pRefCounters, @@ -109,7 +119,7 @@ Texture3D_D3D11 :: Texture3D_D3D11(IReferenceCounters* pRefCounters, RenderDeviceD3D11Impl* pDeviceD3D11, RESOURCE_STATE InitialState, ID3D11Texture3D* pd3d11Texture) : - TextureBaseD3D11(pRefCounters, TexViewObjAllocator, pDeviceD3D11, TexDescFromD3D11Texture3D(pd3d11Texture), TextureData()) + TextureBaseD3D11(pRefCounters, TexViewObjAllocator, pDeviceD3D11, TexDescFromD3D11Texture3D{}(pd3d11Texture), TextureData{}) { m_pd3d11Texture = pd3d11Texture; SetState(InitialState); -- cgit v1.2.3