[PATCH] wined3d: Implement buffer texture range.
Guillaume Charifi
guillaume.charifi at sfr.fr
Sat Jan 28 17:25:33 CST 2017
---
dlls/wined3d/view.c | 35 +++++++++++++++++++++++++----------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 706d80c..81643c1 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -121,7 +121,7 @@ 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,
+static void create_buffer_texture(struct wined3d_gl_view *view, const struct wined3d_view_desc *desc,
struct wined3d_buffer *buffer, const struct wined3d_format *view_format)
{
const struct wined3d_gl_info *gl_info;
@@ -142,7 +142,25 @@ static void create_buffer_texture(struct wined3d_gl_view *view,
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));
+
+ if (desc->u.buffer.start_idx
+ || desc->u.buffer.count * view_format->byte_count != buffer->resource.size)
+ {
+ if (!gl_info->supported[ARB_TEXTURE_BUFFER_RANGE])
+ {
+ FIXME("Ignoring buffer range %u-%u.\n", desc->u.buffer.start_idx, desc->u.buffer.count);
+ GL_EXTCALL(glTexBuffer(GL_TEXTURE_BUFFER, view_format->glInternal, buffer->buffer_object));
+ }
+ else
+ {
+ GL_EXTCALL(glTexBufferRange(GL_TEXTURE_BUFFER, view_format->glInternal, buffer->buffer_object,
+ desc->u.buffer.start_idx, desc->u.buffer.count));
+ }
+ }
+ else
+ {
+ GL_EXTCALL(glTexBuffer(GL_TEXTURE_BUFFER, view_format->glInternal, buffer->buffer_object));
+ }
checkGLcall("Create buffer texture");
context_invalidate_state(context, STATE_SHADER_RESOURCE_BINDING);
@@ -456,14 +474,11 @@ static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_
}
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);
+ if (!desc->u.buffer.count
+ || (desc->u.buffer.start_idx + desc->u.buffer.count) * view_format->byte_count >= buffer->desc.byte_width)
+ return E_INVALIDARG;
+
+ create_buffer_texture(&view->gl_view, desc, buffer, view_format);
}
}
else
--
2.9.3
More information about the wine-patches
mailing list