Skip to content

Commit

Permalink
log direct3d9 errors
Browse files Browse the repository at this point in the history
  • Loading branch information
FunkyFr3sh committed Sep 7, 2024
1 parent 60a6677 commit 2a269f1
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 34 deletions.
1 change: 1 addition & 0 deletions inc/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ void dbg_dump_dds_caps(DWORD caps);
void dbg_dump_dds_flags(DWORD flags);
void dbg_dump_dds_blt_fast_flags(DWORD flags);
void dbg_dump_dds_lock_flags(DWORD flags);
char* dbg_d3d9_hr_to_str(HRESULT hr);
char* dbg_mes_to_str(int id);

__declspec(noreturn) void __cdecl dbg_invoke_watson(
Expand Down
34 changes: 34 additions & 0 deletions src/debug.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <windows.h>
#include <dbghelp.h>
#include <stdio.h>
#include <d3d9.h>
#include "ddraw.h"
#include "dd.h"
#include "ddsurface.h"
Expand Down Expand Up @@ -1005,6 +1006,39 @@ void dbg_dump_dds_lock_flags(DWORD flags)
#endif
}

char* dbg_d3d9_hr_to_str(HRESULT hr)
{
#define HR_TO_STR(x) if (x == hr) return #x

HR_TO_STR(D3D_OK);

HR_TO_STR(D3DERR_WRONGTEXTUREFORMAT);
HR_TO_STR(D3DERR_UNSUPPORTEDCOLOROPERATION);
HR_TO_STR(D3DERR_UNSUPPORTEDCOLORARG);
HR_TO_STR(D3DERR_UNSUPPORTEDALPHAOPERATION);
HR_TO_STR(D3DERR_UNSUPPORTEDALPHAARG);
HR_TO_STR(D3DERR_TOOMANYOPERATIONS);
HR_TO_STR(D3DERR_CONFLICTINGTEXTUREFILTER);
HR_TO_STR(D3DERR_UNSUPPORTEDFACTORVALUE);
HR_TO_STR(D3DERR_CONFLICTINGRENDERSTATE);
HR_TO_STR(D3DERR_UNSUPPORTEDTEXTUREFILTER);
HR_TO_STR(D3DERR_CONFLICTINGTEXTUREPALETTE);
HR_TO_STR(D3DERR_DRIVERINTERNALERROR);

HR_TO_STR(D3DERR_NOTFOUND);
HR_TO_STR(D3DERR_MOREDATA);
HR_TO_STR(D3DERR_DEVICELOST);
HR_TO_STR(D3DERR_DEVICENOTRESET);
HR_TO_STR(D3DERR_NOTAVAILABLE);
HR_TO_STR(D3DERR_OUTOFVIDEOMEMORY);
HR_TO_STR(D3DERR_INVALIDDEVICE);
HR_TO_STR(D3DERR_INVALIDCALL);
HR_TO_STR(D3DERR_DRIVERINVALIDCALL);
HR_TO_STR(D3DERR_WASSTILLDRAWING);

return "UNKNOWN";
}

char* dbg_mes_to_str(int id)
{
switch (id)
Expand Down
96 changes: 62 additions & 34 deletions src/render_d3d9.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@
#include "config.h"


#define FAILEDX(stmt) d3d9_check_failed(stmt, #stmt)
#define SUCCEEDEDX(stmt) d3d9_check_succeeded(stmt, #stmt)

static BOOL d3d9_check_failed(HRESULT hr, const char* stmt);
static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt);
static BOOL d3d9_create_resources();
static BOOL d3d9_set_states();
static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch);
Expand Down Expand Up @@ -86,10 +91,10 @@ BOOL d3d9_create()
#if _DEBUG
D3DADAPTER_IDENTIFIER9 ai = {0};
D3DCAPS9 caps = { 0 };
HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai);
HRESULT hr2 = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
HRESULT adapter_hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai);
HRESULT devcaps_hr = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);

