From: Guillaume Charifi Subject: [PATCH 2/2] wined3d: Implement buffer texture range. Message-Id: <20170129103644.5864-2-guillaume.charifi@sfr.fr> Date: Sun, 29 Jan 2017 11:36:44 +0100 In-Reply-To: <20170129103644.5864-1-guillaume.charifi@sfr.fr> References: <20170129103644.5864-1-guillaume.charifi@sfr.fr> Signed-off-by: Guillaume Charifi --- 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 -- Guillaume Charifi