diff --git a/rpcs3/Emu/RSX/D3D12/D3D12.h b/rpcs3/Emu/RSX/D3D12/D3D12.h index 346dfb7ea7..f88ab827a2 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12.h @@ -60,4 +60,33 @@ void streamBuffer(void* dst, void* src, size_t sizeInBytes) } } +inline +D3D12_RESOURCE_DESC getBufferResourceDesc(size_t sizeInByte) +{ + D3D12_RESOURCE_DESC BufferDesc = {}; + BufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + BufferDesc.Width = (UINT)sizeInByte; + BufferDesc.Height = 1; + BufferDesc.DepthOrArraySize = 1; + BufferDesc.SampleDesc.Count = 1; + BufferDesc.MipLevels = 1; + BufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + return BufferDesc; +} + +inline +D3D12_RESOURCE_DESC getTexture2DResourceDesc(size_t width, size_t height, DXGI_FORMAT dxgiFormat) +{ + D3D12_RESOURCE_DESC result; + result = {}; + result.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + result.Width = width; + result.Height = height; + result.Format = dxgiFormat; + result.DepthOrArraySize = 1; + result.SampleDesc.Count = 1; + result.MipLevels = 1; + return result; +} + #endif \ No newline at end of file diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index 4cb26c1358..5955aaf556 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -132,19 +132,7 @@ void expandIndexedQuads(DstType *dst, const SrcType *src, size_t indexCount) } } -static -D3D12_RESOURCE_DESC getBufferResourceDesc(size_t sizeInByte) -{ - D3D12_RESOURCE_DESC BufferDesc = {}; - BufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; - BufferDesc.Width = (UINT)sizeInByte; - BufferDesc.Height = 1; - BufferDesc.DepthOrArraySize = 1; - BufferDesc.SampleDesc.Count = 1; - BufferDesc.MipLevels = 1; - BufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; - return BufferDesc; -} + // D3D12GS member handling buffers diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 00b982c729..46d4c0f4b3 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -303,10 +303,23 @@ D3D12GSRender::D3D12GSRender() p.first->Release(); p.second->Release(); + + D3D12_HEAP_PROPERTIES hp = {}; + hp.Type = D3D12_HEAP_TYPE_DEFAULT; + check( + m_device->CreateCommittedResource( + &hp, + D3D12_HEAP_FLAG_NONE, + &getTexture2DResourceDesc(2, 2, DXGI_FORMAT_R8G8B8A8_UNORM), + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&m_dummyTexture)) + ); } D3D12GSRender::~D3D12GSRender() { + m_dummyTexture->Release(); m_convertPSO->Release(); m_convertRootSignature->Release(); m_perFrameStorage.Release(); @@ -634,6 +647,28 @@ void D3D12GSRender::ExecCMD() commandList->SetPipelineState(m_PSO); size_t usedTexture = UploadTextures(); + // Drivers don't like undefined texture descriptors + for (; usedTexture < 16; usedTexture++) + { + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; + srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + srvDesc.Texture2D.MipLevels = 1; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + D3D12_CPU_DESCRIPTOR_HANDLE Handle = m_perFrameStorage.m_textureDescriptorsHeap->GetCPUDescriptorHandleForHeapStart(); + Handle.ptr += (m_perFrameStorage.m_currentTextureIndex + usedTexture) * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + m_device->CreateShaderResourceView(m_dummyTexture, &srvDesc, Handle); + + D3D12_SAMPLER_DESC samplerDesc = {}; + samplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_POINT; + samplerDesc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP; + samplerDesc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP; + samplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP; + Handle = m_perFrameStorage.m_samplerDescriptorHeap->GetCPUDescriptorHandleForHeapStart(); + Handle.ptr += (m_perFrameStorage.m_currentTextureIndex + usedTexture) * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + m_device->CreateSampler(&samplerDesc, Handle); + } + Handle = m_perFrameStorage.m_textureDescriptorsHeap->GetGPUDescriptorHandleForHeapStart(); Handle.ptr += m_perFrameStorage.m_currentTextureIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); commandList->SetDescriptorHeaps(1, &m_perFrameStorage.m_textureDescriptorsHeap); @@ -644,7 +679,7 @@ void D3D12GSRender::ExecCMD() commandList->SetDescriptorHeaps(1, &m_perFrameStorage.m_samplerDescriptorHeap); commandList->SetGraphicsRootDescriptorTable(3, Handle); - m_perFrameStorage.m_currentTextureIndex += usedTexture; + m_perFrameStorage.m_currentTextureIndex += 16; InitDrawBuffers(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index 82ae23fd18..8000c812e4 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -104,6 +104,9 @@ private: ID3D12CommandQueue *m_commandQueueCopy; ID3D12CommandQueue *m_commandQueueGraphic; + // Used to fill unused texture slot + ID3D12Resource *m_dummyTexture; + struct IDXGISwapChain3 *m_swapChain; //BackBuffers ID3D12Resource* m_backBuffer[2];