diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index d1e2fa258f..f31d82984a 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -414,8 +414,8 @@ void D3D12GSRender::setScaleOffset() D3D12_CONSTANT_BUFFER_VIEW_DESC constantBufferViewDesc = {}; constantBufferViewDesc.BufferLocation = scaleOffsetBuffer->GetGPUVirtualAddress(); constantBufferViewDesc.SizeInBytes = (UINT)256; - D3D12_CPU_DESCRIPTOR_HANDLE Handle = m_perFrameStorage.m_scaleOffsetDescriptorHeap->GetCPUDescriptorHandleForHeapStart(); - Handle.ptr += m_perFrameStorage.m_currentScaleOffsetBufferIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + D3D12_CPU_DESCRIPTOR_HANDLE Handle = getCurrentResourceStorage().m_scaleOffsetDescriptorHeap->GetCPUDescriptorHandleForHeapStart(); + Handle.ptr += getCurrentResourceStorage().m_currentScaleOffsetBufferIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); m_device->CreateConstantBufferView(&constantBufferViewDesc, Handle); m_constantsData.m_resourceStoredSinceLastSync.push_back(std::make_tuple(heapOffset, 256, scaleOffsetBuffer)); } @@ -450,8 +450,8 @@ void D3D12GSRender::FillVertexShaderConstantsBuffer() D3D12_CONSTANT_BUFFER_VIEW_DESC constantBufferViewDesc = {}; constantBufferViewDesc.BufferLocation = constantsBuffer->GetGPUVirtualAddress(); constantBufferViewDesc.SizeInBytes = 512 * 4 * sizeof(float); - D3D12_CPU_DESCRIPTOR_HANDLE Handle = m_perFrameStorage.m_constantsBufferDescriptorsHeap->GetCPUDescriptorHandleForHeapStart(); - Handle.ptr += m_perFrameStorage.m_constantsBufferIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + D3D12_CPU_DESCRIPTOR_HANDLE Handle = getCurrentResourceStorage().m_constantsBufferDescriptorsHeap->GetCPUDescriptorHandleForHeapStart(); + Handle.ptr += getCurrentResourceStorage().m_constantsBufferIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); m_device->CreateConstantBufferView(&constantBufferViewDesc, Handle); m_constantsData.m_resourceStoredSinceLastSync.push_back(std::make_tuple(heapOffset, 512 * 4 * sizeof(float), constantsBuffer)); } @@ -523,8 +523,8 @@ void D3D12GSRender::FillPixelShaderConstantsBuffer() D3D12_CONSTANT_BUFFER_VIEW_DESC constantBufferViewDesc = {}; constantBufferViewDesc.BufferLocation = constantsBuffer->GetGPUVirtualAddress(); constantBufferViewDesc.SizeInBytes = (UINT)bufferSize; - D3D12_CPU_DESCRIPTOR_HANDLE Handle = m_perFrameStorage.m_constantsBufferDescriptorsHeap->GetCPUDescriptorHandleForHeapStart(); - Handle.ptr += m_perFrameStorage.m_constantsBufferIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + D3D12_CPU_DESCRIPTOR_HANDLE Handle = getCurrentResourceStorage().m_constantsBufferDescriptorsHeap->GetCPUDescriptorHandleForHeapStart(); + Handle.ptr += getCurrentResourceStorage().m_constantsBufferIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); m_device->CreateConstantBufferView(&constantBufferViewDesc, Handle); m_constantsData.m_resourceStoredSinceLastSync.push_back(std::make_tuple(heapOffset, bufferSize, constantsBuffer)); } diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 1764ab30d3..b284e0b6a0 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -98,6 +98,7 @@ void D3D12GSRender::ResourceStorage::Reset() void D3D12GSRender::ResourceStorage::Init(ID3D12Device *device) { + m_frameFinished = 0; // Create a global command allocator device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_commandAllocator)); device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_textureUploadCommandAllocator)); @@ -322,8 +323,10 @@ D3D12GSRender::D3D12GSRender() IID_PPV_ARGS(&m_rootSignatures[textureCount])); } - m_perFrameStorage.Init(m_device); - m_perFrameStorage.Reset(); + m_perFrameStorage[0].Init(m_device); + m_perFrameStorage[0].Reset(); + m_perFrameStorage[1].Init(m_device); + m_perFrameStorage[1].Reset(); vertexConstantShadowCopy = new float[512 * 4]; @@ -391,7 +394,8 @@ D3D12GSRender::~D3D12GSRender() m_dummyTexture->Release(); m_convertPSO->Release(); m_convertRootSignature->Release(); - m_perFrameStorage.Release(); + m_perFrameStorage[0].Release(); + m_perFrameStorage[1].Release(); m_commandQueueGraphic->Release(); m_commandQueueCopy->Release(); m_backbufferAsRendertarget[0]->Release(); @@ -436,8 +440,8 @@ void D3D12GSRender::ExecCMD(u32 cmd) InitDrawBuffers(); ID3D12GraphicsCommandList *commandList; - check(m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_perFrameStorage.m_commandAllocator, nullptr, IID_PPV_ARGS(&commandList))); - m_perFrameStorage.m_inflightCommandList.push_back(commandList); + check(m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, getCurrentResourceStorage().m_commandAllocator, nullptr, IID_PPV_ARGS(&commandList))); + getCurrentResourceStorage().m_inflightCommandList.push_back(commandList); /* if (m_set_color_mask) { @@ -686,8 +690,8 @@ void D3D12GSRender::ExecCMD() InitDrawBuffers(); ID3D12GraphicsCommandList *commandList; - m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_perFrameStorage.m_commandAllocator, nullptr, IID_PPV_ARGS(&commandList)); - m_perFrameStorage.m_inflightCommandList.push_back(commandList); + m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, getCurrentResourceStorage().m_commandAllocator, nullptr, IID_PPV_ARGS(&commandList)); + getCurrentResourceStorage().m_inflightCommandList.push_back(commandList); if (m_indexed_array.m_count) LoadVertexData(m_indexed_array.index_min, m_indexed_array.index_max - m_indexed_array.index_min + 1); @@ -711,20 +715,20 @@ void D3D12GSRender::ExecCMD() // Constants setScaleOffset(); - commandList->SetDescriptorHeaps(1, &m_perFrameStorage.m_scaleOffsetDescriptorHeap); - D3D12_GPU_DESCRIPTOR_HANDLE Handle = m_perFrameStorage.m_scaleOffsetDescriptorHeap->GetGPUDescriptorHandleForHeapStart(); - Handle.ptr += m_perFrameStorage.m_currentScaleOffsetBufferIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + commandList->SetDescriptorHeaps(1, &getCurrentResourceStorage().m_scaleOffsetDescriptorHeap); + D3D12_GPU_DESCRIPTOR_HANDLE Handle = getCurrentResourceStorage().m_scaleOffsetDescriptorHeap->GetGPUDescriptorHandleForHeapStart(); + Handle.ptr += getCurrentResourceStorage().m_currentScaleOffsetBufferIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); commandList->SetGraphicsRootDescriptorTable(0, Handle); - m_perFrameStorage.m_currentScaleOffsetBufferIndex++; + getCurrentResourceStorage().m_currentScaleOffsetBufferIndex++; - size_t currentBufferIndex = m_perFrameStorage.m_constantsBufferIndex; + size_t currentBufferIndex = getCurrentResourceStorage().m_constantsBufferIndex; FillVertexShaderConstantsBuffer(); - m_perFrameStorage.m_constantsBufferIndex++; + getCurrentResourceStorage().m_constantsBufferIndex++; FillPixelShaderConstantsBuffer(); - m_perFrameStorage.m_constantsBufferIndex++; + getCurrentResourceStorage().m_constantsBufferIndex++; - commandList->SetDescriptorHeaps(1, &m_perFrameStorage.m_constantsBufferDescriptorsHeap); - Handle = m_perFrameStorage.m_constantsBufferDescriptorsHeap->GetGPUDescriptorHandleForHeapStart(); + commandList->SetDescriptorHeaps(1, &getCurrentResourceStorage().m_constantsBufferDescriptorsHeap); + Handle = getCurrentResourceStorage().m_constantsBufferDescriptorsHeap->GetGPUDescriptorHandleForHeapStart(); Handle.ptr += currentBufferIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); commandList->SetGraphicsRootDescriptorTable(1, Handle); commandList->SetPipelineState(m_PSO->first); @@ -733,17 +737,17 @@ void D3D12GSRender::ExecCMD() { size_t usedTexture = UploadTextures(); - 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); + Handle = getCurrentResourceStorage().m_textureDescriptorsHeap->GetGPUDescriptorHandleForHeapStart(); + Handle.ptr += getCurrentResourceStorage().m_currentTextureIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + commandList->SetDescriptorHeaps(1, &getCurrentResourceStorage().m_textureDescriptorsHeap); commandList->SetGraphicsRootDescriptorTable(2, Handle); - Handle = m_perFrameStorage.m_samplerDescriptorHeap->GetGPUDescriptorHandleForHeapStart(); - Handle.ptr += m_perFrameStorage.m_currentTextureIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); - commandList->SetDescriptorHeaps(1, &m_perFrameStorage.m_samplerDescriptorHeap); + Handle = getCurrentResourceStorage().m_samplerDescriptorHeap->GetGPUDescriptorHandleForHeapStart(); + Handle.ptr += getCurrentResourceStorage().m_currentTextureIndex * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); + commandList->SetDescriptorHeaps(1, &getCurrentResourceStorage().m_samplerDescriptorHeap); commandList->SetGraphicsRootDescriptorTable(3, Handle); - m_perFrameStorage.m_currentTextureIndex += usedTexture; + getCurrentResourceStorage().m_currentTextureIndex += usedTexture; } size_t numRTT; @@ -843,8 +847,8 @@ void D3D12GSRender::ExecCMD() void D3D12GSRender::Flip() { ID3D12GraphicsCommandList *commandList; - m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_perFrameStorage.m_commandAllocator, nullptr, IID_PPV_ARGS(&commandList)); - m_perFrameStorage.m_inflightCommandList.push_back(commandList); + m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, getCurrentResourceStorage().m_commandAllocator, nullptr, IID_PPV_ARGS(&commandList)); + getCurrentResourceStorage().m_inflightCommandList.push_back(commandList); switch (m_surface_color_target) { @@ -887,43 +891,64 @@ void D3D12GSRender::Flip() // Add an event signaling queue completion Microsoft::WRL::ComPtr fence; m_device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence)); - HANDLE handle = CreateEvent(0, 0, 0, 0); - fence->SetEventOnCompletion(1, handle); + getCurrentResourceStorage().m_frameFinished = CreateEvent(0, 0, 0, 0); + fence->SetEventOnCompletion(1, getCurrentResourceStorage().m_frameFinished); m_commandQueueGraphic->Signal(fence.Get(), 1); - WaitForSingleObject(handle, INFINITE); - CloseHandle(handle); - m_perFrameStorage.Reset(); + + // Flush + getCurrentResourceStorage().Reset(); m_texturesCache.clear(); m_texturesRTTs.clear(); - for (auto tmp : m_constantsData.m_resourceStoredSinceLastSync) + if (getNonCurrentResourceStorage().m_frameFinished) { - std::get<2>(tmp)->Release(); - m_constantsData.m_getPos = std::get<0>(tmp); + WaitForSingleObject(getNonCurrentResourceStorage().m_frameFinished, INFINITE); + CloseHandle(getNonCurrentResourceStorage().m_frameFinished); + + for (auto tmp : getNonCurrentResourceStorage().m_inUseConstantsBuffers) + { + std::get<2>(tmp)->Release(); + m_constantsData.m_getPos = std::get<0>(tmp); + } + for (auto tmp : getNonCurrentResourceStorage().m_inUseVertexIndexBuffers) + { + std::get<2>(tmp)->Release(); + m_vertexIndexData.m_getPos = std::get<0>(tmp); + } + for (auto tmp : getNonCurrentResourceStorage().m_inUseTextureUploadBuffers) + { + std::get<2>(tmp)->Release(); + m_textureUploadData.m_getPos = std::get<0>(tmp); + } + for (auto tmp : getNonCurrentResourceStorage().m_inUseTexture2D) + { + std::get<2>(tmp)->Release(); + m_textureData.m_getPos = std::get<0>(tmp); + } } + + getNonCurrentResourceStorage().m_inUseConstantsBuffers = m_constantsData.m_resourceStoredSinceLastSync; m_constantsData.m_resourceStoredSinceLastSync.clear(); - for (auto tmp : m_vertexIndexData.m_resourceStoredSinceLastSync) - { - std::get<2>(tmp)->Release(); - m_vertexIndexData.m_getPos = std::get<0>(tmp); - } + getNonCurrentResourceStorage().m_inUseVertexIndexBuffers = m_vertexIndexData.m_resourceStoredSinceLastSync; m_vertexIndexData.m_resourceStoredSinceLastSync.clear(); - for (auto tmp : m_textureUploadData.m_resourceStoredSinceLastSync) - { - std::get<2>(tmp)->Release(); - m_textureUploadData.m_getPos = std::get<0>(tmp); - } + getNonCurrentResourceStorage().m_inUseTextureUploadBuffers = m_textureUploadData.m_resourceStoredSinceLastSync; m_textureUploadData.m_resourceStoredSinceLastSync.clear(); - for (auto tmp : m_textureData.m_resourceStoredSinceLastSync) - { - std::get<2>(tmp)->Release(); - m_textureData.m_getPos = std::get<0>(tmp); - } + getNonCurrentResourceStorage().m_inUseTexture2D = m_textureData.m_resourceStoredSinceLastSync; m_textureData.m_resourceStoredSinceLastSync.clear(); m_frame->Flip(nullptr); } +D3D12GSRender::ResourceStorage& D3D12GSRender::getCurrentResourceStorage() +{ + return m_perFrameStorage[m_swapChain->GetCurrentBackBufferIndex()]; +} + +D3D12GSRender::ResourceStorage& D3D12GSRender::getNonCurrentResourceStorage() +{ + return m_perFrameStorage[1 - m_swapChain->GetCurrentBackBufferIndex()]; +} + void D3D12GSRender::WriteDepthBuffer() { @@ -1059,7 +1084,7 @@ void D3D12GSRender::semaphorePGRAPHBackendRelease(u32 offset, u32 value) m_readbackResources.m_putPos.store(heapOffset + sizeInByte); check( - m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_perFrameStorage.m_commandAllocator, nullptr, IID_PPV_ARGS(&convertCommandList)) + m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, getCurrentResourceStorage().m_commandAllocator, nullptr, IID_PPV_ARGS(&convertCommandList)) ); D3D12_DESCRIPTOR_HEAP_DESC descriptorHeapDesc = {}; @@ -1125,7 +1150,7 @@ void D3D12GSRender::semaphorePGRAPHBackendRelease(u32 offset, u32 value) if (needTransfer) { check( - m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_perFrameStorage.m_commandAllocator, nullptr, IID_PPV_ARGS(&downloadCommandList)) + m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, getCurrentResourceStorage().m_commandAllocator, nullptr, IID_PPV_ARGS(&downloadCommandList)) ); } diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index e4290301c2..6cab1f5559 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -80,12 +80,18 @@ private: struct ResourceStorage { + HANDLE m_frameFinished; ID3D12CommandAllocator *m_commandAllocator; ID3D12CommandAllocator *m_downloadCommandAllocator; std::list m_inflightCommandList; std::vector m_inflightResources; + std::vector > m_inUseConstantsBuffers; + std::vector > m_inUseVertexIndexBuffers; + std::vector > m_inUseTextureUploadBuffers; + std::vector > m_inUseTexture2D; + // Constants storage ID3D12DescriptorHeap *m_constantsBufferDescriptorsHeap; size_t m_constantsBufferIndex; @@ -103,7 +109,9 @@ private: void Release(); }; - ResourceStorage m_perFrameStorage; + ResourceStorage m_perFrameStorage[2]; + ResourceStorage &getCurrentResourceStorage(); + ResourceStorage &getNonCurrentResourceStorage(); // Constants storage DataHeap m_constantsData; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp index 6ebea36b62..bca0279b52 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp @@ -22,8 +22,8 @@ void D3D12GSRender::InitDrawBuffers() u32 address_z = GetAddress(m_surface_offset_z, m_context_dma_z - 0xfeed0000); ID3D12GraphicsCommandList *copycmdlist; - check(m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_perFrameStorage.m_commandAllocator, nullptr, IID_PPV_ARGS(©cmdlist))); - m_perFrameStorage.m_inflightCommandList.push_back(copycmdlist); + check(m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, getCurrentResourceStorage().m_commandAllocator, nullptr, IID_PPV_ARGS(©cmdlist))); + getCurrentResourceStorage().m_inflightCommandList.push_back(copycmdlist); // Make previous RTTs sampleable for (unsigned i = 0; i < 4; i++) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp index e9ba950230..76b93611a7 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Texture.cpp @@ -186,7 +186,7 @@ size_t D3D12GSRender::UploadTextures() { // Upload at each iteration to take advantage of overlapping transfer ID3D12GraphicsCommandList *commandList; - check(m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_perFrameStorage.m_textureUploadCommandAllocator, nullptr, IID_PPV_ARGS(&commandList))); + check(m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, getCurrentResourceStorage().m_textureUploadCommandAllocator, nullptr, IID_PPV_ARGS(&commandList))); size_t heightInBlocks = (m_textures[i].GetHeight() + blockHeightInPixel - 1) / blockHeightInPixel; size_t widthInBlocks = (m_textures[i].GetWidth() + blockWidthInPixel - 1) / blockWidthInPixel; @@ -285,7 +285,7 @@ size_t D3D12GSRender::UploadTextures() commandList->Close(); m_commandQueueGraphic->ExecuteCommandLists(1, (ID3D12CommandList**)&commandList); - m_perFrameStorage.m_inflightCommandList.push_back(commandList); + getCurrentResourceStorage().m_inflightCommandList.push_back(commandList); m_texturesCache[texaddr] = vramTexture; } @@ -389,8 +389,8 @@ size_t D3D12GSRender::UploadTextures() break; } - 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); + D3D12_CPU_DESCRIPTOR_HANDLE Handle = getCurrentResourceStorage().m_textureDescriptorsHeap->GetCPUDescriptorHandleForHeapStart(); + Handle.ptr += (getCurrentResourceStorage().m_currentTextureIndex + usedTexture) * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); m_device->CreateShaderResourceView(vramTexture, &srvDesc, Handle); // TODO : Correctly define sampler @@ -405,8 +405,8 @@ size_t D3D12GSRender::UploadTextures() samplerDesc.BorderColor[4] = (FLOAT)m_textures[i].GetBorderColor(); samplerDesc.MinLOD = (FLOAT)(m_textures[i].GetMinLOD() >> 8); samplerDesc.MaxLOD = (FLOAT)(m_textures[i].GetMaxLOD() >> 8); - Handle = m_perFrameStorage.m_samplerDescriptorHeap->GetCPUDescriptorHandleForHeapStart(); - Handle.ptr += (m_perFrameStorage.m_currentTextureIndex + usedTexture) * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); + Handle = getCurrentResourceStorage().m_samplerDescriptorHeap->GetCPUDescriptorHandleForHeapStart(); + Handle.ptr += (getCurrentResourceStorage().m_currentTextureIndex + usedTexture) * m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); m_device->CreateSampler(&samplerDesc, Handle); usedTexture++;