Kaynağa Gözat

improve directx12 api

Kolja Strohm 1 hafta önce
ebeveyn
işleme
566f3c0e2d
4 değiştirilmiş dosya ile 17 ekleme ve 4 silme
  1. 11 1
      DX12Buffer.cpp
  2. 2 0
      DX12Buffer.h
  3. 3 2
      DX12GraphicsApi.cpp
  4. 1 1
      DX12GraphicsApi.h

+ 11 - 1
DX12Buffer.cpp

@@ -13,7 +13,8 @@ DX12Buffer::DX12Buffer(
     : DXBuffer(eSize),
       buffer(0),
       zDevice(zDevice),
-      queue(queue)
+      queue(queue),
+      currentState(D3D12_RESOURCE_STATE_COMMON)
 {
     description = new D3D12_RESOURCE_DESC();
     ZeroMemory(description, sizeof(D3D12_RESOURCE_DESC));
@@ -110,9 +111,18 @@ void Framework::DX12Buffer::createBufferWithoutData(
                     buffer, D3D12_RESOURCE_STATE_COMMON, states);
             queue->zCommandList()->ResourceBarrier(1, &transition);
         }
+        this->currentState = states;
     }
 }
 
+void Framework::DX12Buffer::transformState(D3D12_RESOURCE_STATES newState)
+{
+    CD3DX12_RESOURCE_BARRIER transition
+        = CD3DX12_RESOURCE_BARRIER::Transition(buffer, currentState, newState);
+    queue->zCommandList()->ResourceBarrier(1, &transition);
+    currentState = newState;
+}
+
 // Returns the buffer
 ID3D12Resource* DX12Buffer::zBuffer() const
 {

+ 2 - 0
DX12Buffer.h

@@ -15,6 +15,7 @@ namespace Framework
         ID3D12Resource* buffer;
         ID3D12Device5* zDevice;
         DX12CommandQueue* queue;
+        D3D12_RESOURCE_STATES currentState;
 
     public:
         //! Constructor
@@ -29,6 +30,7 @@ namespace Framework
         DLLEXPORT virtual void copyToGPU(__int64 byteCount = -1) override;
         DLLEXPORT void createBufferWithoutData(D3D12_RESOURCE_STATES states,
             D3D12_HEAP_TYPE heapType = D3D12_HEAP_TYPE_DEFAULT);
+        DLLEXPORT void transformState(D3D12_RESOURCE_STATES newState);
         //! Returns the buffer
         DLLEXPORT ID3D12Resource* zBuffer() const;
     };

+ 3 - 2
DX12GraphicsApi.cpp

@@ -278,7 +278,7 @@ void Framework::DirectX12::renderKamera(
     desc.Height = zTarget->zImage()->getHeight();
     desc.Depth = 1;
     // order of definition in DX12DescriptorHeapType must be matched
-    fillGlobalShaderParams(zKamera);
+    fillGlobalShaderParams(zKamera, tlas);
     directCommandQueue->zCommandList()->SetPipelineState1(
         pipeline->zPipelineState());
     directCommandQueue->zCommandList()->DispatchRays(&desc);
@@ -525,7 +525,8 @@ void Framework::DirectX12::fillShaderBindingTable(
     }
 }
 
-int Framework::DirectX12::fillGlobalShaderParams(Cam3D* zKam, int startIndex)
+int Framework::DirectX12::fillGlobalShaderParams(
+    Cam3D* zKam, DX12TLAS* zTLAS, int startIndex)
 {
     ID3D12DescriptorHeap* heaps[]
         = {pipeline->zGlobalSignature()->doesUseTextureDescriptorHeap()

+ 1 - 1
DX12GraphicsApi.h

@@ -125,7 +125,7 @@ namespace Framework
             const DX12BLAS* zBLAS,
             int& lastHitGroupIndex);
         DLLEXPORT virtual int fillGlobalShaderParams(
-            Cam3D* zCam, int startIndex = 0);
+            Cam3D* zCam, DX12TLAS* zTLAS, int startIndex = 0);
 
     public:
         DLLEXPORT void initialize(NativeWindow* fenster,