Commit 9128ec0b authored by Józef Kucia's avatar Józef Kucia Committed by Alexandre Julliard

wined3d: Extend wined3d_check_device_format() to allow querying general format support.

For D3D10+. When WINED3D_RTYPE_NONE is passed the wined3d_check_device_format() function checks if a format is supported for all reasonable resource types for a given usage. For now render target and depth stencil support can be queried using this method. Signed-off-by: 's avatarJózef Kucia <jkucia@codeweavers.com> Signed-off-by: 's avatarHenri Verbeet <hverbeet@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent aea576b1
......@@ -5236,9 +5236,9 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
const struct wined3d_format *adapter_format = wined3d_get_format(gl_info, adapter_format_id,
WINED3DUSAGE_RENDERTARGET);
const struct wined3d_format *format = wined3d_get_format(gl_info, check_format_id, usage);
enum wined3d_gl_resource_type gl_type, gl_type_end;
DWORD format_flags = 0;
DWORD allowed_usage;
enum wined3d_gl_resource_type gl_type;
TRACE("wined3d %p, adapter_idx %u, device_type %s, adapter_format %s, usage %s, %s, "
"resource_type %s, check_format %s.\n",
......@@ -5251,6 +5251,13 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
switch (resource_type)
{
case WINED3D_RTYPE_NONE:
allowed_usage = WINED3DUSAGE_DEPTHSTENCIL
| WINED3DUSAGE_RENDERTARGET;
gl_type = WINED3D_GL_RES_TYPE_TEX_2D;
gl_type_end = WINED3D_GL_RES_TYPE_TEX_3D;
break;
case WINED3D_RTYPE_TEXTURE_2D:
allowed_usage = WINED3DUSAGE_DEPTHSTENCIL
| WINED3DUSAGE_RENDERTARGET
......@@ -5265,7 +5272,7 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
return WINED3DERR_NOTAVAILABLE;
}
gl_type = WINED3D_GL_RES_TYPE_RB;
gl_type = gl_type_end = WINED3D_GL_RES_TYPE_RB;
break;
}
allowed_usage |= WINED3DUSAGE_AUTOGENMIPMAP
......@@ -5279,11 +5286,11 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
| WINED3DUSAGE_QUERY_SRGBWRITE
| WINED3DUSAGE_QUERY_VERTEXTEXTURE
| WINED3DUSAGE_QUERY_WRAPANDMIP;
gl_type = WINED3D_GL_RES_TYPE_TEX_2D;
gl_type = gl_type_end = WINED3D_GL_RES_TYPE_TEX_2D;
if (usage & WINED3DUSAGE_LEGACY_CUBEMAP)
{
allowed_usage &= ~(WINED3DUSAGE_DEPTHSTENCIL | WINED3DUSAGE_QUERY_LEGACYBUMPMAP);
gl_type = WINED3D_GL_RES_TYPE_TEX_CUBE;
gl_type = gl_type_end = WINED3D_GL_RES_TYPE_TEX_CUBE;
}
else if ((usage & WINED3DUSAGE_DEPTHSTENCIL)
&& (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_SHADOW)
......@@ -5304,7 +5311,7 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
| WINED3DUSAGE_QUERY_SRGBWRITE
| WINED3DUSAGE_QUERY_VERTEXTEXTURE
| WINED3DUSAGE_QUERY_WRAPANDMIP;
gl_type = WINED3D_GL_RES_TYPE_TEX_3D;
gl_type = gl_type_end = WINED3D_GL_RES_TYPE_TEX_3D;
break;
default:
......@@ -5334,39 +5341,46 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
if (usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP)
format_flags |= WINED3DFMT_FLAG_BUMPMAP;
if ((format->flags[gl_type] & format_flags) != format_flags)
{
TRACE("Requested format flags %#x, but format %s only has %#x.\n",
format_flags, debug_d3dformat(check_format_id), format->flags[gl_type]);
return WINED3DERR_NOTAVAILABLE;
}
if ((format_flags & WINED3DFMT_FLAG_TEXTURE) && (wined3d->flags & WINED3D_NO3D))
{
TRACE("Requested texturing support, but wined3d was created with WINED3D_NO3D.\n");
return WINED3DERR_NOTAVAILABLE;
}
if ((usage & WINED3DUSAGE_DEPTHSTENCIL)
&& !CheckDepthStencilCapability(adapter, adapter_format, format, gl_type))
if ((usage & WINED3DUSAGE_AUTOGENMIPMAP) && !gl_info->supported[SGIS_GENERATE_MIPMAP])
{
TRACE("Requested WINED3DUSAGE_DEPTHSTENCIL, but format %s is not supported for depth / stencil buffers.\n",
debug_d3dformat(check_format_id));
return WINED3DERR_NOTAVAILABLE;
TRACE("No WINED3DUSAGE_AUTOGENMIPMAP support, returning WINED3DOK_NOAUTOGEN.\n");
return WINED3DOK_NOAUTOGEN;
}
if ((usage & WINED3DUSAGE_RENDERTARGET)
&& !CheckRenderTargetCapability(adapter, adapter_format, format, gl_type))
for (; gl_type <= gl_type_end; ++gl_type)
{
TRACE("Requested WINED3DUSAGE_RENDERTARGET, but format %s is not supported for render targets.\n",
debug_d3dformat(check_format_id));
return WINED3DERR_NOTAVAILABLE;
}
if ((format->flags[gl_type] & format_flags) != format_flags)
{
TRACE("Requested format flags %#x, but format %s only has %#x.\n",
format_flags, debug_d3dformat(check_format_id), format->flags[gl_type]);
return WINED3DERR_NOTAVAILABLE;
}
if ((usage & WINED3DUSAGE_AUTOGENMIPMAP) && !gl_info->supported[SGIS_GENERATE_MIPMAP])
{
TRACE("No WINED3DUSAGE_AUTOGENMIPMAP support, returning WINED3DOK_NOAUTOGEN.\n");
return WINED3DOK_NOAUTOGEN;
if ((usage & WINED3DUSAGE_RENDERTARGET)
&& !CheckRenderTargetCapability(adapter, adapter_format, format, gl_type))
{
TRACE("Requested WINED3DUSAGE_RENDERTARGET, but format %s is not supported for render targets.\n",
debug_d3dformat(check_format_id));
return WINED3DERR_NOTAVAILABLE;
}
/* 3D depth / stencil textures are never supported. */
if (usage == WINED3DUSAGE_DEPTHSTENCIL && gl_type == WINED3D_GL_RES_TYPE_TEX_3D)
continue;
if ((usage & WINED3DUSAGE_DEPTHSTENCIL)
&& !CheckDepthStencilCapability(adapter, adapter_format, format, gl_type))
{
TRACE("Requested WINED3DUSAGE_DEPTHSTENCIL, but format %s is not supported for depth / stencil buffers.\n",
debug_d3dformat(check_format_id));
return WINED3DERR_NOTAVAILABLE;
}
}
return WINED3D_OK;
......
......@@ -4120,6 +4120,7 @@ const char *debug_d3dresourcetype(enum wined3d_resource_type resource_type)
switch (resource_type)
{
#define WINED3D_TO_STR(x) case x: return #x
WINED3D_TO_STR(WINED3D_RTYPE_NONE);
WINED3D_TO_STR(WINED3D_RTYPE_BUFFER);
WINED3D_TO_STR(WINED3D_RTYPE_TEXTURE_2D);
WINED3D_TO_STR(WINED3D_RTYPE_TEXTURE_3D);
......
......@@ -670,6 +670,7 @@ enum wined3d_texture_filter_type
enum wined3d_resource_type
{
WINED3D_RTYPE_NONE = 0,
WINED3D_RTYPE_BUFFER = 1,
WINED3D_RTYPE_TEXTURE_2D = 2,
WINED3D_RTYPE_TEXTURE_3D = 3,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment