[PATCH 09/10] wined3d: Add multisampling support.
Henri Verbeet
hverbeet at codeweavers.com
Thu Aug 25 14:05:03 CDT 2011
---
dlls/wined3d/context.c | 34 +++++++++++++-
dlls/wined3d/device.c | 26 +++++++++--
dlls/wined3d/directx.c | 36 +++++++++++++--
dlls/wined3d/surface.c | 92 ++++++++++++++++++++++++++++++++++++++-
dlls/wined3d/swapchain.c | 15 ++++++-
dlls/wined3d/utils.c | 10 +++--
dlls/wined3d/wined3d_private.h | 79 +++++++++++++++++++---------------
7 files changed, 235 insertions(+), 57 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index b1c2f50..af11618 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -169,6 +169,18 @@ static void context_attach_depth_stencil_fbo(struct wined3d_context *context,
}
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:
ERR("Unsupported location %s (%#x).\n", debug_surflocation(location), location);
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,
surface->texture_target, surface_get_texture_name(surface, gl_info, srgb),
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;
default:
ERR("Unsupported location %s (%#x).\n", debug_surflocation(location), location);
break;
}
- checkGLcall("glFramebufferTexture2D()");
}
else
{
@@ -2049,7 +2075,8 @@ BOOL context_apply_clear_state(struct wined3d_context *context, struct wined3d_d
context->blit_targets[i] = NULL;
++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);
checkGLcall("glReadBuffer");
}
@@ -2163,7 +2190,8 @@ void context_state_fb(struct wined3d_context *context, const struct wined3d_stat
}
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);
checkGLcall("glReadBuffer");
}
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 1c57840..ab9f657 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5452,6 +5452,9 @@ static HRESULT updateSurfaceDesc(struct wined3d_surface *surface,
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);
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_swapchain *swapchain;
BOOL DisplayModeChanged = FALSE;
+ BOOL update_desc = FALSE;
WINED3DDISPLAYMODE mode;
unsigned int i;
HRESULT hr;
@@ -5771,15 +5775,27 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
&& (present_parameters->BackBufferWidth != swapchain->presentParms.BackBufferWidth
|| present_parameters->BackBufferHeight != swapchain->presentParms.BackBufferHeight))
{
- UINT i;
-
if (!present_parameters->Windowed)
DisplayModeChanged = TRUE;
swapchain->presentParms.BackBufferWidth = present_parameters->BackBufferWidth;
swapchain->presentParms.BackBufferHeight = present_parameters->BackBufferHeight;
+ update_desc = TRUE;
+ }
+
+ 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, present_parameters);
+ hr = updateSurfaceDesc(swapchain->front_buffer, &swapchain->presentParms);
if (FAILED(hr))
{
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)
{
- hr = updateSurfaceDesc(swapchain->back_buffers[i], present_parameters);
+ hr = updateSurfaceDesc(swapchain->back_buffers[i], &swapchain->presentParms);
if (FAILED(hr))
{
wined3d_swapchain_decref(swapchain);
@@ -5797,7 +5813,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
}
if (device->auto_depth_stencil)
{
- hr = updateSurfaceDesc(device->auto_depth_stencil, present_parameters);
+ hr = updateSurfaceDesc(device->auto_depth_stencil, &swapchain->presentParms);
if (FAILED(hr))
{
wined3d_swapchain_decref(swapchain);
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 5887000..506b875 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -4,7 +4,7 @@
* Copyright 2004 Christian Costa
* Copyright 2005 Oliver Stieber
* 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
* 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.glBlitFramebuffer = gl_info->glBlitFramebuffer;
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
{
@@ -2666,6 +2671,11 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
if (gl_info->supported[EXT_FRAMEBUFFER_MULTISAMPLE])
{
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,
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"
"windowed %#x, multisample_type %#x, quality_levels %p.\n",
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)
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;
- return WINED3D_OK;
+ TRACE("Returning not supported.\n");
+ 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 */
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index ec3cf20..821ef9d 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -44,7 +44,9 @@ static void surface_cleanup(struct wined3d_surface *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;
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));
}
+ 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)
{
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)
surface->draw_binding = SFLAG_INDRAWABLE;
+ else if (surface->resource.multisample_type)
+ surface->draw_binding = SFLAG_INRB_MULTISAMPLE;
else
surface->draw_binding = SFLAG_INTEXTURE;
}
@@ -1207,6 +1223,13 @@ static void surface_blt_fbo(struct wined3d_device *device, const WINED3DTEXTUREF
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
* 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
@@ -1881,18 +1904,30 @@ static void surface_unload(struct wined3d_resource *resource)
list_init(&surface->renderbuffers);
surface->current_renderbuffer = NULL;
+ ENTER_GL();
+
/* If we're in a texture, the texture name belongs to the texture.
* Otherwise, destroy it. */
if (surface->container.type != WINED3D_CONTAINER_TEXTURE)
{
- ENTER_GL();
glDeleteTextures(1, &surface->texture_name);
surface->texture_name = 0;
glDeleteTextures(1, &surface->texture_name_srgb);
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);
resource_unload(resource);
@@ -4250,6 +4285,32 @@ void surface_prepare_texture(struct wined3d_surface *surface, struct wined3d_con
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,
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;
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(&front->resource);
}
@@ -5848,6 +5917,8 @@ static DWORD resource_access_from_location(DWORD location)
case SFLAG_INDRAWABLE:
case SFLAG_INSRGBTEX:
case SFLAG_INTEXTURE:
+ case SFLAG_INRB_MULTISAMPLE:
+ case SFLAG_INRB_RESOLVED:
return WINED3D_RESOURCE_ACCESS_GPU;
default:
@@ -6126,6 +6197,17 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface,
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)
{
struct wined3d_device *device = surface->resource.device;
@@ -6185,6 +6267,10 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, c
return hr;
break;
+ case SFLAG_INRB_RESOLVED:
+ surface_multisample_resolve(surface);
+ break;
+
case SFLAG_INTEXTURE:
case SFLAG_INSRGBTEX:
if (FAILED(hr = surface_load_texture(surface, gl_info, rect, location == SFLAG_INSRGBTEX)))
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 704d3cc..fd2e236 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -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))
{
+ DWORD location = SFLAG_INTEXTURE;
+
+ if (backbuffer->resource.multisample_type)
+ {
+ location = SFLAG_INRB_RESOLVED;
+ surface_load_location(backbuffer, location, NULL);
+ }
+
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);
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.BackBufferHeight,
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.BackBufferHeight == client_rect.bottom)
{
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 523f60f..2ef27d0 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -2382,10 +2382,12 @@ const char *debug_surflocation(DWORD flag) {
char buf[128];
buf[0] = 0;
- if(flag & SFLAG_INSYSMEM) strcat(buf, " | SFLAG_INSYSMEM");
- if(flag & SFLAG_INDRAWABLE) strcat(buf, " | SFLAG_INDRAWABLE");
- if(flag & SFLAG_INTEXTURE) strcat(buf, " | SFLAG_INTEXTURE");
- if(flag & SFLAG_INSRGBTEX) strcat(buf, " | SFLAG_INSRGBTEX");
+ if (flag & SFLAG_INSYSMEM) strcat(buf, " | SFLAG_INSYSMEM"); /* 17 */
+ if (flag & SFLAG_INDRAWABLE) strcat(buf, " | SFLAG_INDRAWABLE"); /* 19 */
+ if (flag & SFLAG_INTEXTURE) strcat(buf, " | SFLAG_INTEXTURE"); /* 18 */
+ 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");
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f2e5657..19ee56c 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1453,6 +1453,7 @@ struct wined3d_gl_limits
UINT blends;
UINT anisotropy;
float shininess;
+ UINT samples;
UINT glsl_varyings;
UINT glsl_vs_float_constants;
@@ -2012,6 +2013,8 @@ struct wined3d_surface
/* PBO */
GLuint pbo;
+ GLuint rb_multisample;
+ GLuint rb_resolved;
GLuint texture_name;
GLuint texture_name_srgb;
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;
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_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,
struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
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;
/* Surface flags: */
-#define SFLAG_CONVERTED 0x00000002 /* Converted for color keying or Palettized */
-#define SFLAG_DIBSECTION 0x00000004 /* Has a DIB section attached for GetDC */
-#define SFLAG_LOCKABLE 0x00000008 /* Surface can be locked */
-#define SFLAG_DISCARD 0x00000010 /* ??? */
-#define SFLAG_LOCKED 0x00000020 /* Surface is locked atm */
-#define SFLAG_INTEXTURE 0x00000040 /* The GL texture contains the newest surface content */
-#define SFLAG_INSRGBTEX 0x00000080 /* The GL srgb texture contains the newest surface content */
-#define SFLAG_INDRAWABLE 0x00000100 /* The gl drawable contains the most up to date data */
-#define SFLAG_INSYSMEM 0x00000200 /* The system memory copy is most up to date */
-#define SFLAG_NONPOW2 0x00000400 /* Surface sizes are not a power of 2 */
-#define SFLAG_DYNLOCK 0x00000800 /* Surface is often locked by the app */
-#define SFLAG_DCINUSE 0x00001000 /* Set between GetDC and ReleaseDC calls */
-#define SFLAG_LOST 0x00002000 /* Surface lost flag for DDraw */
-#define SFLAG_USERPTR 0x00004000 /* The application allocated the memory for this surface */
-#define SFLAG_GLCKEY 0x00008000 /* The gl texture was created with a color key */
-#define SFLAG_CLIENT 0x00010000 /* GL_APPLE_client_storage is used on that texture */
-#define SFLAG_ALLOCATED 0x00020000 /* A gl texture is allocated for this surface */
-#define SFLAG_SRGBALLOCATED 0x00040000 /* A srgb gl texture is allocated for this surface */
-#define SFLAG_PBO 0x00080000 /* Has a PBO attached for speeding up data transfers for dynamically locked surfaces */
-#define SFLAG_NORMCOORD 0x00100000 /* Set if the GL texture coords are normalized(non-texture rectangle) */
-#define SFLAG_DS_ONSCREEN 0x00200000 /* Is a depth stencil, last modified onscreen */
-#define SFLAG_DS_OFFSCREEN 0x00400000 /* Is a depth stencil, last modified offscreen */
-#define SFLAG_INOVERLAYDRAW 0x00800000 /* Overlay drawing is in progress. Recursion prevention */
+#define SFLAG_CONVERTED 0x00000001 /* Converted for color keying or palettized. */
+#define SFLAG_DISCARD 0x00000002 /* ??? */
+#define SFLAG_NONPOW2 0x00000004 /* Surface sizes are not a power of 2 */
+#define SFLAG_NORMCOORD 0x00000008 /* Set if GL texture coordinates are normalized (non-texture rectangle). */
+#define SFLAG_LOCKABLE 0x00000010 /* Surface can be locked. */
+#define SFLAG_DYNLOCK 0x00000020 /* Surface is often locked by the application. */
+#define SFLAG_LOCKED 0x00000040 /* Surface is currently locked. */
+#define SFLAG_DCINUSE 0x00000080 /* Set between GetDC and ReleaseDC calls. */
+#define SFLAG_LOST 0x00000100 /* Surface lost flag for ddraw. */
+#define SFLAG_GLCKEY 0x00000200 /* The GL texture was created with a color key. */
+#define SFLAG_CLIENT 0x00000400 /* GL_APPLE_client_storage is used with this surface. */
+#define SFLAG_INOVERLAYDRAW 0x00000800 /* Overlay drawing is in progress. Recursion prevention. */
+#define SFLAG_DIBSECTION 0x00001000 /* Has a DIB section attached for GetDC. */
+#define SFLAG_USERPTR 0x00002000 /* The application allocated the memory for this surface. */
+#define SFLAG_ALLOCATED 0x00004000 /* A GL texture is allocated for this surface. */
+#define SFLAG_SRGBALLOCATED 0x00008000 /* A sRGB GL texture is allocated for this surface. */
+#define SFLAG_PBO 0x00010000 /* The surface has a PBO. */
+#define SFLAG_INSYSMEM 0x00020000 /* The system memory copy is current. */
+#define SFLAG_INTEXTURE 0x00040000 /* The GL texture is current. */
+#define SFLAG_INSRGBTEX 0x00080000 /* The GL sRGB texture is current. */
+#define SFLAG_INDRAWABLE 0x00100000 /* The GL drawable is current. */
+#define SFLAG_INRB_MULTISAMPLE 0x00200000 /* The multisample renderbuffer is current. */
+#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:
* 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_CLIENT: OpenGL uses our memory as backup
*/
-#define SFLAG_DONOTFREE (SFLAG_CONVERTED | \
- SFLAG_DIBSECTION | \
- SFLAG_LOCKED | \
- SFLAG_DYNLOCK | \
- SFLAG_USERPTR | \
- SFLAG_PBO | \
- SFLAG_CLIENT)
-
-#define SFLAG_LOCATIONS (SFLAG_INSYSMEM | \
- SFLAG_INTEXTURE | \
- SFLAG_INDRAWABLE | \
- SFLAG_INSRGBTEX)
+#define SFLAG_DONOTFREE (SFLAG_CONVERTED | \
+ SFLAG_DYNLOCK | \
+ SFLAG_LOCKED | \
+ SFLAG_CLIENT | \
+ SFLAG_DIBSECTION | \
+ SFLAG_USERPTR | \
+ SFLAG_PBO)
+
+#define SFLAG_LOCATIONS (SFLAG_INSYSMEM | \
+ SFLAG_INTEXTURE | \
+ SFLAG_INSRGBTEX | \
+ SFLAG_INDRAWABLE | \
+ SFLAG_INRB_MULTISAMPLE | \
+ SFLAG_INRB_RESOLVED)
#define SFLAG_DS_LOCATIONS (SFLAG_DS_ONSCREEN | \
SFLAG_DS_OFFSCREEN)
--
1.7.3.4
More information about the wine-patches
mailing list