Henri Verbeet : wined3d: Introduce WINED3DFMT_FLAG_BLIT.
Alexandre Julliard
julliard at winehq.org
Mon Sep 24 15:48:22 CDT 2018
Module: wine
Branch: master
Commit: 3ad933d5e665a202d364230dedbada4aecc128ff
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3ad933d5e665a202d364230dedbada4aecc128ff
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Sat Sep 22 03:14:08 2018 +0330
wined3d: Introduce WINED3DFMT_FLAG_BLIT.
To indicate whether a particular format can be used for "off-screen plain"
surfaces.
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/directx.c | 40 +++-------------------------
dlls/wined3d/utils.c | 59 +++++++++++++++++++++++++++++++++++++-----
dlls/wined3d/wined3d_private.h | 2 ++
3 files changed, 58 insertions(+), 43 deletions(-)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 8968447..02ca3f6 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1474,41 +1474,9 @@ static BOOL CheckRenderTargetCapability(const struct wined3d_adapter *adapter,
return FALSE;
}
-static BOOL wined3d_check_surface_capability(const struct wined3d_format *format, BOOL no3d)
+static BOOL wined3d_check_surface_capability(const struct wined3d_format *format)
{
- if (no3d)
- {
- switch (format->id)
- {
- case WINED3DFMT_B8G8R8_UNORM:
- TRACE("[FAILED] - Not enumerated on Windows.\n");
- return FALSE;
- case WINED3DFMT_B8G8R8A8_UNORM:
- case WINED3DFMT_B8G8R8X8_UNORM:
- case WINED3DFMT_B5G6R5_UNORM:
- case WINED3DFMT_B5G5R5X1_UNORM:
- case WINED3DFMT_B5G5R5A1_UNORM:
- case WINED3DFMT_B4G4R4A4_UNORM:
- case WINED3DFMT_B2G3R3_UNORM:
- case WINED3DFMT_A8_UNORM:
- case WINED3DFMT_B2G3R3A8_UNORM:
- case WINED3DFMT_B4G4R4X4_UNORM:
- case WINED3DFMT_R10G10B10A2_UNORM:
- case WINED3DFMT_R8G8B8A8_UNORM:
- case WINED3DFMT_R8G8B8X8_UNORM:
- case WINED3DFMT_R16G16_UNORM:
- case WINED3DFMT_B10G10R10A2_UNORM:
- case WINED3DFMT_R16G16B16A16_UNORM:
- case WINED3DFMT_P8_UINT:
- TRACE("[OK]\n");
- return TRUE;
- default:
- TRACE("[FAILED] - Not available on GDI surfaces.\n");
- return FALSE;
- }
- }
-
- if (format->glInternal)
+ if ((format->flags[WINED3D_GL_RES_TYPE_TEX_2D] | format->flags[WINED3D_GL_RES_TYPE_RB]) & WINED3DFMT_FLAG_BLIT)
{
TRACE("[OK]\n");
return TRUE;
@@ -1589,7 +1557,7 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
allowed_usage |= WINED3DUSAGE_QUERY_SRGBWRITE;
if (!(usage & WINED3DUSAGE_TEXTURE))
{
- if (!wined3d_check_surface_capability(format, wined3d->flags & WINED3D_NO3D))
+ if (!wined3d_check_surface_capability(format))
{
TRACE("[FAILED] - Not supported for plain surfaces.\n");
return WINED3DERR_NOTAVAILABLE;
@@ -2490,7 +2458,7 @@ static BOOL wined3d_adapter_no3d_init(struct wined3d_adapter *adapter)
adapter->vram_bytes_used = 0;
TRACE("Emulating 0x%s bytes of video ram.\n", wine_dbgstr_longlong(adapter->vram_bytes));
- if (!wined3d_adapter_init_format_info(adapter, sizeof(struct wined3d_format)))
+ if (!wined3d_adapter_no3d_init_format_info(adapter))
return FALSE;
adapter->vertex_pipe = &none_vertex_pipe;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 8e9b6df..3669485 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -3158,23 +3158,23 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
format->height_scale.numerator = 1;
format->height_scale.denominator = 1;
- format->flags[WINED3D_GL_RES_TYPE_TEX_1D] |= format_texture_info[i].flags;
- format->flags[WINED3D_GL_RES_TYPE_TEX_2D] |= format_texture_info[i].flags;
- format->flags[WINED3D_GL_RES_TYPE_BUFFER] |= format_texture_info[i].flags;
+ format->flags[WINED3D_GL_RES_TYPE_TEX_1D] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
+ format->flags[WINED3D_GL_RES_TYPE_TEX_2D] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
+ format->flags[WINED3D_GL_RES_TYPE_BUFFER] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
/* GL_ARB_depth_texture does not support 3D textures. It also says "cube textures are
* problematic", but doesn't explicitly mandate that an error is generated. */
if (gl_info->supported[EXT_TEXTURE3D]
&& !(format_texture_info[i].flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)))
- format->flags[WINED3D_GL_RES_TYPE_TEX_3D] |= format_texture_info[i].flags;
+ format->flags[WINED3D_GL_RES_TYPE_TEX_3D] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
- format->flags[WINED3D_GL_RES_TYPE_TEX_CUBE] |= format_texture_info[i].flags;
+ format->flags[WINED3D_GL_RES_TYPE_TEX_CUBE] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
if (gl_info->supported[ARB_TEXTURE_RECTANGLE])
- format->flags[WINED3D_GL_RES_TYPE_TEX_RECT] |= format_texture_info[i].flags;
+ format->flags[WINED3D_GL_RES_TYPE_TEX_RECT] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
- format->flags[WINED3D_GL_RES_TYPE_RB] |= format_texture_info[i].flags;
+ format->flags[WINED3D_GL_RES_TYPE_RB] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->flags[WINED3D_GL_RES_TYPE_RB] &= ~WINED3DFMT_FLAG_TEXTURE;
if (format->glGammaInternal != format->glInternal
@@ -3544,9 +3544,11 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
&& (!gl_info->supported[ARB_FRAGMENT_SHADER] || !gl_info->supported[ARB_VERTEX_SHADER])))
{
format = get_format_internal(adapter, WINED3DFMT_YUY2);
+ format_clear_flag(format, WINED3DFMT_FLAG_BLIT);
format->glInternal = 0;
format = get_format_internal(adapter, WINED3DFMT_UYVY);
+ format_clear_flag(format, WINED3DFMT_FLAG_BLIT);
format->glInternal = 0;
}
@@ -3568,9 +3570,11 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
else
{
format = get_format_internal(adapter, WINED3DFMT_YV12);
+ format_clear_flag(format, WINED3DFMT_FLAG_BLIT);
format->glInternal = 0;
format = get_format_internal(adapter, WINED3DFMT_NV12);
+ format_clear_flag(format, WINED3DFMT_FLAG_BLIT);
format->glInternal = 0;
}
@@ -3979,6 +3983,47 @@ fail:
return FALSE;
}
+BOOL wined3d_adapter_no3d_init_format_info(struct wined3d_adapter *adapter)
+{
+ struct wined3d_format *format;
+ unsigned int i;
+
+ static const enum wined3d_format_id blit_formats[] =
+ {
+ WINED3DFMT_B8G8R8A8_UNORM,
+ WINED3DFMT_B8G8R8X8_UNORM,
+ WINED3DFMT_B5G6R5_UNORM,
+ WINED3DFMT_B5G5R5X1_UNORM,
+ WINED3DFMT_B5G5R5A1_UNORM,
+ WINED3DFMT_B4G4R4A4_UNORM,
+ WINED3DFMT_B2G3R3_UNORM,
+ WINED3DFMT_A8_UNORM,
+ WINED3DFMT_B2G3R3A8_UNORM,
+ WINED3DFMT_B4G4R4X4_UNORM,
+ WINED3DFMT_R10G10B10A2_UNORM,
+ WINED3DFMT_R8G8B8A8_UNORM,
+ WINED3DFMT_R8G8B8X8_UNORM,
+ WINED3DFMT_R16G16_UNORM,
+ WINED3DFMT_B10G10R10A2_UNORM,
+ WINED3DFMT_R16G16B16A16_UNORM,
+ WINED3DFMT_P8_UINT,
+ };
+
+ if (!wined3d_adapter_init_format_info(adapter, sizeof(struct wined3d_format)))
+ return FALSE;
+
+ for (i = 0; i < ARRAY_SIZE(blit_formats); ++i)
+ {
+ if (!(format = get_format_internal(adapter, blit_formats[i])))
+ return FALSE;
+
+ format->flags[WINED3D_GL_RES_TYPE_TEX_2D] |= WINED3DFMT_FLAG_BLIT;
+ format->flags[WINED3D_GL_RES_TYPE_RB] |= WINED3DFMT_FLAG_BLIT;
+ }
+
+ return TRUE;
+}
+
/* Context activation is done by the caller. */
BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter, struct wined3d_caps_gl_ctx *ctx)
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index cb2f442..cec2cff 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2695,6 +2695,7 @@ struct wined3d_caps_gl_ctx
BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter, size_t format_size) DECLSPEC_HIDDEN;
BOOL wined3d_adapter_gl_init_format_info(struct wined3d_adapter *adapter,
struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN;
+BOOL wined3d_adapter_no3d_init_format_info(struct wined3d_adapter *adapter) DECLSPEC_HIDDEN;
UINT64 adapter_adjust_memory(struct wined3d_adapter *adapter, INT64 amount) DECLSPEC_HIDDEN;
BOOL wined3d_caps_gl_ctx_test_viewport_subpixel_bits(struct wined3d_caps_gl_ctx *ctx) DECLSPEC_HIDDEN;
@@ -4299,6 +4300,7 @@ extern enum wined3d_format_id pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN
#define WINED3DFMT_FLAG_GEN_MIPMAP 0x00400000
#define WINED3DFMT_FLAG_NORMALISED 0x00800000
#define WINED3DFMT_FLAG_VERTEX_ATTRIBUTE 0x01000000
+#define WINED3DFMT_FLAG_BLIT 0x02000000
struct wined3d_rational
{
More information about the wine-cvs
mailing list