wined3d: Add multisampling support.

This commit is contained in:
Henri Verbeet 2011-08-25 21:05:03 +02:00 committed by Alexandre Julliard
parent bd5f948682
commit 641f52ef96
7 changed files with 234 additions and 56 deletions

View File

@ -169,6 +169,18 @@ static void context_attach_depth_stencil_fbo(struct wined3d_context *context,
} }
break; break;
case SFLAG_INRB_MULTISAMPLE:
surface_prepare_rb(depth_stencil, gl_info, TRUE);
context_attach_depth_stencil_rb(gl_info, fbo_target,
format_flags, depth_stencil->rb_multisample);
break;
case SFLAG_INRB_RESOLVED:
surface_prepare_rb(depth_stencil, gl_info, FALSE);
context_attach_depth_stencil_rb(gl_info, fbo_target,
format_flags, depth_stencil->rb_resolved);
break;
default: default:
ERR("Unsupported location %s (%#x).\n", debug_surflocation(location), location); ERR("Unsupported location %s (%#x).\n", debug_surflocation(location), location);
break; break;
@ -218,13 +230,27 @@ static void context_attach_surface_fbo(struct wined3d_context *context,
gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx,
surface->texture_target, surface_get_texture_name(surface, gl_info, srgb), surface->texture_target, surface_get_texture_name(surface, gl_info, srgb),
surface->texture_level); surface->texture_level);
checkGLcall("glFramebufferTexture2D()");
break;
case SFLAG_INRB_MULTISAMPLE:
surface_prepare_rb(surface, gl_info, TRUE);
gl_info->fbo_ops.glFramebufferRenderbuffer(fbo_target, GL_COLOR_ATTACHMENT0 + idx,
GL_RENDERBUFFER, surface->rb_multisample);
checkGLcall("glFramebufferRenderbuffer()");
break;
case SFLAG_INRB_RESOLVED:
surface_prepare_rb(surface, gl_info, FALSE);
gl_info->fbo_ops.glFramebufferRenderbuffer(fbo_target, GL_COLOR_ATTACHMENT0 + idx,
GL_RENDERBUFFER, surface->rb_resolved);
checkGLcall("glFramebufferRenderbuffer()");
break; break;
default: default:
ERR("Unsupported location %s (%#x).\n", debug_surflocation(location), location); ERR("Unsupported location %s (%#x).\n", debug_surflocation(location), location);
break; break;
} }
checkGLcall("glFramebufferTexture2D()");
} }
else else
{ {
@ -2049,7 +2075,8 @@ BOOL context_apply_clear_state(struct wined3d_context *context, struct wined3d_d
context->blit_targets[i] = NULL; context->blit_targets[i] = NULL;
++i; ++i;
} }
context_apply_fbo_state(context, GL_FRAMEBUFFER, context->blit_targets, fb->depth_stencil, SFLAG_INTEXTURE); context_apply_fbo_state(context, GL_FRAMEBUFFER, context->blit_targets, fb->depth_stencil,
rt_count ? rts[0]->draw_binding : SFLAG_INTEXTURE);
glReadBuffer(GL_NONE); glReadBuffer(GL_NONE);
checkGLcall("glReadBuffer"); checkGLcall("glReadBuffer");
} }
@ -2163,7 +2190,8 @@ void context_state_fb(struct wined3d_context *context, const struct wined3d_stat
} }
else else
{ {
context_apply_fbo_state(context, GL_FRAMEBUFFER, fb->render_targets, fb->depth_stencil, SFLAG_INTEXTURE); context_apply_fbo_state(context, GL_FRAMEBUFFER, fb->render_targets, fb->depth_stencil,
fb->render_targets[0]->draw_binding);
glReadBuffer(GL_NONE); glReadBuffer(GL_NONE);
checkGLcall("glReadBuffer"); checkGLcall("glReadBuffer");
} }

View File

