ReactOS 0.4.15-dev-7788-g1ad9096
view.c File Reference
#include "config.h"
#include "wine/port.h"
#include "wined3d_private.h"
Include dependency graph for view.c:

Go to the source code of this file.

Macros

#define WINED3D_VIEW_CUBE_ARRAY   (WINED3D_VIEW_TEXTURE_CUBE | WINED3D_VIEW_TEXTURE_ARRAY)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (d3d)
 
static BOOL is_stencil_view_format (const struct wined3d_format *format)
 
static GLenum get_texture_view_target (const struct wined3d_gl_info *gl_info, const struct wined3d_view_desc *desc, const struct wined3d_texture *texture)
 
static const struct wined3d_formatvalidate_resource_view (const struct wined3d_view_desc *desc, struct wined3d_resource *resource, BOOL mip_slice, BOOL allow_srgb_toggle)
 
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)
 
static void create_buffer_texture (struct wined3d_gl_view *view, struct wined3d_context *context, struct wined3d_buffer *buffer, const struct wined3d_format *view_format, unsigned int offset, unsigned int size)
 
static void get_buffer_view_range (const struct wined3d_buffer *buffer, const struct wined3d_view_desc *desc, const struct wined3d_format *view_format, unsigned int *offset, unsigned int *size)
 
static void create_buffer_view (struct wined3d_gl_view *view, struct wined3d_context *context, const struct wined3d_view_desc *desc, struct wined3d_buffer *buffer, const struct wined3d_format *view_format)
 
static void wined3d_view_invalidate_location (struct wined3d_resource *resource, const struct wined3d_view_desc *desc, DWORD location)
 
ULONG CDECL wined3d_rendertarget_view_incref (struct wined3d_rendertarget_view *view)
 
static void wined3d_rendertarget_view_destroy_object (void *object)
 
ULONG CDECL wined3d_rendertarget_view_decref (struct wined3d_rendertarget_view *view)
 
void *CDECL wined3d_rendertarget_view_get_parent (const struct wined3d_rendertarget_view *view)
 
void *CDECL wined3d_rendertarget_view_get_sub_resource_parent (const struct wined3d_rendertarget_view *view)
 
void CDECL wined3d_rendertarget_view_set_parent (struct wined3d_rendertarget_view *view, void *parent)
 
struct wined3d_resource *CDECL wined3d_rendertarget_view_get_resource (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)
 
void wined3d_rendertarget_view_prepare_location (struct wined3d_rendertarget_view *view, struct wined3d_context *context, DWORD location)
 
void wined3d_rendertarget_view_load_location (struct wined3d_rendertarget_view *view, struct wined3d_context *context, DWORD location)
 
void wined3d_rendertarget_view_validate_location (struct wined3d_rendertarget_view *view, DWORD location)
 
void wined3d_rendertarget_view_invalidate_location (struct wined3d_rendertarget_view *view, DWORD location)
 
static void wined3d_render_target_view_cs_init (void *object)
 
static HRESULT wined3d_rendertarget_view_init (struct wined3d_rendertarget_view *view, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
 
HRESULT CDECL wined3d_rendertarget_view_create (const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_rendertarget_view **view)
 
HRESULT CDECL wined3d_rendertarget_view_create_from_sub_resource (struct wined3d_texture *texture, unsigned int sub_resource_idx, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_rendertarget_view **view)
 
ULONG CDECL wined3d_shader_resource_view_incref (struct wined3d_shader_resource_view *view)
 
static void wined3d_shader_resource_view_destroy_object (void *object)
 
ULONG CDECL wined3d_shader_resource_view_decref (struct wined3d_shader_resource_view *view)
 
void *CDECL wined3d_shader_resource_view_get_parent (const struct wined3d_shader_resource_view *view)
 
static void wined3d_shader_resource_view_cs_init (void *object)
 
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)
 
HRESULT CDECL wined3d_shader_resource_view_create (const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader_resource_view **view)
 
void wined3d_shader_resource_view_bind (struct wined3d_shader_resource_view *view, unsigned int unit, struct wined3d_sampler *sampler, struct wined3d_context *context)
 
static void shader_resource_view_bind_and_dirtify (struct wined3d_shader_resource_view *view, struct wined3d_context *context)
 
void shader_resource_view_generate_mipmaps (struct wined3d_shader_resource_view *view)
 
void CDECL wined3d_shader_resource_view_generate_mipmaps (struct wined3d_shader_resource_view *view)
 
ULONG CDECL wined3d_unordered_access_view_incref (struct wined3d_unordered_access_view *view)
 
static void wined3d_unordered_access_view_destroy_object (void *object)
 
ULONG CDECL wined3d_unordered_access_view_decref (struct wined3d_unordered_access_view *view)
 
void *CDECL wined3d_unordered_access_view_get_parent (const struct wined3d_unordered_access_view *view)
 
void wined3d_unordered_access_view_invalidate_location (struct wined3d_unordered_access_view *view, DWORD location)
 
void wined3d_unordered_access_view_clear_uint (struct wined3d_unordered_access_view *view, const struct wined3d_uvec4 *clear_value, struct wined3d_context *context)
 
void wined3d_unordered_access_view_set_counter (struct wined3d_unordered_access_view *view, unsigned int value)
 
void wined3d_unordered_access_view_copy_counter (struct wined3d_unordered_access_view *view, struct wined3d_buffer *buffer, unsigned int offset, struct wined3d_context *context)
 
static void wined3d_unordered_access_view_cs_init (void *object)
 
static HRESULT wined3d_unordered_access_view_init (struct wined3d_unordered_access_view *view, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
 
HRESULT CDECL wined3d_unordered_access_view_create (const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_unordered_access_view **view)
 

Macro Definition Documentation

◆ WINED3D_VIEW_CUBE_ARRAY

#define WINED3D_VIEW_CUBE_ARRAY   (WINED3D_VIEW_TEXTURE_CUBE | WINED3D_VIEW_TEXTURE_ARRAY)

Definition at line 27 of file view.c.

Function Documentation

◆ create_buffer_texture()

static void create_buffer_texture ( struct wined3d_gl_view view,
struct wined3d_context context,
struct wined3d_buffer buffer,
const struct wined3d_format view_format,
unsigned int  offset,
unsigned int  size 
)
static

Definition at line 230 of file view.c.

233{
234 const struct wined3d_gl_info *gl_info = context->gl_info;
235
237 {
238 FIXME("OpenGL implementation does not support buffer textures.\n");
239 return;
240 }
241
242 if ((offset & (gl_info->limits.texture_buffer_offset_alignment - 1)))
243 {
244 FIXME("Buffer offset %u is not %u byte aligned.\n",
245 offset, gl_info->limits.texture_buffer_offset_alignment);
246 return;
247 }
248
250
251 view->target = GL_TEXTURE_BUFFER;
252 gl_info->gl_ops.gl.p_glGenTextures(1, &view->name);
253
256 {
257 GL_EXTCALL(glTexBufferRange(GL_TEXTURE_BUFFER, view_format->glInternal,
258 buffer->buffer_object, offset, size));
259 }
260 else
261 {
262 if (offset || size != buffer->resource.size)
263 FIXME("OpenGL implementation does not support ARB_texture_buffer_range.\n");
264 GL_EXTCALL(glTexBuffer(GL_TEXTURE_BUFFER, view_format->glInternal, buffer->buffer_object));
265 }
266 checkGLcall("Create buffer texture");
267
270}
#define FIXME(fmt,...)
Definition: debug.h:111
BOOL wined3d_buffer_load_location(struct wined3d_buffer *buffer, struct wined3d_context *context, DWORD location)
Definition: buffer.c:641
void context_invalidate_compute_state(struct wined3d_context *context, DWORD state_id)
Definition: context.c:1642
void context_bind_texture(struct wined3d_context *context, GLenum target, GLuint name)
Definition: context.c:2734
void context_invalidate_state(struct wined3d_context *context, DWORD state)
Definition: context.c:1652
GLsizeiptr size
Definition: glext.h:5919
GLuint buffer
Definition: glext.h:5915
#define GL_TEXTURE_BUFFER
Definition: glext.h:748
GLintptr offset
Definition: glext.h:5920
Definition: http.c:7252
BOOL supported[WINED3D_GL_EXT_COUNT]
struct opengl_funcs gl_ops
struct wined3d_gl_limits limits
@ ARB_TEXTURE_BUFFER_OBJECT
Definition: wined3d_gl.h:108
@ ARB_TEXTURE_BUFFER_RANGE
Definition: wined3d_gl.h:109
#define STATE_GRAPHICS_SHADER_RESOURCE_BINDING
#define WINED3D_LOCATION_BUFFER
#define GL_EXTCALL(f)
#define STATE_COMPUTE_SHADER_RESOURCE_BINDING
#define checkGLcall(A)

Referenced by create_buffer_view().

◆ create_buffer_view()

static void create_buffer_view ( struct wined3d_gl_view view,
struct wined3d_context context,
const struct wined3d_view_desc desc,
struct wined3d_buffer buffer,
const struct wined3d_format view_format 
)
static

Definition at line 288 of file view.c.

291{
292 unsigned int offset, size;
293
294 get_buffer_view_range(buffer, desc, view_format, &offset, &size);
296}
static void get_buffer_view_range(const struct wined3d_buffer *buffer, const struct wined3d_view_desc *desc, const struct wined3d_format *view_format, unsigned int *offset, unsigned int *size)
Definition: view.c:272
static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_context *context, struct wined3d_buffer *buffer, const struct wined3d_format *view_format, unsigned int offset, unsigned int size)
Definition: view.c:230
static const WCHAR desc[]
Definition: protectdata.c:36

