// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "StandaloneRendererPlatformHeaders.h" #include "SlateD3DConstantBuffer.h" #include "Rendering/RenderingCommon.h" class FSlateD3DShaderParameter { public: virtual ~FSlateD3DShaderParameter() {} }; template class TSlateD3DTypedShaderParameter : public FSlateD3DShaderParameter { public: void SetParameter( const TRefCountPtr& InParam) { Param = InParam; } const TRefCountPtr& GetParameter() const { return Param; } private: TRefCountPtr Param; }; class FSlateShaderParameterMap { public: static FSlateShaderParameterMap& Get() { static TSharedPtr Instance; if( !Instance.IsValid() ) { Instance = MakeShareable( new FSlateShaderParameterMap ); } return *Instance; } template TSlateD3DTypedShaderParameter& RegisterParameter( const FString& ParamName ) { check( ParamName.Len() > 0 ); FSlateD3DShaderParameter** Param = NameToParameterMap.Find( ParamName ); if( !Param ) { TSlateD3DTypedShaderParameter* NewParam = new TSlateD3DTypedShaderParameter; NameToParameterMap.Add( ParamName, NewParam ); return *NewParam; } else { return **(TSlateD3DTypedShaderParameter**)Param; } } FSlateD3DShaderParameter* Find( const FString& ParamName ) { check( ParamName.Len() > 0 ); FSlateD3DShaderParameter** Param = NameToParameterMap.Find( ParamName ); if( !Param ) { return NULL; } else { return *Param; } } void Shutdown() { for( TMap::TIterator It(NameToParameterMap); It; ++It) { delete It.Value(); } NameToParameterMap.Empty(); } ~FSlateShaderParameterMap() { Shutdown(); } private: FSlateShaderParameterMap() {} private: TMap NameToParameterMap; }; struct FSlateD3DShaderBindings { TArray< TSlateD3DTypedShaderParameter* > ResourceViews; TArray< TSlateD3DTypedShaderParameter* > SamplerStates; TArray< TSlateD3DTypedShaderParameter* > ConstantBuffers; }; class FSlateD3DVS { public: virtual ~FSlateD3DVS() {} void Create( const FString& Filename, const FString& EntryPoint, const FString& ShaderModel, D3D11_INPUT_ELEMENT_DESC* VertexLayout, uint32 VertexLayoutCount ); void BindShader(); void BindParameters(); protected: virtual void UpdateParameters() {} private: FSlateD3DShaderBindings ShaderBindings; TRefCountPtr VertexShader; TRefCountPtr InputLayout; }; class FSlateD3DPS { public: virtual ~FSlateD3DPS() {} void Create( const FString& Filename, const FString& EntryPoint, const FString& ShaderModel ); void BindShader(); void BindParameters(); protected: virtual void UpdateParameters() {} private: FSlateD3DShaderBindings ShaderBindings; TRefCountPtr PixelShader; }; class FSlateDefaultVS : public FSlateD3DVS { public: FSlateDefaultVS(); void SetViewProjection( const FMatrix& ViewProjectionMatrix ); void SetShaderParams( const FVector4& InShaderParams ); protected: void UpdateParameters(); private: struct FPerElementConstants { FMatrix44f ViewProjection; FVector4f VertexShaderParams; }; static_assert(sizeof(FPerElementConstants) == sizeof(float) * 20, "Size mismatch"); // LWC_TODO: Fix for FVector4f FSlateD3DConstantBuffer ConstantBuffer; TSlateD3DTypedShaderParameter* Constants; }; class FSlateDefaultPS : public FSlateD3DPS { public: FSlateDefaultPS(); void SetTexture( const TRefCountPtr& InTexture, TRefCountPtr& InSamplerState ) { Texture->SetParameter( InTexture ); SamplerState = InSamplerState; } void SetShaderType(uint32 InShaderType); void SetDrawEffects(ESlateDrawEffect InDrawEffects); void SetShaderParams(const FShaderParams& InShaderParams); void SetGammaValues(const FVector2f& InGammaValues); protected: void UpdateParameters(); private: MS_ALIGN(16) struct FPerElementConstants { FVector4f ShaderParams; // 16 bytes FVector4f ShaderParams2; // 16 bytes uint32 ShaderType; // 4 bytes uint32 IgnoreTextureAlpha; // 4 bytes uint32 DisableEffect; // 4 bytes uint32 UNUSED[1]; // 4 bytes }; static_assert(sizeof(FPerElementConstants) == sizeof(float) * 8 + sizeof(uint32) * 4, "Size mismatch"); // LWC_TODO: Fix for FVector4f MS_ALIGN(16) struct FPerFrameConstants { FVector2f GammaValues; }; static_assert(sizeof(FVector2f) == sizeof(float) * 2, "Size mismatch"); FSlateD3DConstantBuffer PerElementConstants; FSlateD3DConstantBuffer PerFrameConstants; TSlateD3DTypedShaderParameter* Texture; TSlateD3DTypedShaderParameter* TextureSampler; TSlateD3DTypedShaderParameter* PerFrameCBufferParam; TSlateD3DTypedShaderParameter* PerElementCBufferParam; TRefCountPtr SamplerState; };