From: Stian Low <wineryyyyy@gmail.com> --- dlls/d3d11/device.c | 1 + dlls/wined3d/directx.c | 8 ++++++++ dlls/wined3d/utils.c | 34 +++++++++++++++++++++++++++++++--- dlls/wined3d/wined3d_private.h | 1 + include/wine/wined3d.h | 3 ++- 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index e1a846698e6..b83ff03ce8d 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -4631,6 +4631,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFormatSupport(ID3D11Device5 * {WINED3D_RTYPE_TEXTURE_2D, WINED3D_BIND_SHADER_RESOURCE, WINED3DUSAGE_QUERY_WRAPANDMIP, D3D11_FORMAT_SUPPORT_MIP}, {WINED3D_RTYPE_TEXTURE_2D, WINED3D_BIND_SHADER_RESOURCE, WINED3DUSAGE_QUERY_GENMIPMAP, D3D11_FORMAT_SUPPORT_MIP_AUTOGEN}, {WINED3D_RTYPE_TEXTURE_2D, WINED3D_BIND_RENDER_TARGET, WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3D11_FORMAT_SUPPORT_BLENDABLE}, + {WINED3D_RTYPE_TEXTURE_2D, 0, WINED3DUSAGE_QUERY_BACK_BUFFER_CAST, D3D11_FORMAT_SUPPORT_BACK_BUFFER_CAST}, }; HRESULT hr; diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 19ec8070dd9..7dfb6833105 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -2029,6 +2029,10 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, | WINED3D_BIND_DEPTH_STENCIL | WINED3D_BIND_UNORDERED_ACCESS; gl_type = gl_type_end = WINED3D_GL_RES_TYPE_TEX_2D; + + if ((usage & WINED3DUSAGE_QUERY_BACK_BUFFER_CAST)) + allowed_usage |= WINED3DUSAGE_QUERY_BACK_BUFFER_CAST; + if (!(bind_flags & WINED3D_BIND_SHADER_RESOURCE)) { if (!wined3d_check_surface_format(format)) @@ -2119,6 +2123,8 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, if (bind_flags & WINED3D_BIND_INDEX_BUFFER) format_caps |= WINED3D_FORMAT_CAP_INDEX_BUFFER; + if (usage & WINED3DUSAGE_QUERY_BACK_BUFFER_CAST) + format_caps |= WINED3D_FORMAT_CAP_BACK_BUFFER_CAST; if (usage & WINED3DUSAGE_QUERY_FILTER) format_caps |= WINED3D_FORMAT_CAP_FILTERING; if (usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) @@ -2131,6 +2137,8 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, format_caps |= WINED3D_FORMAT_CAP_VTF; if (usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP) format_attrs |= WINED3D_FORMAT_ATTR_BUMPMAP; + if (usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP) + format_attrs |= WINED3D_FORMAT_ATTR_BUMPMAP; if ((format_caps & WINED3D_FORMAT_CAP_TEXTURE) && (wined3d->flags & WINED3D_NO3D)) { diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 0fb90ba3f18..c1d97835ce7 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -1419,7 +1419,7 @@ static const struct wined3d_format_texture_info format_texture_info[] = GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE - | WINED3D_FORMAT_CAP_VTF, + | WINED3D_FORMAT_CAP_VTF | WINED3D_FORMAT_CAP_BACK_BUFFER_CAST, WINED3D_GL_EXT_NONE, NULL}, {WINED3DFMT_B8G8R8X8_UNORM, GL_RGB8, GL_SRGB8_EXT, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, @@ -1480,13 +1480,13 @@ static const struct wined3d_format_texture_info format_texture_info[] = {WINED3DFMT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 0, WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING - | WINED3D_FORMAT_CAP_RENDERTARGET, + | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_BACK_BUFFER_CAST, WINED3D_GL_EXT_NONE, NULL}, {WINED3DFMT_R8G8B8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0, WINED3D_FORMAT_CAP_TEXTURE | WINED3D_FORMAT_CAP_POSTPIXELSHADER_BLENDING | WINED3D_FORMAT_CAP_FILTERING | WINED3D_FORMAT_CAP_RENDERTARGET | WINED3D_FORMAT_CAP_SRGB_READ | WINED3D_FORMAT_CAP_SRGB_WRITE - | WINED3D_FORMAT_CAP_VTF, + | WINED3D_FORMAT_CAP_VTF | WINED3D_FORMAT_CAP_BACK_BUFFER_CAST, WINED3D_GL_EXT_NONE, NULL}, {WINED3DFMT_R8G8B8A8_UINT, GL_RGBA8UI, GL_RGBA8UI, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_8_8_8_8_REV, 0, @@ -4212,6 +4212,34 @@ static void init_vulkan_format_info(struct wined3d_adapter *adapter, struct wine return; } + for (i = 0; i < ARRAY_SIZE(format_texture_info); ++i) + { + if (format->f.id != format_texture_info[i].id) + continue; + + format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] |= format_texture_info[i].caps & WINED3D_FORMAT_CAP_BACK_BUFFER_CAST; + break; + } + + for (i = 0; i < ARRAY_SIZE(format_srgb_info); ++i) + { + if (format_srgb_info[i].base_format_id == format->f.id) + { + enum wined3d_format_id srgb_format_id = format_srgb_info[i].srgb_format_id; + struct wined3d_format_vk *srgb_format; + for (i = 0; i < WINED3D_FORMAT_COUNT; ++i) + { + srgb_format = wined3d_format_vk_mutable(get_format_by_idx(adapter, i)); + if (srgb_format_id != srgb_format->f.id) + continue; + + srgb_format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] |= format->f.caps[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3D_FORMAT_CAP_BACK_BUFFER_CAST; + break; + } + break; + } + } + if ((format->f.attrs & WINED3D_FORMAT_ATTR_PLANAR) && !vk_info->supported[WINED3D_VK_KHR_SAMPLER_YCBCR_CONVERSION] && vk_info->api_version < VK_API_VERSION_1_1) return; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 9ea159759c6..b72768078b7 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4571,6 +4571,7 @@ extern enum wined3d_format_id pixelformat_for_depth(DWORD depth); #define WINED3D_FORMAT_CAP_VERTEX_ATTRIBUTE 0x00004000 #define WINED3D_FORMAT_CAP_BLIT 0x00008000 #define WINED3D_FORMAT_CAP_INDEX_BUFFER 0x00010000 +#define WINED3D_FORMAT_CAP_BACK_BUFFER_CAST 0x00020000 struct wined3d_rational { diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index a2e60493a22..34883e1e9d2 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -968,7 +968,8 @@ enum wined3d_memory_segment_group #define WINED3DUSAGE_QUERY_SRGBWRITE 0x00040000 #define WINED3DUSAGE_QUERY_VERTEXTEXTURE 0x00100000 #define WINED3DUSAGE_QUERY_WRAPANDMIP 0x00200000 -#define WINED3DUSAGE_QUERY_MASK 0x003f8400 +#define WINED3DUSAGE_QUERY_BACK_BUFFER_CAST 0x00400000 +#define WINED3DUSAGE_QUERY_MASK 0x007f8400 #define WINED3D_MAP_NOSYSLOCK 0x00000800 #define WINED3D_MAP_NOOVERWRITE 0x00001000 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10567