diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 96572c67247..4015adbf352 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 8cdd214b67b..98b632c55ab 100644 --- a/dlls/wined3d/view.c +++ b/dlls/wined3d/view.c @@ -966,26 +966,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) @@ -1002,7 +1002,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); } @@ -1067,15 +1068,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); @@ -1084,16 +1086,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, @@ -1102,11 +1105,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; @@ -1118,12 +1121,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"); @@ -1142,8 +1145,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); } } } @@ -1162,8 +1165,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; } @@ -1171,7 +1172,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", @@ -1180,15 +1181,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 50997e57156..0767518252c 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3890,9 +3890,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; }; @@ -3906,6 +3904,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,