Referenced by wined3d_shader_resource_view_cs_init(), and wined3d_unordered_access_view_cs_init().

◆ create_texture_view()

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 
)
static

Definition at line 168 of file view.c.

171{
172 const struct wined3d_gl_info *gl_info;
173 unsigned int layer_idx, layer_count;
174 struct wined3d_context *context;
175 GLuint texture_name;
176
177 view->target = view_target;
178
179 context = context_acquire(texture->resource.device, NULL, 0);
180 gl_info = context->gl_info;
181
182 if (!gl_info->supported[ARB_TEXTURE_VIEW])
183 {
185 FIXME("OpenGL implementation does not support texture views.\n");
186 return;
187 }
188
191
192 layer_idx = desc->u.texture.layer_idx;
193 layer_count = desc->u.texture.layer_count;
194 if (view_target == GL_TEXTURE_3D && (layer_idx || layer_count != 1))
195 {
196 FIXME("Depth slice (%u-%u) not supported.\n", layer_idx, layer_count);
197 layer_idx = 0;
198 layer_count = 1;
199 }
200
201 gl_info->gl_ops.gl.p_glGenTextures(1, &view->name);
202 GL_EXTCALL(glTextureView(view->name, view->target, texture_name, view_format->glInternal,
203 desc->u.texture.level_idx, desc->u.texture.level_count,
204 layer_idx, layer_count));
205 checkGLcall("Create texture view");
206
207 if (is_stencil_view_format(view_format))
208 {
209 static const GLint swizzle[] = {GL_ZERO, GL_RED, GL_ZERO, GL_ZERO};
210
211 if (!gl_info->supported[ARB_STENCIL_TEXTURING])
212 {
214 FIXME("OpenGL implementation does not support stencil texturing.\n");
215 return;
216 }
217
218 context_bind_texture(context, view->target, view->name);
219 gl_info->gl_ops.gl.p_glTexParameteriv(view->target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
220 gl_info->gl_ops.gl.p_glTexParameteri(view->target, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
221 checkGLcall("Initialize stencil view");
222
225 }
226
228}
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
struct wined3d_context * context_acquire(const struct wined3d_device *device, struct wined3d_texture *texture, unsigned int sub_resource_idx)
Definition: context.c:4242
void context_release(struct wined3d_context *context)
Definition: context.c:1571
void wined3d_texture_prepare_texture(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb)
Definition: texture.c:1546
static BOOL is_stencil_view_format(const struct wined3d_format *format)
Definition: view.c:29
unsigned int GLuint
Definition: gl.h:159
#define GL_TEXTURE_3D
Definition: gl.h:1515
#define GL_ZERO
Definition: gl.h:374
#define GL_RED
Definition: gl.h:480
int GLint
Definition: gl.h:156
#define GL_STENCIL_INDEX
Definition: gl.h:458
GLenum GLuint texture
Definition: glext.h:6295
GLuint GLenum swizzle
Definition: glext.h:9511
#define GL_TEXTURE_SWIZZLE_RGBA
Definition: glext.h:2032
const struct wined3d_gl_info * gl_info
#define GL_DEPTH_STENCIL_TEXTURE_MODE
Definition: wgl.h:1005
@ ARB_TEXTURE_VIEW
Definition: wined3d_gl.h:131
@ ARB_STENCIL_TEXTURING
Definition: wined3d_gl.h:104
static GLuint wined3d_texture_get_texture_name(const struct wined3d_texture *texture, const struct wined3d_context *context, BOOL srgb)

Referenced by wined3d_render_target_view_cs_init(), wined3d_shader_resource_view_cs_init(), and wined3d_unordered_access_view_cs_init().

◆ get_buffer_view_range()

static void get_buffer_view_range ( const struct wined3d_buffer buffer,
const struct wined3d_view_desc desc,
const struct wined3d_format view_format,
unsigned int offset,
unsigned int size 
)
static

Definition at line 272 of file view.c.

275{
276 if (desc->format_id == WINED3DFMT_UNKNOWN)
277 {
278 *offset = desc->u.buffer.start_idx * buffer->desc.structure_byte_stride;
279 *size = desc->u.buffer.count * buffer->desc.structure_byte_stride;
280 }
281 else
282 {
283 *offset = desc->u.buffer.start_idx * view_format->byte_count;
284 *size = desc->u.buffer.count * view_format->byte_count;
285 }
286}
@ WINED3DFMT_UNKNOWN
Definition: wined3d.h:107

Referenced by create_buffer_view(), and wined3d_unordered_access_view_clear_uint().

◆ get_texture_view_target()

static GLenum get_texture_view_target ( const struct wined3d_gl_info gl_info,
const struct wined3d_view_desc desc,
const struct wined3d_texture texture 
)
static

Definition at line 35 of file view.c.

37{
38 static const struct
39 {
40 GLenum texture_target;
41 unsigned int view_flags;
42 GLenum view_target;
43 enum wined3d_gl_extension extension;
44 }
45 view_types[] =
46 {
50
55
62
67 };
68 unsigned int i;
69
70 for (i = 0; i < ARRAY_SIZE(view_types); ++i)
71 {
72 if (view_types[i].texture_target != texture->target || view_types[i].view_flags != desc->flags)
73 continue;
74 if (gl_info->supported[view_types[i].extension])
75 return view_types[i].view_target;
76
77 FIXME("Extension %#x not supported.\n", view_types[i].extension);
78 }
79
80 FIXME("Unhandled view flags %#x for texture target %#x.\n", desc->flags, texture->target);
81 return texture->target;
82}
#define ARRAY_SIZE(A)
Definition: main.h:33
#define WINED3D_VIEW_CUBE_ARRAY
Definition: view.c:27
#define GL_TEXTURE_CUBE_MAP
Definition: gl.h:1788
unsigned int GLenum
Definition: gl.h:150
#define GL_TEXTURE_2D
Definition: gl.h:645
#define GL_TEXTURE_1D
Definition: gl.h:644
#define GL_TEXTURE_RECTANGLE
Definition: glext.h:753
#define GL_TEXTURE_1D_ARRAY
Definition: glext.h:533
#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY
Definition: glext.h:1941
#define GL_TEXTURE_2D_MULTISAMPLE
Definition: glext.h:1939
#define GL_TEXTURE_CUBE_MAP_ARRAY
Definition: glext.h:920
#define GL_TEXTURE_2D_ARRAY
Definition: glext.h:535
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define WINED3D_VIEW_TEXTURE_CUBE
Definition: wined3d.h:1576
#define WINED3D_VIEW_TEXTURE_ARRAY
Definition: wined3d.h:1577
wined3d_gl_extension
Definition: wined3d_gl.h:36
@ ARB_TEXTURE_CUBE_MAP_ARRAY
Definition: wined3d_gl.h:114

Referenced by wined3d_shader_resource_view_cs_init(), and wined3d_unordered_access_view_cs_init().

◆ is_stencil_view_format()

static BOOL is_stencil_view_format ( const struct wined3d_format format)
static

Definition at line 29 of file view.c.

30{
33}
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
@ WINED3DFMT_X24_TYPELESS_G8_UINT
Definition: wined3d.h:183
@ WINED3DFMT_X32_TYPELESS_G8X24_UINT
Definition: wined3d.h:156

Referenced by create_texture_view(), and wined3d_shader_resource_view_cs_init().

◆ shader_resource_view_bind_and_dirtify()

static void shader_resource_view_bind_and_dirtify ( struct wined3d_shader_resource_view view,
struct wined3d_context context 
)
static

Definition at line 834 of file view.c.

836{
837 if (context->active_texture < ARRAY_SIZE(context->rev_tex_unit_map))
838 {
839 DWORD active_sampler = context->rev_tex_unit_map[context->active_texture];
840 if (active_sampler != WINED3D_UNMAPPED_STAGE)
842 }
843 /* FIXME: Ideally we'd only do this when touching a binding that's used by
844 * a shader. */
847
848 context_bind_texture(context, view->gl_view.target, view->gl_view.name);
849}
unsigned long DWORD
Definition: ntddk_ex.h:95
#define STATE_SAMPLER(num)
#define WINED3D_UNMAPPED_STAGE

Referenced by shader_resource_view_generate_mipmaps().

◆ shader_resource_view_generate_mipmaps()

void shader_resource_view_generate_mipmaps ( struct wined3d_shader_resource_view view)

Definition at line 851 of file view.c.

852{
854 unsigned int i, j, layer_count, level_count, base_level, max_level;
855 const struct wined3d_gl_info *gl_info;
856 struct wined3d_context *context;
857 struct gl_texture *gl_tex;
859 BOOL srgb;
860
861 TRACE("view %p.\n", view);
862
863 context = context_acquire(view->resource->device, NULL, 0);
864 gl_info = context->gl_info;
865 layer_count = view->desc.u.texture.layer_count;
866 level_count = view->desc.u.texture.level_count;
867 base_level = view->desc.u.texture.level_idx;
868 max_level = base_level + level_count - 1;
869
870 srgb = !!(texture->flags & WINED3D_TEXTURE_IS_SRGB);
872 for (i = 0; i < layer_count; ++i)
874
875 if (view->gl_view.name)
876 {
878 }
879 else
880 {
882 gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_BASE_LEVEL, base_level);
883 gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_MAX_LEVEL, max_level);
884 }
885
886 if (gl_info->supported[ARB_SAMPLER_OBJECTS])
887 GL_EXTCALL(glBindSampler(context->active_texture, 0));
889 if (context->d3d_info->wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL)
890 {
891 gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_SRGB_DECODE_EXT,
893 gl_tex->sampler_desc.srgb_decode = FALSE;
894 }
895
896 gl_info->fbo_ops.glGenerateMipmap(texture->target);
897 checkGLcall("glGenerateMipMap()");
898
899 for (i = 0; i < layer_count; ++i)
900 {
901 for (j = base_level + 1; j <= max_level; ++j)
902 {
905 }
906 }
907
908 if (!view->gl_view.name)
909 {
910 gl_tex->base_level = base_level;
911 gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_MAX_LEVEL, texture->level_count - 1);
912 }
913
915}
BOOL wined3d_texture_load_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_context *context, DWORD location)
Definition: texture.c:229
void wined3d_texture_invalidate_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, DWORD location)
Definition: texture.c:159
void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb)
Definition: texture.c:868
void wined3d_texture_validate_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, DWORD location)
Definition: texture.c:135
static void shader_resource_view_bind_and_dirtify(struct wined3d_shader_resource_view *view, struct wined3d_context *context)
Definition: view.c:834
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GL_TEXTURE_BASE_LEVEL
Definition: gl.h:1503
#define GL_TEXTURE_MAX_LEVEL
Definition: gl.h:1504
#define GL_SKIP_DECODE_EXT
Definition: glext.h:5291
#define GL_TEXTURE_SRGB_DECODE_EXT
Definition: glext.h:5289
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define location(file, line)
Definition: kmtest.h:18
#define TRACE(s)
Definition: solgame.cpp:4
struct wined3d_sampler_desc sampler_desc
unsigned int base_level
struct wined3d_fbo_ops fbo_ops
#define WINED3D_SRGB_READ_WRITE_CONTROL
Definition: wined3d.h:1324
@ ARB_SAMPLER_OBJECTS
Definition: wined3d_gl.h:92
#define WINED3D_LOCATION_TEXTURE_SRGB
#define WINED3D_LOCATION_TEXTURE_RGB
static struct gl_texture * wined3d_texture_get_gl_texture(struct wined3d_texture *texture, BOOL srgb)
static struct wined3d_texture * texture_from_resource(struct wined3d_resource *resource)
#define WINED3D_TEXTURE_IS_SRGB

