Signed-off-by: Józef Kucia jkucia@codeweavers.com ---
Multisample textures are disabled when immutable storage is not available, because immutable storage is required for texture views. Multisample textures wouldn't be fully functional without immutable storage.
--- dlls/d3d11/texture.c | 3 --- dlls/wined3d/directx.c | 5 ++++ dlls/wined3d/resource.c | 14 ++++++++++- dlls/wined3d/texture.c | 64 +++++++++++++++++++++++++++++++++---------------- 4 files changed, 61 insertions(+), 25 deletions(-)
diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c index 4d500c9847d9..39d71cd3d197 100644 --- a/dlls/d3d11/texture.c +++ b/dlls/d3d11/texture.c @@ -512,9 +512,6 @@ HRESULT d3d_texture2d_create(struct d3d_device *device, const D3D11_TEXTURE2D_DE wined3d_private_store_init(&texture->private_store); texture->desc = *desc;
- if (desc->SampleDesc.Count > 1) - FIXME("Multisampled textures not implemented.\n"); - wined3d_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D; wined3d_desc.format = wined3dformat_from_dxgi_format(desc->Format); wined3d_desc.multisample_type = desc->SampleDesc.Count > 1 ? desc->SampleDesc.Count : WINED3D_MULTISAMPLE_NONE; diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 6dee5ed234fe..c8f42fe253a7 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -4246,6 +4246,11 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter, } if (gl_info->supported[ARB_TEXTURE_MULTISAMPLE] && !wined3d_settings.multisample_textures) gl_info->supported[ARB_TEXTURE_MULTISAMPLE] = FALSE; + if (gl_info->supported[ARB_TEXTURE_MULTISAMPLE] && !gl_info->supported[ARB_TEXTURE_STORAGE_MULTISAMPLE]) + { + WARN("Disabling ARB_texture_multisample because immutable storage is not supported.\n"); + gl_info->supported[ARB_TEXTURE_MULTISAMPLE] = FALSE; + }
wined3d_adapter_init_limits(gl_info);
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index 61ff20679bd4..e3188883205c 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -442,11 +442,23 @@ BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) { if (!wined3d_resource_is_offscreen(resource) || wined3d_settings.offscreen_rendering_mode != ORM_FBO) + { resource->draw_binding = WINED3D_LOCATION_DRAWABLE; + } else if (resource->multisample_type) - resource->draw_binding = WINED3D_LOCATION_RB_MULTISAMPLE; + { + const struct wined3d_gl_info *gl_info = &resource->device->adapter->gl_info; + if (gl_info->supported[ARB_TEXTURE_MULTISAMPLE]) + resource->draw_binding = WINED3D_LOCATION_TEXTURE_RGB; + else + resource->draw_binding = WINED3D_LOCATION_RB_MULTISAMPLE; + } else if (resource->gl_type == WINED3D_GL_RES_TYPE_RB) + { resource->draw_binding = WINED3D_LOCATION_RB_RESOLVED; + } else + { resource->draw_binding = WINED3D_LOCATION_TEXTURE_RGB; + } } diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index ed1ca21117f0..9a02c1936f7a 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -460,6 +460,13 @@ static unsigned int wined3d_texture_get_gl_sample_count(const struct wined3d_tex { const struct wined3d_format *format = texture->resource.format;
+ /* TODO: NVIDIA expose their Coverage Sample Anti-Aliasing (CSAA) + * feature through type == MULTISAMPLE_XX and quality != 0. This could + * be mapped to GL_NV_framebuffer_multisample_coverage. + * + * AMD have a similar feature called Enhanced Quality Anti-Aliasing + * (EQAA), but it does not have an equivalent OpenGL extension. */ + /* We advertise as many WINED3D_MULTISAMPLE_NON_MASKABLE quality * levels as the count of advertised multisample types for the texture * format. */ @@ -530,21 +537,31 @@ static void wined3d_texture_allocate_gl_mutable_storage(struct wined3d_texture * static void wined3d_texture_allocate_gl_immutable_storage(struct wined3d_texture *texture, GLenum gl_internal_format, const struct wined3d_gl_info *gl_info) { - GLsizei width = wined3d_texture_get_level_pow2_width(texture, 0); + unsigned int samples = wined3d_texture_get_gl_sample_count(texture); GLsizei height = wined3d_texture_get_level_pow2_height(texture, 0); + GLsizei width = wined3d_texture_get_level_pow2_width(texture, 0);
- if (texture->target == GL_TEXTURE_2D_ARRAY) - { - GL_EXTCALL(glTexStorage3D(texture->target, texture->level_count, gl_internal_format, - width, height, texture->layer_count)); - checkGLcall("glTexStorage3D"); - } - else + switch (texture->target) { - GL_EXTCALL(glTexStorage2D(texture->target, texture->level_count, gl_internal_format, - width, height)); - checkGLcall("glTexStorage2D"); + case GL_TEXTURE_2D_ARRAY: + GL_EXTCALL(glTexStorage3D(texture->target, texture->level_count, + gl_internal_format, width, height, texture->layer_count)); + break; + case GL_TEXTURE_2D_MULTISAMPLE: + GL_EXTCALL(glTexStorage2DMultisample(texture->target, samples, + gl_internal_format, width, height, GL_FALSE)); + break; + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: + GL_EXTCALL(glTexStorage3DMultisample(texture->target, samples, + gl_internal_format, width, height, texture->layer_count, GL_FALSE)); + break; + default: + GL_EXTCALL(glTexStorage2D(texture->target, texture->level_count, + gl_internal_format, width, height)); + break; } + + checkGLcall("allocate immutable storage"); }
static void wined3d_texture_unload_gl_texture(struct wined3d_texture *texture) @@ -1502,13 +1519,6 @@ static void wined3d_texture_prepare_rb(struct wined3d_texture *texture, if (texture->rb_multisample) return;
- /* TODO: NVIDIA expose their Coverage Sample Anti-Aliasing (CSAA) - * feature through type == MULTISAMPLE_XX and quality != 0. This could - * be mapped to GL_NV_framebuffer_multisample_coverage. - * - * AMD have a similar feature called Enhanced Quality Anti-Aliasing - * (EQAA), but it does not have an equivalent OpenGL extension. */ - samples = wined3d_texture_get_gl_sample_count(texture);
gl_info->fbo_ops.glGenRenderbuffers(1, &texture->rb_multisample); @@ -2189,11 +2199,23 @@ static HRESULT texture_init(struct wined3d_texture *texture, const struct wined3 texture->pow2_matrix[5] = 1.0f; } if (desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP) + { texture->target = GL_TEXTURE_CUBE_MAP_ARB; - else if (layer_count > 1) - texture->target = GL_TEXTURE_2D_ARRAY; + } + else if (desc->multisample_type && gl_info->supported[ARB_TEXTURE_MULTISAMPLE]) + { + if (layer_count > 1) + texture->target = GL_TEXTURE_2D_MULTISAMPLE_ARRAY; + else + texture->target = GL_TEXTURE_2D_MULTISAMPLE; + } else - texture->target = GL_TEXTURE_2D; + { + if (layer_count > 1) + texture->target = GL_TEXTURE_2D_ARRAY; + else + texture->target = GL_TEXTURE_2D; + } } texture->pow2_matrix[10] = 1.0f; texture->pow2_matrix[15] = 1.0f;