Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/wined3d/context.c | 21 ++++++++------- dlls/wined3d/view.c | 61 ++++++++++++++++++++++-------------------- dlls/wined3d/wined3d_private.h | 15 +++++++++-- 3 files changed, 56 insertions(+), 41 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 2e24c834277..4cd46c66c67 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -3875,7 +3875,7 @@ static void context_bind_unordered_access_views(struct wined3d_context *context, const struct wined3d_shader *shader, struct wined3d_unordered_access_view * const *views) { const struct wined3d_gl_info *gl_info = context->gl_info; - struct wined3d_unordered_access_view *view; + struct wined3d_unordered_access_view_gl *view_gl; const struct wined3d_format_gl *format_gl; GLuint texture_name; unsigned int i; @@ -3886,7 +3886,7 @@ static void context_bind_unordered_access_views(struct wined3d_context *context,
for (i = 0; i < MAX_UNORDERED_ACCESS_VIEWS; ++i) { - if (!(view = views[i])) + if (!views[i]) { if (shader->reg_maps.uav_resource_info[i].type) WARN("No unordered access view bound at index %u.\n", i); @@ -3894,16 +3894,17 @@ static void context_bind_unordered_access_views(struct wined3d_context *context, continue; }
- if (view->gl_view.name) + view_gl = wined3d_unordered_access_view_gl(views[i]); + if (view_gl->gl_view.name) { - texture_name = view->gl_view.name; + texture_name = view_gl->gl_view.name; level = 0; } - else if (view->resource->type != WINED3D_RTYPE_BUFFER) + else if (view_gl->v.resource->type != WINED3D_RTYPE_BUFFER) { - struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(texture_from_resource(view->resource)); + struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(texture_from_resource(view_gl->v.resource)); texture_name = wined3d_texture_gl_get_texture_name(texture_gl, context, FALSE); - level = view->desc.u.texture.level_idx; + level = view_gl->v.desc.u.texture.level_idx; } else { @@ -3912,12 +3913,12 @@ static void context_bind_unordered_access_views(struct wined3d_context *context, continue; }
- format_gl = wined3d_format_gl(view->format); + format_gl = wined3d_format_gl(view_gl->v.format); GL_EXTCALL(glBindImageTexture(i, texture_name, level, GL_TRUE, 0, GL_READ_WRITE, format_gl->internal));
- if (view->counter_bo) - GL_EXTCALL(glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, i, view->counter_bo)); + if (view_gl->counter_bo) + GL_EXTCALL(glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, i, view_gl->counter_bo)); } checkGLcall("Bind unordered access views"); } diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c index 5fff7e749e1..0cfadf7329b 100644 --- a/dlls/wined3d/view.c +++ b/dlls/wined3d/view.c @@ -968,26 +968,26 @@ ULONG CDECL wined3d_unordered_access_view_incref(struct wined3d_unordered_access return refcount; }
-static void wined3d_unordered_access_view_destroy_object(void *object) +static void wined3d_unordered_access_view_gl_destroy_object(void *object) { - struct wined3d_unordered_access_view *view = object; + struct wined3d_unordered_access_view_gl *view_gl = object;
- if (view->gl_view.name || view->counter_bo) + if (view_gl->gl_view.name || view_gl->counter_bo) { const struct wined3d_gl_info *gl_info; struct wined3d_context *context;
- context = context_acquire(view->resource->device, NULL, 0); + context = context_acquire(view_gl->v.resource->device, NULL, 0); gl_info = context->gl_info; - if (view->gl_view.name) - gl_info->gl_ops.gl.p_glDeleteTextures(1, &view->gl_view.name); - if (view->counter_bo) - GL_EXTCALL(glDeleteBuffers(1, &view->counter_bo)); + if (view_gl->gl_view.name) + gl_info->gl_ops.gl.p_glDeleteTextures(1, &view_gl->gl_view.name); + if (view_gl->counter_bo) + GL_EXTCALL(glDeleteBuffers(1, &view_gl->counter_bo)); checkGLcall("delete resources"); context_release(context); }
- heap_free(view); + heap_free(view_gl); }
ULONG CDECL wined3d_unordered_access_view_decref(struct wined3d_unordered_access_view *view) @@ -1004,7 +1004,8 @@ ULONG CDECL wined3d_unordered_access_view_decref(struct wined3d_unordered_access /* Call wined3d_object_destroyed() before releasing the resource, * since releasing the resource may end up destroying the parent. */ view->parent_ops->wined3d_object_destroyed(view->parent); - wined3d_cs_destroy_object(device->cs, wined3d_unordered_access_view_destroy_object, view); + wined3d_cs_destroy_object(device->cs, wined3d_unordered_access_view_gl_destroy_object, + wined3d_unordered_access_view_gl(view)); wined3d_resource_decref(resource); }
@@ -1069,15 +1070,16 @@ void wined3d_unordered_access_view_clear_uint(struct wined3d_unordered_access_vi void wined3d_unordered_access_view_set_counter(struct wined3d_unordered_access_view *view, unsigned int value) { + struct wined3d_unordered_access_view_gl *view_gl = wined3d_unordered_access_view_gl(view); const struct wined3d_gl_info *gl_info; struct wined3d_context *context;
- if (!view->counter_bo) + if (!view_gl->counter_bo) return;
- context = context_acquire(view->resource->device, NULL, 0); + context = context_acquire(view_gl->v.resource->device, NULL, 0); gl_info = context->gl_info; - GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view->counter_bo)); + GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view_gl->counter_bo)); GL_EXTCALL(glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(value), &value)); checkGLcall("set atomic counter"); context_release(context); @@ -1086,16 +1088,17 @@ void wined3d_unordered_access_view_set_counter(struct wined3d_unordered_access_v void wined3d_unordered_access_view_copy_counter(struct wined3d_unordered_access_view *view, struct wined3d_buffer *buffer, unsigned int offset, struct wined3d_context *context) { + struct wined3d_unordered_access_view_gl *view_gl = wined3d_unordered_access_view_gl(view); struct wined3d_bo_address dst, src; DWORD dst_location;
- if (!view->counter_bo) + if (!view_gl->counter_bo) return;
dst_location = wined3d_buffer_get_memory(buffer, &dst, buffer->locations); dst.addr += offset;
- src.buffer_object = view->counter_bo; + src.buffer_object = view_gl->counter_bo; src.addr = NULL;
context_copy_bo_address(context, &dst, wined3d_buffer_gl(buffer)->buffer_type_hint, @@ -1104,11 +1107,11 @@ void wined3d_unordered_access_view_copy_counter(struct wined3d_unordered_access_ wined3d_buffer_invalidate_location(buffer, ~dst_location); }
-static void wined3d_unordered_access_view_cs_init(void *object) +static void wined3d_unordered_access_view_gl_cs_init(void *object) { - struct wined3d_unordered_access_view *view = object; - struct wined3d_resource *resource = view->resource; - struct wined3d_view_desc *desc = &view->desc; + struct wined3d_unordered_access_view_gl *view_gl = object; + struct wined3d_resource *resource = view_gl->v.resource; + struct wined3d_view_desc *desc = &view_gl->v.desc; const struct wined3d_gl_info *gl_info;
gl_info = &resource->device->adapter->gl_info; @@ -1120,12 +1123,12 @@ static void wined3d_unordered_access_view_cs_init(void *object)
context = context_acquire(resource->device, NULL, 0); gl_info = context->gl_info; - create_buffer_view(&view->gl_view, context, desc, buffer, view->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)) { static const GLuint initial_value = 0; - GL_EXTCALL(glGenBuffers(1, &view->counter_bo)); - GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view->counter_bo)); + GL_EXTCALL(glGenBuffers(1, &view_gl->counter_bo)); + GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view_gl->counter_bo)); GL_EXTCALL(glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(initial_value), &initial_value, GL_STATIC_DRAW)); checkGLcall("create atomic counter buffer"); @@ -1144,8 +1147,8 @@ static void wined3d_unordered_access_view_cs_init(void *object)
if (desc->u.texture.layer_idx || desc->u.texture.layer_count != depth_or_layer_count) { - create_texture_view(&view->gl_view, get_texture_view_target(gl_info, desc, texture_gl), - desc, texture_gl, view->format); + create_texture_view(&view_gl->gl_view, get_texture_view_target(gl_info, desc, texture_gl), + desc, texture_gl, view_gl->v.format); } } } @@ -1164,8 +1167,6 @@ static HRESULT wined3d_unordered_access_view_init(struct wined3d_unordered_acces
wined3d_resource_incref(view->resource = resource);
- wined3d_cs_init_object(resource->device->cs, wined3d_unordered_access_view_cs_init, view); - return WINED3D_OK; }
@@ -1173,7 +1174,7 @@ HRESULT CDECL wined3d_unordered_access_view_create(const struct wined3d_view_des struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_unordered_access_view **view) { - struct wined3d_unordered_access_view *object; + struct wined3d_unordered_access_view_gl *object; HRESULT hr;
TRACE("desc %s, resource %p, parent %p, parent_ops %p, view %p.\n", @@ -1182,15 +1183,17 @@ HRESULT CDECL wined3d_unordered_access_view_create(const struct wined3d_view_des if (!(object = heap_alloc_zero(sizeof(*object)))) return E_OUTOFMEMORY;
- if (FAILED(hr = wined3d_unordered_access_view_init(object, desc, resource, parent, parent_ops))) + if (FAILED(hr = wined3d_unordered_access_view_init(&object->v, desc, resource, parent, parent_ops))) { heap_free(object); WARN("Failed to initialise view, hr %#x.\n", hr); return hr; }
+ wined3d_cs_init_object(resource->device->cs, wined3d_unordered_access_view_gl_cs_init, object); + TRACE("Created unordered access view %p.\n", object); - *view = object; + *view = &object->v;
return WINED3D_OK; } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b8b3d55d307..2d2f712d66d 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3902,9 +3902,7 @@ struct wined3d_unordered_access_view void *parent; const struct wined3d_parent_ops *parent_ops;
- struct wined3d_gl_view gl_view; const struct wined3d_format *format; - GLuint counter_bo;
struct wined3d_view_desc desc; }; @@ -3918,6 +3916,19 @@ void wined3d_unordered_access_view_invalidate_location(struct wined3d_unordered_ void wined3d_unordered_access_view_set_counter(struct wined3d_unordered_access_view *view, unsigned int value) DECLSPEC_HIDDEN;
+struct wined3d_unordered_access_view_gl +{ + struct wined3d_unordered_access_view v; + struct wined3d_gl_view gl_view; + GLuint counter_bo; +}; + +static inline struct wined3d_unordered_access_view_gl *wined3d_unordered_access_view_gl( + struct wined3d_unordered_access_view *view) +{ + return CONTAINING_RECORD(view, struct wined3d_unordered_access_view_gl, v); +} + struct wined3d_swapchain_ops { void (*swapchain_present)(struct wined3d_swapchain *swapchain,