wined3d: Extract create_texture_view() function from shader resource views.
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
2498988338
commit
7d2bfe7851
|
@ -30,6 +30,57 @@ static BOOL is_stencil_view_format(const struct wined3d_format *format)
|
||||||
|| format->id == WINED3DFMT_X32_TYPELESS_G8X24_UINT;
|
|| 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 CDECL wined3d_rendertarget_view_incref(struct wined3d_rendertarget_view *view)
|
||||||
{
|
{
|
||||||
ULONG refcount = InterlockedIncrement(&view->refcount);
|
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;
|
struct wined3d_shader_resource_view *view = object;
|
||||||
|
|
||||||
if (view->object)
|
if (view->gl_view.name)
|
||||||
{
|
{
|
||||||
const struct wined3d_gl_info *gl_info;
|
const struct wined3d_gl_info *gl_info;
|
||||||
struct wined3d_context *context;
|
struct wined3d_context *context;
|
||||||
|
|
||||||
context = context_acquire(view->resource->device, NULL);
|
context = context_acquire(view->resource->device, NULL);
|
||||||
gl_info = context->gl_info;
|
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");
|
checkGLcall("glDeleteTextures");
|
||||||
context_release(context);
|
context_release(context);
|
||||||
}
|
}
|
||||||
|
@ -302,55 +353,6 @@ void * CDECL wined3d_shader_resource_view_get_parent(const struct wined3d_shader
|
||||||
return view->parent;
|
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,
|
static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_view *view,
|
||||||
const struct wined3d_view_desc *desc, struct wined3d_resource *resource,
|
const struct wined3d_view_desc *desc, struct wined3d_resource *resource,
|
||||||
void *parent, const struct wined3d_parent_ops *parent_ops)
|
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_gl_info *gl_info = &resource->device->adapter->gl_info;
|
||||||
const struct wined3d_format *view_format;
|
const struct wined3d_format *view_format;
|
||||||
|
GLenum view_target;
|
||||||
|
|
||||||
view_format = wined3d_get_format(gl_info, desc->format_id);
|
view_format = wined3d_get_format(gl_info, desc->format_id);
|
||||||
if (wined3d_format_is_typeless(view_format)
|
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 = parent;
|
||||||
view->parent_ops = parent_ops;
|
view->parent_ops = parent_ops;
|
||||||
|
|
||||||
view->target = GL_NONE;
|
|
||||||
view->object = 0;
|
|
||||||
|
|
||||||
if (resource->type == WINED3D_RTYPE_BUFFER)
|
if (resource->type == WINED3D_RTYPE_BUFFER)
|
||||||
{
|
{
|
||||||
FIXME("Buffer shader resource views not supported.\n");
|
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)
|
|| desc->u.texture.layer_count > texture->layer_count - desc->u.texture.layer_idx)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
view->target = texture->target;
|
view_target = texture->target;
|
||||||
for (i = 0; i < ARRAY_SIZE(view_types); ++i)
|
for (i = 0; i < ARRAY_SIZE(view_types); ++i)
|
||||||
{
|
{
|
||||||
if (view_types[i].texture_target == texture->target && view_types[i].view_flags == desc->flags)
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i == ARRAY_SIZE(view_types))
|
if (i == ARRAY_SIZE(view_types))
|
||||||
FIXME("Unhandled view flags %#x for texture target %#x.\n", desc->flags, texture->target);
|
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.level_idx && desc->u.texture.level_count == texture->level_count
|
||||||
&& !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture->layer_count
|
&& !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture->layer_count
|
||||||
&& !is_stencil_view_format(view_format))
|
&& !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
|
else if (resource->format->typeless_id == view_format->typeless_id
|
||||||
&& resource->format->gl_view_class == view_format->gl_view_class)
|
&& 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
|
else
|
||||||
{
|
{
|
||||||
|
@ -476,9 +476,9 @@ void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view
|
||||||
{
|
{
|
||||||
struct wined3d_texture *texture;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
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;
|
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
|
struct wined3d_shader_resource_view
|
||||||
{
|
{
|
||||||
LONG refcount;
|
LONG refcount;
|
||||||
|
@ -3300,8 +3306,7 @@ struct wined3d_shader_resource_view
|
||||||
void *parent;
|
void *parent;
|
||||||
const struct wined3d_parent_ops *parent_ops;
|
const struct wined3d_parent_ops *parent_ops;
|
||||||
|
|
||||||
GLenum target;
|
struct wined3d_gl_view gl_view;
|
||||||
GLuint object;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view,
|
void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view,
|
||||||
|
|
Loading…
Reference in New Issue