[PATCH 4/8] wined3d: Create multisample textures.
Józef Kucia
jkucia at codeweavers.com
Fri Feb 9 06:03:23 CST 2018
Signed-off-by: Józef Kucia <jkucia at 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;
--
2.13.6
More information about the wine-devel
mailing list