[PATCH 1/6] wined3d: Compute "buffer_type_hint" from buffer bind flags.
Józef Kucia
jkucia at codeweavers.com
Wed Nov 2 04:55:32 CDT 2016
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/wined3d/buffer.c | 31 +++++++++++++++++++++++--------
include/wine/wined3d.h | 9 +++++++++
2 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 13953c9..c9493c7 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -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))
{
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index e42ef77..9d234d6 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -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
--
2.7.3
More information about the wine-patches
mailing list