@ -5452,6 +5452,9 @@ static HRESULT updateSurfaceDesc(struct wined3d_surface *surface,
while (surface->pow2Height < pPresentationParameters->BackBufferHeight) surface->pow2Height <<= 1; while (surface->pow2Height < pPresentationParameters->BackBufferHeight) surface->pow2Height <<= 1;
} }
surface->resource.multisample_type = pPresentationParameters->MultiSampleType;
surface->resource.multisample_quality = pPresentationParameters->MultiSampleQuality;
surface->resource.resource_ops->resource_unload(&surface->resource); surface->resource.resource_ops->resource_unload(&surface->resource);
if (surface->pow2Width != pPresentationParameters->BackBufferWidth if (surface->pow2Width != pPresentationParameters->BackBufferWidth
@ -5627,6 +5630,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
struct wined3d_resource *resource, *cursor; struct wined3d_resource *resource, *cursor;
struct wined3d_swapchain *swapchain; struct wined3d_swapchain *swapchain;
BOOL DisplayModeChanged = FALSE; BOOL DisplayModeChanged = FALSE;
BOOL update_desc = FALSE;
WINED3DDISPLAYMODE mode; WINED3DDISPLAYMODE mode;
unsigned int i; unsigned int i;
HRESULT hr; HRESULT hr;
@ -5771,15 +5775,27 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
&& (present_parameters->BackBufferWidth != swapchain->presentParms.BackBufferWidth && (present_parameters->BackBufferWidth != swapchain->presentParms.BackBufferWidth
|| present_parameters->BackBufferHeight != swapchain->presentParms.BackBufferHeight)) || present_parameters->BackBufferHeight != swapchain->presentParms.BackBufferHeight))
{ {
UINT i;
if (!present_parameters->Windowed) if (!present_parameters->Windowed)
DisplayModeChanged = TRUE; DisplayModeChanged = TRUE;
swapchain->presentParms.BackBufferWidth = present_parameters->BackBufferWidth; swapchain->presentParms.BackBufferWidth = present_parameters->BackBufferWidth;
swapchain->presentParms.BackBufferHeight = present_parameters->BackBufferHeight; swapchain->presentParms.BackBufferHeight = present_parameters->BackBufferHeight;
update_desc = TRUE;
}
hr = updateSurfaceDesc(swapchain->front_buffer, present_parameters); if (present_parameters->MultiSampleType != swapchain->presentParms.MultiSampleType
|| present_parameters->MultiSampleQuality != swapchain->presentParms.MultiSampleQuality)
{
swapchain->presentParms.MultiSampleType = present_parameters->MultiSampleType;
swapchain->presentParms.MultiSampleQuality = present_parameters->MultiSampleQuality;
update_desc = TRUE;
}
if (update_desc)
{
UINT i;
hr = updateSurfaceDesc(swapchain->front_buffer, &swapchain->presentParms);
if (FAILED(hr)) if (FAILED(hr))
{ {
wined3d_swapchain_decref(swapchain); wined3d_swapchain_decref(swapchain);
@ -5788,7 +5804,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i) for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i)
{ {
hr = updateSurfaceDesc(swapchain->back_buffers[i], present_parameters); hr = updateSurfaceDesc(swapchain->back_buffers[i], &swapchain->presentParms);
if (FAILED(hr)) if (FAILED(hr))
{ {
wined3d_swapchain_decref(swapchain); wined3d_swapchain_decref(swapchain);
@ -5797,7 +5813,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
} }
if (device->auto_depth_stencil) if (device->auto_depth_stencil)
{ {
hr = updateSurfaceDesc(device->auto_depth_stencil, present_parameters); hr = updateSurfaceDesc(device->auto_depth_stencil, &swapchain->presentParms);
if (FAILED(hr)) if (FAILED(hr))
{ {
wined3d_swapchain_decref(swapchain); wined3d_swapchain_decref(swapchain);

View File

@ -4,7 +4,7 @@
* Copyright 2004 Christian Costa * Copyright 2004 Christian Costa
* Copyright 2005 Oliver Stieber * Copyright 2005 Oliver Stieber
* Copyright 2007-2008 Stefan Dösinger for CodeWeavers * Copyright 2007-2008 Stefan Dösinger for CodeWeavers
* Copyright 2009-2010 Henri Verbeet for CodeWeavers * Copyright 2009-2011 Henri Verbeet for CodeWeavers
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -2631,6 +2631,11 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv = gl_info->glGetFramebufferAttachmentParameteriv; gl_info->fbo_ops.glGetFramebufferAttachmentParameteriv = gl_info->glGetFramebufferAttachmentParameteriv;
gl_info->fbo_ops.glBlitFramebuffer = gl_info->glBlitFramebuffer; gl_info->fbo_ops.glBlitFramebuffer = gl_info->glBlitFramebuffer;
gl_info->fbo_ops.glGenerateMipmap = gl_info->glGenerateMipmap; gl_info->fbo_ops.glGenerateMipmap = gl_info->glGenerateMipmap;
if (wined3d_settings.allow_multisampling)
{
glGetIntegerv(GL_MAX_SAMPLES, &gl_max);
gl_info->limits.samples = gl_max;
}
} }
else else
{ {
@ -2666,6 +2671,11 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
if (gl_info->supported[EXT_FRAMEBUFFER_MULTISAMPLE]) if (gl_info->supported[EXT_FRAMEBUFFER_MULTISAMPLE])
{ {
gl_info->fbo_ops.glRenderbufferStorageMultisample = gl_info->glRenderbufferStorageMultisampleEXT; gl_info->fbo_ops.glRenderbufferStorageMultisample = gl_info->glRenderbufferStorageMultisampleEXT;
if (wined3d_settings.allow_multisampling)
{
glGetIntegerv(GL_MAX_SAMPLES, &gl_max);
gl_info->limits.samples = gl_max;
}
} }
} }
@ -3127,6 +3137,8 @@ HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3
WINED3DDEVTYPE device_type, enum wined3d_format_id surface_format_id, BOOL windowed, WINED3DDEVTYPE device_type, enum wined3d_format_id surface_format_id, BOOL windowed,
WINED3DMULTISAMPLE_TYPE multisample_type, DWORD *quality_levels) WINED3DMULTISAMPLE_TYPE multisample_type, DWORD *quality_levels)
{ {
const struct wined3d_gl_info *gl_info;
TRACE_(d3d_caps)("wined3d %p, adapter_idx %u, device_type %s, surface_format %s,\n" TRACE_(d3d_caps)("wined3d %p, adapter_idx %u, device_type %s, surface_format %s,\n"
"windowed %#x, multisample_type %#x, quality_levels %p.\n", "windowed %#x, multisample_type %#x, quality_levels %p.\n",
wined3d, adapter_idx, debug_d3ddevicetype(device_type), debug_d3dformat(surface_format_id), wined3d, adapter_idx, debug_d3ddevicetype(device_type), debug_d3dformat(surface_format_id),
@ -3135,13 +3147,27 @@ HRESULT CDECL wined3d_check_device_multisample_type(const struct wined3d *wined3
if (adapter_idx >= wined3d->adapter_count) if (adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL; return WINED3DERR_INVALIDCALL;
if (WINED3DMULTISAMPLE_NONE == multisample_type) gl_info = &wined3d->adapters[adapter_idx].gl_info;
if (multisample_type > gl_info->limits.samples)
{ {
if (quality_levels) *quality_levels = 1; TRACE("Returning not supported.\n");
return WINED3D_OK; if (quality_levels)
*quality_levels = 0;
return WINED3DERR_NOTAVAILABLE;
} }
return WINED3DERR_NOTAVAILABLE; if (quality_levels)
{
if (multisample_type == WINED3DMULTISAMPLE_NONMASKABLE)
/* FIXME: This is probably wrong. */
*quality_levels = gl_info->limits.samples;
else
*quality_levels = 1;
}
return WINED3D_OK;
} }
/* Check if we support bumpmapping for a format */ /* Check if we support bumpmapping for a format */

View File

@ -44,7 +44,9 @@ static void surface_cleanup(struct wined3d_surface *surface)
{ {
TRACE("surface %p.\n", surface); TRACE("surface %p.\n", surface);
if (surface->texture_name || (surface->flags & SFLAG_PBO) || !list_empty(&surface->renderbuffers)) if (surface->texture_name || (surface->flags & SFLAG_PBO)
|| surface->rb_multisample || surface->rb_resolved
|| !list_empty(&surface->renderbuffers))
{ {
struct wined3d_renderbuffer_entry *entry, *entry2; struct wined3d_renderbuffer_entry *entry, *entry2;
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
@ -67,6 +69,18 @@ static void surface_cleanup(struct wined3d_surface *surface)
GL_EXTCALL(glDeleteBuffersARB(1, &surface->pbo)); GL_EXTCALL(glDeleteBuffersARB(1, &surface->pbo));
} }
if (surface->rb_multisample)
{
TRACE("Deleting multisample renderbuffer %u.\n", surface->rb_multisample);
gl_info->fbo_ops.glDeleteRenderbuffers(1, &surface->rb_multisample);
}
if (surface->rb_resolved)
{
TRACE("Deleting resolved renderbuffer %u.\n", surface->rb_resolved);
gl_info->fbo_ops.glDeleteRenderbuffers(1, &surface->rb_resolved);
}
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &surface->renderbuffers, struct wined3d_renderbuffer_entry, entry) LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &surface->renderbuffers, struct wined3d_renderbuffer_entry, entry)
{ {
TRACE("Deleting renderbuffer %u.\n", entry->id); TRACE("Deleting renderbuffer %u.\n", entry->id);
@ -104,6 +118,8 @@ void surface_update_draw_binding(struct wined3d_surface *surface)
{ {
if (!surface_is_offscreen(surface) || wined3d_settings.offscreen_rendering_mode != ORM_FBO) if (!surface_is_offscreen(surface) || wined3d_settings.offscreen_rendering_mode != ORM_FBO)
surface->draw_binding = SFLAG_INDRAWABLE; surface->draw_binding = SFLAG_INDRAWABLE;
else if (surface->resource.multisample_type)
surface->draw_binding = SFLAG_INRB_MULTISAMPLE;
else else
surface->draw_binding = SFLAG_INTEXTURE; surface->draw_binding = SFLAG_INTEXTURE;
} }
@ -1207,6 +1223,13 @@ static void surface_blt_fbo(struct wined3d_device *device, const WINED3DTEXTUREF
break; break;
} }
/* Resolve the source surface first if needed. */
if (src_location == SFLAG_INRB_MULTISAMPLE
&& (src_surface->resource.format->id != dst_surface->resource.format->id
|| abs(src_rect.bottom - src_rect.top) != abs(dst_rect.bottom - dst_rect.top)
|| abs(src_rect.right - src_rect.left) != abs(dst_rect.right - dst_rect.left)))
src_location = SFLAG_INRB_RESOLVED;
/* Make sure the locations are up-to-date. Loading the destination /* Make sure the locations are up-to-date. Loading the destination
* surface isn't required if the entire surface is overwritten. (And is * surface isn't required if the entire surface is overwritten. (And is
* in fact harmful if we're being called by surface_load_location() with * in fact harmful if we're being called by surface_load_location() with
@ -1881,17 +1904,29 @@ static void surface_unload(struct wined3d_resource *resource)
list_init(&surface->renderbuffers); list_init(&surface->renderbuffers);
surface->current_renderbuffer = NULL; surface->current_renderbuffer = NULL;
ENTER_GL();
/* If we're in a texture, the texture name belongs to the texture. /* If we're in a texture, the texture name belongs to the texture.
* Otherwise, destroy it. */ * Otherwise, destroy it. */
if (surface->container.type != WINED3D_CONTAINER_TEXTURE) if (surface->container.type != WINED3D_CONTAINER_TEXTURE)
{ {
ENTER_GL();
glDeleteTextures(1, &surface->texture_name); glDeleteTextures(1, &surface->texture_name);
surface->texture_name = 0; surface->texture_name = 0;
glDeleteTextures(1, &surface->texture_name_srgb); glDeleteTextures(1, &surface->texture_name_srgb);
surface->texture_name_srgb = 0; surface->texture_name_srgb = 0;
LEAVE_GL();
} }
if (surface->rb_multisample)
{
gl_info->fbo_ops.glDeleteRenderbuffers(1, &surface->rb_multisample);
surface->rb_multisample = 0;
}
if (surface->rb_resolved)
{
gl_info->fbo_ops.glDeleteRenderbuffers(1, &surface->rb_resolved);
surface->rb_resolved = 0;
}
LEAVE_GL();
context_release(context); context_release(context);
@ -4250,6 +4285,32 @@ void surface_prepare_texture(struct wined3d_surface *surface, struct wined3d_con
surface_prepare_texture_internal(surface, context, srgb); surface_prepare_texture_internal(surface, context, srgb);
} }
void surface_prepare_rb(struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info, BOOL multisample)
{
if (multisample)
{
if (surface->rb_multisample)
return;
gl_info->fbo_ops.glGenRenderbuffers(1, &surface->rb_multisample);
gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, surface->rb_multisample);
gl_info->fbo_ops.glRenderbufferStorageMultisample(GL_RENDERBUFFER, surface->resource.multisample_type,
surface->resource.format->glInternal, surface->pow2Width, surface->pow2Height);
TRACE("Created multisample rb %u.\n", surface->rb_multisample);
}
else
{
if (surface->rb_resolved)
return;
gl_info->fbo_ops.glGenRenderbuffers(1, &surface->rb_resolved);
gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, surface->rb_resolved);
gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, surface->resource.format->glInternal,
surface->pow2Width, surface->pow2Height);
TRACE("Created resolved rb %u.\n", surface->rb_resolved);
}
}
static void flush_to_framebuffer_drawpixels(struct wined3d_surface *surface, static void flush_to_framebuffer_drawpixels(struct wined3d_surface *surface,
const RECT *rect, GLenum fmt, GLenum type, UINT bpp, const BYTE *mem) const RECT *rect, GLenum fmt, GLenum type, UINT bpp, const BYTE *mem)
{ {
@ -4759,6 +4820,14 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back)
back->texture_name_srgb = front->texture_name_srgb; back->texture_name_srgb = front->texture_name_srgb;
front->texture_name_srgb = tmp; front->texture_name_srgb = tmp;
tmp = back->rb_multisample;
back->rb_multisample = front->rb_multisample;
front->rb_multisample = tmp;
tmp = back->rb_resolved;
back->rb_resolved = front->rb_resolved;
front->rb_resolved = tmp;
resource_unload(&back->resource); resource_unload(&back->resource);
resource_unload(&front->resource); resource_unload(&front->resource);
} }
@ -5848,6 +5917,8 @@ static DWORD resource_access_from_location(DWORD location)
case SFLAG_INDRAWABLE: case SFLAG_INDRAWABLE:
case SFLAG_INSRGBTEX: case SFLAG_INSRGBTEX:
case SFLAG_INTEXTURE: case SFLAG_INTEXTURE:
case SFLAG_INRB_MULTISAMPLE:
case SFLAG_INRB_RESOLVED:
return WINED3D_RESOURCE_ACCESS_GPU; return WINED3D_RESOURCE_ACCESS_GPU;
default: default:
@ -6126,6 +6197,17 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface,
return WINED3D_OK; return WINED3D_OK;
} }
static void surface_multisample_resolve(struct wined3d_surface *surface)
{
RECT rect = {0, 0, surface->resource.width, surface->resource.height};
if (!(surface->flags & SFLAG_INRB_MULTISAMPLE))
ERR("Trying to resolve multisampled surface %p, but location SFLAG_INRB_MULTISAMPLE not current.\n", surface);
surface_blt_fbo(surface->resource.device, WINED3DTEXF_POINT,
surface, SFLAG_INRB_MULTISAMPLE, &rect, surface, SFLAG_INRB_RESOLVED, &rect);
}
HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, const RECT *rect) HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, const RECT *rect)
{ {
struct wined3d_device *device = surface->resource.device; struct wined3d_device *device = surface->resource.device;
@ -6185,6 +6267,10 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, c
return hr; return hr;
break; break;
case SFLAG_INRB_RESOLVED:
surface_multisample_resolve(surface);
break;
case SFLAG_INTEXTURE: case SFLAG_INTEXTURE:
case SFLAG_INSRGBTEX: case SFLAG_INSRGBTEX:
if (FAILED(hr = surface_load_texture(surface, gl_info, rect, location == SFLAG_INSRGBTEX))) if (FAILED(hr = surface_load_texture(surface, gl_info, rect, location == SFLAG_INSRGBTEX)))

View File

@ -301,8 +301,16 @@ static void swapchain_blit(const struct wined3d_swapchain *swapchain,
if (gl_info->fbo_ops.glBlitFramebuffer && is_identity_fixup(backbuffer->resource.format->color_fixup)) if (gl_info->fbo_ops.glBlitFramebuffer && is_identity_fixup(backbuffer->resource.format->color_fixup))
{ {
DWORD location = SFLAG_INTEXTURE;
if (backbuffer->resource.multisample_type)
{
location = SFLAG_INRB_RESOLVED;
surface_load_location(backbuffer, location, NULL);
}
ENTER_GL(); ENTER_GL();
context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL, SFLAG_INTEXTURE); context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL, location);
glReadBuffer(GL_COLOR_ATTACHMENT0); glReadBuffer(GL_COLOR_ATTACHMENT0);
context_check_fbo_status(context, GL_READ_FRAMEBUFFER); context_check_fbo_status(context, GL_READ_FRAMEBUFFER);
@ -824,8 +832,11 @@ void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain)
swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferWidth,
swapchain->presentParms.BackBufferHeight, swapchain->presentParms.BackBufferHeight,
client_rect.right, client_rect.bottom); client_rect.right, client_rect.bottom);
TRACE("Multisample type %#x, quality %#x.\n",
swapchain->presentParms.MultiSampleType,
swapchain->presentParms.MultiSampleQuality);
if (!wined3d_settings.always_offscreen if (!wined3d_settings.always_offscreen && !swapchain->presentParms.MultiSampleType
&& swapchain->presentParms.BackBufferWidth == client_rect.right && swapchain->presentParms.BackBufferWidth == client_rect.right
&& swapchain->presentParms.BackBufferHeight == client_rect.bottom) && swapchain->presentParms.BackBufferHeight == client_rect.bottom)
{ {

View File

@ -2382,10 +2382,12 @@ const char *debug_surflocation(DWORD flag) {
char buf[128]; char buf[128];
buf[0] = 0; buf[0] = 0;
if(flag & SFLAG_INSYSMEM) strcat(buf, " | SFLAG_INSYSMEM"); if (flag & SFLAG_INSYSMEM) strcat(buf, " | SFLAG_INSYSMEM"); /* 17 */
if(flag & SFLAG_INDRAWABLE) strcat(buf, " | SFLAG_INDRAWABLE"); if (flag & SFLAG_INDRAWABLE) strcat(buf, " | SFLAG_INDRAWABLE"); /* 19 */
if(flag & SFLAG_INTEXTURE) strcat(buf, " | SFLAG_INTEXTURE"); if (flag & SFLAG_INTEXTURE) strcat(buf, " | SFLAG_INTEXTURE"); /* 18 */
if(flag & SFLAG_INSRGBTEX) strcat(buf, " | SFLAG_INSRGBTEX"); if (flag & SFLAG_INSRGBTEX) strcat(buf, " | SFLAG_INSRGBTEX"); /* 18 */
if (flag & SFLAG_INRB_MULTISAMPLE) strcat(buf, " | SFLAG_INRB_MULTISAMPLE"); /* 25 */
if (flag & SFLAG_INRB_RESOLVED) strcat(buf, " | SFLAG_INRB_RESOLVED"); /* 22 */
return wine_dbg_sprintf("%s", buf[0] ? buf + 3 : "0"); return wine_dbg_sprintf("%s", buf[0] ? buf + 3 : "0");
} }

View File

@ -1453,6 +1453,7 @@ struct wined3d_gl_limits
UINT blends; UINT blends;
UINT anisotropy; UINT anisotropy;
float shininess; float shininess;
UINT samples;
UINT glsl_varyings; UINT glsl_varyings;
UINT glsl_vs_float_constants; UINT glsl_vs_float_constants;
@ -2012,6 +2013,8 @@ struct wined3d_surface
/* PBO */ /* PBO */
GLuint pbo; GLuint pbo;
GLuint rb_multisample;
GLuint rb_resolved;
GLuint texture_name; GLuint texture_name;
GLuint texture_name_srgb; GLuint texture_name_srgb;
GLint texture_level; GLint texture_level;
@ -2075,6 +2078,8 @@ void surface_load_ds_location(struct wined3d_surface *surface,
HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, const RECT *rect) DECLSPEC_HIDDEN; HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, const RECT *rect) DECLSPEC_HIDDEN;
void surface_modify_ds_location(struct wined3d_surface *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN; void surface_modify_ds_location(struct wined3d_surface *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN;
void surface_modify_location(struct wined3d_surface *surface, DWORD location, BOOL persistent) DECLSPEC_HIDDEN; void surface_modify_location(struct wined3d_surface *surface, DWORD location, BOOL persistent) DECLSPEC_HIDDEN;
void surface_prepare_rb(struct wined3d_surface *surface,
const struct wined3d_gl_info *gl_info, BOOL multisample) DECLSPEC_HIDDEN;
void surface_prepare_texture(struct wined3d_surface *surface, void surface_prepare_texture(struct wined3d_surface *surface,
struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN; struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
void surface_set_compatible_renderbuffer(struct wined3d_surface *surface, void surface_set_compatible_renderbuffer(struct wined3d_surface *surface,
@ -2098,29 +2103,31 @@ void draw_textured_quad(const struct wined3d_surface *src_surface, const RECT *s
void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) DECLSPEC_HIDDEN; void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) DECLSPEC_HIDDEN;
/* Surface flags: */ /* Surface flags: */
#define SFLAG_CONVERTED 0x00000002 /* Converted for color keying or Palettized */ #define SFLAG_CONVERTED 0x00000001 /* Converted for color keying or palettized. */
#define SFLAG_DIBSECTION 0x00000004 /* Has a DIB section attached for GetDC */ #define SFLAG_DISCARD 0x00000002 /* ??? */
#define SFLAG_LOCKABLE 0x00000008 /* Surface can be locked */ #define SFLAG_NONPOW2 0x00000004 /* Surface sizes are not a power of 2 */
#define SFLAG_DISCARD 0x00000010 /* ??? */ #define SFLAG_NORMCOORD 0x00000008 /* Set if GL texture coordinates are normalized (non-texture rectangle). */
#define SFLAG_LOCKED 0x00000020 /* Surface is locked atm */ #define SFLAG_LOCKABLE 0x00000010 /* Surface can be locked. */
#define SFLAG_INTEXTURE 0x00000040 /* The GL texture contains the newest surface content */ #define SFLAG_DYNLOCK 0x00000020 /* Surface is often locked by the application. */
#define SFLAG_INSRGBTEX 0x00000080 /* The GL srgb texture contains the newest surface content */ #define SFLAG_LOCKED 0x00000040 /* Surface is currently locked. */
#define SFLAG_INDRAWABLE 0x00000100 /* The gl drawable contains the most up to date data */ #define SFLAG_DCINUSE 0x00000080 /* Set between GetDC and ReleaseDC calls. */
#define SFLAG_INSYSMEM 0x00000200 /* The system memory copy is most up to date */ #define SFLAG_LOST 0x00000100 /* Surface lost flag for ddraw. */
#define SFLAG_NONPOW2 0x00000400 /* Surface sizes are not a power of 2 */ #define SFLAG_GLCKEY 0x00000200 /* The GL texture was created with a color key. */
#define SFLAG_DYNLOCK 0x00000800 /* Surface is often locked by the app */ #define SFLAG_CLIENT 0x00000400 /* GL_APPLE_client_storage is used with this surface. */
#define SFLAG_DCINUSE 0x00001000 /* Set between GetDC and ReleaseDC calls */ #define SFLAG_INOVERLAYDRAW 0x00000800 /* Overlay drawing is in progress. Recursion prevention. */
#define SFLAG_LOST 0x00002000 /* Surface lost flag for DDraw */ #define SFLAG_DIBSECTION 0x00001000 /* Has a DIB section attached for GetDC. */
#define SFLAG_USERPTR 0x00004000 /* The application allocated the memory for this surface */ #define SFLAG_USERPTR 0x00002000 /* The application allocated the memory for this surface. */
#define SFLAG_GLCKEY 0x00008000 /* The gl texture was created with a color key */ #define SFLAG_ALLOCATED 0x00004000 /* A GL texture is allocated for this surface. */
#define SFLAG_CLIENT 0x00010000 /* GL_APPLE_client_storage is used on that texture */ #define SFLAG_SRGBALLOCATED 0x00008000 /* A sRGB GL texture is allocated for this surface. */
#define SFLAG_ALLOCATED 0x00020000 /* A gl texture is allocated for this surface */ #define SFLAG_PBO 0x00010000 /* The surface has a PBO. */
#define SFLAG_SRGBALLOCATED 0x00040000 /* A srgb gl texture is allocated for this surface */ #define SFLAG_INSYSMEM 0x00020000 /* The system memory copy is current. */
#define SFLAG_PBO 0x00080000 /* Has a PBO attached for speeding up data transfers for dynamically locked surfaces */ #define SFLAG_INTEXTURE 0x00040000 /* The GL texture is current. */
#define SFLAG_NORMCOORD 0x00100000 /* Set if the GL texture coords are normalized(non-texture rectangle) */ #define SFLAG_INSRGBTEX 0x00080000 /* The GL sRGB texture is current. */
#define SFLAG_DS_ONSCREEN 0x00200000 /* Is a depth stencil, last modified onscreen */ #define SFLAG_INDRAWABLE 0x00100000 /* The GL drawable is current. */
#define SFLAG_DS_OFFSCREEN 0x00400000 /* Is a depth stencil, last modified offscreen */ #define SFLAG_INRB_MULTISAMPLE 0x00200000 /* The multisample renderbuffer is current. */
#define SFLAG_INOVERLAYDRAW 0x00800000 /* Overlay drawing is in progress. Recursion prevention */ #define SFLAG_INRB_RESOLVED 0x00400000 /* The resolved renderbuffer is current. */
#define SFLAG_DS_ONSCREEN 0x00800000 /* This is a depth / stencil surface, last modified onscreen. */
#define SFLAG_DS_OFFSCREEN 0x01000000 /* This is a depth / stencil surface, last modified offscreen. */
/* In some conditions the surface memory must not be freed: /* In some conditions the surface memory must not be freed:
* SFLAG_CONVERTED: Converting the data back would take too long * SFLAG_CONVERTED: Converting the data back would take too long
@ -2130,18 +2137,20 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) D
* SFLAG_PBO: PBOs don't use 'normal' memory. It is either allocated by the driver or must be NULL. * SFLAG_PBO: PBOs don't use 'normal' memory. It is either allocated by the driver or must be NULL.
* SFLAG_CLIENT: OpenGL uses our memory as backup * SFLAG_CLIENT: OpenGL uses our memory as backup
*/ */
#define SFLAG_DONOTFREE (SFLAG_CONVERTED | \ #define SFLAG_DONOTFREE (SFLAG_CONVERTED | \
SFLAG_DIBSECTION | \ SFLAG_DYNLOCK | \
SFLAG_LOCKED | \ SFLAG_LOCKED | \
SFLAG_DYNLOCK | \ SFLAG_CLIENT | \
SFLAG_USERPTR | \ SFLAG_DIBSECTION | \
SFLAG_PBO | \ SFLAG_USERPTR | \
SFLAG_CLIENT) SFLAG_PBO)
#define SFLAG_LOCATIONS (SFLAG_INSYSMEM | \ #define SFLAG_LOCATIONS (SFLAG_INSYSMEM | \
SFLAG_INTEXTURE | \ SFLAG_INTEXTURE | \
SFLAG_INDRAWABLE | \ SFLAG_INSRGBTEX | \
SFLAG_INSRGBTEX) SFLAG_INDRAWABLE | \
SFLAG_INRB_MULTISAMPLE | \
SFLAG_INRB_RESOLVED)
#define SFLAG_DS_LOCATIONS (SFLAG_DS_ONSCREEN | \ #define SFLAG_DS_LOCATIONS (SFLAG_DS_ONSCREEN | \
SFLAG_DS_OFFSCREEN) SFLAG_DS_OFFSCREEN)