[PATCH 05/11] wined3d: Add initial support for shader buffer views.
Józef Kucia
jkucia at codeweavers.com
Thu Jan 26 06:07:31 CST 2017
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/wined3d/buffer.c | 2 +-
dlls/wined3d/view.c | 51 +++++++++++++++++++++++++++++++++++++++++-
dlls/wined3d/wined3d_private.h | 2 ++
3 files changed, 53 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 6883b40..7d0552b 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -567,7 +567,7 @@ static BOOL wined3d_buffer_prepare_location(struct wined3d_buffer *buffer,
}
}
-static BOOL wined3d_buffer_load_location(struct wined3d_buffer *buffer,
+BOOL wined3d_buffer_load_location(struct wined3d_buffer *buffer,
struct wined3d_context *context, DWORD location)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 18b7180..c63d913 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -121,6 +121,35 @@ static void create_texture_view(struct wined3d_gl_view *view, GLenum view_target
context_release(context);
}
+static void create_buffer_texture(struct wined3d_gl_view *view,
+ struct wined3d_buffer *buffer, const struct wined3d_format *view_format)
+{
+ const struct wined3d_gl_info *gl_info;
+ struct wined3d_context *context;
+
+ context = context_acquire(buffer->resource.device, NULL);
+ gl_info = context->gl_info;
+ if (!gl_info->supported[ARB_TEXTURE_BUFFER_OBJECT])
+ {
+ FIXME("OpenGL implementation does not support buffer textures.\n");
+ context_release(context);
+ return;
+ }
+
+ wined3d_buffer_load_location(buffer, context, WINED3D_LOCATION_BUFFER);
+
+ view->target = GL_TEXTURE_BUFFER;
+ gl_info->gl_ops.gl.p_glGenTextures(1, &view->name);
+
+ context_bind_texture(context, GL_TEXTURE_BUFFER, view->name);
+ GL_EXTCALL(glTexBuffer(GL_TEXTURE_BUFFER, view_format->glInternal, buffer->buffer_object));
+ checkGLcall("Create buffer texture");
+
+ context_invalidate_state(context, STATE_SHADER_RESOURCE_BINDING);
+
+ context_release(context);
+}
+
ULONG CDECL wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view *view)
{
ULONG refcount = InterlockedIncrement(&view->refcount);
@@ -415,7 +444,27 @@ static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_
if (resource->type == WINED3D_RTYPE_BUFFER)
{
- FIXME("Buffer shader resource views not supported.\n");
+ struct wined3d_buffer *buffer = buffer_from_resource(resource);
+
+ if (desc->format_id == WINED3DFMT_UNKNOWN)
+ {
+ FIXME("Structured buffer views not supported.\n");
+ }
+ else if (desc->flags & WINED3D_VIEW_BUFFER_RAW)
+ {
+ FIXME("Raw buffer views not supported.\n");
+ }
+ else
+ {
+ /* FIXME: Support for buffer offsets can be implemented using ARB_texture_buffer_range. */
+ if (desc->u.buffer.start_idx
+ || desc->u.buffer.count * view_format->byte_count != buffer->resource.size)
+ {
+ FIXME("Ignoring buffer range %u-%u.\n", desc->u.buffer.start_idx, desc->u.buffer.count);
+ }
+
+ create_buffer_texture(&view->gl_view, buffer, view_format);
+ }
}
else
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index ee2eaad..9a4a817 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3259,6 +3259,8 @@ DWORD wined3d_buffer_get_memory(struct wined3d_buffer *buffer,
void wined3d_buffer_invalidate_location(struct wined3d_buffer *buffer, DWORD location) DECLSPEC_HIDDEN;
void wined3d_buffer_load(struct wined3d_buffer *buffer, struct wined3d_context *context,
const struct wined3d_state *state) DECLSPEC_HIDDEN;
+BOOL wined3d_buffer_load_location(struct wined3d_buffer *buffer,
+ struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
BYTE *wined3d_buffer_load_sysmem(struct wined3d_buffer *buffer, struct wined3d_context *context) DECLSPEC_HIDDEN;
HRESULT wined3d_buffer_copy(struct wined3d_buffer *dst_buffer, unsigned int dst_offset,
struct wined3d_buffer *src_buffer, unsigned int src_offset, unsigned int size) DECLSPEC_HIDDEN;
--
2.10.2
More information about the wine-patches
mailing list