// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once #include "Engine/Graphics/GPUContext.h" #include "GPUDeviceDX11.h" #include "GPUPipelineStateDX11.h" #include "../IncludeDirectXHeaders.h" #if GRAPHICS_API_DIRECTX11 class GPUBufferDX11; /// /// GPU Context for DirectX 11 backend. /// class GPUContextDX11 : public GPUContext { private: GPUDeviceDX11* _device; ID3D11DeviceContext* _context; #if GPU_ALLOW_PROFILE_EVENTS ID3DUserDefinedAnnotation* _userDefinedAnnotations; #endif int32 _maxUASlots; // Output Merger bool _omDirtyFlag; int32 _rtCount; ID3D11DepthStencilView* _rtDepth; ID3D11RenderTargetView* _rtHandles[GPU_MAX_RT_BINDED]; // Shader Resources bool _srDirtyFlag; ID3D11ShaderResourceView* _srHandles[GPU_MAX_SR_BINDED]; // Unordered Access bool _uaDirtyFlag; ID3D11UnorderedAccessView* _uaHandles[GPU_MAX_UA_BINDED]; // Constant Buffers bool _cbDirtyFlag; ID3D11Buffer* _cbHandles[GPU_MAX_CB_BINDED]; // Vertex Buffers GPUBufferDX11* _ibHandle; ID3D11Buffer* _vbHandles[GPU_MAX_VB_BINDED]; UINT _vbStrides[GPU_MAX_VB_BINDED]; UINT _vbOffsets[GPU_MAX_VB_BINDED]; // Pipeline State GPUPipelineStateDX11* _currentState; ID3D11BlendState* CurrentBlendState; ID3D11RasterizerState* CurrentRasterizerState; ID3D11DepthStencilState* CurrentDepthStencilState; GPUShaderProgramVSDX11* CurrentVS; GPUShaderProgramHSDX11* CurrentHS; GPUShaderProgramDSDX11* CurrentDS; GPUShaderProgramGSDX11* CurrentGS; GPUShaderProgramPSDX11* CurrentPS; GPUShaderProgramCSDX11* CurrentCS; D3D11_PRIMITIVE_TOPOLOGY CurrentPrimitiveTopology; Float4 CurrentBlendFactor; public: /// /// Initializes a new instance of the class. /// /// The graphics device. /// The context. GPUContextDX11(GPUDeviceDX11* device, ID3D11DeviceContext* context); /// /// Finalizes an instance of the class. /// ~GPUContextDX11(); public: /// /// Gets DirectX 11 device context used by this context /// /// GPU context FORCE_INLINE ID3D11DeviceContext* GetContext() const { return _context; } private: void flushSRVs(); void flushUAVs(); void flushCBs(); void flushOM(); void onDrawCall(); public: // [GPUContext] void FrameBegin() override; #if GPU_ALLOW_PROFILE_EVENTS void EventBegin(const Char* name) override; void EventEnd() override; #endif void* GetNativePtr() const override; bool IsDepthBufferBinded() override; void Clear(GPUTextureView* rt, const Color& color) override; void ClearDepth(GPUTextureView* depthBuffer, float depthValue) override; void ClearUA(GPUBuffer* buf, const Float4& value) override; void ClearUA(GPUBuffer* buf, const uint32 value[4]) override; void ClearUA(GPUTexture* texture, const uint32 value[4]) override; void ClearUA(GPUTexture* texture, const Float4& value) override; void ResetRenderTarget() override; void SetRenderTarget(GPUTextureView* rt) override; void SetRenderTarget(GPUTextureView* depthBuffer, GPUTextureView* rt) override; void SetRenderTarget(GPUTextureView* depthBuffer, const Span& rts) override; void SetBlendFactor(const Float4& value) override; void ResetSR() override; void ResetUA() override; void ResetCB() override; void BindCB(int32 slot, GPUConstantBuffer* cb) override; void BindSR(int32 slot, GPUResourceView* view) override; void BindUA(int32 slot, GPUResourceView* view) override; void BindVB(const Span& vertexBuffers, const uint32* vertexBuffersOffsets = nullptr) override; void BindIB(GPUBuffer* indexBuffer) override; void BindSampler(int32 slot, GPUSampler* sampler) override; void UpdateCB(GPUConstantBuffer* cb, const void* data) override; void Dispatch(GPUShaderProgramCS* shader, uint32 threadGroupCountX, uint32 threadGroupCountY, uint32 threadGroupCountZ) override; void DispatchIndirect(GPUShaderProgramCS* shader, GPUBuffer* bufferForArgs, uint32 offsetForArgs) override; void ResolveMultisample(GPUTexture* sourceMultisampleTexture, GPUTexture* destTexture, int32 sourceSubResource, int32 destSubResource, PixelFormat format) override; void DrawInstanced(uint32 verticesCount, uint32 instanceCount, int32 startInstance, int32 startVertex) override; void DrawIndexedInstanced(uint32 indicesCount, uint32 instanceCount, int32 startInstance, int32 startVertex, int32 startIndex) override; void DrawInstancedIndirect(GPUBuffer* bufferForArgs, uint32 offsetForArgs) override; void DrawIndexedInstancedIndirect(GPUBuffer* bufferForArgs, uint32 offsetForArgs) override; void SetViewport(const Viewport& viewport) override; void SetScissor(const Rectangle& scissorRect) override; GPUPipelineState* GetState() const override; void SetState(GPUPipelineState* state) override; void ClearState() override; void FlushState() override; void Flush() override; void UpdateBuffer(GPUBuffer* buffer, const void* data, uint32 size, uint32 offset) override; void CopyBuffer(GPUBuffer* dstBuffer, GPUBuffer* srcBuffer, uint32 size, uint32 dstOffset, uint32 srcOffset) override; void UpdateTexture(GPUTexture* texture, int32 arrayIndex, int32 mipIndex, const void* data, uint32 rowPitch, uint32 slicePitch) override; void CopyTexture(GPUTexture* dstResource, uint32 dstSubresource, uint32 dstX, uint32 dstY, uint32 dstZ, GPUTexture* srcResource, uint32 srcSubresource) override; void ResetCounter(GPUBuffer* buffer) override; void CopyCounter(GPUBuffer* dstBuffer, uint32 dstOffset, GPUBuffer* srcBuffer) override; void CopyResource(GPUResource* dstResource, GPUResource* srcResource) override; void CopySubresource(GPUResource* dstResource, uint32 dstSubresource, GPUResource* srcResource, uint32 srcSubresource) override; }; #endif