Commit 77fe33f5 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Introduce a structure for OpenGL buffer objects.

Analogous to the wined3d_bo_vk structure for Vulkan. Signed-off-by: 's avatarHenri Verbeet <hverbeet@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent fd8e83ea
...@@ -4825,7 +4825,7 @@ struct wined3d_view_gl_destroy_ctx ...@@ -4825,7 +4825,7 @@ struct wined3d_view_gl_destroy_ctx
{ {
struct wined3d_device *device; struct wined3d_device *device;
const struct wined3d_gl_view *gl_view; const struct wined3d_gl_view *gl_view;
GLuint *counter_bo; struct wined3d_bo_gl *counter_bo;
void *object; void *object;
struct wined3d_view_gl_destroy_ctx *free; struct wined3d_view_gl_destroy_ctx *free;
}; };
...@@ -4836,10 +4836,12 @@ static void wined3d_view_gl_destroy_object(void *object) ...@@ -4836,10 +4836,12 @@ static void wined3d_view_gl_destroy_object(void *object)
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
struct wined3d_context *context; struct wined3d_context *context;
struct wined3d_device *device; struct wined3d_device *device;
GLuint counter_id;
device = ctx->device; device = ctx->device;
if (ctx->gl_view->name || ctx->counter_bo) counter_id = ctx->counter_bo ? ctx->counter_bo->id : 0;
if (ctx->gl_view->name || counter_id)
{ {
context = context_acquire(device, NULL, 0); context = context_acquire(device, NULL, 0);
gl_info = wined3d_context_gl(context)->gl_info; gl_info = wined3d_context_gl(context)->gl_info;
...@@ -4848,8 +4850,8 @@ static void wined3d_view_gl_destroy_object(void *object) ...@@ -4848,8 +4850,8 @@ static void wined3d_view_gl_destroy_object(void *object)
context_gl_resource_released(device, ctx->gl_view->name, FALSE); context_gl_resource_released(device, ctx->gl_view->name, FALSE);
gl_info->gl_ops.gl.p_glDeleteTextures(1, &ctx->gl_view->name); gl_info->gl_ops.gl.p_glDeleteTextures(1, &ctx->gl_view->name);
} }
if (ctx->counter_bo) if (counter_id)
GL_EXTCALL(glDeleteBuffers(1, ctx->counter_bo)); GL_EXTCALL(glDeleteBuffers(1, &counter_id));
checkGLcall("delete resources"); checkGLcall("delete resources");
context_release(context); context_release(context);
} }
...@@ -4859,7 +4861,7 @@ static void wined3d_view_gl_destroy_object(void *object) ...@@ -4859,7 +4861,7 @@ static void wined3d_view_gl_destroy_object(void *object)
} }
static void wined3d_view_gl_destroy(struct wined3d_device *device, static void wined3d_view_gl_destroy(struct wined3d_device *device,
const struct wined3d_gl_view *gl_view, GLuint *counter_bo, void *object) const struct wined3d_gl_view *gl_view, struct wined3d_bo_gl *counter_bo, void *object)
{ {
struct wined3d_view_gl_destroy_ctx *ctx, c; struct wined3d_view_gl_destroy_ctx *ctx, c;
......
...@@ -135,7 +135,7 @@ void wined3d_buffer_invalidate_location(struct wined3d_buffer *buffer, DWORD loc ...@@ -135,7 +135,7 @@ void wined3d_buffer_invalidate_location(struct wined3d_buffer *buffer, DWORD loc
/* Context activation is done by the caller. */ /* Context activation is done by the caller. */
static void wined3d_buffer_gl_bind(struct wined3d_buffer_gl *buffer_gl, struct wined3d_context_gl *context_gl) static void wined3d_buffer_gl_bind(struct wined3d_buffer_gl *buffer_gl, struct wined3d_context_gl *context_gl)
{ {
wined3d_context_gl_bind_bo(context_gl, buffer_gl->buffer_type_hint, buffer_gl->b.buffer_object); wined3d_context_gl_bind_bo(context_gl, buffer_gl->buffer_type_hint, buffer_gl->bo.id);
} }
/* Context activation is done by the caller. */ /* Context activation is done by the caller. */
...@@ -146,7 +146,6 @@ static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *bu ...@@ -146,7 +146,6 @@ static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *bu
struct wined3d_resource *resource = &buffer_gl->b.resource; struct wined3d_resource *resource = &buffer_gl->b.resource;
struct wined3d_buffer *buffer = &buffer_gl->b; struct wined3d_buffer *buffer = &buffer_gl->b;
struct wined3d_cs *cs = resource->device->cs; struct wined3d_cs *cs = resource->device->cs;
GLuint bo;
if (!buffer_gl->b.buffer_object) if (!buffer_gl->b.buffer_object)
return; return;
...@@ -186,10 +185,10 @@ static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *bu ...@@ -186,10 +185,10 @@ static void wined3d_buffer_gl_destroy_buffer_object(struct wined3d_buffer_gl *bu
} }
} }
bo = buffer_gl->b.buffer_object; GL_EXTCALL(glDeleteBuffers(1, &buffer_gl->bo.id));
GL_EXTCALL(glDeleteBuffers(1, &bo));
checkGLcall("glDeleteBuffers"); checkGLcall("glDeleteBuffers");
buffer_gl->b.buffer_object = 0; buffer_gl->b.buffer_object = 0;
buffer_gl->bo.id = 0;
if (buffer_gl->b.fence) if (buffer_gl->b.fence)
{ {
...@@ -205,8 +204,8 @@ static BOOL wined3d_buffer_gl_create_buffer_object(struct wined3d_buffer_gl *buf ...@@ -205,8 +204,8 @@ static BOOL wined3d_buffer_gl_create_buffer_object(struct wined3d_buffer_gl *buf
{ {
const struct wined3d_gl_info *gl_info = context_gl->gl_info; const struct wined3d_gl_info *gl_info = context_gl->gl_info;
GLenum gl_usage = GL_STATIC_DRAW; GLenum gl_usage = GL_STATIC_DRAW;
struct wined3d_bo_gl *bo;
GLenum error; GLenum error;
GLuint bo;
TRACE("Creating an OpenGL buffer object for wined3d buffer %p with usage %s.\n", TRACE("Creating an OpenGL buffer object for wined3d buffer %p with usage %s.\n",
buffer_gl, debug_d3dusage(buffer_gl->b.resource.usage)); buffer_gl, debug_d3dusage(buffer_gl->b.resource.usage));
...@@ -224,10 +223,11 @@ static BOOL wined3d_buffer_gl_create_buffer_object(struct wined3d_buffer_gl *buf ...@@ -224,10 +223,11 @@ static BOOL wined3d_buffer_gl_create_buffer_object(struct wined3d_buffer_gl *buf
* to be verified to check if the rhw and color values are in the correct * to be verified to check if the rhw and color values are in the correct
* format. */ * format. */
GL_EXTCALL(glGenBuffers(1, &bo)); bo = &buffer_gl->bo;
buffer_gl->b.buffer_object = bo; GL_EXTCALL(glGenBuffers(1, &bo->id));
buffer_gl->b.buffer_object = (uintptr_t)bo;
error = gl_info->gl_ops.gl.p_glGetError(); error = gl_info->gl_ops.gl.p_glGetError();
if (!buffer_gl->b.buffer_object || error != GL_NO_ERROR) if (!bo->id || error != GL_NO_ERROR)
{ {
ERR("Failed to create a BO with error %s (%#x).\n", debug_glerror(error), error); ERR("Failed to create a BO with error %s (%#x).\n", debug_glerror(error), error);
goto fail; goto fail;
......
...@@ -2528,13 +2528,14 @@ void *wined3d_context_gl_map_bo_address(struct wined3d_context_gl *context_gl, ...@@ -2528,13 +2528,14 @@ void *wined3d_context_gl_map_bo_address(struct wined3d_context_gl *context_gl,
const struct wined3d_bo_address *data, size_t size, GLenum binding, DWORD flags) const struct wined3d_bo_address *data, size_t size, GLenum binding, DWORD flags)
{ {
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
struct wined3d_bo_gl *bo;
BYTE *memory; BYTE *memory;
if (!data->buffer_object) if (!(bo = (struct wined3d_bo_gl *)data->buffer_object))
return data->addr; return data->addr;
gl_info = context_gl->gl_info; gl_info = context_gl->gl_info;
wined3d_context_gl_bind_bo(context_gl, binding, data->buffer_object); wined3d_context_gl_bind_bo(context_gl, binding, bo->id);
if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
{ {
...@@ -2557,13 +2558,14 @@ void wined3d_context_gl_unmap_bo_address(struct wined3d_context_gl *context_gl, ...@@ -2557,13 +2558,14 @@ void wined3d_context_gl_unmap_bo_address(struct wined3d_context_gl *context_gl,
GLenum binding, unsigned int range_count, const struct wined3d_range *ranges) GLenum binding, unsigned int range_count, const struct wined3d_range *ranges)
{ {
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
struct wined3d_bo_gl *bo;
unsigned int i; unsigned int i;
if (!data->buffer_object) if (!(bo = (struct wined3d_bo_gl *)data->buffer_object))
return; return;
gl_info = context_gl->gl_info; gl_info = context_gl->gl_info;
wined3d_context_gl_bind_bo(context_gl, binding, data->buffer_object); wined3d_context_gl_bind_bo(context_gl, binding, bo->id);
if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
{ {
...@@ -2583,17 +2585,20 @@ void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl, ...@@ -2583,17 +2585,20 @@ void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl,
const struct wined3d_bo_address *src, GLenum src_binding, size_t size) const struct wined3d_bo_address *src, GLenum src_binding, size_t size)
{ {
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
struct wined3d_bo_gl *src_bo, *dst_bo;
struct wined3d_range range; struct wined3d_range range;
BYTE *dst_ptr, *src_ptr; BYTE *dst_ptr, *src_ptr;
gl_info = context_gl->gl_info; gl_info = context_gl->gl_info;
src_bo = (struct wined3d_bo_gl *)src->buffer_object;
dst_bo = (struct wined3d_bo_gl *)dst->buffer_object;
if (dst->buffer_object && src->buffer_object) if (dst_bo && src_bo)
{ {
if (gl_info->supported[ARB_COPY_BUFFER]) if (gl_info->supported[ARB_COPY_BUFFER])
{ {
GL_EXTCALL(glBindBuffer(GL_COPY_READ_BUFFER, src->buffer_object)); GL_EXTCALL(glBindBuffer(GL_COPY_READ_BUFFER, src_bo->id));
GL_EXTCALL(glBindBuffer(GL_COPY_WRITE_BUFFER, dst->buffer_object)); GL_EXTCALL(glBindBuffer(GL_COPY_WRITE_BUFFER, dst_bo->id));
GL_EXTCALL(glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, GL_EXTCALL(glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER,
(GLintptr)src->addr, (GLintptr)dst->addr, size)); (GLintptr)src->addr, (GLintptr)dst->addr, size));
checkGLcall("direct buffer copy"); checkGLcall("direct buffer copy");
...@@ -2611,15 +2616,15 @@ void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl, ...@@ -2611,15 +2616,15 @@ void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl,
wined3d_context_gl_unmap_bo_address(context_gl, src, src_binding, 0, NULL); wined3d_context_gl_unmap_bo_address(context_gl, src, src_binding, 0, NULL);
} }
} }
else if (!dst->buffer_object && src->buffer_object) else if (!dst_bo && src_bo)
{ {
wined3d_context_gl_bind_bo(context_gl, src_binding, src->buffer_object); wined3d_context_gl_bind_bo(context_gl, src_binding, src_bo->id);
GL_EXTCALL(glGetBufferSubData(src_binding, (GLintptr)src->addr, size, dst->addr)); GL_EXTCALL(glGetBufferSubData(src_binding, (GLintptr)src->addr, size, dst->addr));
checkGLcall("buffer download"); checkGLcall("buffer download");
} }
else if (dst->buffer_object && !src->buffer_object) else if (dst_bo && !src_bo)
{ {
wined3d_context_gl_bind_bo(context_gl, dst_binding, dst->buffer_object); wined3d_context_gl_bind_bo(context_gl, dst_binding, dst_bo->id);
GL_EXTCALL(glBufferSubData(dst_binding, (GLintptr)dst->addr, size, src->addr)); GL_EXTCALL(glBufferSubData(dst_binding, (GLintptr)dst->addr, size, src->addr));
checkGLcall("buffer upload"); checkGLcall("buffer upload");
} }
...@@ -3489,8 +3494,8 @@ static void wined3d_context_gl_bind_unordered_access_views(struct wined3d_contex ...@@ -3489,8 +3494,8 @@ static void wined3d_context_gl_bind_unordered_access_views(struct wined3d_contex
GL_EXTCALL(glBindImageTexture(i, texture_name, level, GL_TRUE, 0, GL_READ_WRITE, GL_EXTCALL(glBindImageTexture(i, texture_name, level, GL_TRUE, 0, GL_READ_WRITE,
format_gl->internal)); format_gl->internal));
if (view_gl->counter_bo) if (view_gl->counter_bo.id)
GL_EXTCALL(glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, i, view_gl->counter_bo)); GL_EXTCALL(glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, i, view_gl->counter_bo.id));
} }
checkGLcall("Bind unordered access views"); checkGLcall("Bind unordered access views");
} }
...@@ -3908,9 +3913,9 @@ void dispatch_compute(struct wined3d_device *device, const struct wined3d_state ...@@ -3908,9 +3913,9 @@ void dispatch_compute(struct wined3d_device *device, const struct wined3d_state
if (parameters->indirect) if (parameters->indirect)
{ {
const struct wined3d_indirect_dispatch_parameters *indirect = &parameters->u.indirect; const struct wined3d_indirect_dispatch_parameters *indirect = &parameters->u.indirect;
struct wined3d_buffer *buffer = indirect->buffer; struct wined3d_buffer_gl *buffer_gl = wined3d_buffer_gl(indirect->buffer);
GL_EXTCALL(glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, buffer->buffer_object)); GL_EXTCALL(glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, buffer_gl->bo.id));
GL_EXTCALL(glDispatchComputeIndirect((GLintptr)indirect->offset)); GL_EXTCALL(glDispatchComputeIndirect((GLintptr)indirect->offset));
GL_EXTCALL(glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, 0)); GL_EXTCALL(glBindBuffer(GL_DISPATCH_INDIRECT_BUFFER, 0));
} }
...@@ -4303,7 +4308,7 @@ static void wined3d_context_gl_draw_indirect(struct wined3d_context_gl *context_ ...@@ -4303,7 +4308,7 @@ static void wined3d_context_gl_draw_indirect(struct wined3d_context_gl *context_
return; return;
} }
GL_EXTCALL(glBindBuffer(GL_DRAW_INDIRECT_BUFFER, buffer->buffer_object)); GL_EXTCALL(glBindBuffer(GL_DRAW_INDIRECT_BUFFER, wined3d_buffer_gl(buffer)->bo.id));
offset = (void *)(GLintptr)parameters->offset; offset = (void *)(GLintptr)parameters->offset;
if (idx_size) if (idx_size)
...@@ -4662,6 +4667,7 @@ void wined3d_context_gl_load_tex_coords(const struct wined3d_context_gl *context ...@@ -4662,6 +4667,7 @@ void wined3d_context_gl_load_tex_coords(const struct wined3d_context_gl *context
const struct wined3d_format_gl *format_gl; const struct wined3d_format_gl *format_gl;
unsigned int mapped_stage = 0; unsigned int mapped_stage = 0;
unsigned int texture_idx; unsigned int texture_idx;
GLuint bo;
for (texture_idx = 0; texture_idx < context_gl->c.d3d_info->limits.ffp_blend_stages; ++texture_idx) for (texture_idx = 0; texture_idx < context_gl->c.d3d_info->limits.ffp_blend_stages; ++texture_idx)
{ {
...@@ -4683,11 +4689,12 @@ void wined3d_context_gl_load_tex_coords(const struct wined3d_context_gl *context ...@@ -4683,11 +4689,12 @@ void wined3d_context_gl_load_tex_coords(const struct wined3d_context_gl *context
TRACE("Setting up texture %u, idx %u, coord_idx %u, data %s.\n", TRACE("Setting up texture %u, idx %u, coord_idx %u, data %s.\n",
texture_idx, mapped_stage, coord_idx, debug_bo_address(&e->data)); texture_idx, mapped_stage, coord_idx, debug_bo_address(&e->data));
if (*current_bo != e->data.buffer_object) bo = wined3d_bo_gl_id(e->data.buffer_object);
if (*current_bo != bo)
{ {
GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, e->data.buffer_object)); GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, bo));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
*current_bo = e->data.buffer_object; *current_bo = bo;
} }
GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage)); GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
...@@ -4738,7 +4745,7 @@ static void wined3d_context_gl_load_vertex_data(struct wined3d_context_gl *conte ...@@ -4738,7 +4745,7 @@ static void wined3d_context_gl_load_vertex_data(struct wined3d_context_gl *conte
const struct wined3d_gl_info *gl_info = context_gl->gl_info; const struct wined3d_gl_info *gl_info = context_gl->gl_info;
const struct wined3d_stream_info_element *e; const struct wined3d_stream_info_element *e;
const struct wined3d_format_gl *format_gl; const struct wined3d_format_gl *format_gl;
GLuint current_bo; GLuint current_bo, bo;
TRACE("context_gl %p, si %p, state %p.\n", context_gl, si, state); TRACE("context_gl %p, si %p, state %p.\n", context_gl, si, state);
...@@ -4770,11 +4777,12 @@ static void wined3d_context_gl_load_vertex_data(struct wined3d_context_gl *conte ...@@ -4770,11 +4777,12 @@ static void wined3d_context_gl_load_vertex_data(struct wined3d_context_gl *conte
e = &si->elements[WINED3D_FFP_POSITION]; e = &si->elements[WINED3D_FFP_POSITION];
format_gl = wined3d_format_gl(e->format); format_gl = wined3d_format_gl(e->format);
if (current_bo != e->data.buffer_object) bo = wined3d_bo_gl_id(e->data.buffer_object);
if (current_bo != bo)
{ {
GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, e->data.buffer_object)); GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, bo));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
current_bo = e->data.buffer_object; current_bo = bo;
} }
TRACE("glVertexPointer(%#x, %#x, %#x, %p);\n", TRACE("glVertexPointer(%#x, %#x, %#x, %p);\n",
...@@ -4793,11 +4801,12 @@ static void wined3d_context_gl_load_vertex_data(struct wined3d_context_gl *conte ...@@ -4793,11 +4801,12 @@ static void wined3d_context_gl_load_vertex_data(struct wined3d_context_gl *conte
e = &si->elements[WINED3D_FFP_NORMAL]; e = &si->elements[WINED3D_FFP_NORMAL];
format_gl = wined3d_format_gl(e->format); format_gl = wined3d_format_gl(e->format);
if (current_bo != e->data.buffer_object) bo = wined3d_bo_gl_id(e->data.buffer_object);
if (current_bo != bo)
{ {
GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, e->data.buffer_object)); GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, bo));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
current_bo = e->data.buffer_object; current_bo = bo;
} }
TRACE("glNormalPointer(%#x, %#x, %p);\n", format_gl->vtx_type, e->stride, TRACE("glNormalPointer(%#x, %#x, %p);\n", format_gl->vtx_type, e->stride,
...@@ -4821,11 +4830,12 @@ static void wined3d_context_gl_load_vertex_data(struct wined3d_context_gl *conte ...@@ -4821,11 +4830,12 @@ static void wined3d_context_gl_load_vertex_data(struct wined3d_context_gl *conte
e = &si->elements[WINED3D_FFP_DIFFUSE]; e = &si->elements[WINED3D_FFP_DIFFUSE];
format_gl = wined3d_format_gl(e->format); format_gl = wined3d_format_gl(e->format);
if (current_bo != e->data.buffer_object) bo = wined3d_bo_gl_id(e->data.buffer_object);
if (current_bo != bo)
{ {
GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, e->data.buffer_object)); GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, bo));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
current_bo = e->data.buffer_object; current_bo = bo;
} }
TRACE("glColorPointer(%#x, %#x %#x, %p);\n", TRACE("glColorPointer(%#x, %#x %#x, %p);\n",
...@@ -4860,11 +4870,12 @@ static void wined3d_context_gl_load_vertex_data(struct wined3d_context_gl *conte ...@@ -4860,11 +4870,12 @@ static void wined3d_context_gl_load_vertex_data(struct wined3d_context_gl *conte
type = format_gl->vtx_type; type = format_gl->vtx_type;
format = format_gl->vtx_format; format = format_gl->vtx_format;
if (current_bo != e->data.buffer_object) bo = wined3d_bo_gl_id(e->data.buffer_object);
if (current_bo != bo)
{ {
GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, e->data.buffer_object)); GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, bo));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
current_bo = e->data.buffer_object; current_bo = bo;
} }
if (format != 4 || (gl_info->quirks & WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA)) if (format != 4 || (gl_info->quirks & WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA))
...@@ -4957,7 +4968,7 @@ static void wined3d_context_gl_load_numbered_arrays(struct wined3d_context_gl *c ...@@ -4957,7 +4968,7 @@ static void wined3d_context_gl_load_numbered_arrays(struct wined3d_context_gl *c
struct wined3d_context *context = &context_gl->c; struct wined3d_context *context = &context_gl->c;
const struct wined3d_shader *vs = state->shader[WINED3D_SHADER_TYPE_VERTEX]; const struct wined3d_shader *vs = state->shader[WINED3D_SHADER_TYPE_VERTEX];
const struct wined3d_gl_info *gl_info = context_gl->gl_info; const struct wined3d_gl_info *gl_info = context_gl->gl_info;
GLuint current_bo; GLuint current_bo, bo;
unsigned int i; unsigned int i;
/* Default to no instancing. */ /* Default to no instancing. */
...@@ -5021,11 +5032,12 @@ static void wined3d_context_gl_load_numbered_arrays(struct wined3d_context_gl *c ...@@ -5021,11 +5032,12 @@ static void wined3d_context_gl_load_numbered_arrays(struct wined3d_context_gl *c
{ {
DWORD format_flags = format_gl->f.flags[WINED3D_GL_RES_TYPE_BUFFER]; DWORD format_flags = format_gl->f.flags[WINED3D_GL_RES_TYPE_BUFFER];
if (current_bo != element->data.buffer_object) bo = wined3d_bo_gl_id(element->data.buffer_object);
if (current_bo != bo)
{ {
GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, element->data.buffer_object)); GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, bo));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
current_bo = element->data.buffer_object; current_bo = bo;
} }
/* Use the VBO to find out if a vertex buffer exists, not the vb /* Use the VBO to find out if a vertex buffer exists, not the vb
* pointer. vb can point to a user pointer data blob. In that case * pointer. vb can point to a user pointer data blob. In that case
......
...@@ -4388,7 +4388,7 @@ static void indexbuffer(struct wined3d_context *context, const struct wined3d_st ...@@ -4388,7 +4388,7 @@ static void indexbuffer(struct wined3d_context *context, const struct wined3d_st
if (!ib || !stream_info->all_vbo) if (!ib || !stream_info->all_vbo)
GL_EXTCALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); GL_EXTCALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
else else
GL_EXTCALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib->buffer_object)); GL_EXTCALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, wined3d_buffer_gl_const(ib)->bo.id));
} }
static void depth_clip(const struct wined3d_rasterizer_state *r, const struct wined3d_gl_info *gl_info) static void depth_clip(const struct wined3d_rasterizer_state *r, const struct wined3d_gl_info *gl_info)
...@@ -4495,7 +4495,7 @@ static void state_cb(struct wined3d_context *context, const struct wined3d_state ...@@ -4495,7 +4495,7 @@ static void state_cb(struct wined3d_context *context, const struct wined3d_state
for (i = 0; i < count; ++i) for (i = 0; i < count; ++i)
{ {
buffer = state->cb[shader_type][i]; buffer = state->cb[shader_type][i];
GL_EXTCALL(glBindBufferBase(GL_UNIFORM_BUFFER, base + i, buffer ? buffer->buffer_object : 0)); GL_EXTCALL(glBindBufferBase(GL_UNIFORM_BUFFER, base + i, buffer ? wined3d_buffer_gl(buffer)->bo.id : 0));
} }
checkGLcall("bind constant buffers"); checkGLcall("bind constant buffers");
} }
...@@ -4567,7 +4567,7 @@ static void state_so(struct wined3d_context *context, const struct wined3d_state ...@@ -4567,7 +4567,7 @@ static void state_so(struct wined3d_context *context, const struct wined3d_state
offset = 0; offset = 0;
} }
size = buffer->resource.size - offset; size = buffer->resource.size - offset;
GL_EXTCALL(glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, i, buffer->buffer_object, offset, size)); GL_EXTCALL(glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, i, wined3d_buffer_gl(buffer)->bo.id, offset, size));
} }
checkGLcall("bind transform feedback buffers"); checkGLcall("bind transform feedback buffers");
} }
......
...@@ -742,7 +742,7 @@ void texture2d_read_from_framebuffer(struct wined3d_texture *texture, unsigned i ...@@ -742,7 +742,7 @@ void texture2d_read_from_framebuffer(struct wined3d_texture *texture, unsigned i
if (data.buffer_object) if (data.buffer_object)
{ {
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, data.buffer_object)); GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, ((struct wined3d_bo_gl *)data.buffer_object)->id));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
} }
......
...@@ -361,6 +361,7 @@ static BOOL wined3d_texture_copy_sysmem_location(struct wined3d_texture *texture ...@@ -361,6 +361,7 @@ static BOOL wined3d_texture_copy_sysmem_location(struct wined3d_texture *texture
unsigned int size = texture->sub_resources[sub_resource_idx].size; unsigned int size = texture->sub_resources[sub_resource_idx].size;
struct wined3d_device *device = texture->resource.device; struct wined3d_device *device = texture->resource.device;
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
struct wined3d_bo_gl *src_bo, *dst_bo;
struct wined3d_bo_address dst, src; struct wined3d_bo_address dst, src;
if (!wined3d_texture_prepare_location(texture, sub_resource_idx, context, location)) if (!wined3d_texture_prepare_location(texture, sub_resource_idx, context, location))
...@@ -370,11 +371,11 @@ static BOOL wined3d_texture_copy_sysmem_location(struct wined3d_texture *texture ...@@ -370,11 +371,11 @@ static BOOL wined3d_texture_copy_sysmem_location(struct wined3d_texture *texture
wined3d_texture_get_memory(texture, sub_resource_idx, &src, wined3d_texture_get_memory(texture, sub_resource_idx, &src,
texture->sub_resources[sub_resource_idx].locations); texture->sub_resources[sub_resource_idx].locations);
if (dst.buffer_object) if ((dst_bo = (struct wined3d_bo_gl *)dst.buffer_object))
{ {
context = context_acquire(device, NULL, 0); context = context_acquire(device, NULL, 0);
gl_info = wined3d_context_gl(context)->gl_info; gl_info = wined3d_context_gl(context)->gl_info;
GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, dst.buffer_object)); GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, dst_bo->id));
GL_EXTCALL(glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, size, src.addr)); GL_EXTCALL(glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, size, src.addr));
GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0)); GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
checkGLcall("PBO upload"); checkGLcall("PBO upload");
...@@ -382,11 +383,11 @@ static BOOL wined3d_texture_copy_sysmem_location(struct wined3d_texture *texture ...@@ -382,11 +383,11 @@ static BOOL wined3d_texture_copy_sysmem_location(struct wined3d_texture *texture
return TRUE; return TRUE;
} }
if (src.buffer_object) if ((src_bo = (struct wined3d_bo_gl *)src.buffer_object))
{ {
context = context_acquire(device, NULL, 0); context = context_acquire(device, NULL, 0);
gl_info = wined3d_context_gl(context)->gl_info; gl_info = wined3d_context_gl(context)->gl_info;
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, src.buffer_object)); GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, src_bo->id));
GL_EXTCALL(glGetBufferSubData(GL_PIXEL_PACK_BUFFER, 0, size, dst.addr)); GL_EXTCALL(glGetBufferSubData(GL_PIXEL_PACK_BUFFER, 0, size, dst.addr));
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0)); GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
checkGLcall("PBO download"); checkGLcall("PBO download");
...@@ -466,7 +467,7 @@ void wined3d_texture_get_memory(struct wined3d_texture *texture, unsigned int su ...@@ -466,7 +467,7 @@ void wined3d_texture_get_memory(struct wined3d_texture *texture, unsigned int su
if (locations & WINED3D_LOCATION_BUFFER) if (locations & WINED3D_LOCATION_BUFFER)
{ {
data->addr = NULL; data->addr = NULL;
data->buffer_object = sub_resource->buffer_object; data->buffer_object = (uintptr_t)&sub_resource->bo;
return; return;
} }
if (locations & WINED3D_LOCATION_USER_MEMORY) if (locations & WINED3D_LOCATION_USER_MEMORY)
...@@ -492,18 +493,16 @@ void wined3d_texture_get_memory(struct wined3d_texture *texture, unsigned int su ...@@ -492,18 +493,16 @@ void wined3d_texture_get_memory(struct wined3d_texture *texture, unsigned int su
static void wined3d_texture_remove_buffer_object(struct wined3d_texture *texture, static void wined3d_texture_remove_buffer_object(struct wined3d_texture *texture,
unsigned int sub_resource_idx, const struct wined3d_gl_info *gl_info) unsigned int sub_resource_idx, const struct wined3d_gl_info *gl_info)
{ {
uintptr_t *buffer_object = &texture->sub_resources[sub_resource_idx].buffer_object; struct wined3d_bo_gl *bo = &texture->sub_resources[sub_resource_idx].bo;
GLuint bo;
bo = *buffer_object; GL_EXTCALL(glDeleteBuffers(1, &bo->id));
GL_EXTCALL(glDeleteBuffers(1, &bo));
checkGLcall("glDeleteBuffers"); checkGLcall("glDeleteBuffers");
TRACE("Deleted buffer object %u for texture %p, sub-resource %u.\n", TRACE("Deleted buffer object %u for texture %p, sub-resource %u.\n",
bo, texture, sub_resource_idx); bo->id, texture, sub_resource_idx);
wined3d_texture_invalidate_location(texture, sub_resource_idx, WINED3D_LOCATION_BUFFER); wined3d_texture_invalidate_location(texture, sub_resource_idx, WINED3D_LOCATION_BUFFER);
*buffer_object = 0; bo->id = 0;
} }
static void wined3d_texture_update_map_binding(struct wined3d_texture *texture) static void wined3d_texture_update_map_binding(struct wined3d_texture *texture)
...@@ -1631,20 +1630,20 @@ static void wined3d_texture_prepare_buffer_object(struct wined3d_texture *textur ...@@ -1631,20 +1630,20 @@ static void wined3d_texture_prepare_buffer_object(struct wined3d_texture *textur
unsigned int sub_resource_idx, const struct wined3d_gl_info *gl_info) unsigned int sub_resource_idx, const struct wined3d_gl_info *gl_info)
{ {
struct wined3d_texture_sub_resource *sub_resource; struct wined3d_texture_sub_resource *sub_resource;
GLuint bo; struct wined3d_bo_gl *bo;
sub_resource = &texture->sub_resources[sub_resource_idx]; sub_resource = &texture->sub_resources[sub_resource_idx];
if (sub_resource->buffer_object) bo = &sub_resource->bo;
if (bo->id)
return; return;
GL_EXTCALL(glGenBuffers(1, &bo)); GL_EXTCALL(glGenBuffers(1, &bo->id));
GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, bo)); GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, bo->id));
GL_EXTCALL(glBufferData(GL_PIXEL_UNPACK_BUFFER, sub_resource->size, NULL, GL_STREAM_DRAW)); GL_EXTCALL(glBufferData(GL_PIXEL_UNPACK_BUFFER, sub_resource->size, NULL, GL_STREAM_DRAW));
GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0)); GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0));
checkGLcall("Create buffer object"); checkGLcall("Create buffer object");
sub_resource->buffer_object = bo; TRACE("Created buffer object %u for texture %p, sub-resource %u.\n", bo->id, texture, sub_resource_idx);
TRACE("Created buffer object %u for texture %p, sub-resource %u.\n", bo, texture, sub_resource_idx);
} }
static void wined3d_texture_force_reload(struct wined3d_texture *texture) static void wined3d_texture_force_reload(struct wined3d_texture *texture)
...@@ -2186,7 +2185,7 @@ static void wined3d_texture_gl_upload_data(struct wined3d_context *context, ...@@ -2186,7 +2185,7 @@ static void wined3d_texture_gl_upload_data(struct wined3d_context *context,
{ {
if (bo.buffer_object) if (bo.buffer_object)
{ {
GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, bo.buffer_object)); GL_EXTCALL(glBindBuffer(GL_PIXEL_UNPACK_BUFFER, ((struct wined3d_bo_gl *)bo.buffer_object)->id));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
} }
...@@ -2215,6 +2214,7 @@ static void wined3d_texture_gl_upload_data(struct wined3d_context *context, ...@@ -2215,6 +2214,7 @@ static void wined3d_texture_gl_upload_data(struct wined3d_context *context,
static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl *texture_gl, static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl *texture_gl,
unsigned int sub_resource_idx, struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *data) unsigned int sub_resource_idx, struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *data)
{ {
const struct wined3d_bo_gl *bo = (const struct wined3d_bo_gl *)data->buffer_object;
const struct wined3d_gl_info *gl_info = context_gl->gl_info; const struct wined3d_gl_info *gl_info = context_gl->gl_info;
struct wined3d_texture_sub_resource *sub_resource; struct wined3d_texture_sub_resource *sub_resource;
unsigned int dst_row_pitch, dst_slice_pitch; unsigned int dst_row_pitch, dst_slice_pitch;
...@@ -2280,7 +2280,7 @@ static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl ...@@ -2280,7 +2280,7 @@ static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl
return; return;
} }
if (data->buffer_object) if (bo)
ERR("NP2 emulated texture uses PBO unexpectedly.\n"); ERR("NP2 emulated texture uses PBO unexpectedly.\n");
if (texture_gl->t.resource.format_flags & WINED3DFMT_FLAG_COMPRESSED) if (texture_gl->t.resource.format_flags & WINED3DFMT_FLAG_COMPRESSED)
ERR("Unexpected compressed format for NP2 emulated texture.\n"); ERR("Unexpected compressed format for NP2 emulated texture.\n");
...@@ -2290,7 +2290,7 @@ static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl ...@@ -2290,7 +2290,7 @@ static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl
{ {
struct wined3d_format f; struct wined3d_format f;
if (data->buffer_object) if (bo)
ERR("Converted texture %p uses PBO unexpectedly.\n", texture_gl); ERR("Converted texture %p uses PBO unexpectedly.\n", texture_gl);
WARN_(d3d_perf)("Downloading converted texture %p, %u with format %s.\n", WARN_(d3d_perf)("Downloading converted texture %p, %u with format %s.\n",
...@@ -2315,9 +2315,9 @@ static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl ...@@ -2315,9 +2315,9 @@ static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl
{ {
mem = temporary_mem; mem = temporary_mem;
} }
else if (data->buffer_object) else if (bo)
{ {
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, data->buffer_object)); GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, bo->id));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
mem = data->addr; mem = data->addr;
} }
...@@ -2418,9 +2418,9 @@ static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl ...@@ -2418,9 +2418,9 @@ static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl
{ {
unsigned int layer = sub_resource_idx / texture_gl->t.level_count; unsigned int layer = sub_resource_idx / texture_gl->t.level_count;
void *src_data = temporary_mem + layer * sub_resource->size; void *src_data = temporary_mem + layer * sub_resource->size;
if (data->buffer_object) if (bo)
{ {
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, data->buffer_object)); GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, bo->id));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
GL_EXTCALL(glBufferSubData(GL_PIXEL_PACK_BUFFER, 0, sub_resource->size, src_data)); GL_EXTCALL(glBufferSubData(GL_PIXEL_PACK_BUFFER, 0, sub_resource->size, src_data));
checkGLcall("glBufferSubData"); checkGLcall("glBufferSubData");
...@@ -2431,7 +2431,7 @@ static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl ...@@ -2431,7 +2431,7 @@ static void wined3d_texture_gl_download_data_slow_path(struct wined3d_texture_gl
} }
} }
if (data->buffer_object) if (bo)
{ {
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0)); GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
...@@ -2452,6 +2452,7 @@ static void wined3d_texture_gl_download_data(struct wined3d_context *context, ...@@ -2452,6 +2452,7 @@ static void wined3d_texture_gl_download_data(struct wined3d_context *context,
unsigned int src_level, src_width, src_height, src_depth; unsigned int src_level, src_width, src_height, src_depth;
unsigned int src_row_pitch, src_slice_pitch; unsigned int src_row_pitch, src_slice_pitch;
const struct wined3d_format_gl *format_gl; const struct wined3d_format_gl *format_gl;
struct wined3d_bo_gl *dst_bo;
BOOL srgb = FALSE; BOOL srgb = FALSE;
GLenum target; GLenum target;
...@@ -2526,9 +2527,9 @@ static void wined3d_texture_gl_download_data(struct wined3d_context *context, ...@@ -2526,9 +2527,9 @@ static void wined3d_texture_gl_download_data(struct wined3d_context *context,
return; return;
} }
if (dst_bo_addr->buffer_object) if ((dst_bo = (struct wined3d_bo_gl *)dst_bo_addr->buffer_object))
{ {
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, dst_bo_addr->buffer_object)); GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, dst_bo->id));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
} }
...@@ -2549,7 +2550,7 @@ static void wined3d_texture_gl_download_data(struct wined3d_context *context, ...@@ -2549,7 +2550,7 @@ static void wined3d_texture_gl_download_data(struct wined3d_context *context,
checkGLcall("glGetTexImage"); checkGLcall("glGetTexImage");
} }
if (dst_bo_addr->buffer_object) if (dst_bo)
{ {
GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0)); GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
checkGLcall("glBindBuffer"); checkGLcall("glBindBuffer");
...@@ -2793,7 +2794,7 @@ static BOOL wined3d_texture_gl_load_texture(struct wined3d_texture_gl *texture_g ...@@ -2793,7 +2794,7 @@ static BOOL wined3d_texture_gl_load_texture(struct wined3d_texture_gl *texture_g
/* Don't use PBOs for converted surfaces. During PBO conversion we look at /* Don't use PBOs for converted surfaces. During PBO conversion we look at
* WINED3D_TEXTURE_CONVERTED but it isn't set (yet) in all cases it is * WINED3D_TEXTURE_CONVERTED but it isn't set (yet) in all cases it is
* getting called. */ * getting called. */
if (conversion && sub_resource->buffer_object) if (conversion && sub_resource->bo.id)
{ {
TRACE("Removing the pbo attached to texture %p, %u.\n", texture_gl, sub_resource_idx); TRACE("Removing the pbo attached to texture %p, %u.\n", texture_gl, sub_resource_idx);
...@@ -2936,7 +2937,7 @@ static void wined3d_texture_gl_unload_location(struct wined3d_texture *texture, ...@@ -2936,7 +2937,7 @@ static void wined3d_texture_gl_unload_location(struct wined3d_texture *texture,
sub_count = texture->level_count * texture->layer_count; sub_count = texture->level_count * texture->layer_count;
for (i = 0; i < sub_count; ++i) for (i = 0; i < sub_count; ++i)
{ {
if (texture_gl->t.sub_resources[i].buffer_object) if (texture_gl->t.sub_resources[i].bo.id)
wined3d_texture_remove_buffer_object(&texture_gl->t, i, context_gl->gl_info); wined3d_texture_remove_buffer_object(&texture_gl->t, i, context_gl->gl_info);
} }
break; break;
......
...@@ -246,13 +246,11 @@ static void create_texture_view(struct wined3d_gl_view *view, GLenum view_target ...@@ -246,13 +246,11 @@ static void create_texture_view(struct wined3d_gl_view *view, GLenum view_target
context_release(context); context_release(context);
} }
static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_context *context, static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_context_gl *context_gl,
struct wined3d_buffer *buffer, const struct wined3d_format *view_format, struct wined3d_buffer_gl *buffer_gl, const struct wined3d_format_gl *view_format_gl,
unsigned int offset, unsigned int size) unsigned int offset, unsigned int size)
{ {
struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
const struct wined3d_gl_info *gl_info = context_gl->gl_info; const struct wined3d_gl_info *gl_info = context_gl->gl_info;
const struct wined3d_format_gl *view_format_gl;
if (!gl_info->supported[ARB_TEXTURE_BUFFER_OBJECT]) if (!gl_info->supported[ARB_TEXTURE_BUFFER_OBJECT])
{ {
...@@ -267,8 +265,7 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c ...@@ -267,8 +265,7 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c
return; return;
} }
view_format_gl = wined3d_format_gl(view_format); wined3d_buffer_load_location(&buffer_gl->b, &context_gl->c, WINED3D_LOCATION_BUFFER);
wined3d_buffer_load_location(buffer, context, WINED3D_LOCATION_BUFFER);
view->target = GL_TEXTURE_BUFFER; view->target = GL_TEXTURE_BUFFER;
gl_info->gl_ops.gl.p_glGenTextures(1, &view->name); gl_info->gl_ops.gl.p_glGenTextures(1, &view->name);
...@@ -276,19 +273,18 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c ...@@ -276,19 +273,18 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c
wined3d_context_gl_bind_texture(context_gl, GL_TEXTURE_BUFFER, view->name); wined3d_context_gl_bind_texture(context_gl, GL_TEXTURE_BUFFER, view->name);
if (gl_info->supported[ARB_TEXTURE_BUFFER_RANGE]) if (gl_info->supported[ARB_TEXTURE_BUFFER_RANGE])
{ {
GL_EXTCALL(glTexBufferRange(GL_TEXTURE_BUFFER, view_format_gl->internal, GL_EXTCALL(glTexBufferRange(GL_TEXTURE_BUFFER, view_format_gl->internal, buffer_gl->bo.id, offset, size));
buffer->buffer_object, offset, size));
} }
else else
{ {
if (offset || size != buffer->resource.size) if (offset || size != buffer_gl->b.resource.size)
FIXME("OpenGL implementation does not support ARB_texture_buffer_range.\n"); FIXME("OpenGL implementation does not support ARB_texture_buffer_range.\n");
GL_EXTCALL(glTexBuffer(GL_TEXTURE_BUFFER, view_format_gl->internal, buffer->buffer_object)); GL_EXTCALL(glTexBuffer(GL_TEXTURE_BUFFER, view_format_gl->internal, buffer_gl->bo.id));
} }
checkGLcall("Create buffer texture"); checkGLcall("Create buffer texture");
context_invalidate_compute_state(context, STATE_COMPUTE_SHADER_RESOURCE_BINDING); context_invalidate_compute_state(&context_gl->c, STATE_COMPUTE_SHADER_RESOURCE_BINDING);
context_invalidate_state(context, STATE_GRAPHICS_SHADER_RESOURCE_BINDING); context_invalidate_state(&context_gl->c, STATE_GRAPHICS_SHADER_RESOURCE_BINDING);
} }
static void get_buffer_view_range(const struct wined3d_buffer *buffer, static void get_buffer_view_range(const struct wined3d_buffer *buffer,
...@@ -314,7 +310,8 @@ static void create_buffer_view(struct wined3d_gl_view *view, struct wined3d_cont ...@@ -314,7 +310,8 @@ static void create_buffer_view(struct wined3d_gl_view *view, struct wined3d_cont
unsigned int offset, size; unsigned int offset, size;
get_buffer_view_range(buffer, desc, view_format, &offset, &size); get_buffer_view_range(buffer, desc, view_format, &offset, &size);
create_buffer_texture(view, context, buffer, view_format, offset, size); create_buffer_texture(view, wined3d_context_gl(context),
wined3d_buffer_gl(buffer), wined3d_format_gl(view_format), offset, size);
} }
static void wined3d_view_invalidate_location(struct wined3d_resource *resource, static void wined3d_view_invalidate_location(struct wined3d_resource *resource,
...@@ -1035,7 +1032,7 @@ void wined3d_unordered_access_view_gl_clear_uint(struct wined3d_unordered_access ...@@ -1035,7 +1032,7 @@ void wined3d_unordered_access_view_gl_clear_uint(struct wined3d_unordered_access
wined3d_unordered_access_view_invalidate_location(&view_gl->v, ~WINED3D_LOCATION_BUFFER); wined3d_unordered_access_view_invalidate_location(&view_gl->v, ~WINED3D_LOCATION_BUFFER);
get_buffer_view_range(&buffer_gl->b, &view_gl->v.desc, &format->f, &offset, &size); get_buffer_view_range(&buffer_gl->b, &view_gl->v.desc, &format->f, &offset, &size);
wined3d_context_gl_bind_bo(context_gl, buffer_gl->buffer_type_hint, buffer_gl->b.buffer_object); wined3d_context_gl_bind_bo(context_gl, buffer_gl->buffer_type_hint, buffer_gl->bo.id);
GL_EXTCALL(glClearBufferSubData(buffer_gl->buffer_type_hint, format->internal, GL_EXTCALL(glClearBufferSubData(buffer_gl->buffer_type_hint, format->internal,
offset, size, format->format, format->type, clear_value)); offset, size, format->format, format->type, clear_value));
checkGLcall("clear unordered access view"); checkGLcall("clear unordered access view");
...@@ -1048,12 +1045,12 @@ void wined3d_unordered_access_view_set_counter(struct wined3d_unordered_access_v ...@@ -1048,12 +1045,12 @@ void wined3d_unordered_access_view_set_counter(struct wined3d_unordered_access_v
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
struct wined3d_context *context; struct wined3d_context *context;
if (!view_gl->counter_bo) if (!view_gl->counter_bo.id)
return; return;
context = context_acquire(view_gl->v.resource->device, NULL, 0); context = context_acquire(view_gl->v.resource->device, NULL, 0);
gl_info = wined3d_context_gl(context)->gl_info; gl_info = wined3d_context_gl(context)->gl_info;
GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view_gl->counter_bo)); GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view_gl->counter_bo.id));
GL_EXTCALL(glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(value), &value)); GL_EXTCALL(glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(value), &value));
checkGLcall("set atomic counter"); checkGLcall("set atomic counter");
context_release(context); context_release(context);
...@@ -1067,13 +1064,13 @@ void wined3d_unordered_access_view_copy_counter(struct wined3d_unordered_access_ ...@@ -1067,13 +1064,13 @@ void wined3d_unordered_access_view_copy_counter(struct wined3d_unordered_access_
struct wined3d_bo_address dst, src; struct wined3d_bo_address dst, src;
DWORD dst_location; DWORD dst_location;
if (!view_gl->counter_bo) if (!view_gl->counter_bo.id)
return; return;
dst_location = wined3d_buffer_get_memory(buffer, &dst, buffer->locations); dst_location = wined3d_buffer_get_memory(buffer, &dst, buffer->locations);
dst.addr += offset; dst.addr += offset;
src.buffer_object = view_gl->counter_bo; src.buffer_object = (uintptr_t)&view_gl->counter_bo;
src.addr = NULL; src.addr = NULL;
wined3d_context_gl_copy_bo_address(context_gl, &dst, wined3d_buffer_gl(buffer)->buffer_type_hint, wined3d_context_gl_copy_bo_address(context_gl, &dst, wined3d_buffer_gl(buffer)->buffer_type_hint,
...@@ -1101,9 +1098,11 @@ static void wined3d_unordered_access_view_gl_cs_init(void *object) ...@@ -1101,9 +1098,11 @@ static void wined3d_unordered_access_view_gl_cs_init(void *object)
create_buffer_view(&view_gl->gl_view, context, desc, buffer, view_gl->v.format); create_buffer_view(&view_gl->gl_view, context, desc, buffer, view_gl->v.format);
if (desc->flags & (WINED3D_VIEW_BUFFER_COUNTER | WINED3D_VIEW_BUFFER_APPEND)) if (desc->flags & (WINED3D_VIEW_BUFFER_COUNTER | WINED3D_VIEW_BUFFER_APPEND))
{ {
struct wined3d_bo_gl *bo = &view_gl->counter_bo;
static const GLuint initial_value = 0; static const GLuint initial_value = 0;
GL_EXTCALL(glGenBuffers(1, &view_gl->counter_bo));
GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view_gl->counter_bo)); GL_EXTCALL(glGenBuffers(1, &bo->id));
GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, bo->id));
GL_EXTCALL(glBufferData(GL_ATOMIC_COUNTER_BUFFER, GL_EXTCALL(glBufferData(GL_ATOMIC_COUNTER_BUFFER,
sizeof(initial_value), &initial_value, GL_STATIC_DRAW)); sizeof(initial_value), &initial_value, GL_STATIC_DRAW));
checkGLcall("create atomic counter buffer"); checkGLcall("create atomic counter buffer");
......
...@@ -1519,6 +1519,16 @@ do { \ ...@@ -1519,6 +1519,16 @@ do { \
#define checkGLcall(A) do {} while(0) #define checkGLcall(A) do {} while(0)
#endif #endif
struct wined3d_bo_gl
{
GLuint id;
};
static inline GLuint wined3d_bo_gl_id(uintptr_t bo)
{
return bo ? ((struct wined3d_bo_gl *)bo)->id : 0;
}
struct wined3d_bo_vk struct wined3d_bo_vk
{ {
VkBuffer vk_buffer; VkBuffer vk_buffer;
...@@ -3800,7 +3810,7 @@ struct wined3d_texture ...@@ -3800,7 +3810,7 @@ struct wined3d_texture
unsigned int map_count; unsigned int map_count;
uint32_t map_flags; uint32_t map_flags;
DWORD locations; DWORD locations;
uintptr_t buffer_object; struct wined3d_bo_gl bo;
} *sub_resources; } *sub_resources;
}; };
...@@ -4410,6 +4420,7 @@ struct wined3d_buffer_gl ...@@ -4410,6 +4420,7 @@ struct wined3d_buffer_gl
{ {
struct wined3d_buffer b; struct wined3d_buffer b;
struct wined3d_bo_gl bo;
GLenum buffer_object_usage; GLenum buffer_object_usage;
GLenum buffer_type_hint; GLenum buffer_type_hint;
}; };
...@@ -4419,6 +4430,11 @@ static inline struct wined3d_buffer_gl *wined3d_buffer_gl(struct wined3d_buffer ...@@ -4419,6 +4430,11 @@ static inline struct wined3d_buffer_gl *wined3d_buffer_gl(struct wined3d_buffer
return CONTAINING_RECORD(buffer, struct wined3d_buffer_gl, b); return CONTAINING_RECORD(buffer, struct wined3d_buffer_gl, b);
} }
static inline const struct wined3d_buffer_gl *wined3d_buffer_gl_const(const struct wined3d_buffer *buffer)
{
return CONTAINING_RECORD(buffer, struct wined3d_buffer_gl, b);
}
GLenum wined3d_buffer_gl_binding_from_bind_flags(const struct wined3d_gl_info *gl_info, GLenum wined3d_buffer_gl_binding_from_bind_flags(const struct wined3d_gl_info *gl_info,
uint32_t bind_flags) DECLSPEC_HIDDEN; uint32_t bind_flags) DECLSPEC_HIDDEN;
HRESULT wined3d_buffer_gl_init(struct wined3d_buffer_gl *buffer_gl, struct wined3d_device *device, HRESULT wined3d_buffer_gl_init(struct wined3d_buffer_gl *buffer_gl, struct wined3d_device *device,
...@@ -4581,7 +4597,7 @@ struct wined3d_unordered_access_view_gl ...@@ -4581,7 +4597,7 @@ struct wined3d_unordered_access_view_gl
{ {
struct wined3d_unordered_access_view v; struct wined3d_unordered_access_view v;
struct wined3d_gl_view gl_view; struct wined3d_gl_view gl_view;
GLuint counter_bo; struct wined3d_bo_gl counter_bo;
}; };
static inline struct wined3d_unordered_access_view_gl *wined3d_unordered_access_view_gl( static inline struct wined3d_unordered_access_view_gl *wined3d_unordered_access_view_gl(
......
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