[PATCH 3/5] wined3d: Create a PBO in surface_load_location() even if SFLAG_INSYSMEM is already set.
Henri Verbeet
hverbeet at codeweavers.com
Thu Dec 1 00:31:41 CST 2011
In the longer term, sysmem and pbo should be separate resource locations.
---
dlls/wined3d/surface.c | 73 ++++++++++++++++++++++++++---------------------
1 files changed, 40 insertions(+), 33 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 373b443..d5b73e3 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -534,49 +534,51 @@ static BOOL surface_need_pbo(const struct wined3d_surface *surface, const struct
return TRUE;
}
-static void surface_prepare_system_memory(struct wined3d_surface *surface)
+static void surface_load_pbo(struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info)
{
- struct wined3d_device *device = surface->resource.device;
- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ struct wined3d_context *context;
+ GLenum error;
- TRACE("surface %p.\n", surface);
+ context = context_acquire(surface->resource.device, NULL);
+ ENTER_GL();
- if (!(surface->flags & SFLAG_PBO) && surface_need_pbo(surface, gl_info))
- {
- struct wined3d_context *context;
- GLenum error;
+ GL_EXTCALL(glGenBuffersARB(1, &surface->pbo));
+ error = glGetError();
+ if (!surface->pbo || error != GL_NO_ERROR)
+ ERR("Failed to create a PBO with error %s (%#x).\n", debug_glerror(error), error);
- context = context_acquire(device, NULL);
- ENTER_GL();
+ TRACE("Binding PBO %u.\n", surface->pbo);
- GL_EXTCALL(glGenBuffersARB(1, &surface->pbo));
- error = glGetError();
- if (!surface->pbo || error != GL_NO_ERROR)
- ERR("Failed to create a PBO with error %s (%#x).\n", debug_glerror(error), error);
+ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo));
+ checkGLcall("glBindBufferARB");
- TRACE("Binding PBO %u.\n", surface->pbo);
+ GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.size + 4,
+ surface->resource.allocatedMemory, GL_STREAM_DRAW_ARB));
+ checkGLcall("glBufferDataARB");
- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo));
- checkGLcall("glBindBufferARB");
+ GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
+ checkGLcall("glBindBufferARB");
- GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.size + 4,
- surface->resource.allocatedMemory, GL_STREAM_DRAW_ARB));
- checkGLcall("glBufferDataARB");
+ /* We don't need the system memory anymore and we can't even use it for PBOs. */
+ if (!(surface->flags & SFLAG_CLIENT))
+ {
+ HeapFree(GetProcessHeap(), 0, surface->resource.heapMemory);
+ surface->resource.heapMemory = NULL;
+ }
+ surface->resource.allocatedMemory = NULL;
+ surface->flags |= SFLAG_PBO;
+ LEAVE_GL();
+ context_release(context);
+}
- GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
- checkGLcall("glBindBufferARB");
+static void surface_prepare_system_memory(struct wined3d_surface *surface)
+{
+ const struct wined3d_gl_info *gl_info = &surface->resource.device->adapter->gl_info;
- /* We don't need the system memory anymore and we can't even use it for PBOs. */
- if (!(surface->flags & SFLAG_CLIENT))
- {
- HeapFree(GetProcessHeap(), 0, surface->resource.heapMemory);
- surface->resource.heapMemory = NULL;
- }
- surface->resource.allocatedMemory = NULL;
- surface->flags |= SFLAG_PBO;
- LEAVE_GL();
- context_release(context);
- }
+ TRACE("surface %p.\n", surface);
+
+ if (!(surface->flags & SFLAG_PBO) && surface_need_pbo(surface, gl_info))
+ surface_load_pbo(surface, gl_info);
else if (!(surface->resource.allocatedMemory || surface->flags & SFLAG_PBO))
{
/* Whatever surface we have, make sure that there is memory allocated
@@ -6136,6 +6138,11 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, c
if (surface->flags & location)
{
TRACE("Location already up to date.\n");
+
+ if (location == SFLAG_INSYSMEM && !(surface->flags & SFLAG_PBO)
+ && surface_need_pbo(surface, gl_info))
+ surface_load_pbo(surface, gl_info);
+
return WINED3D_OK;
}
--
1.7.3.4
More information about the wine-patches
mailing list