Commit 2fd86a17 authored by Józef Kucia's avatar Józef Kucia Committed by Alexandre Julliard

wined3d: Create multisample textures.

parent 11dd0601
......@@ -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;
......
......@@ -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);
......
......@@ -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;
}
}
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment