Commit 94c0da18 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Create a PBO in surface_load_location() even if SFLAG_INSYSMEM is already set.

In the longer term, sysmem and pbo should be separate resource locations.
parent 39ebb992
...@@ -534,49 +534,51 @@ static BOOL surface_need_pbo(const struct wined3d_surface *surface, const struct ...@@ -534,49 +534,51 @@ static BOOL surface_need_pbo(const struct wined3d_surface *surface, const struct
return TRUE; 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; struct wined3d_context *context;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; 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)) GL_EXTCALL(glGenBuffersARB(1, &surface->pbo));
{ error = glGetError();
struct wined3d_context *context; if (!surface->pbo || error != GL_NO_ERROR)
GLenum error; ERR("Failed to create a PBO with error %s (%#x).\n", debug_glerror(error), error);
context = context_acquire(device, NULL); TRACE("Binding PBO %u.\n", surface->pbo);
ENTER_GL();
GL_EXTCALL(glGenBuffersARB(1, &surface->pbo)); GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->pbo));
error = glGetError(); checkGLcall("glBindBufferARB");
if (!surface->pbo || error != GL_NO_ERROR)
ERR("Failed to create a PBO with error %s (%#x).\n", debug_glerror(error), error);
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)); GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
checkGLcall("glBindBufferARB"); checkGLcall("glBindBufferARB");
GL_EXTCALL(glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, surface->resource.size + 4, /* We don't need the system memory anymore and we can't even use it for PBOs. */
surface->resource.allocatedMemory, GL_STREAM_DRAW_ARB)); if (!(surface->flags & SFLAG_CLIENT))
checkGLcall("glBufferDataARB"); {
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)); static void surface_prepare_system_memory(struct wined3d_surface *surface)
checkGLcall("glBindBufferARB"); {
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. */ TRACE("surface %p.\n", surface);
if (!(surface->flags & SFLAG_CLIENT))
{ if (!(surface->flags & SFLAG_PBO) && surface_need_pbo(surface, gl_info))
HeapFree(GetProcessHeap(), 0, surface->resource.heapMemory); surface_load_pbo(surface, gl_info);
surface->resource.heapMemory = NULL;
}
surface->resource.allocatedMemory = NULL;
surface->flags |= SFLAG_PBO;
LEAVE_GL();
context_release(context);
}
else if (!(surface->resource.allocatedMemory || surface->flags & SFLAG_PBO)) else if (!(surface->resource.allocatedMemory || surface->flags & SFLAG_PBO))
{ {
/* Whatever surface we have, make sure that there is memory allocated /* 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 ...@@ -6136,6 +6138,11 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, c
if (surface->flags & location) if (surface->flags & location)
{ {
TRACE("Location already up to date.\n"); 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; return WINED3D_OK;
} }
......
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