Don't rely on LPDIRECT3DTEXTURE

This commit is contained in:
twinaphex 2018-01-25 04:28:50 +01:00
parent 26f9489f89
commit 0588c3c68e
6 changed files with 148 additions and 116 deletions

View File

@ -543,39 +543,43 @@ void d3d_set_transform(void *_dev,
}
}
bool d3d_texture_get_level_desc(LPDIRECT3DTEXTURE tex,
bool d3d_texture_get_level_desc(void *_tex,
unsigned idx, void *_ppsurface_level)
{
if (!tex)
return false;
switch (d3d_common_api)
{
case GFX_CTX_DIRECT3D9_API:
{
#ifdef HAVE_D3D9
LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)_tex;
#ifdef __cplusplus
if (SUCCEEDED(tex->GetLevelDesc(idx, (D3DSURFACE_DESC*)_ppsurface_level)))
return true;
if (SUCCEEDED(tex->GetLevelDesc(idx, (D3DSURFACE_DESC*)_ppsurface_level)))
return true;
#else
#if defined(_XBOX)
D3DTexture_GetLevelDesc(tex, idx, (D3DSURFACE_DESC*)_ppsurface_level);
return true;
#else
if (SUCCEEDED(IDirect3DTexture9_GetLevelDesc(tex, idx, (D3DSURFACE_DESC*)_ppsurface_level)))
D3DTexture_GetLevelDesc(tex, idx, (D3DSURFACE_DESC*)_ppsurface_level);
return true;
#else
if (SUCCEEDED(IDirect3DTexture9_GetLevelDesc(tex, idx, (D3DSURFACE_DESC*)_ppsurface_level)))
return true;
#endif
#endif
#endif
}
break;
case GFX_CTX_DIRECT3D8_API:
{
#ifdef HAVE_D3D8
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex;
#ifdef __cplusplus
if (SUCCEEDED(tex->GetLevelDesc(idx, (D3DSURFACE_DESC*)_ppsurface_level)))
return true;
if (SUCCEEDED(tex->GetLevelDesc(idx, (D3DSURFACE_DESC*)_ppsurface_level)))
return true;
#else
if (SUCCEEDED(IDirect3DTexture8_GetLevelDesc(tex, idx, (D3DSURFACE_DESC*)_ppsurface_level)))
return true;
if (SUCCEEDED(IDirect3DTexture8_GetLevelDesc(tex, idx, (D3DSURFACE_DESC*)_ppsurface_level)))
return true;
#endif
#endif
}
break;
case GFX_CTX_NONE:
default:
@ -585,35 +589,42 @@ bool d3d_texture_get_level_desc(LPDIRECT3DTEXTURE tex,
return false;
}
bool d3d_texture_get_surface_level(LPDIRECT3DTEXTURE tex,
bool d3d_texture_get_surface_level(void *_tex,
unsigned idx, void **_ppsurface_level)
{
if (!tex)
return false;
switch (d3d_common_api)
{
case GFX_CTX_DIRECT3D9_API:
{
#ifdef HAVE_D3D9
LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)_tex;
if (!tex)
return false;
#ifdef __cplusplus
if (SUCCEEDED(tex->GetSurfaceLevel(idx, (ID3DSURFACE**)_ppsurface_level)))
return true;
if (SUCCEEDED(tex->GetSurfaceLevel(idx, (ID3DSURFACE**)_ppsurface_level)))
return true;
#else
if (SUCCEEDED(IDirect3DTexture9_GetSurfaceLevel(tex, idx, (IDirect3DSurface9**)_ppsurface_level)))
return true;
if (SUCCEEDED(IDirect3DTexture9_GetSurfaceLevel(tex, idx, (IDirect3DSurface9**)_ppsurface_level)))
return true;
#endif
#endif
}
break;
case GFX_CTX_DIRECT3D8_API:
{
#ifdef HAVE_D3D8
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex;
if (!tex)
return false;
#ifdef __cplusplus
if (SUCCEEDED(tex->GetSurfaceLevel(idx, (ID3DSURFACE**)_ppsurface_level)))
return true;
if (SUCCEEDED(tex->GetSurfaceLevel(idx, (ID3DSURFACE**)_ppsurface_level)))
return true;
#else
if (SUCCEEDED(IDirect3DTexture8_GetSurfaceLevel(tex, idx, (IDirect3DSurface8**)_ppsurface_level)))
return true;
if (SUCCEEDED(IDirect3DTexture8_GetSurfaceLevel(tex, idx, (IDirect3DSurface8**)_ppsurface_level)))
return true;
#endif
#endif
}
break;
case GFX_CTX_NONE:
default:
@ -624,7 +635,7 @@ bool d3d_texture_get_surface_level(LPDIRECT3DTEXTURE tex,
}
#ifdef HAVE_D3DX
static LPDIRECT3DTEXTURE d3d_texture_new_from_file(
static void *d3d_texture_new_from_file(
void *dev,
const char *path, unsigned width, unsigned height,
unsigned miplevels, unsigned usage, D3DFORMAT format,
@ -632,42 +643,39 @@ static LPDIRECT3DTEXTURE d3d_texture_new_from_file(
D3DCOLOR color_key, void *src_info_data,
PALETTEENTRY *palette)
{
LPDIRECT3DTEXTURE buf = NULL;
void *buf = NULL;
HRESULT hr = E_FAIL;
switch (d3d_common_api)
{
HRESULT hr = E_FAIL;
switch (d3d_common_api)
{
case GFX_CTX_DIRECT3D9_API:
case GFX_CTX_DIRECT3D9_API:
#if defined(HAVE_D3D9)
hr = D3DCreateTextureFromFile((LPDIRECT3DDEVICE9)dev,
path, width, height, miplevels, usage, format,
pool, filter, mipfilter, color_key, src_info_data,
palette, &buf);
hr = D3DCreateTextureFromFile((LPDIRECT3DDEVICE9)dev,
path, width, height, miplevels, usage, format,
pool, filter, mipfilter, color_key, src_info_data,
palette, (struct IDirect3DTexture9**)&buf);
#endif
break;
case GFX_CTX_DIRECT3D8_API:
break;
case GFX_CTX_DIRECT3D8_API:
#if defined(HAVE_D3D8)
hr = D3DCreateTextureFromFile((LPDIRECT3DDEVICE8)dev,
path, width, height, miplevels, usage, format,
pool, filter, mipfilter, color_key, src_info_data,
palette, &buf);
hr = D3DCreateTextureFromFile((LPDIRECT3DDEVICE8)dev,
path, width, height, miplevels, usage, format,
pool, filter, mipfilter, color_key, src_info_data,
palette, (struct IDirect3DTeture8**)&buf);
#endif
break;
default:
break;
}
if (FAILED(hr))
return NULL;
break;
default:
break;
}
if (FAILED(hr))
return NULL;
return buf;
}
#endif
LPDIRECT3DTEXTURE d3d_texture_new(void *_dev,
void *d3d_texture_new(void *_dev,
const char *path, unsigned width, unsigned height,
unsigned miplevels, unsigned usage, D3DFORMAT format,
D3DPOOL pool, unsigned filter, unsigned mipfilter,
@ -675,7 +683,7 @@ LPDIRECT3DTEXTURE d3d_texture_new(void *_dev,
PALETTEENTRY *palette, bool want_mipmap)
{
HRESULT hr = S_OK;
LPDIRECT3DTEXTURE buf = NULL;
void *buf = NULL;
if (path)
{
@ -702,11 +710,11 @@ LPDIRECT3DTEXTURE d3d_texture_new(void *_dev,
#ifdef __cplusplus
hr = dev->CreateTexture(
width, height, miplevels, usage,
format, pool, &buf, NULL);
format, pool, (LPDIRECT3DTEXTURE9)&buf, NULL);
#else
hr = IDirect3DDevice9_CreateTexture(dev,
width, height, miplevels, usage,
format, pool, &buf, NULL);
format, pool, (struct IDirect3DTexture9**)&buf, NULL);
#endif
#endif
}
@ -718,11 +726,11 @@ LPDIRECT3DTEXTURE d3d_texture_new(void *_dev,
#ifdef __cplusplus
hr = dev->CreateTexture(
width, height, miplevels, usage,
format, pool, &buf);
format, pool, (LPDIRECT3DTEXTURE8)&buf);
#else
hr = IDirect3DDevice8_CreateTexture(dev,
width, height, miplevels, usage,
format, pool, &buf);
format, pool, (LPDIRECT3DTEXTURE8)&buf);
#endif
#endif
}
@ -738,30 +746,37 @@ LPDIRECT3DTEXTURE d3d_texture_new(void *_dev,
return buf;
}
void d3d_texture_free(LPDIRECT3DTEXTURE tex)
void d3d_texture_free(void *_tex)
{
if (!tex)
return;
switch (d3d_common_api)
{
case GFX_CTX_DIRECT3D9_API:
{
#ifdef HAVE_D3D9
LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)_tex;
if (!tex)
return;
#ifdef __cplusplus
tex->Release();
tex->Release();
#else
IDirect3DTexture9_Release(tex);
IDirect3DTexture9_Release(tex);
#endif
#endif
}
break;
case GFX_CTX_DIRECT3D8_API:
{
#ifdef HAVE_D3D8
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex;
if (!tex)
return;
#ifdef __cplusplus
tex->Release();
tex->Release();
#else
IDirect3DTexture8_Release(tex);
IDirect3DTexture8_Release(tex);
#endif
#endif
}
break;
case GFX_CTX_NONE:
default:
@ -1653,37 +1668,47 @@ bool d3d_device_get_render_target(void *_dev,
}
bool d3d_lock_rectangle(LPDIRECT3DTEXTURE tex,
bool d3d_lock_rectangle(void *_tex,
unsigned level, D3DLOCKED_RECT *lock_rect, RECT *rect,
unsigned rectangle_height, unsigned flags)
{
switch (d3d_common_api)
{
case GFX_CTX_DIRECT3D9_API:
{
#ifdef HAVE_D3D9
LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)_tex;
if (!tex)
return false;
#ifdef __cplusplus
if (FAILED(tex->LockRect(level, lock_rect, rect, flags)))
return false;
if (FAILED(tex->LockRect(level, lock_rect, rect, flags)))
return false;
#else
#ifdef _XBOX
IDirect3DTexture9_LockRect(tex, level, lock_rect, (const RECT*)rect, flags);
IDirect3DTexture9_LockRect(tex, level, lock_rect, (const RECT*)rect, flags);
#else
if (IDirect3DTexture9_LockRect(tex, level, lock_rect, (const RECT*)rect, flags) != D3D_OK)
return false;
if (IDirect3DTexture9_LockRect(tex, level, lock_rect, (const RECT*)rect, flags) != D3D_OK)
return false;
#endif
#endif
#endif
}
break;
case GFX_CTX_DIRECT3D8_API:
{
#ifdef HAVE_D3D8
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex;
if (!tex)
return false;
#ifdef __cplusplus
if (FAILED(tex->LockRect(level, lock_rect, rect, flags)))
return false;
if (FAILED(tex->LockRect(level, lock_rect, rect, flags)))
return false;
#else
if (IDirect3DTexture8_LockRect(tex, level, lock_rect, rect, flags) != D3D_OK)
return false;
if (IDirect3DTexture8_LockRect(tex, level, lock_rect, rect, flags) != D3D_OK)
return false;
#endif
#endif
}
break;
case GFX_CTX_NONE:
default:
@ -1693,27 +1718,37 @@ bool d3d_lock_rectangle(LPDIRECT3DTEXTURE tex,
return true;
}
void d3d_unlock_rectangle(LPDIRECT3DTEXTURE tex)
void d3d_unlock_rectangle(void *_tex)
{
switch (d3d_common_api)
{
case GFX_CTX_DIRECT3D9_API:
{
#ifdef HAVE_D3D9
LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)_tex;
if (!tex)
return;
#ifdef __cplusplus
tex->UnlockRect(0);
tex->UnlockRect(0);
#else
IDirect3DTexture9_UnlockRect(tex, 0);
IDirect3DTexture9_UnlockRect(tex, 0);
#endif
#endif
}
break;
case GFX_CTX_DIRECT3D8_API:
{
#ifdef HAVE_D3D8
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)_tex;
if (!tex)
return;
#ifdef __cplusplus
tex->UnlockRect(0);
tex->UnlockRect(0);
#else
IDirect3DTexture8_UnlockRect(tex, 0);
IDirect3DTexture8_UnlockRect(tex, 0);
#endif
#endif
}
break;
case GFX_CTX_NONE:
default:
@ -1721,7 +1756,7 @@ void d3d_unlock_rectangle(LPDIRECT3DTEXTURE tex)
}
}
void d3d_lock_rectangle_clear(LPDIRECT3DTEXTURE tex,
void d3d_lock_rectangle_clear(void *tex,
unsigned level, D3DLOCKED_RECT *lock_rect, RECT *rect,
unsigned rectangle_height, unsigned flags)
{
@ -1773,18 +1808,14 @@ void d3d_set_viewports(void *_dev, D3DVIEWPORT *vp)
void d3d_set_texture(void *_dev, unsigned sampler,
void *tex_data)
{
LPDIRECT3DTEXTURE tex = (LPDIRECT3DTEXTURE)tex_data;
if (!tex)
return;
switch (d3d_common_api)
{
case GFX_CTX_DIRECT3D9_API:
{
#ifdef HAVE_D3D9
LPDIRECT3DDEVICE9 dev = (LPDIRECT3DDEVICE9)_dev;
if (!dev)
LPDIRECT3DTEXTURE9 tex = (LPDIRECT3DTEXTURE9)tex_data;
LPDIRECT3DDEVICE9 dev = (LPDIRECT3DDEVICE9)_dev;
if (!dev || !tex)
return;
#ifdef __cplusplus
dev->SetTexture(sampler, tex);
@ -1798,8 +1829,9 @@ void d3d_set_texture(void *_dev, unsigned sampler,
case GFX_CTX_DIRECT3D8_API:
{
#ifdef HAVE_D3D8
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (!dev)
LPDIRECT3DTEXTURE8 tex = (LPDIRECT3DTEXTURE8)tex_data;
LPDIRECT3DDEVICE8 dev = (LPDIRECT3DDEVICE8)_dev;
if (!dev || !tex)
return;
#ifdef __cplusplus
dev->SetTexture(sampler, tex);
@ -2057,7 +2089,7 @@ bool d3d_set_vertex_shader_constantf(void *_dev,
}
void d3d_texture_blit(unsigned pixel_size,
LPDIRECT3DTEXTURE tex,
void *tex,
D3DLOCKED_RECT *lr, const void *frame,
unsigned width, unsigned height, unsigned pitch)
{

View File

@ -26,7 +26,7 @@ RETRO_BEGIN_DECLS
typedef struct d3d_texture
{
LPDIRECT3DTEXTURE data;
void *data;
D3DPOOL pool;
} d3d_texture_t;
@ -41,13 +41,13 @@ void d3d_vertex_buffer_unlock(void *data);
void d3d_vertex_buffer_free(void *vertex_data, void *vertex_declaration);
bool d3d_texture_get_level_desc(LPDIRECT3DTEXTURE tex,
bool d3d_texture_get_level_desc(void *tex,
unsigned idx, void *_ppsurface_level);
bool d3d_texture_get_surface_level(LPDIRECT3DTEXTURE tex,
bool d3d_texture_get_surface_level(void *tex,
unsigned idx, void **_ppsurface_level);
LPDIRECT3DTEXTURE d3d_texture_new(void *dev,
void *d3d_texture_new(void *dev,
const char *path, unsigned width, unsigned height,
unsigned miplevels, unsigned usage, D3DFORMAT format,
D3DPOOL pool, unsigned filter, unsigned mipfilter,
@ -58,7 +58,7 @@ void d3d_set_stream_source(void *dev, unsigned stream_no,
void *stream_vertbuf, unsigned offset_bytes,
unsigned stride);
void d3d_texture_free(LPDIRECT3DTEXTURE tex);
void d3d_texture_free(void *tex);
void d3d_set_transform(void *dev,
D3DTRANSFORMSTATETYPE state, CONST D3DMATRIX *matrix);
@ -89,15 +89,15 @@ void d3d_clear(void *dev,
unsigned count, const D3DRECT *rects, unsigned flags,
D3DCOLOR color, float z, unsigned stencil);
bool d3d_lock_rectangle(LPDIRECT3DTEXTURE tex,
bool d3d_lock_rectangle(void *tex,
unsigned level, D3DLOCKED_RECT *lock_rect, RECT *rect,
unsigned rectangle_height, unsigned flags);
void d3d_lock_rectangle_clear(LPDIRECT3DTEXTURE tex,
void d3d_lock_rectangle_clear(void *tex,
unsigned level, D3DLOCKED_RECT *lock_rect, RECT *rect,
unsigned rectangle_height, unsigned flags);
void d3d_unlock_rectangle(LPDIRECT3DTEXTURE tex);
void d3d_unlock_rectangle(void *tex);
void d3d_set_texture(void *dev, unsigned sampler,
void *tex_data);
@ -121,7 +121,7 @@ bool d3d_set_vertex_shader_constantf(void *dev,
UINT start_register,const float* constant_data, unsigned vector4f_count);
void d3d_texture_blit(unsigned pixel_size,
LPDIRECT3DTEXTURE tex,
void *tex,
D3DLOCKED_RECT *lr, const void *frame,
unsigned width, unsigned height, unsigned pitch);

View File

@ -52,7 +52,7 @@ typedef struct
float tex_coords[4];
float vert_coords[4];
float alpha_mod;
LPDIRECT3DTEXTURE tex;
void *tex;
void *vert_buf;
} overlay_t;

View File

@ -62,7 +62,7 @@ typedef struct d3d8_renderchain
unsigned pixel_size;
LPDIRECT3DDEVICE8 dev;
const video_info_t *video_info;
LPDIRECT3DTEXTURE tex;
LPDIRECT3DTEXTURE8 tex;
LPDIRECT3DVERTEXBUFFER vertex_buf;
unsigned last_width;
unsigned last_height;
@ -1643,8 +1643,8 @@ static void d3d8_video_texture_load_d3d(d3d_video_t *d3d,
uintptr_t *id)
{
D3DLOCKED_RECT d3dlr;
unsigned usage = 0;
LPDIRECT3DTEXTURE tex = d3d_texture_new(d3d->dev, NULL,
unsigned usage = 0;
LPDIRECT3DTEXTURE8 tex = d3d_texture_new(d3d->dev, NULL,
ti->width, ti->height, 0,
usage, d3d_get_argb8888_format(),
D3DPOOL_MANAGED, 0, 0, 0,
@ -1698,11 +1698,11 @@ static uintptr_t d3d8_load_texture(void *video_data, void *data,
static void d3d8_unload_texture(void *data, uintptr_t id)
{
LPDIRECT3DTEXTURE texid;
LPDIRECT3DTEXTURE8 texid;
if (!id)
return;
texid = (LPDIRECT3DTEXTURE)id;
texid = (LPDIRECT3DTEXTURE8)id;
d3d_texture_free(texid);
}

View File

@ -1639,9 +1639,9 @@ static void d3d9_video_texture_load_d3d(d3d_video_t *d3d,
uintptr_t *id)
{
D3DLOCKED_RECT d3dlr;
LPDIRECT3DTEXTURE tex = NULL;
unsigned usage = 0;
bool want_mipmap = false;
LPDIRECT3DTEXTURE9 tex = NULL;
unsigned usage = 0;
bool want_mipmap = false;
if((filter_type == TEXTURE_FILTER_MIPMAP_LINEAR) ||
(filter_type == TEXTURE_FILTER_MIPMAP_NEAREST))
@ -1721,11 +1721,11 @@ static uintptr_t d3d9_load_texture(void *video_data, void *data,
static void d3d9_unload_texture(void *data, uintptr_t id)
{
LPDIRECT3DTEXTURE texid;
LPDIRECT3DTEXTURE9 texid;
if (!id)
return;
texid = (LPDIRECT3DTEXTURE)id;
texid = (LPDIRECT3DTEXTURE9)id;
d3d_texture_free(texid);
}

View File

@ -58,7 +58,7 @@
struct lut_info
{
LPDIRECT3DTEXTURE tex;
LPDIRECT3DTEXTURE9 tex;
char id[64];
bool smooth;
};
@ -75,7 +75,7 @@ struct Pass
{
struct LinkInfo info;
D3DPOOL pool;
LPDIRECT3DTEXTURE tex;
LPDIRECT3DTEXTURE9 tex;
LPDIRECT3DVERTEXBUFFER vertex_buf;
CGprogram vPrg, fPrg;
unsigned last_width, last_height;
@ -101,7 +101,7 @@ typedef struct cg_renderchain
unsigned frame_count;
struct
{
LPDIRECT3DTEXTURE tex[TEXTURES];
LPDIRECT3DTEXTURE9 tex[TEXTURES];
LPDIRECT3DVERTEXBUFFER vertex_buf[TEXTURES];
unsigned ptr;
unsigned last_width[TEXTURES];
@ -516,11 +516,11 @@ static void d3d9_cg_renderchain_bind_prev(void *data, const void *pass_data)
param = cgGetNamedParameter(pass->fPrg, attr_texture);
if (param)
{
LPDIRECT3DTEXTURE tex;
LPDIRECT3DTEXTURE9 tex;
index = cgGetParameterResourceIndex(param);
tex = (LPDIRECT3DTEXTURE)
tex = (LPDIRECT3DTEXTURE9)
chain->prev.tex[(chain->prev.ptr - (i + 1)) & TEXTURESMASK];
d3d_set_texture(chain->dev, index, tex);
@ -1126,7 +1126,7 @@ static bool d3d9_cg_renderchain_add_lut(void *data,
{
struct lut_info info;
cg_renderchain_t *chain = (cg_renderchain_t*)data;
LPDIRECT3DTEXTURE lut = d3d_texture_new(
LPDIRECT3DTEXTURE9 lut = d3d_texture_new(
chain->dev,
path,
D3D_DEFAULT_NONPOW2,