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:
parent
669e3ac3de
commit
41995669d0
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue