wined3d: Make the adapter responsible for sampler creation and destruction.

Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Henri Verbeet 2019-08-14 16:34:39 +04:30 committed by Alexandre Julliard
parent 669e3ac3de
commit 41995669d0
5 changed files with 133 additions and 38 deletions

View File

@ -5024,6 +5024,49 @@ static void adapter_gl_destroy_unordered_access_view(struct wined3d_unordered_ac
wined3d_device_decref(device);
}
static HRESULT adapter_gl_create_sampler(struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_sampler **sampler)
{
struct wined3d_sampler *sampler_gl;
TRACE("device %p, desc %p, parent %p, parent_ops %p, sampler %p.\n",
device, desc, parent, parent_ops, sampler);
if (!(sampler_gl = heap_alloc_zero(sizeof(*sampler_gl))))
return E_OUTOFMEMORY;
wined3d_sampler_gl_init(sampler_gl, device, desc, parent, parent_ops);
TRACE("Created sampler %p.\n", sampler_gl);
*sampler = sampler_gl;
return WINED3D_OK;
}
static void wined3d_sampler_gl_destroy_object(void *object)
{
struct wined3d_sampler *sampler_gl = object;
const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
if (sampler_gl->name)
{
context = context_acquire(sampler_gl->device, NULL, 0);
gl_info = wined3d_context_gl(context)->gl_info;
GL_EXTCALL(glDeleteSamplers(1, &sampler_gl->name));
context_release(context);
}
heap_free(sampler_gl);
}
static void adapter_gl_destroy_sampler(struct wined3d_sampler *sampler)
{
TRACE("sampler %p.\n", sampler);
wined3d_cs_destroy_object(sampler->device->cs, wined3d_sampler_gl_destroy_object, sampler);
}
static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
{
adapter_gl_destroy,
@ -5047,6 +5090,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
adapter_gl_destroy_shader_resource_view,
adapter_gl_create_unordered_access_view,
adapter_gl_destroy_unordered_access_view,
adapter_gl_create_sampler,
adapter_gl_destroy_sampler,
};
static BOOL wined3d_adapter_gl_init(struct wined3d_adapter_gl *adapter_gl,

View File

@ -733,6 +733,32 @@ static void adapter_vk_destroy_unordered_access_view(struct wined3d_unordered_ac
wined3d_device_decref(device);
}
static HRESULT adapter_vk_create_sampler(struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_sampler **sampler)
{
struct wined3d_sampler *sampler_vk;
TRACE("device %p, desc %p, parent %p, parent_ops %p, sampler %p.\n",
device, desc, parent, parent_ops, sampler);
if (!(sampler_vk = heap_alloc_zero(sizeof(*sampler_vk))))
return E_OUTOFMEMORY;
wined3d_sampler_vk_init(sampler_vk, device, desc, parent, parent_ops);
TRACE("Created sampler %p.\n", sampler_vk);
*sampler = sampler_vk;
return WINED3D_OK;
}
static void adapter_vk_destroy_sampler(struct wined3d_sampler *sampler)
{
TRACE("sampler %p.\n", sampler);
wined3d_cs_destroy_object(sampler->device->cs, heap_free, sampler);
}
static const struct wined3d_adapter_ops wined3d_adapter_vk_ops =
{
adapter_vk_destroy,
@ -756,6 +782,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_vk_ops =
adapter_vk_destroy_shader_resource_view,
adapter_vk_create_unordered_access_view,
adapter_vk_destroy_unordered_access_view,
adapter_vk_create_sampler,
adapter_vk_destroy_sampler,
};
static unsigned int wined3d_get_wine_vk_version(void)

View File

@ -2554,6 +2554,20 @@ static void adapter_no3d_destroy_unordered_access_view(struct wined3d_unordered_
TRACE("view %p.\n", view);
}
static HRESULT adapter_no3d_create_sampler(struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_sampler **sampler)
{
TRACE("device %p, desc %p, parent %p, parent_ops %p, sampler %p.\n",
device, desc, parent, parent_ops, sampler);
return E_NOTIMPL;
}
static void adapter_no3d_destroy_sampler(struct wined3d_sampler *sampler)
{
TRACE("sampler %p.\n", sampler);
}
static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
{
adapter_no3d_destroy,
@ -2577,6 +2591,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
adapter_no3d_destroy_shader_resource_view,
adapter_no3d_create_unordered_access_view,
adapter_no3d_destroy_unordered_access_view,
adapter_no3d_create_sampler,
adapter_no3d_destroy_sampler,
};
static void wined3d_adapter_no3d_init_d3d_info(struct wined3d_adapter *adapter, unsigned int wined3d_creation_flags)

View File

@ -33,23 +33,6 @@ ULONG CDECL wined3d_sampler_incref(struct wined3d_sampler *sampler)
return refcount;
}
static void wined3d_sampler_destroy_object(void *object)
{
struct wined3d_sampler *sampler = object;
const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
if (sampler->name)
{
context = context_acquire(sampler->device, NULL, 0);
gl_info = wined3d_context_gl(context)->gl_info;
GL_EXTCALL(glDeleteSamplers(1, &sampler->name));
context_release(context);
}
heap_free(sampler);
}
ULONG CDECL wined3d_sampler_decref(struct wined3d_sampler *sampler)
{
ULONG refcount = InterlockedDecrement(&sampler->refcount);
@ -59,7 +42,7 @@ ULONG CDECL wined3d_sampler_decref(struct wined3d_sampler *sampler)
if (!refcount)
{
sampler->parent_ops->wined3d_object_destroyed(sampler->parent);
wined3d_cs_destroy_object(sampler->device->cs, wined3d_sampler_destroy_object, sampler);
sampler->device->adapter->adapter_ops->adapter_destroy_sampler(sampler);
}
return refcount;
@ -72,7 +55,20 @@ void * CDECL wined3d_sampler_get_parent(const struct wined3d_sampler *sampler)
return sampler->parent;
}
static void wined3d_sampler_cs_init(void *object)
static void wined3d_sampler_init(struct wined3d_sampler *sampler, struct wined3d_device *device,
const struct wined3d_sampler_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
{
TRACE("sampler %p, device %p, desc %p, parent %p, parent_ops %p.\n",
sampler, device, desc, parent, parent_ops);
sampler->refcount = 1;
sampler->device = device;
sampler->parent = parent;
sampler->parent_ops = parent_ops;
sampler->desc = *desc;
}
static void wined3d_sampler_gl_cs_init(void *object)
{
struct wined3d_sampler *sampler = object;
const struct wined3d_sampler_desc *desc;
@ -114,25 +110,32 @@ static void wined3d_sampler_cs_init(void *object)
context_release(context);
}
static void wined3d_sampler_init(struct wined3d_sampler *sampler, struct wined3d_device *device,
void wined3d_sampler_gl_init(struct wined3d_sampler *sampler_gl, struct wined3d_device *device,
const struct wined3d_sampler_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
{
sampler->refcount = 1;
sampler->device = device;
sampler->parent = parent;
sampler->parent_ops = parent_ops;
sampler->desc = *desc;
TRACE("sampler_gl %p, device %p, desc %p, parent %p, parent_ops %p.\n",
sampler_gl, device, desc, parent, parent_ops);
wined3d_sampler_init(sampler_gl, device, desc, parent, parent_ops);
if (device->adapter->gl_info.supported[ARB_SAMPLER_OBJECTS])
wined3d_cs_init_object(device->cs, wined3d_sampler_cs_init, sampler);
wined3d_cs_init_object(device->cs, wined3d_sampler_gl_cs_init, sampler_gl);
}
void wined3d_sampler_vk_init(struct wined3d_sampler *sampler_vk, struct wined3d_device *device,
const struct wined3d_sampler_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
{
TRACE("sampler_vk %p, device %p, desc %p, parent %p, parent_ops %p.\n",
sampler_vk, device, desc, parent, parent_ops);
wined3d_sampler_init(sampler_vk, device, desc, parent, parent_ops);
}
HRESULT CDECL wined3d_sampler_create(struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_sampler **sampler)
{
struct wined3d_sampler *object;
TRACE("device %p, desc %p, parent %p, sampler %p.\n", device, desc, parent, sampler);
TRACE("device %p, desc %p, parent %p, parent_ops %p, sampler %p.\n",
device, desc, parent, parent_ops, sampler);
if (desc->address_u < WINED3D_TADDRESS_WRAP || desc->address_u > WINED3D_TADDRESS_MIRROR_ONCE
|| desc->address_v < WINED3D_TADDRESS_WRAP || desc->address_v > WINED3D_TADDRESS_MIRROR_ONCE
@ -144,15 +147,7 @@ HRESULT CDECL wined3d_sampler_create(struct wined3d_device *device, const struct
|| desc->mip_filter > WINED3D_TEXF_LINEAR)
return WINED3DERR_INVALIDCALL;
if (!(object = heap_alloc_zero(sizeof(*object))))
return E_OUTOFMEMORY;
wined3d_sampler_init(object, device, desc, parent, parent_ops);
TRACE("Created sampler %p.\n", object);
*sampler = object;
return WINED3D_OK;
return device->adapter->adapter_ops->adapter_create_sampler(device, desc, parent, parent_ops, sampler);
}
static void texture_gl_apply_base_level(struct wined3d_texture_gl *texture_gl,

View File

@ -2805,6 +2805,9 @@ struct wined3d_adapter_ops
struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops,
struct wined3d_unordered_access_view **view);
void (*adapter_destroy_unordered_access_view)(struct wined3d_unordered_access_view *view);
HRESULT (*adapter_create_sampler)(struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_sampler **sampler);
void (*adapter_destroy_sampler)(struct wined3d_sampler *sampler);
};
/* The adapter structure */
@ -3800,6 +3803,14 @@ struct wined3d_sampler
void wined3d_sampler_bind(struct wined3d_sampler *sampler, unsigned int unit,
struct wined3d_texture_gl *texture_gl, const struct wined3d_context_gl *context_gl) DECLSPEC_HIDDEN;
void wined3d_sampler_gl_init(struct wined3d_sampler *sampler_gl,
struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
void wined3d_sampler_vk_init(struct wined3d_sampler *sampler_vk,
struct wined3d_device *device, const struct wined3d_sampler_desc *desc,
void *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
struct wined3d_vertex_declaration_element
{
const struct wined3d_format *format;