wined3d: Compute "buffer_type_hint" from buffer bind flags.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2016-11-02 10:55:32 +01:00 committed by Alexandre Julliard
parent d38c0c3b7c
commit e3c692151f
2 changed files with 32 additions and 8 deletions

View File

@ -1410,14 +1410,28 @@ static const struct wined3d_resource_ops buffer_resource_ops =
buffer_resource_sub_resource_unmap,
};
static GLenum buffer_type_hint_from_bind_flags(unsigned int bind_flags)
{
if (bind_flags == WINED3D_BIND_INDEX_BUFFER)
return GL_ELEMENT_ARRAY_BUFFER;
if (bind_flags & WINED3D_BIND_CONSTANT_BUFFER)
return GL_UNIFORM_BUFFER;
if (bind_flags & ~(WINED3D_BIND_VERTEX_BUFFER | WINED3D_BIND_INDEX_BUFFER))
FIXME("Unhandled bind flags %#x.\n", bind_flags);
return GL_ARRAY_BUFFER;
}
static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device *device,
UINT size, DWORD usage, enum wined3d_format_id format_id, enum wined3d_pool pool, GLenum bind_hint,
UINT size, DWORD usage, enum wined3d_format_id format_id, enum wined3d_pool pool, unsigned int bind_flags,
const struct wined3d_sub_resource_data *data, void *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
const struct wined3d_format *format = wined3d_get_format(gl_info, format_id);
HRESULT hr;
BOOL dynamic_buffer_ok;
HRESULT hr;
if (!size)
{
@ -1438,11 +1452,12 @@ static HRESULT buffer_init(struct wined3d_buffer *buffer, struct wined3d_device
WARN("Failed to initialize resource, hr %#x.\n", hr);
return hr;
}
buffer->buffer_type_hint = bind_hint;
buffer->buffer_type_hint = buffer_type_hint_from_bind_flags(bind_flags);
buffer->locations = WINED3D_LOCATION_SYSMEM;
TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage,
debug_d3dformat(buffer->resource.format->id), buffer->resource.heap_memory, buffer);
TRACE("buffer %p, size %#x, usage %#x, format %s, memory @ %p.\n",
buffer, buffer->resource.size, buffer->resource.usage,
debug_d3dformat(buffer->resource.format->id), buffer->resource.heap_memory);
if (device->create_parms.flags & WINED3DCREATE_SOFTWARE_VERTEXPROCESSING || pool == WINED3D_POOL_MANAGED)
{
@ -1509,7 +1524,7 @@ HRESULT CDECL wined3d_buffer_create(struct wined3d_device *device, const struct
FIXME("Ignoring access flags (pool).\n");
hr = buffer_init(object, device, desc->byte_width, desc->usage, WINED3DFMT_UNKNOWN,
WINED3D_POOL_MANAGED, GL_ARRAY_BUFFER_ARB, data, parent, parent_ops);
WINED3D_POOL_MANAGED, desc->bind_flags, data, parent, parent_ops);
if (FAILED(hr))
{
WARN("Failed to initialize buffer, hr %#x.\n", hr);
@ -1551,7 +1566,7 @@ HRESULT CDECL wined3d_buffer_create_vb(struct wined3d_device *device, UINT size,
}
hr = buffer_init(object, device, size, usage, WINED3DFMT_VERTEXDATA,
pool, GL_ARRAY_BUFFER_ARB, NULL, parent, parent_ops);
pool, WINED3D_BIND_VERTEX_BUFFER, NULL, parent, parent_ops);
if (FAILED(hr))
{
WARN("Failed to initialize buffer, hr %#x.\n", hr);
@ -1582,7 +1597,7 @@ HRESULT CDECL wined3d_buffer_create_ib(struct wined3d_device *device, UINT size,
}
hr = buffer_init(object, device, size, usage | WINED3DUSAGE_STATICDECL,
WINED3DFMT_UNKNOWN, pool, GL_ELEMENT_ARRAY_BUFFER_ARB, NULL,
WINED3DFMT_UNKNOWN, pool, WINED3D_BIND_INDEX_BUFFER, NULL,
parent, parent_ops);
if (FAILED(hr))
{

View File

@ -834,6 +834,15 @@ enum wined3d_display_rotation
#define WINED3DDP_MAXTEXCOORD 8
#define WINED3D_BIND_VERTEX_BUFFER 0x00000001
#define WINED3D_BIND_INDEX_BUFFER 0x00000002
#define WINED3D_BIND_CONSTANT_BUFFER 0x00000004
#define WINED3D_BIND_SHADER_RESOURCE 0x00000008
#define WINED3D_BIND_STREAM_OUTPUT 0x00000010
#define WINED3D_BIND_RENDER_TARGET 0x00000020
#define WINED3D_BIND_DEPTH_STENCIL 0x00000040
#define WINED3D_BIND_UNORDERED_ACCESS 0x00000080
#define WINED3DUSAGE_RENDERTARGET 0x00000001
#define WINED3DUSAGE_DEPTHSTENCIL 0x00000002
#define WINED3DUSAGE_WRITEONLY 0x00000008