Referenced by wined3d_cs_exec_generate_mipmaps().

◆ validate_resource_view()

static const struct wined3d_format * validate_resource_view ( const struct wined3d_view_desc desc,
struct wined3d_resource resource,
BOOL  mip_slice,
BOOL  allow_srgb_toggle 
)
static

Definition at line 84 of file view.c.

86{
87 const struct wined3d_gl_info *gl_info = &resource->device->adapter->gl_info;
88 const struct wined3d_format *format;
89
90 format = wined3d_get_format(gl_info, desc->format_id, resource->usage);
92 {
94 {
95 WARN("Invalid format %s for raw buffer view.\n", debug_d3dformat(format->id));
96 return NULL;
97 }
98
100 }
101
103 {
104 WARN("Trying to create view for typeless format %s.\n", debug_d3dformat(format->id));
105 return NULL;
106 }
107
108 if (resource->type == WINED3D_RTYPE_BUFFER)
109 {
111 unsigned int buffer_size, element_size;
112
113 if (buffer->desc.structure_byte_stride)
114 {
115 if (desc->format_id != WINED3DFMT_UNKNOWN)
116 {
117 WARN("Invalid format %s for structured buffer view.\n", debug_d3dformat(desc->format_id));
118 return NULL;
119 }
120
122 element_size = buffer->desc.structure_byte_stride;
123 }
124 else
125 {
126 element_size = format->byte_count;
127 }
128
129 if (!element_size)
130 return NULL;
131
132 buffer_size = buffer->resource.size / element_size;
133 if (desc->u.buffer.start_idx >= buffer_size
134 || desc->u.buffer.count > buffer_size - desc->u.buffer.start_idx)
135 return NULL;
136 }
137 else
138 {
140 unsigned int depth_or_layer_count;
141
142 if (resource->format->id != format->id && !wined3d_format_is_typeless(resource->format)
143 && (!allow_srgb_toggle || !wined3d_formats_are_srgb_variants(resource->format->id, format->id)))
144 {
145 WARN("Trying to create incompatible view for non typeless format %s.\n",
147 return NULL;
148 }
149
150 if (mip_slice && resource->type == WINED3D_RTYPE_TEXTURE_3D)
151 depth_or_layer_count = wined3d_texture_get_level_depth(texture, desc->u.texture.level_idx);
152 else
153 depth_or_layer_count = texture->layer_count;
154
155 if (!desc->u.texture.level_count
156 || (mip_slice && desc->u.texture.level_count != 1)
157 || desc->u.texture.level_idx >= texture->level_count
158 || desc->u.texture.level_count > texture->level_count - desc->u.texture.level_idx
159 || !desc->u.texture.layer_count
160 || desc->u.texture.layer_idx >= depth_or_layer_count
161 || desc->u.texture.layer_count > depth_or_layer_count - desc->u.texture.layer_idx)
162 return NULL;
163 }
164
165 return format;
166}
#define WARN(fmt,...)
Definition: debug.h:112
const struct wined3d_format * wined3d_get_format(const struct wined3d_gl_info *gl_info, enum wined3d_format_id format_id, unsigned int resource_usage)
Definition: utils.c:3831
const char * debug_d3dformat(enum wined3d_format_id format_id)
Definition: utils.c:3980
BOOL wined3d_formats_are_srgb_variants(enum wined3d_format_id format1, enum wined3d_format_id format2)
Definition: utils.c:3922
static void buffer_size(GLcontext *ctx, GLuint *width, GLuint *height)
Definition: swimpl.c:888
@ WINED3D_RTYPE_BUFFER
Definition: wined3d.h:698
@ WINED3D_RTYPE_TEXTURE_3D
Definition: wined3d.h:701
#define WINED3D_VIEW_BUFFER_RAW
Definition: wined3d.h:1573
@ WINED3DFMT_R32_UINT
Definition: wined3d.h:178
@ WINED3DFMT_R32_TYPELESS
Definition: wined3d.h:175
static BOOL wined3d_format_is_typeless(const struct wined3d_format *format)
static struct wined3d_buffer * buffer_from_resource(struct wined3d_resource *resource)
static unsigned int wined3d_texture_get_level_depth(const struct wined3d_texture *texture, unsigned int level)

Referenced by wined3d_rendertarget_view_init(), wined3d_shader_resource_view_init(), and wined3d_unordered_access_view_init().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( d3d  )

◆ wined3d_render_target_view_cs_init()

static void wined3d_render_target_view_cs_init ( void object)
static

Definition at line 510 of file view.c.

511{
513 struct wined3d_resource *resource = view->resource;
514 const struct wined3d_view_desc *desc = &view->desc;
515
516 if (resource->type == WINED3D_RTYPE_BUFFER)
517 {
518 FIXME("Not implemented for resources %s.\n", debug_d3dresourcetype(resource->type));
519 }
520 else
521 {
523 unsigned int depth_or_layer_count;
524
526 depth_or_layer_count = wined3d_texture_get_level_depth(texture, desc->u.texture.level_idx);
527 else
528 depth_or_layer_count = texture->layer_count;
529
530 if (resource->format->id != view->format->id
531 || (view->layer_count != 1 && view->layer_count != depth_or_layer_count))
532 {
533 if (resource->format->gl_view_class != view->format->gl_view_class)
534 {
535 FIXME("Render target view not supported, resource format %s, view format %s.\n",
536 debug_d3dformat(resource->format->id), debug_d3dformat(view->format->id));
537 return;
538 }
539 if (texture->swapchain && texture->swapchain->desc.backbuffer_count > 1)
540 {
541 FIXME("Swapchain views not supported.\n");
542 return;
543 }
544
545 create_texture_view(&view->gl_view, texture->target, desc, texture, view->format);
546 }
547 }
548}
const char * debug_d3dresourcetype(enum wined3d_resource_type resource_type)
Definition: utils.c:4329
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)
Definition: view.c:168

Referenced by wined3d_rendertarget_view_init().

◆ wined3d_rendertarget_view_create()

HRESULT CDECL wined3d_rendertarget_view_create ( const struct wined3d_view_desc desc,
struct wined3d_resource resource,
void parent,
const struct wined3d_parent_ops parent_ops,
struct wined3d_rendertarget_view **  view 
)

Definition at line 598 of file view.c.

601{
603 HRESULT hr;
604
605 TRACE("desc %p, resource %p, parent %p, parent_ops %p, view %p.\n",
607
608 if (!(object = heap_alloc_zero(sizeof(*object))))
609 return E_OUTOFMEMORY;
610
612 {
613 heap_free(object);
614 WARN("Failed to initialise view, hr %#x.\n", hr);
615 return hr;
616 }
617
618 TRACE("Created render target view %p.\n", object);
619 *view = object;
620
621 return hr;
622}
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static HRESULT wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *view, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: view.c:550
r parent
Definition: btrfs.c:3010
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT hr
Definition: shlfolder.c:183
const struct wined3d_parent_ops * parent_ops

Referenced by swapchain_init(), wined3d_device_init_3d(), wined3d_device_reset(), and wined3d_rendertarget_view_create_from_sub_resource().

◆ wined3d_rendertarget_view_create_from_sub_resource()

HRESULT CDECL wined3d_rendertarget_view_create_from_sub_resource ( struct wined3d_texture texture,
unsigned int  sub_resource_idx,
void parent,
const struct wined3d_parent_ops parent_ops,
struct wined3d_rendertarget_view **  view 
)

Definition at line 624 of file view.c.

627{
628 struct wined3d_view_desc desc;
629
630 TRACE("texture %p, sub_resource_idx %u, parent %p, parent_ops %p, view %p.\n",
631 texture, sub_resource_idx, parent, parent_ops, view);
632
633 desc.format_id = texture->resource.format->id;
634 desc.flags = 0;
635 desc.u.texture.level_idx = sub_resource_idx % texture->level_count;
636 desc.u.texture.level_count = 1;
637 desc.u.texture.layer_idx = sub_resource_idx / texture->level_count;
638 desc.u.texture.layer_count = 1;
639
640 return wined3d_rendertarget_view_create(&desc, &texture->resource, parent, parent_ops, view);
641}
HRESULT CDECL wined3d_rendertarget_view_create(const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_rendertarget_view **view)
Definition: view.c:598

Referenced by d3d8_surface_acquire_rendertarget_view(), d3d9_surface_acquire_rendertarget_view(), and ddraw_surface_get_rendertarget_view().

◆ wined3d_rendertarget_view_decref()

ULONG CDECL wined3d_rendertarget_view_decref ( struct wined3d_rendertarget_view view)

Definition at line 348 of file view.c.

349{
350 ULONG refcount = InterlockedDecrement(&view->refcount);
351
352 TRACE("%p decreasing refcount to %u.\n", view, refcount);
353
354 if (!refcount)
355 {
356 struct wined3d_resource *resource = view->resource;
357 struct wined3d_device *device = resource->device;
358
359 /* Call wined3d_object_destroyed() before releasing the resource,
360 * since releasing the resource may end up destroying the parent. */
361 view->parent_ops->wined3d_object_destroyed(view->parent);
364 }
365
366 return refcount;
367}
#define InterlockedDecrement
Definition: armddk.h:52
void wined3d_cs_destroy_object(struct wined3d_cs *cs, void(*callback)(void *object), void *object)
Definition: cs.c:1885
static void wined3d_rendertarget_view_destroy_object(void *object)
Definition: view.c:327
Definition: devices.h:37
uint32_t ULONG
Definition: typedefs.h:59
static ULONG wined3d_resource_decref(struct wined3d_resource *resource)

Referenced by d3d8_surface_Release(), d3d8_texture_2d_Release(), d3d8_texture_cube_Release(), d3d9_surface_Release(), d3d9_texture_cleanup(), d3d9_texture_cube_AddRef(), ddraw_set_cooperative_level(), ddraw_surface_cleanup(), wined3d_device_init_3d(), wined3d_device_reset(), wined3d_device_set_depth_stencil_view(), wined3d_device_set_rendertarget_view(), and wined3d_device_uninit_3d().

◆ wined3d_rendertarget_view_destroy_object()

static void wined3d_rendertarget_view_destroy_object ( void object)
static

Definition at line 327 of file view.c.

328{
330 struct wined3d_device *device = view->resource->device;
331
332 if (view->gl_view.name)
333 {
334 const struct wined3d_gl_info *gl_info;
335 struct wined3d_context *context;
336
338 gl_info = context->gl_info;
340 gl_info->gl_ops.gl.p_glDeleteTextures(1, &view->gl_view.name);
341 checkGLcall("glDeleteTextures");
343 }
344
346}
void context_gl_resource_released(struct wined3d_device *device, GLuint name, BOOL rb_namespace)
Definition: context.c:1104

Referenced by wined3d_rendertarget_view_decref().

◆ wined3d_rendertarget_view_get_drawable_size()

void wined3d_rendertarget_view_get_drawable_size ( const struct wined3d_rendertarget_view view,
const struct wined3d_context context,
unsigned int width,
unsigned int height 
)

Definition at line 404 of file view.c.

406{
407 const struct wined3d_texture *texture;
408
409 if (view->resource->type != WINED3D_RTYPE_TEXTURE_2D)
410 {
411 *width = view->width;
412 *height = view->height;
413 return;
414 }
415
417 if (texture->swapchain)
418 {
419 /* The drawable size of an onscreen drawable is the surface size.
420 * (Actually: The window size, but the surface is created in window
421 * size.) */
422 *width = texture->resource.width;
423 *height = texture->resource.height;
424 }
426 {
427 const struct wined3d_swapchain *swapchain = context->swapchain;
428
429 /* The drawable size of a backbuffer / aux buffer offscreen target is
430 * the size of the current context's drawable, which is the size of
431 * the back buffer of the swapchain the active context belongs to. */
432 *width = swapchain->desc.backbuffer_width;
433 *height = swapchain->desc.backbuffer_height;
434 }
435 else
436 {
437 unsigned int level_idx = view->sub_resource_idx % texture->level_count;
438
439 /* The drawable size of an FBO target is the OpenGL texture size,
440 * which is the power of two size. */
443 }
444}
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
enum view_type type
struct wined3d_swapchain_desc desc
@ WINED3D_RTYPE_TEXTURE_2D
Definition: wined3d.h:700
static unsigned int wined3d_texture_get_level_pow2_height(const struct wined3d_texture *texture, unsigned int level)
static unsigned int wined3d_texture_get_level_pow2_width(const struct wined3d_texture *texture, unsigned int level)
#define ORM_BACKBUFFER

Referenced by device_clear_render_targets(), get_viewport(), and scissorrect().

◆ wined3d_rendertarget_view_get_parent()

void *CDECL wined3d_rendertarget_view_get_parent ( const struct wined3d_rendertarget_view view)

Definition at line 369 of file view.c.

370{
371 TRACE("view %p.\n", view);
372
373 return view->parent;
374}

◆ wined3d_rendertarget_view_get_resource()

struct wined3d_resource *CDECL wined3d_rendertarget_view_get_resource ( const struct wined3d_rendertarget_view view)

Definition at line 397 of file view.c.

398{
399 TRACE("view %p.\n", view);
400
401 return view->resource;
402}

◆ wined3d_rendertarget_view_get_sub_resource_parent()

void *CDECL wined3d_rendertarget_view_get_sub_resource_parent ( const struct wined3d_rendertarget_view view)

Definition at line 376 of file view.c.

377{
378 struct wined3d_texture *texture;
379
380 TRACE("view %p.\n", view);
381
382 if (view->resource->type == WINED3D_RTYPE_BUFFER)
384
386
387 return texture->sub_resources[view->sub_resource_idx].parent;
388}
void *CDECL wined3d_buffer_get_parent(const struct wined3d_buffer *buffer)
Definition: buffer.c:807

Referenced by d3d8_device_GetDepthStencilSurface(), d3d8_device_GetRenderTarget(), d3d8_device_SetRenderTarget(), d3d9_device_GetDepthStencilSurface(), d3d9_device_GetRenderTarget(), d3d9_device_reset(), ddraw_set_cooperative_level(), and device_init().

◆ wined3d_rendertarget_view_incref()

ULONG CDECL wined3d_rendertarget_view_incref ( struct wined3d_rendertarget_view view)

Definition at line 318 of file view.c.

319{
320 ULONG refcount = InterlockedIncrement(&view->refcount);
321
322 TRACE("%p increasing refcount to %u.\n", view, refcount);
323
324 return refcount;
325}
#define InterlockedIncrement
Definition: armddk.h:53

Referenced by d3d8_surface_AddRef(), d3d8_texture_2d_AddRef(), d3d8_texture_cube_AddRef(), d3d9_surface_AddRef(), d3d9_texture_2d_AddRef(), ddraw_set_cooperative_level(), ddraw_surface_add_iface(), wined3d_device_set_depth_stencil_view(), and wined3d_device_set_rendertarget_view().

◆ wined3d_rendertarget_view_init()

static HRESULT wined3d_rendertarget_view_init ( struct wined3d_rendertarget_view view,
const struct wined3d_view_desc desc,
struct wined3d_resource resource,
void parent,
const struct wined3d_parent_ops parent_ops 
)
static

Definition at line 550 of file view.c.

553{
554 BOOL allow_srgb_toggle = FALSE;
555
556 view->refcount = 1;
557 view->parent = parent;
558 view->parent_ops = parent_ops;
559
560 if (resource->type != WINED3D_RTYPE_BUFFER)
561 {
563
564 if (texture->swapchain)
565 allow_srgb_toggle = TRUE;
566 }
567 if (!(view->format = validate_resource_view(desc, resource, TRUE, allow_srgb_toggle)))
568 return E_INVALIDARG;
569 view->format_flags = view->format->flags[resource->gl_type];
570 view->desc = *desc;
571
572 if (resource->type == WINED3D_RTYPE_BUFFER)
573 {
574 view->sub_resource_idx = 0;
575 view->layer_count = 1;
576 view->width = desc->u.buffer.count;
577 view->height = 1;
578 }
579 else
580 {
582
583 view->sub_resource_idx = desc->u.texture.level_idx;
585 view->sub_resource_idx += desc->u.texture.layer_idx * texture->level_count;
586 view->layer_count = desc->u.texture.layer_count;
587 view->width = wined3d_texture_get_level_width(texture, desc->u.texture.level_idx);
588 view->height = wined3d_texture_get_level_height(texture, desc->u.texture.level_idx);
589 }
590
592
594
595 return WINED3D_OK;
596}
void wined3d_cs_init_object(struct wined3d_cs *cs, void(*callback)(void *object), void *object)
Definition: cs.c:1890
#define E_INVALIDARG
Definition: ddrawi.h:101
#define TRUE
Definition: types.h:120
static void wined3d_render_target_view_cs_init(void *object)
Definition: view.c:510
static const struct wined3d_format * validate_resource_view(const struct wined3d_view_desc *desc, struct wined3d_resource *resource, BOOL mip_slice, BOOL allow_srgb_toggle)
Definition: view.c:84
#define WINED3D_OK
Definition: wined3d.h:37
static unsigned int wined3d_texture_get_level_height(const struct wined3d_texture *texture, unsigned int level)
static unsigned int wined3d_texture_get_level_width(const struct wined3d_texture *texture, unsigned int level)
static ULONG wined3d_resource_incref(struct wined3d_resource *resource)

Referenced by wined3d_rendertarget_view_create().

◆ wined3d_rendertarget_view_invalidate_location()

void wined3d_rendertarget_view_invalidate_location ( struct wined3d_rendertarget_view view,
DWORD  location 
)

Definition at line 505 of file view.c.

506{
508}
static void wined3d_view_invalidate_location(struct wined3d_resource *resource, const struct wined3d_view_desc *desc, DWORD location)
Definition: view.c:298

Referenced by draw_primitive().

◆ wined3d_rendertarget_view_load_location()

void wined3d_rendertarget_view_load_location ( struct wined3d_rendertarget_view view,
struct wined3d_context context,
DWORD  location 
)

Definition at line 466 of file view.c.

468{
469 struct wined3d_resource *resource = view->resource;
470 unsigned int i, sub_resource_idx, layer_count;
471 struct wined3d_texture *texture;
472
473 if (resource->type == WINED3D_RTYPE_BUFFER)
474 {
476 return;
477 }
478
480 sub_resource_idx = view->sub_resource_idx;
481 layer_count = resource->type != WINED3D_RTYPE_TEXTURE_3D ? view->layer_count : 1;
482 for (i = 0; i < layer_count; ++i, sub_resource_idx += texture->level_count)
484}

Referenced by draw_primitive().

◆ wined3d_rendertarget_view_prepare_location()

void wined3d_rendertarget_view_prepare_location ( struct wined3d_rendertarget_view view,
struct wined3d_context context,
DWORD  location 
)

Definition at line 446 of file view.c.

448{
449 struct wined3d_resource *resource = view->resource;
450 unsigned int i, sub_resource_idx, layer_count;
451 struct wined3d_texture *texture;
452
453 if (resource->type == WINED3D_RTYPE_BUFFER)
454 {
455 FIXME("Not implemented for resources %s.\n", debug_d3dresourcetype(resource->type));
456 return;
457 }
458
460 sub_resource_idx = view->sub_resource_idx;
461 layer_count = resource->type != WINED3D_RTYPE_TEXTURE_3D ? view->layer_count : 1;
462 for (i = 0; i < layer_count; ++i, sub_resource_idx += texture->level_count)
464}
BOOL wined3d_texture_prepare_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_context *context, DWORD location)
Definition: texture.c:1605

Referenced by draw_primitive().

◆ wined3d_rendertarget_view_set_parent()

void CDECL wined3d_rendertarget_view_set_parent ( struct wined3d_rendertarget_view view,
void parent 
)

Definition at line 390 of file view.c.

391{
392 TRACE("view %p, parent %p.\n", view, parent);
393
394 view->parent = parent;
395}

Referenced by ddraw_surface7_Flip().

◆ wined3d_rendertarget_view_validate_location()

void wined3d_rendertarget_view_validate_location ( struct wined3d_rendertarget_view view,
DWORD  location 
)

Definition at line 486 of file view.c.

487{
488 struct wined3d_resource *resource = view->resource;
489 unsigned int i, sub_resource_idx, layer_count;
490 struct wined3d_texture *texture;
491
492 if (resource->type == WINED3D_RTYPE_BUFFER)
493 {
494 FIXME("Not implemented for resources %s.\n", debug_d3dresourcetype(resource->type));
495 return;
496 }
497
499 sub_resource_idx = view->sub_resource_idx;
500 layer_count = resource->type != WINED3D_RTYPE_TEXTURE_3D ? view->layer_count : 1;
501 for (i = 0; i < layer_count; ++i, sub_resource_idx += texture->level_count)
503}

Referenced by draw_primitive().

◆ wined3d_shader_resource_view_bind()

void wined3d_shader_resource_view_bind ( struct wined3d_shader_resource_view view,
unsigned int  unit,
struct wined3d_sampler sampler,
struct wined3d_context context 
)

Definition at line 807 of file view.c.

809{
810 const struct wined3d_gl_info *gl_info = context->gl_info;
811 struct wined3d_texture *texture;
812
814
815 if (view->gl_view.name)
816 {
817 context_bind_texture(context, view->gl_view.target, view->gl_view.name);
819 return;
820 }
821
822 if (view->resource->type == WINED3D_RTYPE_BUFFER)
823 {
824 FIXME("Buffer shader resources not supported.\n");
825 return;
826 }
827
831}
void context_active_texture(struct wined3d_context *context, const struct wined3d_gl_info *gl_info, unsigned int unit)
Definition: context.c:2717
struct wined3d_texture *__cdecl wined3d_texture_from_resource(struct wined3d_resource *resource)
Definition: texture.c:2210
void wined3d_texture_bind(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb)
Definition: texture.c:729
GLuint sampler
Definition: glext.h:7283
png_const_structrp png_const_inforp int * unit
Definition: png.h:2159
void wined3d_sampler_bind(struct wined3d_sampler *sampler, unsigned int unit, struct wined3d_texture *texture, const struct wined3d_context *context)
Definition: sampler.c:184

Referenced by context_bind_shader_resources().

◆ wined3d_shader_resource_view_create()

HRESULT CDECL wined3d_shader_resource_view_create ( const struct wined3d_view_desc desc,
struct wined3d_resource resource,
void parent,
const struct wined3d_parent_ops parent_ops,
struct wined3d_shader_resource_view **  view 
)

Definition at line 781 of file view.c.

784{
786 HRESULT hr;
787
788 TRACE("desc %p, resource %p, parent %p, parent_ops %p, view %p.\n",
790
791 if (!(object = heap_alloc_zero(sizeof(*object))))
792 return E_OUTOFMEMORY;
793
795 {
796 heap_free(object);
797 WARN("Failed to initialise view, hr %#x.\n", hr);
798 return hr;
799 }
800
801 TRACE("Created shader resource view %p.\n", object);
802 *view = object;
803
804 return WINED3D_OK;
805}
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)
Definition: view.c:759
const struct wined3d_parent_ops * parent_ops

Referenced by d3d9_texture_acquire_shader_resource_view().

◆ wined3d_shader_resource_view_cs_init()

static void wined3d_shader_resource_view_cs_init ( void object)
static

Definition at line 699 of file view.c.

700{
702 struct wined3d_resource *resource = view->resource;
703 const struct wined3d_format *view_format;
704 const struct wined3d_gl_info *gl_info;
705 const struct wined3d_view_desc *desc;
706 GLenum view_target;
707
708 view_format = view->format;
709 gl_info = &resource->device->adapter->gl_info;
710 desc = &view->desc;
711
712 if (resource->type == WINED3D_RTYPE_BUFFER)
713 {
715 struct wined3d_context *context;
716
717 context = context_acquire(resource->device, NULL, 0);
718 create_buffer_view(&view->gl_view, context, desc, buffer, view_format);
720 }
721 else
722 {
724
725 view_target = get_texture_view_target(gl_info, desc, texture);
726
727 if (resource->format->id == view_format->id && texture->target == view_target
728 && !desc->u.texture.level_idx && desc->u.texture.level_count == texture->level_count
729 && !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture->layer_count
730 && !is_stencil_view_format(view_format))
731 {
732 TRACE("Creating identity shader resource view.\n");
733 }
734 else if (texture->swapchain && texture->swapchain->desc.backbuffer_count > 1)
735 {
736 FIXME("Swapchain shader resource views not supported.\n");
737 }
738 else if (resource->format->typeless_id == view_format->typeless_id
739 && resource->format->gl_view_class == view_format->gl_view_class)
740 {
741 create_texture_view(&view->gl_view, view_target, desc, texture, view_format);
742 }
743 else if (wined3d_format_is_depth_view(resource->format->id, view_format->id))
744 {
745 create_texture_view(&view->gl_view, view_target, desc, texture, resource->format);
746 }
747 else
748 {
749 FIXME("Shader resource view not supported, resource format %s, view format %s.\n",
750 debug_d3dformat(resource->format->id), debug_d3dformat(view_format->id));
751 }
752 }
753#if defined(STAGING_CSMT)
754
756#endif /* STAGING_CSMT */
757}
BOOL wined3d_format_is_depth_view(enum wined3d_format_id resource_format_id, enum wined3d_format_id view_format_id)
Definition: utils.c:3863
static GLenum get_texture_view_target(const struct wined3d_gl_info *gl_info, const struct wined3d_view_desc *desc, const struct wined3d_texture *texture)
Definition: view.c:35
static void create_buffer_view(struct wined3d_gl_view *view, struct wined3d_context *context, const struct wined3d_view_desc *desc, struct wined3d_buffer *buffer, const struct wined3d_format *view_format)
Definition: view.c:288
enum wined3d_format_id id
enum wined3d_format_id typeless_id
static void wined3d_resource_release(struct wined3d_resource *resource)

Referenced by wined3d_shader_resource_view_init().

◆ wined3d_shader_resource_view_decref()

ULONG CDECL wined3d_shader_resource_view_decref ( struct wined3d_shader_resource_view view)

Definition at line 671 of file view.c.

672{
673 ULONG refcount = InterlockedDecrement(&view->refcount);
674
675 TRACE("%p decreasing refcount to %u.\n", view, refcount);
676
677 if (!refcount)
678 {
679 struct wined3d_resource *resource = view->resource;
680 struct wined3d_device *device = resource->device;
681
682 /* Call wined3d_object_destroyed() before releasing the resource,
683 * since releasing the resource may end up destroying the parent. */
684 view->parent_ops->wined3d_object_destroyed(view->parent);
687 }
688
689 return refcount;
690}
static void wined3d_shader_resource_view_destroy_object(void *object)
Definition: view.c:652

Referenced by d3d9_texture_cleanup(), state_unbind_resources(), and wined3d_device_set_shader_resource_view().

◆ wined3d_shader_resource_view_destroy_object()

static void wined3d_shader_resource_view_destroy_object ( void object)
static

Definition at line 652 of file view.c.

653{
655
656 if (view->gl_view.name)
657 {
658 const struct wined3d_gl_info *gl_info;
659 struct wined3d_context *context;
660
661 context = context_acquire(view->resource->device, NULL, 0);
662 gl_info = context->gl_info;
663 gl_info->gl_ops.gl.p_glDeleteTextures(1, &view->gl_view.name);
664 checkGLcall("glDeleteTextures");
666 }
667
669}

Referenced by wined3d_shader_resource_view_decref().

◆ wined3d_shader_resource_view_generate_mipmaps()

void CDECL wined3d_shader_resource_view_generate_mipmaps ( struct wined3d_shader_resource_view view)

Definition at line 917 of file view.c.

918{
919 struct wined3d_texture *texture;
920
921 TRACE("view %p.\n", view);
922
923 if (view->resource->type == WINED3D_RTYPE_BUFFER)
924 {
925 WARN("Called on buffer resource %p.\n", view->resource);
926 return;
927 }
928
931 {
932 WARN("Texture without the WINED3D_TEXTURE_GENERATE_MIPMAPS flag, ignoring.\n");
933 return;
934 }
935
936 wined3d_cs_emit_generate_mipmaps(view->resource->device->cs, view);
937}
void wined3d_cs_emit_generate_mipmaps(struct wined3d_cs *cs, struct wined3d_shader_resource_view *view)
Definition: cs.c:2436
#define WINED3D_TEXTURE_GENERATE_MIPMAPS

Referenced by d3d9_texture_gen_auto_mipmap().

◆ wined3d_shader_resource_view_get_parent()

void *CDECL wined3d_shader_resource_view_get_parent ( const struct wined3d_shader_resource_view view)

Definition at line 692 of file view.c.

693{
694 TRACE("view %p.\n", view);
695
696 return view->parent;
697}

◆ wined3d_shader_resource_view_incref()

ULONG CDECL wined3d_shader_resource_view_incref ( struct wined3d_shader_resource_view view)

Definition at line 643 of file view.c.

644{
645 ULONG refcount = InterlockedIncrement(&view->refcount);
646
647 TRACE("%p increasing refcount to %u.\n", view, refcount);
648
649 return refcount;
650}

Referenced by wined3d_device_set_shader_resource_view().

◆ wined3d_shader_resource_view_init()

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 
)
static

Definition at line 759 of file view.c.

762{
763 view->refcount = 1;
764 view->parent = parent;
765 view->parent_ops = parent_ops;
766
767 if (!(view->format = validate_resource_view(desc, resource, FALSE, FALSE)))
768 return E_INVALIDARG;
769 view->desc = *desc;
770
772
773#if defined(STAGING_CSMT)
775#endif /* STAGING_CSMT */
777
778 return WINED3D_OK;
779}
static void wined3d_shader_resource_view_cs_init(void *object)
Definition: view.c:699
static void wined3d_resource_acquire(struct wined3d_resource *resource)

Referenced by wined3d_shader_resource_view_create().

◆ wined3d_unordered_access_view_clear_uint()

void wined3d_unordered_access_view_clear_uint ( struct wined3d_unordered_access_view view,
const struct wined3d_uvec4 clear_value,
struct wined3d_context context 
)

Definition at line 1004 of file view.c.

1006{
1007 const struct wined3d_gl_info *gl_info = context->gl_info;
1008 const struct wined3d_format *format;
1009 struct wined3d_resource *resource;
1010 struct wined3d_buffer *buffer;
1011 unsigned int offset, size;
1012
1013 resource = view->resource;
1014 if (resource->type != WINED3D_RTYPE_BUFFER)
1015 {
1016 FIXME("Not implemented for %s resources.\n", debug_d3dresourcetype(resource->type));
1017 return;
1018 }
1019
1020 if (!gl_info->supported[ARB_CLEAR_BUFFER_OBJECT])
1021 {
1022 FIXME("OpenGL implementation does not support ARB_clear_buffer_object.\n");
1023 return;
1024 }
1025
1026 format = view->format;
1030 {
1031 FIXME("Not implemented for format %s.\n", debug_d3dformat(format->id));
1032 return;
1033 }
1034
1038
1040 context_bind_bo(context, buffer->buffer_type_hint, buffer->buffer_object);
1041 GL_EXTCALL(glClearBufferSubData(buffer->buffer_type_hint, format->glInternal,
1042 offset, size, format->glFormat, format->glType, clear_value));
1043 checkGLcall("clear unordered access view");
1044}
void context_bind_bo(struct wined3d_context *context, GLenum binding, GLuint name)
Definition: context.c:2724
void wined3d_unordered_access_view_invalidate_location(struct wined3d_unordered_access_view *view, DWORD location)
Definition: view.c:998
#define resource
Definition: kernel32.h:9
@ WINED3DFMT_R32_SINT
Definition: wined3d.h:179
@ WINED3DFMT_R32G32B32A32_UINT
Definition: wined3d.h:137
@ WINED3DFMT_R32G32B32A32_SINT
Definition: wined3d.h:138
@ ARB_CLEAR_BUFFER_OBJECT
Definition: wined3d_gl.h:47

Referenced by wined3d_cs_exec_clear_unordered_access_view().

◆ wined3d_unordered_access_view_copy_counter()

void wined3d_unordered_access_view_copy_counter ( struct wined3d_unordered_access_view view,
struct wined3d_buffer buffer,
unsigned int  offset,
struct wined3d_context context 
)

Definition at line 1063 of file view.c.

1065{
1066 struct wined3d_bo_address dst, src;
1067 DWORD dst_location;
1068
1069 if (!view->counter_bo)
1070 return;
1071
1072 dst_location = wined3d_buffer_get_memory(buffer, &dst, buffer->locations);
1073 dst.addr += offset;
1074
1075 src.buffer_object = view->counter_bo;
1076 src.addr = NULL;
1077
1078 context_copy_bo_address(context, &dst, buffer->buffer_type_hint,
1080
1082}
DWORD wined3d_buffer_get_memory(struct wined3d_buffer *buffer, struct wined3d_bo_address *data, DWORD locations)
Definition: buffer.c:713
void wined3d_buffer_invalidate_location(struct wined3d_buffer *buffer, DWORD location)
Definition: buffer.c:130
void context_copy_bo_address(struct wined3d_context *context, const struct wined3d_bo_address *dst, GLenum dst_binding, const struct wined3d_bo_address *src, GLenum src_binding, size_t size)
Definition: context.c:2846
#define GL_ATOMIC_COUNTER_BUFFER
Definition: glext.h:2297
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340

Referenced by wined3d_cs_exec_copy_uav_counter().

◆ wined3d_unordered_access_view_create()

HRESULT CDECL wined3d_unordered_access_view_create ( const struct wined3d_view_desc desc,
struct wined3d_resource resource,
void parent,
const struct wined3d_parent_ops parent_ops,
struct wined3d_unordered_access_view **  view 
)

Definition at line 1156 of file view.c.

1159{
1161 HRESULT hr;
1162
1163 TRACE("desc %p, resource %p, parent %p, parent_ops %p, view %p.\n",
1165
1166 if (!(object = heap_alloc_zero(sizeof(*object))))
1167 return E_OUTOFMEMORY;
1168
1170 {
1171 heap_free(object);
1172 WARN("Failed to initialise view, hr %#x.\n", hr);
1173 return hr;
1174 }
1175
1176 TRACE("Created unordered access view %p.\n", object);
1177 *view = object;
1178
1179 return WINED3D_OK;
1180}
static HRESULT wined3d_unordered_access_view_init(struct wined3d_unordered_access_view *view, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: view.c:1134
const struct wined3d_parent_ops * parent_ops

◆ wined3d_unordered_access_view_cs_init()

static void wined3d_unordered_access_view_cs_init ( void object)
static

Definition at line 1084 of file view.c.

1085{
1087 struct wined3d_resource *resource = view->resource;
1088 struct wined3d_view_desc *desc = &view->desc;
1089 const struct wined3d_gl_info *gl_info;
1090
1091 gl_info = &resource->device->adapter->gl_info;
1092
1093 if (resource->type == WINED3D_RTYPE_BUFFER)
1094 {
1096 struct wined3d_context *context;
1097
1098 context = context_acquire(resource->device, NULL, 0);
1099 gl_info = context->gl_info;
1100 create_buffer_view(&view->gl_view, context, desc, buffer, view->format);
1102 {
1103 static const GLuint initial_value = 0;
1104 GL_EXTCALL(glGenBuffers(1, &view->counter_bo));
1105 GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view->counter_bo));
1107 sizeof(initial_value), &initial_value, GL_STATIC_DRAW));
1108 checkGLcall("create atomic counter buffer");
1109 }
1111 }
1112 else
1113 {
1115 unsigned int depth_or_layer_count;
1116
1118 depth_or_layer_count = wined3d_texture_get_level_depth(texture, desc->u.texture.level_idx);
1119 else
1120 depth_or_layer_count = texture->layer_count;
1121
1122 if (desc->u.texture.layer_idx || desc->u.texture.layer_count != depth_or_layer_count)
1123 {
1125 desc, texture, view->format);
1126 }
1127 }
1128#if defined(STAGING_CSMT)
1129
1131#endif /* STAGING_CSMT */
1132}
#define GL_STATIC_DRAW
Definition: glext.h:350
#define WINED3D_VIEW_BUFFER_APPEND
Definition: wined3d.h:1574
#define WINED3D_VIEW_BUFFER_COUNTER
Definition: wined3d.h:1575

Referenced by wined3d_unordered_access_view_init().

◆ wined3d_unordered_access_view_decref()

ULONG CDECL wined3d_unordered_access_view_decref ( struct wined3d_unordered_access_view view)

Definition at line 970 of file view.c.

971{
972 ULONG refcount = InterlockedDecrement(&view->refcount);
973
974 TRACE("%p decreasing refcount to %u.\n", view, refcount);
975
976 if (!refcount)
977 {
978 struct wined3d_resource *resource = view->resource;
979 struct wined3d_device *device = resource->device;
980
981 /* Call wined3d_object_destroyed() before releasing the resource,
982 * since releasing the resource may end up destroying the parent. */
983 view->parent_ops->wined3d_object_destroyed(view->parent);
986 }
987
988 return refcount;
989}
static void wined3d_unordered_access_view_destroy_object(void *object)
Definition: view.c:948

Referenced by state_unbind_resources(), and wined3d_device_set_pipeline_unordered_access_view().

◆ wined3d_unordered_access_view_destroy_object()

static void wined3d_unordered_access_view_destroy_object ( void object)
static

Definition at line 948 of file view.c.

949{
951
952 if (view->gl_view.name || view->counter_bo)
953 {
954 const struct wined3d_gl_info *gl_info;
955 struct wined3d_context *context;
956
957 context = context_acquire(view->resource->device, NULL, 0);
958 gl_info = context->gl_info;
959 if (view->gl_view.name)
960 gl_info->gl_ops.gl.p_glDeleteTextures(1, &view->gl_view.name);
961 if (view->counter_bo)
962 GL_EXTCALL(glDeleteBuffers(1, &view->counter_bo));
963 checkGLcall("delete resources");
965 }
966
968}

Referenced by wined3d_unordered_access_view_decref().

◆ wined3d_unordered_access_view_get_parent()

void *CDECL wined3d_unordered_access_view_get_parent ( const struct wined3d_unordered_access_view view)

Definition at line 991 of file view.c.

992{
993 TRACE("view %p.\n", view);
994
995 return view->parent;
996}

◆ wined3d_unordered_access_view_incref()

ULONG CDECL wined3d_unordered_access_view_incref ( struct wined3d_unordered_access_view view)

Definition at line 939 of file view.c.

940{
941 ULONG refcount = InterlockedIncrement(&view->refcount);
942
943 TRACE("%p increasing refcount to %u.\n", view, refcount);
944
945 return refcount;
946}

Referenced by wined3d_device_set_pipeline_unordered_access_view().

◆ wined3d_unordered_access_view_init()

static HRESULT wined3d_unordered_access_view_init ( struct wined3d_unordered_access_view view,
const struct wined3d_view_desc desc,
struct wined3d_resource resource,
void parent,
const struct wined3d_parent_ops parent_ops 
)
static

Definition at line 1134 of file view.c.

1137{
1138 view->refcount = 1;
1139 view->parent = parent;
1140 view->parent_ops = parent_ops;
1141
1142 if (!(view->format = validate_resource_view(desc, resource, TRUE, FALSE)))
1143 return E_INVALIDARG;
1144 view->desc = *desc;
1145
1147
1148#if defined(STAGING_CSMT)
1150#endif /* STAGING_CSMT */
1152
1153 return WINED3D_OK;
1154}
static void wined3d_unordered_access_view_cs_init(void *object)
Definition: view.c:1084

Referenced by wined3d_unordered_access_view_create().

◆ wined3d_unordered_access_view_invalidate_location()

void wined3d_unordered_access_view_invalidate_location ( struct wined3d_unordered_access_view view,
DWORD  location 
)

Definition at line 998 of file view.c.

1000{
1002}

Referenced by context_load_unordered_access_resources(), and wined3d_unordered_access_view_clear_uint().

◆ wined3d_unordered_access_view_set_counter()

void wined3d_unordered_access_view_set_counter ( struct wined3d_unordered_access_view view,
unsigned int  value 
)

Definition at line 1046 of file view.c.

1048{
1049 const struct wined3d_gl_info *gl_info;
1050 struct wined3d_context *context;
1051
1052 if (!view->counter_bo)
1053 return;
1054
1055 context = context_acquire(view->resource->device, NULL, 0);
1056 gl_info = context->gl_info;
1057 GL_EXTCALL(glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, view->counter_bo));
1058 GL_EXTCALL(glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sizeof(value), &value));
1059 checkGLcall("set atomic counter");
1061}
Definition: pdh_main.c:94

Referenced by wined3d_cs_exec_set_unordered_access_view().

◆ wined3d_view_invalidate_location()

static void wined3d_view_invalidate_location ( struct wined3d_resource resource,
const struct wined3d_view_desc desc,
DWORD  location 
)
static

Definition at line 298 of file view.c.

300{
301 unsigned int i, sub_resource_idx, layer_count;
302 struct wined3d_texture *texture;
303
304 if (resource->type == WINED3D_RTYPE_BUFFER)
305 {
307 return;
308 }
309
311
312 sub_resource_idx = desc->u.texture.layer_idx * texture->level_count + desc->u.texture.level_idx;
313 layer_count = resource->type != WINED3D_RTYPE_TEXTURE_3D ? desc->u.texture.layer_count : 1;
314 for (i = 0; i < layer_count; ++i, sub_resource_idx += texture->level_count)
316}

Referenced by wined3d_rendertarget_view_invalidate_location(), and wined3d_unordered_access_view_invalidate_location().