#pragma once #if defined(ENABLE_DX11) || defined(ENABLE_DX12) #ifdef __cplusplus #include "../interpreter.h" #include #include #include "gfx_rendering_api.h" #include "d3d11.h" #include "d3dcompiler.h" namespace Fast { struct PerFrameCB { uint32_t noise_frame; float noise_scale; uint32_t padding[2]; // constant buffers must be multiples of 16 bytes in size }; struct PerDrawCB { struct Texture { uint32_t width; uint32_t height; uint32_t linear_filtering; uint32_t padding; } mTextures[SHADER_MAX_TEXTURES]; }; struct Coord { int x, y; }; struct TextureData { Microsoft::WRL::ComPtr texture; Microsoft::WRL::ComPtr resource_view; Microsoft::WRL::ComPtr sampler_state; uint32_t width; uint32_t height; bool linear_filtering; }; struct FramebufferDX11 { Microsoft::WRL::ComPtr render_target_view; Microsoft::WRL::ComPtr depth_stencil_view; Microsoft::WRL::ComPtr depth_stencil_srv; uint32_t texture_id; bool has_depth_buffer; uint32_t msaa_level; }; struct ShaderProgramD3D11 { Microsoft::WRL::ComPtr vertex_shader; Microsoft::WRL::ComPtr pixel_shader; Microsoft::WRL::ComPtr input_layout; Microsoft::WRL::ComPtr blend_state; uint64_t shader_id0; uint32_t shader_id1; uint8_t numInputs; uint8_t numFloats; bool usedTextures[SHADER_MAX_TEXTURES]; }; class GfxWindowBackendDXGI; class GfxRenderingAPIDX11 final : public GfxRenderingAPI { public: GfxRenderingAPIDX11() = default; ~GfxRenderingAPIDX11() override; GfxRenderingAPIDX11(GfxWindowBackendDXGI* backend); const char* GetName() override; int GetMaxTextureSize() override; GfxClipParameters GetClipParameters() override; void UnloadShader(struct ShaderProgram* oldPrg) override; void LoadShader(struct ShaderProgram* newPrg) override; struct ShaderProgram* CreateAndLoadNewShader(uint64_t shaderId0, uint32_t shaderId1) override; struct ShaderProgram* LookupShader(uint64_t shaderId0, uint32_t shaderId1) override; void ShaderGetInfo(struct ShaderProgram* prg, uint8_t* numInputs, bool usedTextures[2]) override; uint32_t NewTexture() override; void SelectTexture(int tile, uint32_t textureId) override; void UploadTexture(const uint8_t* rgba32Buf, uint32_t width, uint32_t height) override; void SetSamplerParameters(int sampler, bool linear_filter, uint32_t cms, uint32_t cmt) override; void SetDepthTestAndMask(bool depth_test, bool z_upd) override; void SetZmodeDecal(bool decal) override; void SetViewport(int x, int y, int width, int height) override; void SetScissor(int x, int y, int width, int height) override; void SetUseAlpha(bool useAlpha) override; void DrawTriangles(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris) override; void Init() override; void OnResize() override; void StartFrame() override; void EndFrame() override; void FinishRender() override; int CreateFramebuffer() override; void UpdateFramebufferParameters(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level, bool opengl_invertY, bool render_target, bool has_depth_buffer, bool can_extract_depth) override; void StartDrawToFramebuffer(int fbId, float noiseScale) override; void CopyFramebuffer(int fbDstId, int fbSrcId, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1) override; void ClearFramebuffer(bool color, bool depth) override; void ReadFramebufferToCPU(int fbId, uint32_t width, uint32_t height, uint16_t* rgba16Buf) override; void ResolveMSAAColorBuffer(int fbIdTarger, int fbIdSrc) override; std::unordered_map, uint16_t, hash_pair_ff> GetPixelDepth(int fb_id, const std::set>& coordinates) override; void* GetFramebufferTextureId(int fbId) override; void SelectTextureFb(int fbId) override; void DeleteTexture(uint32_t texId) override; void SetTextureFilter(FilteringMode mode) override; FilteringMode GetTextureFilter() override; void SetSrgbMode() override; ImTextureID GetTextureById(int id) override; PFN_D3D11_CREATE_DEVICE mDX11CreateDevice; Microsoft::WRL::ComPtr mContext; Microsoft::WRL::ComPtr mDevice; GfxWindowBackendDXGI* mWindowBackend = nullptr; D3D_FEATURE_LEVEL mFeatureLevel; private: void CreateDepthStencilObjects(uint32_t width, uint32_t height, uint32_t msaa_count, ID3D11DepthStencilView** view, ID3D11ShaderResourceView** srv); HMODULE mDX11Module; HMODULE mCompilerModule; pD3DCompile mD3dCompile; uint32_t mMsaaNumQualityLevels[D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT]; Microsoft::WRL::ComPtr mRasterizerState; Microsoft::WRL::ComPtr mDepthStencilState; Microsoft::WRL::ComPtr mVertexBuffer; Microsoft::WRL::ComPtr mPerFrameCb; Microsoft::WRL::ComPtr mPerDrawCb; Microsoft::WRL::ComPtr mCoordBuffer; Microsoft::WRL::ComPtr mCoordBufferSrv; Microsoft::WRL::ComPtr mDepthValueOutputBuffer; Microsoft::WRL::ComPtr mDepthValueOutputBufferCopy; Microsoft::WRL::ComPtr mDepthValueOutputUav; Microsoft::WRL::ComPtr mComputeShader; Microsoft::WRL::ComPtr mComputeShaderMsaa; Microsoft::WRL::ComPtr mComputeShaderMsaaBlob; size_t mCoordBufferSize; #if DEBUG_D3D Microsoft::WRL::ComPtr debug; #endif PerFrameCB mPerFrameCbData; PerDrawCB mPerDrawCbData; std::map, struct ShaderProgramD3D11> mShaderProgramPool; std::vector mTextures; int mCurrentTile; uint32_t mCurrentTextureIds[SHADER_MAX_TEXTURES]; std::vector mFrameBuffers; // Current state struct ShaderProgramD3D11* mShaderProgram; int32_t mRenderTargetHeight; int mCurrentFramebuffer; FilteringMode mCurrentFilterMode = FILTER_NONE; // Previous states (to prevent setting states needlessly) struct ShaderProgramD3D11* mLastShaderProgram = nullptr; uint32_t mLastVertexBufferStride = 0; Microsoft::WRL::ComPtr mLastBlendState = nullptr; Microsoft::WRL::ComPtr mLastResourceViews[SHADER_MAX_TEXTURES] = { nullptr, nullptr }; Microsoft::WRL::ComPtr mLastSamplerStates[SHADER_MAX_TEXTURES] = { nullptr, nullptr }; D3D_PRIMITIVE_TOPOLOGY mLastPrimitaveTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED; }; std::string gfx_direct3d_common_build_shader(size_t& numFloats, const CCFeatures& cc_features, bool include_root_signature, bool three_point_filtering, bool use_srgb); } // namespace Fast #endif #endif