[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