From 88387ccbde97dc2af59300484ed83f742971192f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 22 Apr 2018 15:34:08 +0200 Subject: [PATCH] (D3D8) Cleanups --- gfx/common/d3d8_common.c | 500 ++------------------------------------- gfx/common/d3d8_common.h | 476 +++++++++++++++++++++++++++++-------- 2 files changed, 391 insertions(+), 585 deletions(-) diff --git a/gfx/common/d3d8_common.c b/gfx/common/d3d8_common.c index 5bbec85867..f75d23b9fc 100644 --- a/gfx/common/d3d8_common.c +++ b/gfx/common/d3d8_common.c @@ -172,108 +172,32 @@ void d3d8_deinitialize_symbols(void) #endif } -bool d3d8_check_device_type(void *_d3d, - unsigned idx, - INT32 disp_format, - INT32 backbuffer_format, - bool windowed_mode) -{ - LPDIRECT3D8 d3d = (LPDIRECT3D8)_d3d; - if (d3d && - SUCCEEDED(IDirect3D8_CheckDeviceType(d3d, - 0, - D3DDEVTYPE_HAL, - disp_format, - backbuffer_format, - windowed_mode))) - return true; - - return false; -} - -bool d3d8_get_adapter_display_mode( - void *_d3d, - unsigned idx, - void *display_mode) -{ - LPDIRECT3D8 d3d = (LPDIRECT3D8)_d3d; - if (d3d && - SUCCEEDED(IDirect3D8_GetAdapterDisplayMode( - d3d, idx, (D3DDISPLAYMODE*)display_mode))) - return true; - - return false; -} - -bool d3d8_swap(void *data, void *_dev) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (IDirect3DDevice8_Present(dev, NULL, NULL, NULL, NULL) - == D3DERR_DEVICELOST) - return false; - return true; -} - -void d3d8_set_transform(void *_dev, - INT32 state, const void *_matrix) -{ - CONST D3DMATRIX *matrix = (CONST D3DMATRIX*)_matrix; - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - IDirect3DDevice8_SetTransform(dev, (D3DTRANSFORMSTATETYPE)state, matrix); -} - -bool d3d8_texture_get_level_desc(void *_tex, - unsigned idx, void *_ppsurface_level) -{ - LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex; - if (SUCCEEDED(IDirect3DTexture8_GetLevelDesc(tex, idx, (D3DSURFACE_DESC*)_ppsurface_level))) - return true; - - return false; -} - -bool d3d8_texture_get_surface_level(void *_tex, - unsigned idx, void **_ppsurface_level) -{ - LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex; - if (tex && - SUCCEEDED( - IDirect3DTexture8_GetSurfaceLevel( - tex, idx, (IDirect3DSurface8**)_ppsurface_level))) - return true; - return false; -} - #ifdef HAVE_D3DX static void *d3d8_texture_new_from_file( - void *dev, + LPDIRECT3DDEVICE8 dev, const char *path, unsigned width, unsigned height, unsigned miplevels, unsigned usage, D3DFORMAT format, - INT32 pool, unsigned filter, unsigned mipfilter, + D3DPOOL pool, unsigned filter, unsigned mipfilter, INT32 color_key, void *src_info_data, PALETTEENTRY *palette) { void *buf = NULL; - HRESULT hr = D3DCreateTextureFromFile((LPDIRECT3DDEVICE8)dev, + if (FAILED(D3DCreateTextureFromFile(dev, path, width, height, miplevels, usage, format, - (D3DPOOL)pool, filter, mipfilter, color_key, src_info_data, - palette, (struct IDirect3DTeture8**)&buf); - - if (FAILED(hr)) + pool, filter, mipfilter, color_key, src_info_data, + palette, (struct IDirect3DTeture8**)&buf))) return NULL; - return buf; } #endif -void *d3d8_texture_new(void *_dev, +void *d3d8_texture_new(LPDIRECT3DDEVICE8 dev, const char *path, unsigned width, unsigned height, unsigned miplevels, unsigned usage, INT32 format, INT32 pool, unsigned filter, unsigned mipfilter, INT32 color_key, void *src_info_data, PALETTEENTRY *palette, bool want_mipmap) { - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; void *buf = NULL; if (path) @@ -298,326 +222,6 @@ void *d3d8_texture_new(void *_dev, return buf; } -void d3d8_texture_free(void *_tex) -{ - LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex; - if (!tex) - return; - IDirect3DTexture8_Release(tex); -} - -bool d3d8_surface_lock_rect(void *data, void *data2) -{ - LPDIRECT3DSURFACE8 surf = (LPDIRECT3DSURFACE8)data; - if (surf && - SUCCEEDED( - IDirect3DSurface8_LockRect( - surf, (D3DLOCKED_RECT*)data2, - NULL, D3DLOCK_READONLY))) - return true; - return false; -} - -void d3d8_surface_unlock_rect(void *data) -{ - LPDIRECT3DSURFACE8 surf = (LPDIRECT3DSURFACE8)data; - if (!surf) - return; - IDirect3DSurface8_UnlockRect(surf); -} - -void d3d8_surface_free(void *data) -{ - LPDIRECT3DSURFACE8 surf = (LPDIRECT3DSURFACE8)data; - if (!surf) - return; - IDirect3DSurface8_Release(surf); -} - -void *d3d8_vertex_buffer_new(void *_dev, - unsigned length, unsigned usage, - unsigned fvf, INT32 pool, void *handle) -{ - void *buf = NULL; - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (FAILED(IDirect3DDevice8_CreateVertexBuffer( - dev, length, usage, fvf, - (D3DPOOL)pool, - (struct IDirect3DVertexBuffer8**)&buf))) - return NULL; - - return buf; -} - -void d3d8_vertex_buffer_unlock(void *vertbuf_ptr) -{ - LPDIRECT3DVERTEXBUFFER8 vertbuf = (LPDIRECT3DVERTEXBUFFER8)vertbuf_ptr; - - if (!vertbuf) - return; - IDirect3DVertexBuffer8_Unlock(vertbuf); -} - -void *d3d8_vertex_buffer_lock(void *vertbuf_ptr) -{ - void *buf = NULL; - LPDIRECT3DVERTEXBUFFER8 vertbuf = (LPDIRECT3DVERTEXBUFFER8)vertbuf_ptr; - - if (!vertbuf) - return NULL; - - IDirect3DVertexBuffer8_Lock(vertbuf, 0, 0, (BYTE**)&buf, 0); - - if (!buf) - return NULL; - - return buf; -} - -void d3d8_vertex_buffer_free(void *vertex_data, void *vertex_declaration) -{ - if (vertex_data) - { - LPDIRECT3DVERTEXBUFFER8 buf = (LPDIRECT3DVERTEXBUFFER8)vertex_data; - IDirect3DVertexBuffer8_Release(buf); - buf = NULL; - } -} - -void d3d8_set_stream_source(void *_dev, unsigned stream_no, - void *stream_vertbuf_ptr, unsigned offset_bytes, - unsigned stride) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - LPDIRECT3DVERTEXBUFFER8 stream_vertbuf = (LPDIRECT3DVERTEXBUFFER8)stream_vertbuf_ptr; - if (!stream_vertbuf) - return; - IDirect3DDevice8_SetStreamSource(dev, stream_no, stream_vertbuf, stride); -} - -static void d3d8_set_texture_stage_state(void *_dev, - unsigned sampler, unsigned type, unsigned value) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (IDirect3DDevice8_SetTextureStageState(dev, sampler, (D3DTEXTURESTAGESTATETYPE)type, value) != D3D_OK) - RARCH_ERR("SetTextureStageState call failed, sampler: %d, value: %d, type: %d\n", sampler, value, type); -} - -void d3d8_set_sampler_address_u(void *_dev, - unsigned sampler, unsigned value) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - d3d8_set_texture_stage_state(dev, sampler, D3DTSS_ADDRESSU, value); -} - -void d3d8_set_sampler_address_v(void *_dev, - unsigned sampler, unsigned value) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - d3d8_set_texture_stage_state(dev, sampler, D3DTSS_ADDRESSV, value); -} - -void d3d8_set_sampler_minfilter(void *_dev, - unsigned sampler, unsigned value) -{ - d3d8_set_texture_stage_state(_dev, sampler, D3DTSS_MINFILTER, value); -} - -void d3d8_set_sampler_magfilter(void *_dev, - unsigned sampler, unsigned value) -{ - d3d8_set_texture_stage_state(_dev, sampler, D3DTSS_MAGFILTER, value); -} - -bool d3d8_begin_scene(void *_dev) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (!dev) - return false; -#ifdef _XBOX - IDirect3DDevice8_BeginScene(dev); -#else - if (FAILED(IDirect3DDevice8_BeginScene(dev))) - return false; -#endif - - return true; -} - -void d3d8_end_scene(void *_dev) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (!dev) - return; - IDirect3DDevice8_EndScene(dev); -} - -static void d3d8_draw_primitive_internal(void *_dev, - D3DPRIMITIVETYPE type, unsigned start, unsigned count) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (!dev) - return; - IDirect3DDevice8_DrawPrimitive(dev, type, start, count); -} - -void d3d8_draw_primitive(void *dev, - INT32 type, unsigned start, unsigned count) -{ - if (!d3d8_begin_scene(dev)) - return; - - d3d8_draw_primitive_internal(dev, (D3DPRIMITIVETYPE)type, start, count); - d3d8_end_scene(dev); -} - -void d3d8_clear(void *_dev, - unsigned count, const void *rects, unsigned flags, - INT32 color, float z, unsigned stencil) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (!dev) - return; - IDirect3DDevice8_Clear(dev, count, (const D3DRECT*)rects, flags, - color, z, stencil); -} - -bool d3d8_device_get_render_target(void *_dev, - unsigned idx, void **data) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (dev && - SUCCEEDED(IDirect3DDevice8_GetRenderTarget(dev, - (LPDIRECT3DSURFACE8*)data))) - return true; - - return false; -} - - -bool d3d8_lock_rectangle(void *_tex, - unsigned level, void *_lr, RECT *rect, - unsigned rectangle_height, unsigned flags) -{ - D3DLOCKED_RECT *lr = (D3DLOCKED_RECT*)_lr; - LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex; - if (tex && - IDirect3DTexture8_LockRect(tex, level, lr, rect, flags) == D3D_OK) - return true; - return false; -} - -void d3d8_unlock_rectangle(void *_tex) -{ - LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex; - if (!tex) - return; - IDirect3DTexture8_UnlockRect(tex, 0); -} - -void d3d8_lock_rectangle_clear(void *tex, - unsigned level, void *_lr, RECT *rect, - unsigned rectangle_height, unsigned flags) -{ - D3DLOCKED_RECT *lr = (D3DLOCKED_RECT*)_lr; -#if defined(_XBOX) - level = 0; -#endif - memset(lr->pBits, level, rectangle_height * lr->Pitch); - d3d8_unlock_rectangle(tex); -} - -void d3d8_set_viewports(void *_dev, void *_vp) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - D3DVIEWPORT8 *vp = (D3DVIEWPORT8*)_vp; - if (!dev) - return; - IDirect3DDevice8_SetViewport(dev, vp); -} - -void d3d8_set_texture(void *_dev, unsigned sampler, - void *tex_data) -{ - LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)tex_data; - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (!dev || !tex) - return; - IDirect3DDevice8_SetTexture(dev, sampler, - (IDirect3DBaseTexture8*)tex); -} - -bool d3d8_set_vertex_shader(void *_dev, unsigned index, - void *data) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (IDirect3DDevice8_SetVertexShader(dev, index) != D3D_OK) - return false; - - return true; -} - -void d3d8_texture_blit(unsigned pixel_size, - void *tex, - void *_lr, const void *frame, - unsigned width, unsigned height, unsigned pitch) -{ - unsigned y; - D3DLOCKED_RECT *lr = (D3DLOCKED_RECT*)_lr; - - for (y = 0; y < height; y++) - { - const uint8_t *in = (const uint8_t*)frame + y * pitch; - uint8_t *out = (uint8_t*)lr->pBits + y * lr->Pitch; - memcpy(out, in, width * pixel_size); - } -} - -bool d3d8_get_render_state(void *data, INT32 state, DWORD *value) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data; - if (dev && IDirect3DDevice8_GetRenderState(dev, (D3DRENDERSTATETYPE)state, value) == D3D_OK) - return true; - - return false; -} - -void d3d8_set_render_state(void *data, INT32 state, DWORD value) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data; - if (!dev) - return; - IDirect3DDevice8_SetRenderState(dev, (D3DRENDERSTATETYPE)state, value); -} - -void d3d8_enable_blend_func(void *data) -{ - if (!data) - return; - - d3d8_set_render_state(data, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - d3d8_set_render_state(data, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); - d3d8_set_render_state(data, D3DRS_ALPHABLENDENABLE, true); -} - -void d3d8_device_set_render_target(void *_dev, unsigned idx, - void *data) -{ - LPDIRECT3DSURFACE8 surf = (LPDIRECT3DSURFACE8)data; - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (!dev) - return; - IDirect3DDevice8_SetRenderTarget(dev, surf, NULL); -} - -void d3d8_enable_alpha_blend_texture_func(void *data) -{ - /* Also blend the texture with the set alpha value. */ - d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); - d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); - d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); -} - void d3d8_frame_postprocess(void *data) { #if defined(_XBOX) @@ -627,27 +231,19 @@ void d3d8_frame_postprocess(void *data) #endif } -void d3d8_disable_blend_func(void *data) -{ - d3d8_set_render_state(data, D3DRS_ALPHABLENDENABLE, false); -} - -static bool d3d8_reset_internal(void *data, +static bool d3d8_reset_internal(LPDIRECT3DDEVICE8 dev, D3DPRESENT_PARAMETERS *d3dpp ) { - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data; if (dev && IDirect3DDevice8_Reset(dev, d3dpp) == D3D_OK) return true; - return false; } -static HRESULT d3d8_test_cooperative_level(void *data) +static HRESULT d3d8_test_cooperative_level(LPDIRECT3DDEVICE8 dev) { #ifndef _XBOX - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data; if (dev) return IDirect3DDevice8_TestCooperativeLevel(dev); #endif @@ -655,15 +251,13 @@ static HRESULT d3d8_test_cooperative_level(void *data) } static bool d3d8_create_device_internal( - void *data, + LPDIRECT3DDEVICE8 dev, D3DPRESENT_PARAMETERS *d3dpp, - void *_d3d, + LPDIRECT3D8 d3d, HWND focus_window, unsigned cur_mon_id, DWORD behavior_flags) { - LPDIRECT3D8 d3d = (LPDIRECT3D8)_d3d; - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)data; if (dev && SUCCEEDED(IDirect3D8_CreateDevice(d3d, cur_mon_id, @@ -679,7 +273,7 @@ static bool d3d8_create_device_internal( bool d3d8_create_device(void *dev, void *d3dpp, - void *d3d, + LPDIRECT3D8 d3d, HWND focus_window, unsigned cur_mon_id) { @@ -732,32 +326,6 @@ bool d3d8_reset(void *dev, void *d3dpp) return false; } -bool d3d8_device_get_backbuffer(void *_dev, - unsigned idx, unsigned swapchain_idx, - unsigned backbuffer_type, void **data) -{ - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (dev && - SUCCEEDED(IDirect3DDevice8_GetBackBuffer(dev, idx, - (D3DBACKBUFFER_TYPE)backbuffer_type, - (LPDIRECT3DSURFACE8*)data))) - return true; - - return false; -} - - -void d3d8_device_free(void *_dev, void *_pd3d) -{ - LPDIRECT3D8 pd3d = (LPDIRECT3D8)_pd3d; - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; - if (dev) - IDirect3DDevice8_Release(dev); - - if (pd3d) - IDirect3D8_Release(pd3d); -} - INT32 d3d8_translate_filter(unsigned type) { switch (type) @@ -778,22 +346,22 @@ INT32 d3d8_translate_filter(unsigned type) return D3DTEXF_POINT; } -bool d3d8x_create_font_indirect(void *_dev, +bool d3d8x_create_font_indirect(LPDIRECT3DDEVICE8 dev, void *desc, void **font_data) { #ifdef HAVE_D3DX - LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev; if (SUCCEEDED(D3DCreateFontIndirect( dev, (CONST LOGFONT*)desc, (struct ID3DXFont**)font_data))) return true; #endif - return false; } -void d3d8x_font_draw_text(void *data, void *sprite_data, void *string_data, - unsigned count, void *rect_data, unsigned format, unsigned color) +void d3d8x_font_draw_text(void *data, + void *sprite_data, void *string_data, + unsigned count, void *rect_data, + unsigned format, unsigned color) { #ifdef HAVE_D3DX ID3DXFont *font = (ID3DXFont*)data; @@ -808,9 +376,8 @@ void d3d8x_font_release(void *data) { #ifdef HAVE_D3DX ID3DXFont *font = (ID3DXFont*)data; - if (!font) - return; - font->lpVtbl->Release(font); + if (font) + font->lpVtbl->Release(font); #endif } @@ -818,35 +385,8 @@ void d3d8x_font_get_text_metrics(void *data, void *metrics) { #ifdef HAVE_D3DX ID3DXFont *font = (ID3DXFont*)data; - if (!font) - return; - font->lpVtbl->GetTextMetrics(font, (TEXTMETRICA*)metrics); + if (font) + font->lpVtbl->GetTextMetrics(font, (TEXTMETRICA*)metrics); #endif } -INT32 d3d8_get_rgb565_format(void) -{ -#ifdef _XBOX - return D3DFMT_LIN_R5G6B5; -#else - return D3DFMT_R5G6B5; -#endif -} - -INT32 d3d8_get_argb8888_format(void) -{ -#ifdef _XBOX - return D3DFMT_LIN_A8R8G8B8; -#else - return D3DFMT_A8R8G8B8; -#endif -} - -INT32 d3d8_get_xrgb8888_format(void) -{ -#ifdef _XBOX - return D3DFMT_LIN_X8R8G8B8; -#else - return D3DFMT_X8R8G8B8; -#endif -} diff --git a/gfx/common/d3d8_common.h b/gfx/common/d3d8_common.h index 890ba485f8..7878076f86 100644 --- a/gfx/common/d3d8_common.h +++ b/gfx/common/d3d8_common.h @@ -18,168 +18,399 @@ #include #include +#include #include #include "../video_driver.h" +#include "../../verbosity.h" RETRO_BEGIN_DECLS -bool d3d8_swap(void *data, void *dev); +static INLINE bool d3d8_swap(void *data, LPDIRECT3DDEVICE8 dev) +{ + if (IDirect3DDevice8_Present(dev, NULL, NULL, NULL, NULL) + == D3DERR_DEVICELOST) + return false; + return true; +} -void *d3d8_vertex_buffer_new(void *dev, - unsigned length, unsigned usage, unsigned fvf, - INT32 pool, void *handle); +static INLINE void *d3d8_vertex_buffer_new( + LPDIRECT3DDEVICE8 dev, + unsigned length, unsigned usage, + unsigned fvf, D3DPOOL pool, void *handle) +{ + void *buf = NULL; + if (FAILED(IDirect3DDevice8_CreateVertexBuffer( + dev, length, usage, fvf, + pool, + (struct IDirect3DVertexBuffer8**)&buf))) + return NULL; + return buf; +} -void *d3d8_vertex_buffer_lock(void *data); -void d3d8_vertex_buffer_unlock(void *data); +static INLINE void * +d3d8_vertex_buffer_lock(LPDIRECT3DVERTEXBUFFER8 vertbuf) +{ + void *buf = NULL; -void d3d8_vertex_buffer_free(void *vertex_data, void *vertex_declaration); + if (!vertbuf) + return NULL; -bool d3d8_texture_get_level_desc(void *tex, - unsigned idx, void *_ppsurface_level); + IDirect3DVertexBuffer8_Lock(vertbuf, 0, 0, (BYTE**)&buf, 0); -bool d3d8_texture_get_surface_level(void *tex, - unsigned idx, void **_ppsurface_level); + if (!buf) + return NULL; -void *d3d8_texture_new(void *dev, + return buf; +} + +static INLINE void d3d8_vertex_buffer_unlock( + LPDIRECT3DVERTEXBUFFER8 vertbuf) +{ + if (vertbuf) + IDirect3DVertexBuffer8_Unlock(vertbuf); +} + +static INLINE void d3d8_vertex_buffer_free( + LPDIRECT3DVERTEXBUFFER8 buf, + void *vertex_declaration) +{ + if (buf) + { + IDirect3DVertexBuffer8_Release(buf); + buf = NULL; + } +} + +static INLINE bool d3d8_texture_get_level_desc( + LPDIRECT3DTEXTURE8 tex, + unsigned idx, void *_ppsurface_level) +{ + if (SUCCEEDED(IDirect3DTexture8_GetLevelDesc( + tex, idx, (D3DSURFACE_DESC*)_ppsurface_level))) + return true; + return false; +} + +static INLINE bool d3d8_texture_get_surface_level( + LPDIRECT3DTEXTURE8 tex, + unsigned idx, void **_ppsurface_level) +{ + if (tex && + SUCCEEDED( + IDirect3DTexture8_GetSurfaceLevel( + tex, idx, (IDirect3DSurface8**)_ppsurface_level))) + return true; + return false; +} + +void *d3d8_texture_new(LPDIRECT3DDEVICE8 dev, const char *path, unsigned width, unsigned height, unsigned miplevels, unsigned usage, INT32 format, INT32 pool, unsigned filter, unsigned mipfilter, - INT32 color_key, void *src_info, + INT32 color_key, void *src_info_data, PALETTEENTRY *palette, bool want_mipmap); -void d3d8_set_stream_source(void *dev, unsigned stream_no, - void *stream_vertbuf, unsigned offset_bytes, - unsigned stride); +static INLINE void d3d8_set_stream_source(LPDIRECT3DDEVICE8 dev, + unsigned stream_no, + LPDIRECT3DVERTEXBUFFER8 stream_vertbuf, + unsigned offset_bytes, + unsigned stride) +{ + if (stream_vertbuf) + IDirect3DDevice8_SetStreamSource(dev, + stream_no, stream_vertbuf, stride); +} -void d3d8_texture_free(void *tex); +static INLINE void d3d8_texture_free(LPDIRECT3DTEXTURE8 tex) +{ + if (tex) + IDirect3DTexture8_Release(tex); +} -void d3d8_set_transform(void *dev, - INT32 state, const void *_matrix); +static INLINE void d3d8_set_transform(LPDIRECT3DDEVICE8 dev, + D3DTRANSFORMSTATETYPE state, const D3DMATRIX *matrix) +{ + IDirect3DDevice8_SetTransform(dev, state, matrix); +} -void d3d8_set_sampler_address_u(void *dev, - unsigned sampler, unsigned value); +static INLINE void d3d8_set_texture_stage_state(LPDIRECT3DDEVICE8 dev, + unsigned sampler, D3DTEXTURESTAGESTATETYPE type, unsigned value) +{ + if (IDirect3DDevice8_SetTextureStageState(dev, sampler, + (D3DTEXTURESTAGESTATETYPE)type, value) != D3D_OK) + RARCH_ERR("SetTextureStageState call failed, sampler: %d, value: %d, type: %d\n", sampler, value, type); +} -void d3d8_set_sampler_address_v(void *dev, - unsigned sampler, unsigned value); +static INLINE void d3d8_set_sampler_address_u(LPDIRECT3DDEVICE8 dev, + unsigned sampler, unsigned value) +{ + d3d8_set_texture_stage_state(dev, sampler, D3DTSS_ADDRESSU, value); +} -void d3d8_set_sampler_minfilter(void *dev, - unsigned sampler, unsigned value); +static INLINE void d3d8_set_sampler_address_v(LPDIRECT3DDEVICE8 dev, + unsigned sampler, unsigned value) +{ + d3d8_set_texture_stage_state(dev, sampler, D3DTSS_ADDRESSV, value); +} -void d3d8_set_sampler_magfilter(void *dev, - unsigned sampler, unsigned value); +static INLINE void d3d8_set_sampler_minfilter(void *_dev, + unsigned sampler, unsigned value) +{ + d3d8_set_texture_stage_state(_dev, sampler, D3DTSS_MINFILTER, value); +} + +static INLINE void d3d8_set_sampler_magfilter(void *_dev, + unsigned sampler, unsigned value) +{ + d3d8_set_texture_stage_state(_dev, sampler, D3DTSS_MAGFILTER, value); +} void d3d8_set_sampler_mipfilter(void *dev, unsigned sampler, unsigned value); -bool d3d8_begin_scene(void *dev); +static INLINE bool d3d8_begin_scene(LPDIRECT3DDEVICE8 dev) +{ + if (!dev) + return false; +#ifdef _XBOX + IDirect3DDevice8_BeginScene(dev); +#else + if (FAILED(IDirect3DDevice8_BeginScene(dev))) + return false; +#endif -void d3d8_end_scene(void *dev); + return true; +} -void d3d8_draw_primitive(void *dev, - INT32 type, unsigned start, unsigned count); +static INLINE void d3d8_end_scene(LPDIRECT3DDEVICE8 dev) +{ + if (dev) + IDirect3DDevice8_EndScene(dev); +} -void d3d8_clear(void *dev, +static INLINE void d3d8_draw_primitive(LPDIRECT3DDEVICE8 dev, + D3DPRIMITIVETYPE type, unsigned start, unsigned count) +{ + if (!d3d8_begin_scene(dev)) + return; + + IDirect3DDevice8_DrawPrimitive(dev, type, start, count); + d3d8_end_scene(dev); +} + +static INLINE void d3d8_clear(LPDIRECT3DDEVICE8 dev, unsigned count, const void *rects, unsigned flags, - INT32 color, float z, unsigned stencil); + INT32 color, float z, unsigned stencil) +{ + if (dev) + IDirect3DDevice8_Clear(dev, count, (const D3DRECT*)rects, flags, + color, z, stencil); +} -bool d3d8_lock_rectangle(void *tex, - unsigned level, void *lock_rect, RECT *rect, - unsigned rectangle_height, unsigned flags); +static INLINE bool d3d8_lock_rectangle( + LPDIRECT3DTEXTURE8 tex, + unsigned level, D3DLOCKED_RECT *lr, RECT *rect, + unsigned rectangle_height, unsigned flags) +{ + if (tex && + IDirect3DTexture8_LockRect(tex, + level, lr, rect, flags) == D3D_OK) + return true; + return false; +} -void d3d8_lock_rectangle_clear(void *tex, - unsigned level, void *lock_rect, RECT *rect, - unsigned rectangle_height, unsigned flags); +static INLINE void d3d8_unlock_rectangle(LPDIRECT3DTEXTURE8 tex) +{ + if (tex) + IDirect3DTexture8_UnlockRect(tex, 0); +} -void d3d8_unlock_rectangle(void *tex); - -void d3d8_set_texture(void *dev, unsigned sampler, - void *tex_data); - -bool d3d8_create_vertex_shader(void *dev, - const DWORD *a, void **b); - -bool d3d8_create_pixel_shader(void *dev, - const DWORD *a, void **b); - -void d3d8_free_vertex_shader(void *dev, void *data); - -bool d3d8_set_vertex_shader(void *dev, unsigned index, - void *data); - -void d3d8_texture_blit(unsigned pixel_size, +static INLINE void d3d8_lock_rectangle_clear( void *tex, - void *lr, const void *frame, - unsigned width, unsigned height, unsigned pitch); + unsigned level, void *_lr, RECT *rect, + unsigned rectangle_height, unsigned flags) +{ + D3DLOCKED_RECT *lr = (D3DLOCKED_RECT*)_lr; +#if defined(_XBOX) + level = 0; +#endif + memset(lr->pBits, level, rectangle_height * lr->Pitch); + d3d8_unlock_rectangle(tex); +} -bool d3d8_vertex_declaration_new(void *dev, - const void *vertex_data, void **decl_data); +static INLINE void d3d8_set_texture( + LPDIRECT3DDEVICE8 dev, unsigned sampler, + LPDIRECT3DTEXTURE8 tex) +{ + if (dev && tex) + IDirect3DDevice8_SetTexture(dev, sampler, + (IDirect3DBaseTexture8*)tex); +} -void d3d8_vertex_declaration_free(void *data); +static INLINE bool d3d8_set_vertex_shader( + LPDIRECT3DDEVICE8 dev, + unsigned index, + void *data) +{ + if (IDirect3DDevice8_SetVertexShader(dev, index) != D3D_OK) + return false; + return true; +} -void d3d8_set_viewports(void *dev, void *vp); +static INLINE void d3d8_texture_blit( + unsigned pixel_size, + void *tex, + D3DLOCKED_RECT *lr, + const void *frame, + unsigned width, unsigned height, unsigned pitch) +{ + unsigned y; -void d3d8_enable_blend_func(void *data); + for (y = 0; y < height; y++) + { + const uint8_t *in = (const uint8_t*)frame + y * pitch; + uint8_t *out = (uint8_t*)lr->pBits + y * lr->Pitch; + memcpy(out, in, width * pixel_size); + } +} -void d3d8_disable_blend_func(void *data); +static INLINE void d3d8_set_viewports( + LPDIRECT3DDEVICE8 dev, + void *vp) +{ + if (dev) + IDirect3DDevice8_SetViewport(dev, (D3DVIEWPORT8*)vp); +} -void d3d8_set_vertex_declaration(void *data, void *vertex_data); +static INLINE void d3d8_set_render_state( + LPDIRECT3DDEVICE8 dev, + D3DRENDERSTATETYPE state, + DWORD value) +{ + if (dev) + IDirect3DDevice8_SetRenderState(dev, state, value); +} -void d3d8_enable_alpha_blend_texture_func(void *data); +static INLINE void d3d8_enable_blend_func(void *data) +{ + if (!data) + return; + + d3d8_set_render_state(data, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + d3d8_set_render_state(data, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + d3d8_set_render_state(data, D3DRS_ALPHABLENDENABLE, true); +} + +static INLINE void d3d8_disable_blend_func(void *data) +{ + d3d8_set_render_state(data, D3DRS_ALPHABLENDENABLE, false); +} + +static INLINE void d3d8_enable_alpha_blend_texture_func(void *data) +{ + /* Also blend the texture with the set alpha value. */ + d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); + d3d8_set_texture_stage_state(data, 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); +} void d3d8_frame_postprocess(void *data); -void d3d8_surface_free(void *data); +static INLINE void d3d8_surface_free(LPDIRECT3DSURFACE8 surf) +{ + if (surf) + IDirect3DSurface8_Release(surf); +} -bool d3d8_device_get_render_target_data(void *dev, - void *_src, void *_dst); +static INLINE bool d3d8_device_get_render_target( + LPDIRECT3DDEVICE8 dev, + unsigned idx, void **data) +{ + if (dev && + SUCCEEDED(IDirect3DDevice8_GetRenderTarget(dev, + (LPDIRECT3DSURFACE8*)data))) + return true; + return false; +} -bool d3d8_device_get_render_target(void *dev, - unsigned idx, void **data); +static INLINE void d3d8_device_set_render_target( + LPDIRECT3DDEVICE8 dev, unsigned idx, + LPDIRECT3DSURFACE8 surf) +{ + if (dev) + IDirect3DDevice8_SetRenderTarget(dev, surf, NULL); +} -void d3d8_device_set_render_target(void *dev, unsigned idx, - void *data); +static INLINE bool d3d8_get_render_state(LPDIRECT3DDEVICE8 dev, + D3DRENDERSTATETYPE state, DWORD *value) +{ + if (dev && + IDirect3DDevice8_GetRenderState(dev, state, value) == D3D_OK) + return true; + return false; +} -bool d3d8_get_render_state(void *data, - INT32 state, DWORD *value); +static INLINE bool d3d8_surface_lock_rect( + LPDIRECT3DSURFACE8 surf, void *data2) +{ + if (surf && + SUCCEEDED( + IDirect3DSurface8_LockRect( + surf, (D3DLOCKED_RECT*)data2, + NULL, D3DLOCK_READONLY))) + return true; + return false; +} -void d3d8_set_render_state(void *data, - INT32 state, DWORD value); +static INLINE void d3d8_surface_unlock_rect(LPDIRECT3DSURFACE8 surf) +{ + if (surf) + IDirect3DSurface8_UnlockRect(surf); +} -void d3d8_device_set_render_target(void *dev, unsigned idx, - void *data); - -bool d3d8_device_create_offscreen_plain_surface( - void *dev, - unsigned width, - unsigned height, - unsigned format, - unsigned pool, - void **surf_data, - void *data); - -bool d3d8_surface_lock_rect(void *data, void *data2); - -void d3d8_surface_unlock_rect(void *data); - -bool d3d8_get_adapter_display_mode(void *d3d, +static INLINE bool d3d8_get_adapter_display_mode( + LPDIRECT3D8 d3d, unsigned idx, - void *display_mode); + void *display_mode) +{ + if (d3d && + SUCCEEDED(IDirect3D8_GetAdapterDisplayMode( + d3d, idx, (D3DDISPLAYMODE*)display_mode))) + return true; + return false; +} bool d3d8_create_device(void *dev, void *d3dpp, - void *d3d, + LPDIRECT3D8 d3d, HWND focus_window, unsigned cur_mon_id); bool d3d8_reset(void *dev, void *d3dpp); -bool d3d8_device_get_backbuffer(void *dev, +static INLINE bool d3d8_device_get_backbuffer( + LPDIRECT3DDEVICE8 dev, unsigned idx, unsigned swapchain_idx, - unsigned backbuffer_type, void **data); + unsigned backbuffer_type, void **data) +{ + if (dev && + SUCCEEDED(IDirect3DDevice8_GetBackBuffer(dev, idx, + (D3DBACKBUFFER_TYPE)backbuffer_type, + (LPDIRECT3DSURFACE8*)data))) + return true; + return false; +} -void d3d8_device_free(void *dev, void *pd3d); +static INLINE void d3d8_device_free( + LPDIRECT3DDEVICE8 dev, LPDIRECT3D8 pd3d) +{ + if (dev) + IDirect3DDevice8_Release(dev); + if (pd3d) + IDirect3D8_Release(pd3d); +} void *d3d8_create(void); @@ -187,13 +418,25 @@ bool d3d8_initialize_symbols(enum gfx_ctx_api api); void d3d8_deinitialize_symbols(void); -bool d3d8_check_device_type(void *d3d, +static INLINE bool d3d8_check_device_type( + LPDIRECT3D8 d3d, unsigned idx, INT32 disp_format, INT32 backbuffer_format, - bool windowed_mode); + bool windowed_mode) +{ + if (d3d && + SUCCEEDED(IDirect3D8_CheckDeviceType(d3d, + 0, + D3DDEVTYPE_HAL, + disp_format, + backbuffer_format, + windowed_mode))) + return true; + return false; +} -bool d3d8x_create_font_indirect(void *dev, +bool d3d8x_create_font_indirect(LPDIRECT3DDEVICE8 dev, void *desc, void **font_data); void d3d8x_font_draw_text(void *data, void *sprite_data, void *string_data, @@ -205,9 +448,32 @@ void d3d8x_font_release(void *data); INT32 d3d8_translate_filter(unsigned type); -INT32 d3d8_get_rgb565_format(void); -INT32 d3d8_get_argb8888_format(void); -INT32 d3d8_get_xrgb8888_format(void); +static INLINE INT32 d3d8_get_rgb565_format(void) +{ +#ifdef _XBOX + return D3DFMT_LIN_R5G6B5; +#else + return D3DFMT_R5G6B5; +#endif +} + +static INLINE INT32 d3d8_get_argb8888_format(void) +{ +#ifdef _XBOX + return D3DFMT_LIN_A8R8G8B8; +#else + return D3DFMT_A8R8G8B8; +#endif +} + +static INLINE INT32 d3d8_get_xrgb8888_format(void) +{ +#ifdef _XBOX + return D3DFMT_LIN_X8R8G8B8; +#else + return D3DFMT_X8R8G8B8; +#endif +} RETRO_END_DECLS