Henri Verbeet : wined3d: Send shader resource view GL initialisation through the command stream.
Alexandre Julliard
julliard at winehq.org
Thu Feb 16 15:12:28 CST 2017
Module: wine
Branch: master
Commit: a772bbdfdaec60131a2068ee6ecac205fabe8242
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a772bbdfdaec60131a2068ee6ecac205fabe8242
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Thu Feb 16 00:58:54 2017 +0100
wined3d: Send shader resource view GL initialisation through the command stream.
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/view.c | 121 +++++++++++++++++++++++++----------------
dlls/wined3d/wined3d_private.h | 3 +
2 files changed, 78 insertions(+), 46 deletions(-)
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 7919e2e..50e6e0a 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -177,7 +177,7 @@ static void create_buffer_texture(struct wined3d_gl_view *view,
context_release(context);
}
-static HRESULT create_buffer_view(struct wined3d_gl_view *view,
+static void create_buffer_view(struct wined3d_gl_view *view,
const struct wined3d_view_desc *desc, struct wined3d_buffer *buffer,
const struct wined3d_format *view_format)
{
@@ -186,22 +186,13 @@ static HRESULT create_buffer_view(struct wined3d_gl_view *view,
if (desc->format_id == WINED3DFMT_UNKNOWN)
{
FIXME("Structured buffer views not supported.\n");
- return WINED3D_OK;
+ return;
}
- if (desc->u.buffer.start_idx > ~0u / view_format->byte_count
- || desc->u.buffer.count > ~0u / view_format->byte_count)
- return E_INVALIDARG;
-
offset = desc->u.buffer.start_idx * view_format->byte_count;
size = desc->u.buffer.count * view_format->byte_count;
- if (offset >= buffer->resource.size
- || size > buffer->resource.size - offset)
- return E_INVALIDARG;
-
create_buffer_texture(view, buffer, view_format, offset, size);
- return WINED3D_OK;
}
ULONG CDECL wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view *view)
@@ -476,13 +467,61 @@ void * CDECL wined3d_shader_resource_view_get_parent(const struct wined3d_shader
return view->parent;
}
+static void wined3d_shader_resource_view_cs_init(void *object)
+{
+ struct wined3d_shader_resource_view *view = object;
+ struct wined3d_resource *resource = view->resource;
+ const struct wined3d_format *view_format;
+ const struct wined3d_gl_info *gl_info;
+ const struct wined3d_view_desc *desc;
+ GLenum view_target;
+
+ view_format = view->format;
+ gl_info = &resource->device->adapter->gl_info;
+ desc = &view->desc;
+
+ if (resource->type == WINED3D_RTYPE_BUFFER)
+ {
+ struct wined3d_buffer *buffer = buffer_from_resource(resource);
+
+ create_buffer_view(&view->gl_view, desc, buffer, view_format);
+ }
+ else
+ {
+ struct wined3d_texture *texture = texture_from_resource(resource);
+
+ view_target = get_texture_view_target(gl_info, desc, texture);
+
+ if (resource->format->id == view_format->id && texture->target == view_target
+ && !desc->u.texture.level_idx && desc->u.texture.level_count == texture->level_count
+ && !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture->layer_count
+ && !is_stencil_view_format(view_format))
+ {
+ TRACE("Creating identity shader resource view.\n");
+ }
+ else if (texture->swapchain && texture->swapchain->desc.backbuffer_count > 1)
+ {
+ FIXME("Swapchain shader resource views not supported.\n");
+ }
+ else if (resource->format->typeless_id == view_format->typeless_id
+ && resource->format->gl_view_class == view_format->gl_view_class)
+ {
+ create_texture_view(&view->gl_view, view_target, desc, texture, view_format);
+ }
+ else
+ {
+ FIXME("Shader resource view not supported, resource format %s, view format %s.\n",
+ debug_d3dformat(resource->format->id), debug_d3dformat(view_format->id));
+ }
+ }
+}
+
static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_view *view,
const struct wined3d_view_desc *desc, struct wined3d_resource *resource,
void *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &resource->device->adapter->gl_info;
const struct wined3d_format *view_format;
- GLenum view_target;
view_format = wined3d_get_format(gl_info, desc->format_id, resource->usage);
if (resource->type == WINED3D_RTYPE_BUFFER && desc->flags & WINED3D_VIEW_BUFFER_RAW)
@@ -502,17 +541,17 @@ static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_
return E_INVALIDARG;
}
- view->refcount = 1;
- view->parent = parent;
- view->parent_ops = parent_ops;
-
if (resource->type == WINED3D_RTYPE_BUFFER)
{
struct wined3d_buffer *buffer = buffer_from_resource(resource);
- HRESULT hr;
- if (FAILED(hr = create_buffer_view(&view->gl_view, desc, buffer, view_format)))
- return hr;
+ if (view_format->byte_count)
+ {
+ unsigned int buffer_size = buffer->resource.size / view_format->byte_count;
+ if (desc->u.buffer.start_idx >= buffer_size
+ || desc->u.buffer.count > buffer_size - desc->u.buffer.start_idx)
+ return E_INVALIDARG;
+ }
}
else
{
@@ -525,32 +564,16 @@ static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_
|| desc->u.texture.layer_idx >= texture->layer_count
|| desc->u.texture.layer_count > texture->layer_count - desc->u.texture.layer_idx)
return E_INVALIDARG;
-
- view_target = get_texture_view_target(gl_info, desc, texture);
-
- if (resource->format->id == view_format->id && texture->target == view_target
- && !desc->u.texture.level_idx && desc->u.texture.level_count == texture->level_count
- && !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture->layer_count
- && !is_stencil_view_format(view_format))
- {
- TRACE("Creating identity shader resource view.\n");
- }
- else if (texture->swapchain && texture->swapchain->desc.backbuffer_count > 1)
- {
- FIXME("Swapchain shader resource views not supported.\n");
- }
- else if (resource->format->typeless_id == view_format->typeless_id
- && resource->format->gl_view_class == view_format->gl_view_class)
- {
- create_texture_view(&view->gl_view, view_target, desc, texture, view_format);
- }
- else
- {
- FIXME("Shader resource view not supported, resource format %s, view format %s.\n",
- debug_d3dformat(resource->format->id), debug_d3dformat(view_format->id));
- }
}
+
+ view->refcount = 1;
wined3d_resource_incref(view->resource = resource);
+ view->parent = parent;
+ view->parent_ops = parent_ops;
+ view->format = view_format;
+ view->desc = *desc;
+
+ wined3d_cs_init_object(resource->device->cs, wined3d_shader_resource_view_cs_init, view);
return WINED3D_OK;
}
@@ -696,10 +719,16 @@ static HRESULT wined3d_unordered_access_view_init(struct wined3d_unordered_acces
if (resource->type == WINED3D_RTYPE_BUFFER)
{
struct wined3d_buffer *buffer = buffer_from_resource(resource);
- HRESULT hr;
- if (FAILED(hr = create_buffer_view(&view->gl_view, desc, buffer, view->format)))
- return hr;
+ if (view->format->byte_count)
+ {
+ unsigned int buffer_size = buffer->resource.size / view->format->byte_count;
+ if (desc->u.buffer.start_idx >= buffer_size
+ || desc->u.buffer.count > buffer_size - desc->u.buffer.start_idx)
+ return E_INVALIDARG;
+ }
+
+ create_buffer_view(&view->gl_view, desc, buffer, view->format);
}
else
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f6b42e5..512d33d 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3352,6 +3352,9 @@ struct wined3d_shader_resource_view
void *parent;
const struct wined3d_parent_ops *parent_ops;
+ const struct wined3d_format *format;
+ struct wined3d_view_desc desc;
+
struct wined3d_gl_view gl_view;
};
More information about the wine-cvs
mailing list