diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2018-12-27 16:52:19 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2018-12-27 16:52:19 +0000 |
| commit | 3452eb6fe6c1a7f4994652e898d839d4e3fda7a3 (patch) | |
| tree | 6437cdd0548f9fa03fb2cfd36a5c4bd43a79cedb /Graphics | |
| parent | Fixed shader version when compiling glsl in Vulkan on Mac (diff) | |
| download | DiligentCore-3452eb6fe6c1a7f4994652e898d839d4e3fda7a3.tar.gz DiligentCore-3452eb6fe6c1a7f4994652e898d839d4e3fda7a3.zip | |
Fix for memory access violation when reading debug name from d3d11 textures
Diffstat (limited to 'Graphics')
4 files changed, 118 insertions, 86 deletions
diff --git a/Graphics/GraphicsEngine/include/DeviceObjectBase.h b/Graphics/GraphicsEngine/include/DeviceObjectBase.h index f9a53979..3ad1ef85 100644 --- a/Graphics/GraphicsEngine/include/DeviceObjectBase.h +++ b/Graphics/GraphicsEngine/include/DeviceObjectBase.h @@ -55,7 +55,7 @@ public: // Do not keep strong reference to the device if the object is an internal device object m_spDevice (bIsDeviceInternal ? nullptr : pDevice), m_pDevice (pDevice), - m_ObjectNameCopy(ObjDesc.Name ? ObjDesc.Name : ThisToString()), + m_ObjectNameCopy(ObjDesc.Name ? String{ObjDesc.Name} : ThisToString()), m_Desc (ObjDesc) { m_Desc.Name = m_ObjectNameCopy.c_str(); 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<char> 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<char> 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<char> 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<char> 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<char> 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<char> 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); |
