1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-01-18 20:52:10 +01:00

[d3d11] Implement ID3D11Device2

Adds some extra validation to resource creation so that
apps cannot accidentally create tiled resources.
This commit is contained in:
Philip Rebohle 2019-09-15 18:40:57 +02:00
parent c1a7243811
commit 7ba7178d14
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
4 changed files with 79 additions and 5 deletions

View File

@ -204,6 +204,10 @@ namespace dxvk {
if (!pDesc->ByteWidth)
return E_INVALIDARG;
// We don't support tiled resources
if (pDesc->MiscFlags & (D3D11_RESOURCE_MISC_TILE_POOL | D3D11_RESOURCE_MISC_TILED))
return E_INVALIDARG;
// Basic validation for structured buffers
if ((pDesc->MiscFlags & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED)
&& ((pDesc->StructureByteStride == 0)

View File

@ -1040,6 +1040,13 @@ namespace dxvk {
return S_OK;
}
HRESULT STDMETHODCALLTYPE D3D11Device::CreateDeferredContext2(
UINT ContextFlags,
ID3D11DeviceContext2** ppDeferredContext) {
*ppDeferredContext = ref(new D3D11DeferredContext(this, m_dxvkDevice, ContextFlags));
return S_OK;
}
HRESULT STDMETHODCALLTYPE D3D11Device::CreateDeviceContextState(
UINT Flags,
const D3D_FEATURE_LEVEL* pFeatureLevels,
@ -1125,12 +1132,28 @@ namespace dxvk {
DXGI_FORMAT Format,
UINT SampleCount,
UINT* pNumQualityLevels) {
return CheckMultisampleQualityLevels1(Format, SampleCount, 0, pNumQualityLevels);
}
HRESULT STDMETHODCALLTYPE D3D11Device::CheckMultisampleQualityLevels1(
DXGI_FORMAT Format,
UINT SampleCount,
UINT Flags,
UINT* pNumQualityLevels) {
// There are many error conditions, so we'll just assume
// that we will fail and return a non-zero value in case
// the device does actually support the format.
if (!pNumQualityLevels)
return E_INVALIDARG;
// We don't support tiled resources, but it's unclear what
// we are supposed to return in this case. Be conservative.
if (Flags) {
*pNumQualityLevels = 0;
return E_FAIL;
}
// For some reason, we can query DXGI_FORMAT_UNKNOWN
if (Format == DXGI_FORMAT_UNKNOWN) {
*pNumQualityLevels = SampleCount == 1 ? 1 : 0;
@ -1167,8 +1190,8 @@ namespace dxvk {
*pNumQualityLevels = 1;
return S_OK;
}
void STDMETHODCALLTYPE D3D11Device::CheckCounterInfo(D3D11_COUNTER_INFO* pCounterInfo) {
// We basically don't support counters
pCounterInfo->LastDeviceDependentCounter = D3D11_COUNTER(0);
@ -1392,7 +1415,12 @@ namespace dxvk {
}
void STDMETHODCALLTYPE D3D11Device::GetImmediateContext1(ID3D11DeviceContext1 ** ppImmediateContext) {
void STDMETHODCALLTYPE D3D11Device::GetImmediateContext1(ID3D11DeviceContext1** ppImmediateContext) {
*ppImmediateContext = ref(m_context);
}
void STDMETHODCALLTYPE D3D11Device::GetImmediateContext2(ID3D11DeviceContext2** ppImmediateContext) {
*ppImmediateContext = ref(m_context);
}
@ -1407,6 +1435,21 @@ namespace dxvk {
Logger::err("D3D11Device::GetExceptionMode: Not implemented");
return 0;
}
void STDMETHODCALLTYPE D3D11Device::GetResourceTiling(
ID3D11Resource* pTiledResource,
UINT* pNumTilesForEntireResource,
D3D11_PACKED_MIP_DESC* pPackedMipDesc,
D3D11_TILE_SHAPE* pStandardTileShapeForNonPackedMips,
UINT* pNumSubresourceTilings,
UINT FirstSubresourceTilingToGet,
D3D11_SUBRESOURCE_TILING* pSubresourceTilingsForNonPackedMips) {
static bool s_errorShown = false;
if (!std::exchange(s_errorShown, true))
Logger::err("D3D11Device::GetResourceTiling: Not implemented");
}
DXGI_VK_FORMAT_INFO D3D11Device::LookupFormat(
@ -1995,7 +2038,8 @@ namespace dxvk {
}
if (riid == __uuidof(ID3D11Device)
|| riid == __uuidof(ID3D11Device1)) {
|| riid == __uuidof(ID3D11Device1)
|| riid == __uuidof(ID3D11Device2)) {
*ppvObject = ref(&m_d3d11Device);
return S_OK;
}

View File

@ -45,7 +45,7 @@ namespace dxvk {
* Implements the ID3D11Device interfaces
* as part of a \ref D3D11DeviceContainer.
*/
class D3D11Device final : public ID3D11Device1 {
class D3D11Device final : public ID3D11Device2 {
/// Maximum number of resource init commands per command buffer
constexpr static uint64_t InitCommandThreshold = 50;
public:
@ -206,6 +206,10 @@ namespace dxvk {
UINT ContextFlags,
ID3D11DeviceContext1** ppDeferredContext);
HRESULT STDMETHODCALLTYPE CreateDeferredContext2(
UINT ContextFlags,
ID3D11DeviceContext2** ppDeferredContext);
HRESULT STDMETHODCALLTYPE CreateDeviceContextState(
UINT Flags,
const D3D_FEATURE_LEVEL* pFeatureLevels,
@ -240,6 +244,12 @@ namespace dxvk {
UINT SampleCount,
UINT* pNumQualityLevels);
HRESULT STDMETHODCALLTYPE CheckMultisampleQualityLevels1(
DXGI_FORMAT Format,
UINT SampleCount,
UINT Flags,
UINT* pNumQualityLevels);
void STDMETHODCALLTYPE CheckCounterInfo(
D3D11_COUNTER_INFO* pCounterInfo);
@ -285,10 +295,22 @@ namespace dxvk {
void STDMETHODCALLTYPE GetImmediateContext1(
ID3D11DeviceContext1** ppImmediateContext);
void STDMETHODCALLTYPE GetImmediateContext2(
ID3D11DeviceContext2** ppImmediateContext);
HRESULT STDMETHODCALLTYPE SetExceptionMode(UINT RaiseFlags);
UINT STDMETHODCALLTYPE GetExceptionMode();
void STDMETHODCALLTYPE GetResourceTiling(
ID3D11Resource* pTiledResource,
UINT* pNumTilesForEntireResource,
D3D11_PACKED_MIP_DESC* pPackedMipDesc,
D3D11_TILE_SHAPE* pStandardTileShapeForNonPackedMips,
UINT* pNumSubresourceTilings,
UINT FirstSubresourceTilingToGet,
D3D11_SUBRESOURCE_TILING* pSubresourceTilingsForNonPackedMips);
Rc<DxvkDevice> GetDXVKDevice() {
return m_dxvkDevice;
}

View File

@ -282,6 +282,10 @@ namespace dxvk {
!= (D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET))
return E_INVALIDARG;
// TILE_POOL is invalid, but we don't support TILED either
if (pDesc->MiscFlags & (D3D11_RESOURCE_MISC_TILE_POOL | D3D11_RESOURCE_MISC_TILED))
return E_INVALIDARG;
// Use the maximum possible mip level count if the supplied
// mip level count is either unspecified (0) or invalid
const uint32_t maxMipLevelCount = pDesc->SampleDesc.Count <= 1