wined3d: Create multisample textures.
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
11dd0601c5
commit
2fd86a17bb
|
@ -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)
|
||||
switch (texture->target)
|
||||
{
|
||||
GL_EXTCALL(glTexStorage3D(texture->target, texture->level_count, gl_internal_format,
|
||||
width, height, texture->layer_count));
|
||||
checkGLcall("glTexStorage3D");
|
||||
}
|
||||
else
|
||||
{
|
||||
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;
|
||||
|
|
Loading…
Reference in New Issue