=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Extract create_texture_view() function from shader resource views.
Alexandre Julliard
julliard at winehq.org
Fri Dec 9 13:37:33 CST 2016
Module: wine
Branch: master
Commit: 7d2bfe78518bbfaf3c2a2f48c43d5b85a3454af9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7d2bfe78518bbfaf3c2a2f48c43d5b85a3454af9
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Fri Dec 9 11:30:41 2016 +0100
wined3d: Extract create_texture_view() function from shader resource views.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/view.c | 120 ++++++++++++++++++++---------------------
dlls/wined3d/wined3d_private.h | 9 +++-
2 files changed, 67 insertions(+), 62 deletions(-)
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index adbd159..036edf3 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -30,6 +30,57 @@ static BOOL is_stencil_view_format(const struct wined3d_format *format)
|| format->id == WINED3DFMT_X32_TYPELESS_G8X24_UINT;
}
+static void create_texture_view(struct wined3d_gl_view *view, GLenum view_target,
+ const struct wined3d_view_desc *desc, struct wined3d_texture *texture,
+ const struct wined3d_format *view_format)
+{
+ const struct wined3d_gl_info *gl_info;
+ struct wined3d_context *context;
+ struct gl_texture *gl_texture;
+
+ view->target = view_target;
+
+ context = context_acquire(texture->resource.device, NULL);
+ gl_info = context->gl_info;
+
+ if (!gl_info->supported[ARB_TEXTURE_VIEW])
+ {
+ context_release(context);
+ FIXME("OpenGL implementation does not support texture views.\n");
+ return;
+ }
+
+ wined3d_texture_prepare_texture(texture, context, FALSE);
+ gl_texture = wined3d_texture_get_gl_texture(texture, FALSE);
+
+ gl_info->gl_ops.gl.p_glGenTextures(1, &view->name);
+ GL_EXTCALL(glTextureView(view->name, view->target, gl_texture->name, view_format->glInternal,
+ desc->u.texture.level_idx, desc->u.texture.level_count,
+ desc->u.texture.layer_idx, desc->u.texture.layer_count));
+ checkGLcall("Create texture view");
+
+ if (is_stencil_view_format(view_format))
+ {
+ static const GLint swizzle[] = {GL_ZERO, GL_RED, GL_ZERO, GL_ZERO};
+
+ if (!gl_info->supported[ARB_STENCIL_TEXTURING])
+ {
+ context_release(context);
+ FIXME("OpenGL implementation does not support stencil texturing.\n");
+ return;
+ }
+
+ context_bind_texture(context, view->target, view->name);
+ gl_info->gl_ops.gl.p_glTexParameteriv(view->target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
+ gl_info->gl_ops.gl.p_glTexParameteri(view->target, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
+ checkGLcall("Initialize stencil view");
+
+ 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);
@@ -259,14 +310,14 @@ static void wined3d_shader_resource_view_destroy_object(void *object)
{
struct wined3d_shader_resource_view *view = object;
- if (view->object)
+ if (view->gl_view.name)
{
const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
context = context_acquire(view->resource->device, NULL);
gl_info = context->gl_info;
- gl_info->gl_ops.gl.p_glDeleteTextures(1, &view->object);
+ gl_info->gl_ops.gl.p_glDeleteTextures(1, &view->gl_view.name);
checkGLcall("glDeleteTextures");
context_release(context);
}
@@ -302,55 +353,6 @@ void * CDECL wined3d_shader_resource_view_get_parent(const struct wined3d_shader
return view->parent;
}
-static void wined3d_shader_resource_view_create_texture_view(struct wined3d_shader_resource_view *view,
- const struct wined3d_view_desc *desc, struct wined3d_texture *texture,
- const struct wined3d_format *view_format)
-{
- const struct wined3d_gl_info *gl_info;
- struct wined3d_context *context;
- struct gl_texture *gl_texture;
-
- context = context_acquire(texture->resource.device, NULL);
- gl_info = context->gl_info;
-
- if (!gl_info->supported[ARB_TEXTURE_VIEW])
- {
- context_release(context);
- FIXME("OpenGL implementation does not support texture views.\n");
- return;
- }
-
- wined3d_texture_prepare_texture(texture, context, FALSE);
- gl_texture = wined3d_texture_get_gl_texture(texture, FALSE);
-
- gl_info->gl_ops.gl.p_glGenTextures(1, &view->object);
- GL_EXTCALL(glTextureView(view->object, view->target, gl_texture->name, view_format->glInternal,
- desc->u.texture.level_idx, desc->u.texture.level_count,
- desc->u.texture.layer_idx, desc->u.texture.layer_count));
- checkGLcall("Create texture view");
-
- if (is_stencil_view_format(view_format))
- {
- static const GLint swizzle[] = {GL_ZERO, GL_RED, GL_ZERO, GL_ZERO};
-
- if (!gl_info->supported[ARB_STENCIL_TEXTURING])
- {
- context_release(context);
- FIXME("OpenGL implementation does not support stencil texturing.\n");
- return;
- }
-
- context_bind_texture(context, view->target, view->object);
- gl_info->gl_ops.gl.p_glTexParameteriv(view->target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
- gl_info->gl_ops.gl.p_glTexParameteri(view->target, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
- checkGLcall("Initialize stencil view");
-
- context_invalidate_state(context, STATE_SHADER_RESOURCE_BINDING);
- }
-
- context_release(context);
-}
-
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)
@@ -373,6 +375,7 @@ static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_
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);
if (wined3d_format_is_typeless(view_format)
@@ -386,9 +389,6 @@ static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_
view->parent = parent;
view->parent_ops = parent_ops;
- view->target = GL_NONE;
- view->object = 0;
-
if (resource->type == WINED3D_RTYPE_BUFFER)
{
FIXME("Buffer shader resource views not supported.\n");
@@ -406,19 +406,19 @@ static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_
|| desc->u.texture.layer_count > texture->layer_count - desc->u.texture.layer_idx)
return E_INVALIDARG;
- view->target = texture->target;
+ view_target = texture->target;
for (i = 0; i < ARRAY_SIZE(view_types); ++i)
{
if (view_types[i].texture_target == texture->target && view_types[i].view_flags == desc->flags)
{
- view->target = view_types[i].view_target;
+ view_target = view_types[i].view_target;
break;
}
}
if (i == ARRAY_SIZE(view_types))
FIXME("Unhandled view flags %#x for texture target %#x.\n", desc->flags, texture->target);
- if (resource->format->id == view_format->id && texture->target == view->target
+ 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))
@@ -432,7 +432,7 @@ static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_
else if (resource->format->typeless_id == view_format->typeless_id
&& resource->format->gl_view_class == view_format->gl_view_class)
{
- wined3d_shader_resource_view_create_texture_view(view, desc, texture, view_format);
+ create_texture_view(&view->gl_view, view_target, desc, texture, view_format);
}
else
{
@@ -476,9 +476,9 @@ void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view
{
struct wined3d_texture *texture;
- if (view->object)
+ if (view->gl_view.name)
{
- context_bind_texture(context, view->target, view->object);
+ context_bind_texture(context, view->gl_view.target, view->gl_view.name);
return;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index dd2754b..29143be 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3292,6 +3292,12 @@ static inline struct wined3d_surface *wined3d_rendertarget_view_get_surface(
void wined3d_rendertarget_view_get_drawable_size(const struct wined3d_rendertarget_view *view,
const struct wined3d_context *context, unsigned int *width, unsigned int *height) DECLSPEC_HIDDEN;
+struct wined3d_gl_view
+{
+ GLenum target;
+ GLuint name;
+};
+
struct wined3d_shader_resource_view
{
LONG refcount;
@@ -3300,8 +3306,7 @@ struct wined3d_shader_resource_view
void *parent;
const struct wined3d_parent_ops *parent_ops;
- GLenum target;
- GLuint object;
+ struct wined3d_gl_view gl_view;
};
void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view,
More information about the wine-cvs
mailing list