wined3d: Add depth fills to the blitter interface.
This commit is contained in:
parent
99bfd81714
commit
519a3a9162
|
@ -7253,11 +7253,20 @@ static HRESULT arbfp_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurface
|
|||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
/* Do not call while under the GL lock. */
|
||||
static HRESULT arbfp_blit_depth_fill(IWineD3DDeviceImpl *device,
|
||||
IWineD3DSurfaceImpl *surface, const RECT *rect, float depth)
|
||||
{
|
||||
FIXME("Depth filling not implemented by arbfp_blit.\n");
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
const struct blit_shader arbfp_blit = {
|
||||
arbfp_blit_alloc,
|
||||
arbfp_blit_free,
|
||||
arbfp_blit_set,
|
||||
arbfp_blit_unset,
|
||||
arbfp_blit_supported,
|
||||
arbfp_blit_color_fill
|
||||
arbfp_blit_color_fill,
|
||||
arbfp_blit_depth_fill,
|
||||
};
|
||||
|
|
|
@ -3897,10 +3897,19 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface,
|
|||
/* Do not call while under the GL lock. */
|
||||
static HRESULT wined3d_surface_depth_fill(IWineD3DSurfaceImpl *surface, const RECT *rect, float depth)
|
||||
{
|
||||
const RECT draw_rect = {0, 0, surface->resource.width, surface->resource.height};
|
||||
const struct wined3d_resource *resource = &surface->resource;
|
||||
IWineD3DDeviceImpl *device = resource->device;
|
||||
const struct blit_shader *blitter;
|
||||
|
||||
return device_clear_render_targets(surface->resource.device, 0, NULL, surface,
|
||||
!!rect, rect, &draw_rect, WINED3DCLEAR_ZBUFFER, 0, depth, 0);
|
||||
blitter = wined3d_select_blitter(&device->adapter->gl_info, WINED3D_BLIT_OP_DEPTH_FILL,
|
||||
NULL, 0, 0, NULL, rect, resource->usage, resource->pool, resource->format);
|
||||
if (!blitter)
|
||||
{
|
||||
FIXME("No blitter is capable of performing the requested depth fill operation.\n");
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
return blitter->depth_fill(device, surface, rect, depth);
|
||||
}
|
||||
|
||||
/* Do not call while under the GL lock. */
|
||||
|
@ -3929,13 +3938,16 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT
|
|||
if (flags & WINEDDBLT_DEPTHFILL)
|
||||
{
|
||||
float depth;
|
||||
RECT rect;
|
||||
|
||||
TRACE("Depth fill.\n");
|
||||
|
||||
surface_get_rect(This, DestRect, &rect);
|
||||
|
||||
if (!surface_convert_depth_to_float(This, DDBltFx->u5.dwFillDepth, &depth))
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
|
||||
if (SUCCEEDED(wined3d_surface_depth_fill(This, DestRect, depth)))
|
||||
if (SUCCEEDED(wined3d_surface_depth_fill(This, &rect, depth)))
|
||||
return WINED3D_OK;
|
||||
}
|
||||
else
|
||||
|
@ -4862,51 +4874,54 @@ static BOOL ffp_blit_supported(const struct wined3d_gl_info *gl_info, enum wined
|
|||
{
|
||||
enum complex_fixup src_fixup;
|
||||
|
||||
if (blit_op == WINED3D_BLIT_OP_COLOR_FILL)
|
||||
switch (blit_op)
|
||||
{
|
||||
if (!(dst_usage & WINED3DUSAGE_RENDERTARGET))
|
||||
{
|
||||
TRACE("Color fill not supported\n");
|
||||
case WINED3D_BLIT_OP_COLOR_BLIT:
|
||||
src_fixup = get_complex_fixup(src_format->color_fixup);
|
||||
if (TRACE_ON(d3d_surface) && TRACE_ON(d3d))
|
||||
{
|
||||
TRACE("Checking support for fixup:\n");
|
||||
dump_color_fixup_desc(src_format->color_fixup);
|
||||
}
|
||||
|
||||
if (!is_identity_fixup(dst_format->color_fixup))
|
||||
{
|
||||
TRACE("Destination fixups are not supported\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (src_fixup == COMPLEX_FIXUP_P8 && gl_info->supported[EXT_PALETTED_TEXTURE])
|
||||
{
|
||||
TRACE("P8 fixup supported\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* We only support identity conversions. */
|
||||
if (is_identity_fixup(src_format->color_fixup))
|
||||
{
|
||||
TRACE("[OK]\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TRACE("[FAILED]\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
case WINED3D_BLIT_OP_COLOR_FILL:
|
||||
if (!(dst_usage & WINED3DUSAGE_RENDERTARGET))
|
||||
{
|
||||
TRACE("Color fill not supported\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
case WINED3D_BLIT_OP_DEPTH_FILL:
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
TRACE("Unsupported blit_op=%d\n", blit_op);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
src_fixup = get_complex_fixup(src_format->color_fixup);
|
||||
if (TRACE_ON(d3d_surface) && TRACE_ON(d3d))
|
||||
{
|
||||
TRACE("Checking support for fixup:\n");
|
||||
dump_color_fixup_desc(src_format->color_fixup);
|
||||
}
|
||||
|
||||
if (blit_op != WINED3D_BLIT_OP_COLOR_BLIT)
|
||||
{
|
||||
TRACE("Unsupported blit_op=%d\n", blit_op);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!is_identity_fixup(dst_format->color_fixup))
|
||||
{
|
||||
TRACE("Destination fixups are not supported\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (src_fixup == COMPLEX_FIXUP_P8 && gl_info->supported[EXT_PALETTED_TEXTURE])
|
||||
{
|
||||
TRACE("P8 fixup supported\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* We only support identity conversions. */
|
||||
if (is_identity_fixup(src_format->color_fixup))
|
||||
{
|
||||
TRACE("[OK]\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TRACE("[FAILED]\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Do not call while under the GL lock. */
|
||||
|
@ -4919,13 +4934,24 @@ static HRESULT ffp_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceIm
|
|||
1, dst_rect, &draw_rect, WINED3DCLEAR_TARGET, color, 0.0f, 0);
|
||||
}
|
||||
|
||||
/* Do not call while under the GL lock. */
|
||||
static HRESULT ffp_blit_depth_fill(IWineD3DDeviceImpl *device,
|
||||
IWineD3DSurfaceImpl *surface, const RECT *rect, float depth)
|
||||
{
|
||||
const RECT draw_rect = {0, 0, surface->resource.width, surface->resource.height};
|
||||
|
||||
return device_clear_render_targets(device, 0, NULL, surface,
|
||||
1, rect, &draw_rect, WINED3DCLEAR_ZBUFFER, 0, depth, 0);
|
||||
}
|
||||
|
||||
const struct blit_shader ffp_blit = {
|
||||
ffp_blit_alloc,
|
||||
ffp_blit_free,
|
||||
ffp_blit_set,
|
||||
ffp_blit_unset,
|
||||
ffp_blit_supported,
|
||||
ffp_blit_color_fill
|
||||
ffp_blit_color_fill,
|
||||
ffp_blit_depth_fill,
|
||||
};
|
||||
|
||||
static HRESULT cpu_blit_alloc(IWineD3DDeviceImpl *device)
|
||||
|
@ -4974,13 +5000,22 @@ static HRESULT cpu_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceIm
|
|||
NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
|
||||
}
|
||||
|
||||
/* Do not call while under the GL lock. */
|
||||
static HRESULT cpu_blit_depth_fill(IWineD3DDeviceImpl *device,
|
||||
IWineD3DSurfaceImpl *surface, const RECT *rect, float depth)
|
||||
{
|
||||
FIXME("Depth filling not implemented by cpu_blit.\n");
|
||||
return WINED3DERR_INVALIDCALL;
|
||||
}
|
||||
|
||||
const struct blit_shader cpu_blit = {
|
||||
cpu_blit_alloc,
|
||||
cpu_blit_free,
|
||||
cpu_blit_set,
|
||||
cpu_blit_unset,
|
||||
cpu_blit_supported,
|
||||
cpu_blit_color_fill
|
||||
cpu_blit_color_fill,
|
||||
cpu_blit_depth_fill,
|
||||
};
|
||||
|
||||
static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum wined3d_blit_op blit_op,
|
||||
|
|
|
@ -1170,6 +1170,7 @@ enum wined3d_blit_op
|
|||
{
|
||||
WINED3D_BLIT_OP_COLOR_BLIT,
|
||||
WINED3D_BLIT_OP_COLOR_FILL,
|
||||
WINED3D_BLIT_OP_DEPTH_FILL,
|
||||
};
|
||||
|
||||
/* Shaders for color conversions in blits. Do not do blit operations while
|
||||
|
@ -1185,6 +1186,7 @@ struct blit_shader
|
|||
const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format *dst_format);
|
||||
HRESULT (*color_fill)(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface,
|
||||
const RECT *dst_rect, const WINED3DCOLORVALUE *color);
|
||||
HRESULT (*depth_fill)(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *surface, const RECT *rect, float depth);
|
||||
};
|
||||
|
||||
extern const struct blit_shader ffp_blit DECLSPEC_HIDDEN;
|
||||
|
|
Loading…
Reference in New Issue