libultraship
Reimplementations of libultra (N64 SDK) functions for modern hardware
Loading...
Searching...
No Matches
gfx_direct3d_common.h
Go to the documentation of this file.
1#pragma once
2
3#if defined(ENABLE_DX11) || defined(ENABLE_DX12)
4
5#ifdef __cplusplus
6#include <memory>
7#include "../interpreter.h"
8#include <cstdint>
9#include <string>
10#include "gfx_rendering_api.h"
11#include "d3d11.h"
12#include "d3dcompiler.h"
13
14namespace Ship {
15class ConsoleVariable;
16class ResourceManager;
17} // namespace Ship
18
19namespace Fast {
23struct PerFrameCB {
24 uint32_t noise_frame;
26 uint32_t padding[2]; // constant buffers must be multiples of 16 bytes in size
27};
28
32struct PerDrawCB {
33 struct Texture {
34 uint32_t width;
35 uint32_t height;
37 uint32_t padding;
39};
40
46 float _pad[3]; // 16-byte CB alignment
47};
48
52struct Coord {
53 int x, y;
54};
55
60 Microsoft::WRL::ComPtr<ID3D11Texture2D> texture;
61 Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> resource_view;
62 Microsoft::WRL::ComPtr<ID3D11SamplerState> sampler_state;
63 uint32_t width;
64 uint32_t height;
66};
67
72 Microsoft::WRL::ComPtr<ID3D11RenderTargetView> render_target_view;
73 Microsoft::WRL::ComPtr<ID3D11DepthStencilView> depth_stencil_view;
74 Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> depth_stencil_srv;
75 uint32_t texture_id;
77 uint32_t msaa_level;
78};
79
84 Microsoft::WRL::ComPtr<ID3D11VertexShader> vertex_shader;
85 Microsoft::WRL::ComPtr<ID3D11PixelShader> pixel_shader;
86 Microsoft::WRL::ComPtr<ID3D11InputLayout> input_layout;
87 Microsoft::WRL::ComPtr<ID3D11BlendState> blend_state;
88
89 uint64_t shader_id0;
90 uint64_t shader_id1;
91 uint8_t numInputs;
92 uint8_t numFloats;
94};
95
97
106 public:
110
114 GfxRenderingAPIDX11(GfxWindowBackendDXGI* backend, std::shared_ptr<Ship::ConsoleVariable> consoleVariable = nullptr,
115 std::shared_ptr<Ship::ResourceManager> resourceManager = nullptr);
116
119 const char* GetName() override;
120 int GetMaxTextureSize() override;
122 void UnloadShader(struct ShaderProgram* oldPrg) override;
123 void LoadShader(struct ShaderProgram* newPrg) override;
124 struct ShaderProgram* CreateAndLoadNewShader(uint64_t shaderId0, uint64_t shaderId1) override;
125 struct ShaderProgram* LookupShader(uint64_t shaderId0, uint64_t shaderId1) override;
126 void ShaderGetInfo(struct ShaderProgram* prg, uint8_t* numInputs, bool usedTextures[2]) override;
127 void ClearShaderCache() override;
128 uint32_t NewTexture() override;
129 void SelectTexture(int tile, uint32_t textureId) override;
130 void UploadTexture(const uint8_t* rgba32Buf, uint32_t width, uint32_t height) override;
131 void SetSamplerParameters(int sampler, bool linear_filter, uint32_t cms, uint32_t cmt) override;
132 void SetDepthTestAndMask(bool depth_test, bool z_upd) override;
133 void SetCurrentPrimDepth(float depth) override;
134 void SetZmodeDecal(bool decal) override;
135 void SetViewport(int x, int y, int width, int height) override;
136 void SetScissor(int x, int y, int width, int height) override;
137 void SetUseAlpha(bool useAlpha) override;
138 void DrawTriangles(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris) override;
139 void Init() override;
140 void OnResize() override;
141 void StartFrame() override;
142 void EndFrame() override;
143 void FinishRender() override;
144 int CreateFramebuffer() override;
145 void UpdateFramebufferParameters(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level,
146 bool opengl_invertY, bool render_target, bool has_depth_buffer,
147 bool can_extract_depth) override;
148 void StartDrawToFramebuffer(int fbId, float noiseScale) override;
149 void CopyFramebuffer(int fbDstId, int fbSrcId, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0,
150 int dstX1, int dstY1) override;
151 void ClearFramebuffer(bool color, bool depth) override;
152 void ReadFramebufferToCPU(int fbId, uint32_t width, uint32_t height, uint16_t* rgba16Buf) override;
153 void ResolveMSAAColorBuffer(int fbIdTarger, int fbIdSrc) override;
154 std::unordered_map<std::pair<float, float>, uint16_t, hash_pair_ff>
155 GetPixelDepth(int fb_id, const std::set<std::pair<float, float>>& coordinates) override;
156 void* GetFramebufferTextureId(int fbId) override;
157 void SelectTextureFb(int fbId) override;
158 void DeleteTexture(uint32_t texId) override;
159 void SetTextureFilter(FilteringMode mode) override;
161 void SetSrgbMode() override;
162 ImTextureID GetTextureById(int id) override;
165 PFN_D3D11_CREATE_DEVICE mDX11CreateDevice;
166 Microsoft::WRL::ComPtr<ID3D11DeviceContext> mContext;
167 Microsoft::WRL::ComPtr<ID3D11Device> mDevice;
169 D3D_FEATURE_LEVEL mFeatureLevel;
170
171 std::shared_ptr<Ship::ConsoleVariable> mConsoleVariable;
172 std::shared_ptr<Ship::ResourceManager> mResourceManager;
173
174 private:
175 void CreateDepthStencilObjects(uint32_t width, uint32_t height, uint32_t msaa_count, ID3D11DepthStencilView** view,
176 ID3D11ShaderResourceView** srv);
177
178 HMODULE mDX11Module;
179
180 HMODULE mCompilerModule;
181 pD3DCompile mD3dCompile;
182
183 uint32_t mMsaaNumQualityLevels[D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT];
184
185 Microsoft::WRL::ComPtr<ID3D11RasterizerState> mRasterizerState;
186 Microsoft::WRL::ComPtr<ID3D11DepthStencilState> mDepthStencilState;
187 Microsoft::WRL::ComPtr<ID3D11Buffer> mVertexBuffer;
188 Microsoft::WRL::ComPtr<ID3D11Buffer> mPerFrameCb;
189 Microsoft::WRL::ComPtr<ID3D11Buffer> mPerDrawCb;
190 Microsoft::WRL::ComPtr<ID3D11Buffer> mPerPrimDepthCb;
191 Microsoft::WRL::ComPtr<ID3D11Buffer> mCoordBuffer;
192 Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> mCoordBufferSrv;
193 Microsoft::WRL::ComPtr<ID3D11Buffer> mDepthValueOutputBuffer;
194 Microsoft::WRL::ComPtr<ID3D11Buffer> mDepthValueOutputBufferCopy;
195 Microsoft::WRL::ComPtr<ID3D11UnorderedAccessView> mDepthValueOutputUav;
196 Microsoft::WRL::ComPtr<ID3D11ComputeShader> mComputeShader;
197 Microsoft::WRL::ComPtr<ID3D11ComputeShader> mComputeShaderMsaa;
198 Microsoft::WRL::ComPtr<ID3DBlob> mComputeShaderMsaaBlob;
199 size_t mCoordBufferSize;
200
201#if DEBUG_D3D
202 Microsoft::WRL::ComPtr<ID3D11Debug> debug;
203#endif
204
205 PerFrameCB mPerFrameCbData;
206 PerDrawCB mPerDrawCbData;
207 PerPrimDepthCB mPerPrimDepthCbData;
208
209 std::map<std::pair<uint64_t, uint32_t>, struct ShaderProgramD3D11> mShaderProgramPool;
210
211 std::vector<struct TextureData> mTextures;
212 int mCurrentTile;
213 uint32_t mCurrentTextureIds[SHADER_MAX_TEXTURES] = {};
214
215 std::vector<FramebufferDX11> mFrameBuffers;
216
217 // Current state
218
219 struct ShaderProgramD3D11* mShaderProgram;
220
221 int32_t mRenderTargetHeight;
222 int mCurrentFramebuffer;
223 FilteringMode mCurrentFilterMode = FILTER_NONE;
224
225 // Previous states (to prevent setting states needlessly)
226
227 struct ShaderProgramD3D11* mLastShaderProgram = nullptr;
228 uint32_t mLastVertexBufferStride = 0;
229 Microsoft::WRL::ComPtr<ID3D11BlendState> mLastBlendState = nullptr;
230 Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> mLastResourceViews[SHADER_MAX_TEXTURES] = { nullptr, nullptr };
231 Microsoft::WRL::ComPtr<ID3D11SamplerState> mLastSamplerStates[SHADER_MAX_TEXTURES] = { nullptr, nullptr };
232
233 D3D_PRIMITIVE_TOPOLOGY mLastPrimitaveTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
234
235 // Cached staging texture for ReadFramebufferToCPU — avoids CreateTexture2D/Release per frame
236 Microsoft::WRL::ComPtr<ID3D11Texture2D> mReadbackStaging;
237 uint32_t mReadbackStagingW = 0;
238 uint32_t mReadbackStagingH = 0;
239};
240
244std::string gfx_direct3d_common_build_shader(size_t& numFloats, const CCFeatures& cc_features,
245 bool include_root_signature, bool three_point_filtering, bool use_srgb);
246} // namespace Fast
247#endif
248#endif
Direct3D 11 implementation of the Fast3D rendering backend.
Definition gfx_direct3d_common.h:105
void CopyFramebuffer(int fbDstId, int fbSrcId, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1) override
void SetTextureFilter(FilteringMode mode) override
void SetCurrentPrimDepth(float depth) override
void ShaderGetInfo(struct ShaderProgram *prg, uint8_t *numInputs, bool usedTextures[2]) override
uint32_t NewTexture() override
void SetSamplerParameters(int sampler, bool linear_filter, uint32_t cms, uint32_t cmt) override
void FinishRender() override
int CreateFramebuffer() override
void * GetFramebufferTextureId(int fbId) override
Microsoft::WRL::ComPtr< ID3D11Device > mDevice
Definition gfx_direct3d_common.h:167
int GetMaxTextureSize() override
D3D_FEATURE_LEVEL mFeatureLevel
Definition gfx_direct3d_common.h:169
void StartFrame() override
void UnloadShader(struct ShaderProgram *oldPrg) override
PFN_D3D11_CREATE_DEVICE mDX11CreateDevice
Definition gfx_direct3d_common.h:165
GfxWindowBackendDXGI * mWindowBackend
Definition gfx_direct3d_common.h:168
void DeleteTexture(uint32_t texId) override
FilteringMode GetTextureFilter() override
void ResolveMSAAColorBuffer(int fbIdTarger, int fbIdSrc) override
void StartDrawToFramebuffer(int fbId, float noiseScale) override
void SelectTextureFb(int fbId) override
struct ShaderProgram * LookupShader(uint64_t shaderId0, uint64_t shaderId1) override
void ClearFramebuffer(bool color, bool depth) override
struct ShaderProgram * CreateAndLoadNewShader(uint64_t shaderId0, uint64_t shaderId1) override
Microsoft::WRL::ComPtr< ID3D11DeviceContext > mContext
Definition gfx_direct3d_common.h:166
void SetScissor(int x, int y, int width, int height) override
void SetDepthTestAndMask(bool depth_test, bool z_upd) override
void EndFrame() override
void SetSrgbMode() override
void SelectTexture(int tile, uint32_t textureId) override
GfxRenderingAPIDX11()=default
Constructs an uninitialized D3D11 renderer instance.
void OnResize() override
GfxClipParameters GetClipParameters() override
void SetUseAlpha(bool useAlpha) override
void LoadShader(struct ShaderProgram *newPrg) override
ImTextureID GetTextureById(int id) override
GfxRenderingAPIDX11(GfxWindowBackendDXGI *backend, std::shared_ptr< Ship::ConsoleVariable > consoleVariable=nullptr, std::shared_ptr< Ship::ResourceManager > resourceManager=nullptr)
Constructs a D3D11 renderer bound to an existing DXGI window backend.
std::shared_ptr< Ship::ResourceManager > mResourceManager
Definition gfx_direct3d_common.h:172
std::shared_ptr< Ship::ConsoleVariable > mConsoleVariable
Definition gfx_direct3d_common.h:171
void ClearShaderCache() override
void UploadTexture(const uint8_t *rgba32Buf, uint32_t width, uint32_t height) override
void SetZmodeDecal(bool decal) 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
const char * GetName() override
void DrawTriangles(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris) override
void SetViewport(int x, int y, int width, int height) override
void ReadFramebufferToCPU(int fbId, uint32_t width, uint32_t height, uint16_t *rgba16Buf) override
std::unordered_map< std::pair< float, float >, uint16_t, hash_pair_ff > GetPixelDepth(int fb_id, const std::set< std::pair< float, float > > &coordinates) override
Definition gfx_rendering_api.h:30
DXGI/Win32 window backend used by the Fast3D renderer on Windows.
Definition gfx_dxgi.h:27
Manages a named collection of console variables (CVars).
Definition ConsoleVariable.h:58
Central manager for loading, caching, and unloading game resources.
Definition ResourceManager.h:61
#define SHADER_MAX_TEXTURES
Definition interpreter.h:105
Definition gfx_direct3d_common.h:19
FilteringMode
Definition gfx_rendering_api.h:17
@ FILTER_NONE
Definition gfx_rendering_api.h:17
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)
Builds the HLSL shader source for the requested combiner features.
Core namespace for the libultraship engine framework.
Definition gfx_direct3d_common.h:14
Integer 2D coordinate used for depth sampling requests.
Definition gfx_direct3d_common.h:52
int x
Definition gfx_direct3d_common.h:53
int y
Definition gfx_direct3d_common.h:53
Direct3D 11 framebuffer attachments and metadata.
Definition gfx_direct3d_common.h:71
bool has_depth_buffer
Definition gfx_direct3d_common.h:76
uint32_t texture_id
Definition gfx_direct3d_common.h:75
Microsoft::WRL::ComPtr< ID3D11DepthStencilView > depth_stencil_view
Definition gfx_direct3d_common.h:73
uint32_t msaa_level
Definition gfx_direct3d_common.h:77
Microsoft::WRL::ComPtr< ID3D11ShaderResourceView > depth_stencil_srv
Definition gfx_direct3d_common.h:74
Microsoft::WRL::ComPtr< ID3D11RenderTargetView > render_target_view
Definition gfx_direct3d_common.h:72
Definition gfx_rendering_api.h:12
Definition gfx_direct3d_common.h:33
uint32_t width
Definition gfx_direct3d_common.h:34
uint32_t padding
Definition gfx_direct3d_common.h:37
uint32_t height
Definition gfx_direct3d_common.h:35
uint32_t linear_filtering
Definition gfx_direct3d_common.h:36
Per-draw shader constants describing bound texture metadata.
Definition gfx_direct3d_common.h:32
struct Fast::PerDrawCB::Texture mTextures[SHADER_MAX_TEXTURES]
Per-frame shader constants shared across draw calls.
Definition gfx_direct3d_common.h:23
uint32_t noise_frame
Definition gfx_direct3d_common.h:24
float noise_scale
Definition gfx_direct3d_common.h:25
uint32_t padding[2]
Definition gfx_direct3d_common.h:26
Per-draw depth constants used by primitive-depth rendering paths.
Definition gfx_direct3d_common.h:44
float prim_depth
Definition gfx_direct3d_common.h:45
float _pad[3]
Definition gfx_direct3d_common.h:46
Compiled D3D11 shader program and pipeline-state cache entry.
Definition gfx_direct3d_common.h:83
uint64_t shader_id0
Definition gfx_direct3d_common.h:89
Microsoft::WRL::ComPtr< ID3D11BlendState > blend_state
Definition gfx_direct3d_common.h:87
uint64_t shader_id1
Definition gfx_direct3d_common.h:90
Microsoft::WRL::ComPtr< ID3D11PixelShader > pixel_shader
Definition gfx_direct3d_common.h:85
uint8_t numFloats
Definition gfx_direct3d_common.h:92
uint8_t numInputs
Definition gfx_direct3d_common.h:91
Microsoft::WRL::ComPtr< ID3D11VertexShader > vertex_shader
Definition gfx_direct3d_common.h:84
Microsoft::WRL::ComPtr< ID3D11InputLayout > input_layout
Definition gfx_direct3d_common.h:86
bool usedTextures[SHADER_MAX_TEXTURES]
Definition gfx_direct3d_common.h:93
OpenGL shader program metadata cached by the Fast3D renderer.
Definition gfx_opengl.h:37
Runtime Direct3D 11 texture state tracked by the renderer.
Definition gfx_direct3d_common.h:59
Microsoft::WRL::ComPtr< ID3D11ShaderResourceView > resource_view
Definition gfx_direct3d_common.h:61
uint32_t height
Definition gfx_direct3d_common.h:64
Microsoft::WRL::ComPtr< ID3D11SamplerState > sampler_state
Definition gfx_direct3d_common.h:62
bool linear_filtering
Definition gfx_direct3d_common.h:65
uint32_t width
Definition gfx_direct3d_common.h:63
Microsoft::WRL::ComPtr< ID3D11Texture2D > texture
Definition gfx_direct3d_common.h:60
Definition gfx_rendering_api.h:20