Module: wine Branch: master Commit: 00275acca850a337f5e97f78bb2d8eaea00ffc1b URL: https://source.winehq.org/git/wine.git/?a=commit;h=00275acca850a337f5e97f78b...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed Oct 31 13:19:51 2018 +0330
wined3d: Validate format capabilities against the bind flags instead of the usage flags in resource_init().
Note that buffer resources don't have an inherent format, so validating bind flags against WINED3DFMT_UNKNOWN doesn't make a lot of sense. This wasn't an issue previously because d3d11 doesn't set the usage flags corresponding to the bind flags for buffer resources, and earlier versions of D3D didn't allow buffers to be used as e.g. shader resources.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/resource.c | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-)
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index 512546d..ff58456 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -107,28 +107,33 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device * if (base_type == WINED3D_GL_RES_TYPE_COUNT) base_type = gl_type;
- if ((usage & WINED3DUSAGE_RENDERTARGET) && !(format->flags[gl_type] & WINED3DFMT_FLAG_RENDERTARGET)) + if (type != WINED3D_RTYPE_BUFFER) { - WARN("Format %s cannot be used for render targets.\n", debug_d3dformat(format->id)); - continue; - } - if ((usage & WINED3DUSAGE_DEPTHSTENCIL) - && !(format->flags[gl_type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) - { - WARN("Format %s cannot be used for depth/stencil buffers.\n", debug_d3dformat(format->id)); - continue; - } - if (wined3d_settings.offscreen_rendering_mode == ORM_FBO - && usage & (WINED3DUSAGE_RENDERTARGET | WINED3DUSAGE_DEPTHSTENCIL) - && !(format->flags[gl_type] & WINED3DFMT_FLAG_FBO_ATTACHABLE)) - { - WARN("Render target or depth stencil is not FBO attachable.\n"); - continue; - } - if ((usage & WINED3DUSAGE_TEXTURE) && !(format->flags[gl_type] & WINED3DFMT_FLAG_TEXTURE)) - { - WARN("Format %s cannot be used for texturing.\n", debug_d3dformat(format->id)); - continue; + if ((bind_flags & WINED3D_BIND_RENDER_TARGET) + && !(format->flags[gl_type] & WINED3DFMT_FLAG_RENDERTARGET)) + { + WARN("Format %s cannot be used for render targets.\n", debug_d3dformat(format->id)); + continue; + } + if ((bind_flags & WINED3D_BIND_DEPTH_STENCIL) + && !(format->flags[gl_type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) + { + WARN("Format %s cannot be used for depth/stencil buffers.\n", debug_d3dformat(format->id)); + continue; + } + if (wined3d_settings.offscreen_rendering_mode == ORM_FBO + && bind_flags & (WINED3D_BIND_RENDER_TARGET | WINED3D_BIND_DEPTH_STENCIL) + && !(format->flags[gl_type] & WINED3DFMT_FLAG_FBO_ATTACHABLE)) + { + WARN("Render target or depth stencil is not FBO attachable.\n"); + continue; + } + if ((bind_flags & WINED3D_BIND_SHADER_RESOURCE) + && !(format->flags[gl_type] & WINED3DFMT_FLAG_TEXTURE)) + { + WARN("Format %s cannot be used for texturing.\n", debug_d3dformat(format->id)); + continue; + } } if (((width & (width - 1)) || (height & (height - 1))) && !d3d_info->texture_npot