12#define MAX_VERTICES 4096
13#define DTTR_MAT4_ELEMS 16
14#define DTTR_MAT4_BYTES (sizeof(float) * DTTR_MAT4_ELEMS)
20 const float *restrict a,
21 const float *restrict b
24 for (
int i = 0; i < 4; i++) {
25 for (
int j = 0; j < 4; j++) {
27 for (
int k = 0; k < 4; k++) {
28 tmp[i * 4 + j] += a[i * 4 + k] * b[k * 4 + j];
33 memcpy(out, tmp,
sizeof(tmp));
40 case D3DTRANSFORMSTATE_WORLD:
41 *out_matrix_f =
state->model;
43 case D3DTRANSFORMSTATE_VIEW:
44 *out_matrix_f =
state->view;
46 case D3DTRANSFORMSTATE_PROJECTION:
47 *out_matrix_f =
state->proj;
57 case D3DTRANSFORMSTATE_WORLD:
60 case D3DTRANSFORMSTATE_VIEW:
63 case D3DTRANSFORMSTATE_PROJECTION:
72 float *matrix_f =
NULL;
83 if (!isfinite(m[i])) {
85 "SetTransform(%s) rejected non-finite matrix input",
106 for (uint32_t i = 0; i <
count - 2; i++) {
108 out[
n++] = in[i + 1];
110 out[
n++] = in[i + 2];
113 out[
n++] = in[i + 1];
114 out[
n++] = in[i + 2];
132 for (uint32_t i = 0; i <
count - 2; i++) {
134 out[
n++] = in[i + 1];
135 out[
n++] = in[i + 2];
173 if (!
state->frame_active) {
267 if (upload_count == 0) {
278 if (!
state->transfer_mapped)
282 "DrawPrimitive: frame vertex limit reached (%u + %u > %u)",
283 state->vertex_offset,
291 +
state->vertex_offset
295 if (fill_mesh_seams) {
299 state->logical_width,
300 state->logical_height,
311 if (
state->blend_enabled) {
339 :
state->dummy_texture;
345 ? (uint32_t)(
state->bound_texture_handle - 1)
348 state->vertex_offset += upload_count;
351 size_t n = kv_size(
state->batch_records);
384 && !
state->bound_texture) {
392 if (
state->bound_texture_handle == tex &&
state->bound_texture) {
396 const int idx = (int)tex - 1;
397 if (idx < 0 || idx >=
state->staged_texture_count) {
402 if (!
state->texture_mutex) {
407 SDL_LockMutex(
state->texture_mutex);
413 state->bound_texture_handle = tex;
414 state->bound_texture =
st->gpu_tex;
415 SDL_UnlockMutex(
state->texture_mutex);
437 if (
w <= 0 ||
h <= 0)
444 state->viewport_min_z = min_z;
445 state->viewport_max_z = max_z;
461static HRESULT __stdcall d3ddevice7_enumtextureformats(
471 const LPD3DENUMPIXELFORMATSCALLBACK callback = (LPD3DENUMPIXELFORMATSCALLBACK)
cb;
475 .dwSize =
sizeof(DDPIXELFORMAT),
476 .dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS,
478 .dwRBitMask = 0x0F00,
479 .dwGBitMask = 0x00F0,
480 .dwBBitMask = 0x000F,
481 .dwRGBAlphaBitMask = 0xF000,
492 .dwSize =
sizeof(DDPIXELFORMAT),
495 .dwRBitMask = 0xF800,
496 .dwGBitMask = 0x07E0,
497 .dwBBitMask = 0x001F,
498 .dwRGBAlphaBitMask = 0,
511 d3ddevice7_getdirect3d,
518 d3ddevice7_setrendertarget,
525 d3ddevice7_getrendertarget,
531static HRESULT __stdcall d3ddevice7_clear(
544 if (
flags & D3DCLEAR_ZBUFFER)
546 if (
flags & D3DCLEAR_STENCIL)
569 float *matrix_f =
NULL;
587 const D3DVIEWPORT7 *v = (
const D3DVIEWPORT7 *)vp;
608 float *matrix_f =
NULL;
614 memcpy(matrix_f, result,
sizeof(result));
626 D3DVIEWPORT7 *v = (D3DVIEWPORT7 *)vp;
632 v->dvMinZ =
state->viewport_min_z;
633 v->dvMaxZ =
state->viewport_max_z;
638 d3ddevice7_setmaterial,
644 d3ddevice7_getmaterial,
672 case D3DRENDERSTATE_ZENABLE:
675 case D3DRENDERSTATE_ZWRITEENABLE:
678 case D3DRENDERSTATE_ZFUNC:
680 case D3DRENDERSTATE_ALPHABLENDENABLE:
683 case D3DRENDERSTATE_SRCBLEND:
686 case D3DRENDERSTATE_DESTBLEND:
689 case D3DRENDERSTATE_CULLMODE:
697 d3ddevice7_getrenderstate,
707 d3ddevice7_endstateblock,
719static HRESULT __stdcall d3ddevice7_drawprimitive(
805 DWORD dim_code = (
fvf >> (16 + t * 2)) & 0x3;
809 }
else if (dim_code == 2) {
811 }
else if (dim_code == 3) {
815 stride += (size_t)dim *
sizeof(
float);
825 const float *v = (
const float *)(
src + i *
stride);
841 float rhw =
has_rhw ? v[3] : 1.0f;
842 if (!isfinite(rhw) || rhw <= 0.0f)
869 float max_rhw = 0.0f;
876 if (max_rhw > 0.0f) {
877 const float inv_max = 1.0f / max_rhw;
890 d3ddevice7_drawindexedprimitive,
902 d3ddevice7_setclipstatus,
908 d3ddevice7_getclipstatus,
915 d3ddevice7_drawprimitivestrided,
925 d3ddevice7_drawindexedprimitivestrided,
937 d3ddevice7_drawprimitivevb,
947 d3ddevice7_drawindexedprimitivevb,
959 d3ddevice7_computespherevisibility,
970 d3ddevice7_gettexture,
977static HRESULT __stdcall d3ddevice7_settexture(
1012 case D3DTSS_COLOROP:
1015 case D3DTSS_COLORARG1:
1018 case D3DTSS_COLORARG2:
1021 case D3DTSS_ALPHAOP:
1024 case D3DTSS_ALPHAARG1:
1027 case D3DTSS_ALPHAARG2:
1030 case D3DTSS_ADDRESSU:
1033 case D3DTSS_ADDRESSV:
1051 case D3DTSS_COLOROP:
1054 case D3DTSS_COLORARG1:
1057 case D3DTSS_COLORARG2:
1060 case D3DTSS_ALPHAOP:
1063 case D3DTSS_ALPHAARG1:
1066 case D3DTSS_ALPHAARG2:
1069 case D3DTSS_ADDRESS:
1074 case D3DTSS_ADDRESSU:
1077 case D3DTSS_ADDRESSV:
1086 d3ddevice7_validatedevice,
1093 d3ddevice7_applystateblock,
1099 d3ddevice7_capturestateblock,
1105 d3ddevice7_deletestateblock,
1111 d3ddevice7_createstateblock,
1129 d3ddevice7_lightenable,
1136 d3ddevice7_getlightenable,
1144 d3ddevice7_setclipplane,
1151 d3ddevice7_getclipplane,
1166 memset(info, 0, sz);
1171 .QueryInterface = d3ddevice7_queryinterface,
1172 .AddRef = d3ddevice7_addref,
1173 .Release = d3ddevice7_release,
1174 .GetCaps = d3ddevice7_getcaps,
1175 .EnumTextureFormats = d3ddevice7_enumtextureformats,
1176 .BeginScene = d3ddevice7_beginscene,
1177 .EndScene = d3ddevice7_endscene,
1178 .GetDirect3D = d3ddevice7_getdirect3d,
1179 .SetRenderTarget = d3ddevice7_setrendertarget,
1180 .GetRenderTarget = d3ddevice7_getrendertarget,
1181 .Clear = d3ddevice7_clear,
1187 .SetMaterial = d3ddevice7_setmaterial,
1188 .GetMaterial = d3ddevice7_getmaterial,
1189 .SetLight = d3ddevice7_setlight,
1190 .GetLight = d3ddevice7_getlight,
1192 .GetRenderState = d3ddevice7_getrenderstate,
1193 .BeginStateBlock = d3ddevice7_beginstateblock,
1194 .EndStateBlock = d3ddevice7_endstateblock,
1195 .PreLoad = d3ddevice7_preload,
1196 .DrawPrimitive = d3ddevice7_drawprimitive,
1197 .DrawIndexedPrimitive = d3ddevice7_drawindexedprimitive,
1198 .SetClipStatus = d3ddevice7_setclipstatus,
1199 .GetClipStatus = d3ddevice7_getclipstatus,
1200 .DrawPrimitiveStrided = d3ddevice7_drawprimitivestrided,
1201 .DrawIndexedPrimitiveStrided = d3ddevice7_drawindexedprimitivestrided,
1202 .DrawPrimitiveVB = d3ddevice7_drawprimitivevb,
1203 .DrawIndexedPrimitiveVB = d3ddevice7_drawindexedprimitivevb,
1204 .ComputeSphereVisibility = d3ddevice7_computespherevisibility,
1205 .GetTexture = d3ddevice7_gettexture,
1206 .SetTexture = d3ddevice7_settexture,
1209 .ValidateDevice = d3ddevice7_validatedevice,
1210 .ApplyStateBlock = d3ddevice7_applystateblock,
1211 .CaptureStateBlock = d3ddevice7_capturestateblock,
1212 .DeleteStateBlock = d3ddevice7_deletestateblock,
1213 .CreateStateBlock = d3ddevice7_createstateblock,
1214 .Load = d3ddevice7_load,
1215 .LightEnable = d3ddevice7_lightenable,
1216 .GetLightEnable = d3ddevice7_getlightenable,
1217 .SetClipPlane = d3ddevice7_setclipplane,
1218 .GetClipPlane = d3ddevice7_getclipplane,
static DTTR_Graphics_COM_Direct3D7_VT vtbl
const size_t specular_off
DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 void void void void DWORD f DTTR_Graphics_COM_Direct3DDevice7 DWORD idx float
DTTR_Graphics_COM_Direct3DDevice7 void * surface
DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 void void void void * srcR
static HRESULT d3ddevice7_gettexturestagestate(DTTR_Graphics_COM_Direct3DDevice7 *self, DWORD stage, DWORD type, DWORD *out)
DTTR_Graphics_COM_Direct3DDevice7 * self
DTTR_Graphics_COM_Direct3DDevice7 void *status DTTR_Graphics_COM_Direct3DDevice7 DWORD DWORD void DWORD DWORD f DTTR_Graphics_COM_Direct3DDevice7 DWORD void DWORD st
static HRESULT d3ddevice7_gettransform(DTTR_Graphics_COM_Direct3DDevice7 *self, DWORD type, void *matrix)
static DTTR_PrimitiveType d3d_device7_map_primitive_type(DWORD prim_type)
Maps a D3D primitive code to the internal primitive enum.
static HRESULT d3ddevice7_settransform(DTTR_Graphics_COM_Direct3DDevice7 *self, DWORD type, void *matrix)
static bool d3d_device7_get_transform_state(DWORD type, float **out_matrix_f)
Selects the backend transform matrix for a D3D transform state token.
DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 void void * dstPt
DTTR_Graphics_COM_Direct3DDevice7 void *status DTTR_Graphics_COM_Direct3DDevice7 DWORD DWORD void DWORD DWORD f DTTR_Graphics_COM_Direct3DDevice7 DWORD void DWORD DWORD DWORD f DTTR_Graphics_COM_Direct3DDevice7 void float * r
DTTR_Graphics_COM_Direct3DDevice7 *self DWORD DWORD fvf
static void d3d_device7_mat4_multiply_f(float *restrict out, const float *restrict a, const float *restrict b)
Multiplies two row-major 4x4 float matrices into out.
DTTR_Graphics_COM_Direct3DDevice7 * dttr_graphics_com_create_direct3ddevice7()
DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 void void void void DWORD f BOOL
DTTR_Graphics_COM_Direct3DDevice7 void DWORD flags DWORD count
DTTR_Graphics_COM_Direct3DDevice7 void *status DTTR_Graphics_COM_Direct3DDevice7 DWORD DWORD void * d
static void d3d_device7_record_draw(DTTR_PrimitiveType type, const DTTR_Vertex *verts, uint32_t count, bool transformed, bool textured)
Appends a draw record to the current frame batch.
const DTTR_BackendState * state
static uint32_t d3d_device7_expand_fan(const DTTR_Vertex *restrict in, uint32_t count, DTTR_Vertex *restrict out)
Expands a triangle fan into a triangle list.
static DTTR_PrimitiveType d3d_device7_uploaded_primitive_type(DTTR_PrimitiveType type)
static void d3d_device7_clear_bound_texture(DTTR_BackendState *state)
static DTTR_Vertex d3d_device7_verts[MAX_VERTICES]
DTTR_Graphics_COM_Direct3DDevice7 void DWORD flags DWORD void DWORD DWORD color
static void d3d_device7_set_texture_address_u(DTTR_TextureAddress addr)
Sets texture addressing mode for U coordinates.
static void d3d_device7_record_clear(uint32_t flags, uint32_t color, float depth, uint32_t stencil)
Appends a clear record to the current frame batch.
static HRESULT d3ddevice7_getviewport(DTTR_Graphics_COM_Direct3DDevice7 *self, void *vp)
static uint32_t d3d_device7_expand_strip(const DTTR_Vertex *restrict in, uint32_t count, DTTR_Vertex *restrict out)
Expands a triangle strip into a triangle list.
static void d3d_device7_set_viewport(int x, int y, int w, int h, float min_z, float max_z)
Updates the viewport state used by transformed rendering paths.
static const char * d3d_device7_transform_label(DWORD type)
static void d3d_device7_set_transform_state(DWORD type, const float *m)
const size_t normal_bytes
DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 void void void void DWORD f FALSE
DTTR_Graphics_COM_Direct3DDevice7 *self DTTR_Graphics_COM_Direct3DDevice7 DWORD static idx HRESULT d3ddevice7_setrenderstate(DTTR_Graphics_COM_Direct3DDevice7 *self, DWORD state, DWORD value)
DTTR_Graphics_COM_Direct3DDevice7 void *status DTTR_Graphics_COM_Direct3DDevice7 DWORD DWORD void DWORD DWORD f DTTR_Graphics_COM_Direct3DDevice7 DWORD void DWORD DWORD DWORD f DTTR_Graphics_COM_Direct3DDevice7 void float DWORD DWORD f DWORD stage
DTTR_Graphics_COM_Direct3DDevice7 void DWORD flags DWORD void DWORD DWORD float DWORD stencil
static HRESULT d3ddevice7_setviewport(DTTR_Graphics_COM_Direct3DDevice7 *self, void *vp)
static void d3d_device7_set_texture_address_v(DTTR_TextureAddress addr)
Sets texture addressing mode for V coordinates.
DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 void * dst
const DTTR_PrimitiveType type
static void d3d_device7_texture_bind(DTTR_Texture tex)
Binds an internal texture handle for subsequent draw records.
DTTR_Graphics_COM_Direct3DDevice7 void *status DTTR_Graphics_COM_Direct3DDevice7 DWORD DWORD void DWORD DWORD f DTTR_Graphics_COM_Direct3DDevice7 DWORD void DWORD DWORD DWORD f DTTR_Graphics_COM_Direct3DDevice7 void float DWORD DWORD f DWORD void * texture
static void d3d_device7_set_blend_func(DTTR_BlendFactor src, DTTR_BlendFactor dst)
Sets source and destination blend factors.
static HRESULT d3ddevice7_multiplytransform(DTTR_Graphics_COM_Direct3DDevice7 *self, DWORD type, void *matrix)
DTTR_Graphics_COM_Direct3DDevice7 *self DWORD prim_type
DDPIXELFORMAT fmt_argb4444
DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 DWORD block DTTR_Graphics_COM_Direct3DDevice7 void void void void DWORD f DTTR_Graphics_COM_Direct3DDevice7 DWORD idx DTTR_Graphics_COM_Direct3DDevice7 DWORD static idx HRESULT d3ddevice7_getinfo(DTTR_Graphics_COM_Direct3DDevice7 *self, DWORD id, void *info, DWORD sz)
DTTR_Graphics_COM_Direct3DDevice7 void *status DTTR_Graphics_COM_Direct3DDevice7 DWORD DWORD void DWORD DWORD f DTTR_Graphics_COM_Direct3DDevice7 DWORD void * vb
DTTR_Graphics_COM_Direct3DDevice7 void DWORD flags DWORD void * rects
DTTR_Graphics_COM_Direct3DDevice7 *self DWORD DWORD void * vertices
DTTR_Graphics_COM_Direct3DDevice7 void *status DTTR_Graphics_COM_Direct3DDevice7 DWORD DWORD void DWORD DWORD f DTTR_Graphics_COM_Direct3DDevice7 DWORD void DWORD DWORD DWORD f DTTR_Graphics_COM_Direct3DDevice7 void * c
DTTR_Graphics_COM_Direct3DDevice7 void DWORD flags DWORD void DWORD DWORD float z
static void d3d_device7_copy_or_expand_primitive(DTTR_PrimitiveType *type, const DTTR_Vertex *verts, uint32_t count, DTTR_Vertex *out)
const size_t diffuse_bytes
static uint32_t d3d_device7_expanded_primitive_count(DTTR_PrimitiveType type, uint32_t count)
DTTR_Graphics_COM_Direct3DDevice7 void DWORD flags DWORD void DWORD flags
static HRESULT d3ddevice7_settexturestagestate(DTTR_Graphics_COM_Direct3DDevice7 *self, DWORD stage, DWORD type, DWORD value)
DTTR_Graphics_COM_Direct3DDevice7 void *status DTTR_Graphics_COM_Direct3DDevice7 DWORD prim
const size_t specular_bytes
DTTR_Graphics_COM_Direct3DDevice7 void *status DTTR_Graphics_COM_Direct3DDevice7 DWORD DWORD void DWORD n
DTTR_Graphics_COM_DirectDraw7 *self DWORD DWORD h
DTTR_Graphics_COM_DirectDraw7 DWORD f
DTTR_Graphics_COM_DirectDraw7 *self DWORD w
DTTR_Graphics_COM_DirectDrawSurface7 DWORD x
DTTR_Graphics_COM_DirectDrawSurface7 DWORD DWORD y
DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags void NULL
#define DTTR_LOG_WARN(...)
void dttr_graphics_begin_frame()
#define DTTR_D3DPT_POINTLIST
#define DTTR_D3DFVF_XYZB2
#define DTTR_D3DFVF_XYZB3
#define DTTR_D3DFVF_SPECULAR
#define DTTR_D3DFVF_XYZRHW
#define DTTR_COM_STUB_MEMSET(fn, size, buf_type,...)
#define DTTR_COM_STUB_SET(fn, out_type, val,...)
#define DTTR_D3DPT_LINELIST
#define DTTR_D3DPT_TRIANGLEFAN
#define DTTR_D3DFVF_TEXCOUNT_SHIFT
#define DTTR_COM_NOOP_HRESULT(fn,...)
#define DTTR_COM_ADDREF(fn, type)
#define DTTR_D3DFVF_POSITION_MASK
#define DTTR_D3DFVF_NORMAL
#define DTTR_D3DFVF_XYZB4
#define DTTR_D3DFVF_XYZB1
#define DTTR_D3DFVF_DIFFUSE
#define DTTR_COM_QI_SELF(fn, type)
#define DTTR_D3DPT_LINESTRIP
#define DTTR_D3DPT_TRIANGLESTRIP
#define DTTR_D3DFVF_XYZB5
#define DTTR_D3DFVF_LASTBETA_UBYTE4
#define DTTR_SIZEOF_D3DMATERIAL7
#define DTTR_COM_RELEASE(fn, type)
#define DTTR_D3DFVF_LASTBETA_D3DCOLOR
#define DTTR_D3DFVF_PSIZE
#define DTTR_SIZEOF_D3DCLIPSTATUS
#define DTTR_D3DPT_TRIANGLELIST
#define DTTR_SIZEOF_D3DLIGHT7
#define DTTR_SIZEOF_D3DDEVICEDESC7
void dttr_graphics_fill_mesh_seams(DTTR_Vertex *verts, uint32_t count, int logical_width, int logical_height, int render_width, int render_height)
Expands triangle-list vertices by a tiny physical-pixel amount to hide mesh cracks.
#define DTTR_MAX_FRAME_VERTICES
bool dttr_graphics_ensure_staged_texture(DTTR_BackendState *state, DTTR_StagedTexture *st)
bool dttr_graphics_is_gpu_thread()
#define DTTR_CLEAR_STENCIL
bool dttr_graphics_should_fill_mesh_seams(DTTR_PrimitiveType type, bool transformed, bool depth_test, bool blend_enabled)
Returns true when a draw call should receive subpixel logical-scaling seam fill.
#define DTTR_BLEND_ADDITIVE
DTTR_BackendState dttr_backend
@ DTTR_PRIM_TRIANGLESTRIP
#define DTTR_INVALID_TEXTURE
A recorded clear or draw command replayed during frame submission.
struct DTTR_BatchRecord::@173304276063167267021134124022136033175102267147::@317066375077304207167347173122133172104242212006 clear
struct DTTR_BatchRecord::@173304276063167267021134124022136033175102267147::@107356260052026241174121242151011150024304321020 draw
DTTR_BatchRecordType type
DTTR_Graphics_COM_Direct3DDevice7_VT * vtbl