if (SUCCEEDED(hr))
if (SUCCEEDEDX(adapter_hr))
{
TRACE("+--Direct3D9-------------------------------------\n");
TRACE("| D3D9On12: %s (%p)\n", d3d9on12 != NULL ? "True" : "False", GetModuleHandleA("d3d9on12.dll"));
Expand All @@ -106,7 +111,7 @@ BOOL d3d9_create()
TRACE("| Driver: %s\n", ai.Driver);
TRACE("| Description: %s\n", ai.Description);

if (SUCCEEDED(hr2))
if (SUCCEEDEDX(devcaps_hr))
{
TRACE("| MaxTextureWidth: %d\n", caps.MaxTextureWidth);
TRACE("| MaxTextureHeight: %d\n", caps.MaxTextureHeight);
Expand Down Expand Up @@ -146,7 +151,7 @@ BOOL d3d9_create()

for (int i = 0; i < sizeof(behavior_flags) / sizeof(behavior_flags[0]); i++)
{
if (SUCCEEDED(
if (SUCCEEDEDX(
IDirect3D9_CreateDevice(
g_d3d9.instance,
D3DADAPTER_DEFAULT,
Expand All @@ -163,6 +168,29 @@ BOOL d3d9_create()
return FALSE;
}

static BOOL d3d9_check_failed(HRESULT hr, const char* stmt)
{
if (FAILED(hr))
{
TRACE("Direct3D9 error %s [%08x] (%s)\n", dbg_d3d9_hr_to_str(hr), hr, stmt);
return TRUE;
}

return FALSE;
}

static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt)
{
if (!SUCCEEDED(hr))
{
TRACE("Direct3D9 error %s [%08x] (%s)\n", dbg_d3d9_hr_to_str(hr), hr, stmt);

return FALSE;
}

return TRUE;
}

BOOL d3d9_on_device_lost()
{
if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET)
Expand All @@ -181,7 +209,7 @@ BOOL d3d9_reset(BOOL windowed)
g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate;
g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8;

if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params)))
if (g_d3d9.device && SUCCEEDEDX(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params)))
{
BOOL result = d3d9_set_states();

Expand Down Expand Up @@ -278,7 +306,7 @@ static BOOL d3d9_create_resources()
g_d3d9.scale_w = (float)width / g_d3d9.tex_width;;
g_d3d9.scale_h = (float)height / g_d3d9.tex_height;

err = err || FAILED(
err = err || FAILEDX(
IDirect3DDevice9_CreateVertexBuffer(
g_d3d9.device,
sizeof(CUSTOMVERTEX) * 4, 0,
Expand All @@ -293,7 +321,7 @@ static BOOL d3d9_create_resources()
{
if (g_ddraw.bpp == 16 && g_config.rgb555)
{
BOOL error = FAILED(
BOOL error = FAILEDX(
IDirect3DDevice9_CreateTexture(
g_d3d9.device,
g_d3d9.tex_width,
Expand All @@ -307,7 +335,7 @@ static BOOL d3d9_create_resources()

if (error)
{
err = err || FAILED(
err = err || FAILEDX(
IDirect3DDevice9_CreateTexture(
g_d3d9.device,
g_d3d9.tex_width,
Expand All @@ -322,7 +350,7 @@ static BOOL d3d9_create_resources()
}
else if (g_ddraw.bpp == 32)
{
BOOL error = FAILED(
BOOL error = FAILEDX(
IDirect3DDevice9_CreateTexture(
g_d3d9.device,
g_d3d9.tex_width,
Expand All @@ -336,7 +364,7 @@ static BOOL d3d9_create_resources()

if (error)
{
err = err || FAILED(
err = err || FAILEDX(
IDirect3DDevice9_CreateTexture(
g_d3d9.device,
g_d3d9.tex_width,
Expand All @@ -351,7 +379,7 @@ static BOOL d3d9_create_resources()
}
else
{
err = err || FAILED(
err = err || FAILEDX(
IDirect3DDevice9_CreateTexture(
g_d3d9.device,
g_d3d9.tex_width,
Expand All @@ -368,7 +396,7 @@ static BOOL d3d9_create_resources()

if (g_ddraw.bpp == 8)
{
BOOL error = FAILED(
BOOL error = FAILEDX(
IDirect3DDevice9_CreateTexture(
g_d3d9.device,
256,
Expand All @@ -382,7 +410,7 @@ static BOOL d3d9_create_resources()

if (error)
{
err = err || FAILED(
err = err || FAILEDX(
IDirect3DDevice9_CreateTexture(
g_d3d9.device,
256,
Expand All @@ -401,7 +429,7 @@ static BOOL d3d9_create_resources()

if (g_ddraw.bpp == 8)
{
err = err || FAILED(
err = err || FAILEDX(
IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader));

IDirect3DDevice9_CreatePixelShader(
Expand All @@ -413,7 +441,7 @@ static BOOL d3d9_create_resources()
{
if (g_config.d3d9_filter == FILTER_LANCZOS)
{
BOOL error = FAILED(
BOOL error = FAILEDX(
IDirect3DDevice9_CreatePixelShader(
g_d3d9.device,
(DWORD*)D3D9_LANCZOS2_SHADER,
Expand Down Expand Up @@ -441,28 +469,28 @@ static BOOL d3d9_set_states()
{
BOOL err = FALSE;

err = err || FAILED(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1));
err = err || FAILED(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX)));
err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0]));
err = err || FAILEDX(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1));
err = err || FAILEDX(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX)));
err = err || FAILEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0]));

if (g_ddraw.bpp == 8)
{
err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0]));
err = err || FAILEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0]));

BOOL bilinear =
g_config.d3d9_filter &&
g_d3d9.pixel_shader_upscale &&
(g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack);

err = err || FAILED(
err = err || FAILEDX(
IDirect3DDevice9_SetPixelShader(
g_d3d9.device,
bilinear ? g_d3d9.pixel_shader_upscale : g_d3d9.pixel_shader));

if (bilinear)
{
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 };
err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
}
}
else
Expand All @@ -473,22 +501,22 @@ static BOOL d3d9_set_states()
g_d3d9.pixel_shader_upscale &&
(g_ddraw.render.viewport.width != g_ddraw.width ||
g_ddraw.render.viewport.height != g_ddraw.height) &&
SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))
SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))
{
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 };
err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
}
else if (
SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) &&
SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) &&
SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) &&
SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) &&
g_config.d3d9_filter == FILTER_CUBIC &&
g_d3d9.pixel_shader_upscale &&
(g_ddraw.render.viewport.width != g_ddraw.width ||
g_ddraw.render.viewport.height != g_ddraw.height) &&
SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))
SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale)))
{
float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 };
err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1));
}
}
}
Expand All @@ -502,7 +530,7 @@ static BOOL d3d9_set_states()
0.0f,
1.0f };
err = err || FAILED(IDirect3DDevice9_SetViewport(g_d3d9.device, &view_data));
err = err || FAILEDX(IDirect3DDevice9_SetViewport(g_d3d9.device, &view_data));
*/
return !err;
}
Expand All @@ -527,7 +555,7 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch)
};

void* data;
if (g_d3d9.vertex_buf && SUCCEEDED(IDirect3DVertexBuffer9_Lock(g_d3d9.vertex_buf, 0, 0, (void**)&data, 0)))
if (g_d3d9.vertex_buf && SUCCEEDEDX(IDirect3DVertexBuffer9_Lock(g_d3d9.vertex_buf, 0, 0, (void**)&data, 0)))
{
memcpy(data, vertices, sizeof(vertices));

Expand Down Expand Up @@ -594,8 +622,8 @@ DWORD WINAPI d3d9_render_main(void)

RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height };

if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) &&
SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0)))
if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) &&
SUCCEEDEDX(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0)))
{
blt_clean(
lock_rc.pBits,
Expand All @@ -622,8 +650,8 @@ DWORD WINAPI d3d9_render_main(void)

RECT rc = { 0,0,256,1 };

if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) &&
SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0)))
if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) &&
SUCCEEDEDX(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0)))
{
memcpy(lock_rc.pBits, g_ddraw.primary->palette->data_rgb, 256 * sizeof(int));

Expand Down

0 comments on commit 2a269f1

Please sign in to comment.