// Copyright (c) Wojciech Figat. All rights reserved. #pragma once #if GRAPHICS_API_DIRECTX12 #include "GPUDeviceDX12.h" #include "Engine/Core/Types/DataContainer.h" #include "Engine/Graphics/Shaders/GPUShaderProgram.h" #include "Types.h" #include "../IncludeDirectXHeaders.h" /// /// Shaders base class for DirectX 12 backend. /// template class GPUShaderProgramDX12 : public BaseType { public: GPUShaderProgramDX12(const GPUShaderProgramInitializer& initializer, const DxShaderHeader* header, Span bytecode) : Header(*header) { BaseType::Init(initializer); Bytecode.Copy(bytecode); } public: BytesContainer Bytecode; DxShaderHeader Header; public: // [BaseType] void* GetBufferHandle() const override { return (void*)Bytecode.Get(); } uint32 GetBufferSize() const override { return Bytecode.Length(); } }; /// /// Vertex Shader for DirectX 12 backend. /// class GPUShaderProgramVSDX12 : public GPUShaderProgramDX12 { public: GPUShaderProgramVSDX12(const GPUShaderProgramInitializer& initializer, const DxShaderHeader* header, Span bytecode, GPUVertexLayout* inputLayout, GPUVertexLayout* vertexLayout) : GPUShaderProgramDX12(initializer, header, bytecode) { InputLayout = inputLayout; Layout = vertexLayout; } }; #if GPU_ALLOW_TESSELLATION_SHADERS /// /// Hull Shader for DirectX 12 backend. /// class GPUShaderProgramHSDX12 : public GPUShaderProgramDX12 { public: GPUShaderProgramHSDX12(const GPUShaderProgramInitializer& initializer, const DxShaderHeader* header, Span bytecode, int32 controlPointsCount) : GPUShaderProgramDX12(initializer, header, bytecode) { _controlPointsCount = controlPointsCount; } }; /// /// Domain Shader for DirectX 12 backend. /// class GPUShaderProgramDSDX12 : public GPUShaderProgramDX12 { public: GPUShaderProgramDSDX12(const GPUShaderProgramInitializer& initializer, const DxShaderHeader* header, Span bytecode) : GPUShaderProgramDX12(initializer, header, bytecode) { } }; #endif #if GPU_ALLOW_GEOMETRY_SHADERS /// /// Geometry Shader for DirectX 12 backend. /// class GPUShaderProgramGSDX12 : public GPUShaderProgramDX12 { public: GPUShaderProgramGSDX12(const GPUShaderProgramInitializer& initializer, const DxShaderHeader* header, Span bytecode) : GPUShaderProgramDX12(initializer, header, bytecode) { } }; #endif /// /// Pixel Shader for DirectX 12 backend. /// class GPUShaderProgramPSDX12 : public GPUShaderProgramDX12 { public: GPUShaderProgramPSDX12(const GPUShaderProgramInitializer& initializer, const DxShaderHeader* header, Span bytecode) : GPUShaderProgramDX12(initializer, header, bytecode) { } }; /// /// Compute Shader for DirectX 12 backend. /// class GPUShaderProgramCSDX12 : public GPUShaderProgramDX12 { private: GPUDeviceDX12* _device; Array _data; ID3D12PipelineState* _state; public: GPUShaderProgramCSDX12(GPUDeviceDX12* device, const GPUShaderProgramInitializer& initializer, const DxShaderHeader* header, Span bytecode) : GPUShaderProgramDX12(initializer, header, bytecode) , _device(device) , _state(nullptr) { } ~GPUShaderProgramCSDX12() { _device->AddResourceToLateRelease(_state); } public: /// /// Gets DirectX 12 compute pipeline state object /// FORCE_INLINE ID3D12PipelineState* GetState() const { return _state; } /// /// Gets or creates compute pipeline state for that compute shader. /// ID3D12PipelineState* GetOrCreateState(); }; #endif