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:
parent
0799c3babd
commit
cf6b3f28d7
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue