wined3d: Introduce a separate structure for OpenGL unordered access view information.

Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Henri Verbeet 2018-11-13 16:40:18 +03:30 committed by Alexandre Julliard
parent 0799c3babd
commit cf6b3f28d7
3 changed files with 56 additions and 41 deletions

View File

@ -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");
}

View File

@ -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;
}

View File

@ -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,