14ee0ebc600304f946f2d311e9f8ee375862d4b4
2 * Mesa 3-D graphics library
4 * Copyright (C) 2011 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 * Functions for mapping/unmapping texture images.
29 #include "main/context.h"
30 #include "main/fbobject.h"
31 #include "main/teximage.h"
32 #include "swrast/swrast.h"
33 #include "swrast/s_context.h"
37 * Allocate a new swrast_texture_image (a subclass of gl_texture_image).
38 * Called via ctx->Driver.NewTextureImage().
40 struct gl_texture_image
*
41 _swrast_new_texture_image( struct gl_context
*ctx
)
44 return (struct gl_texture_image
*) CALLOC_STRUCT(swrast_texture_image
);
49 * Free a swrast_texture_image (a subclass of gl_texture_image).
50 * Called via ctx->Driver.DeleteTextureImage().
53 _swrast_delete_texture_image(struct gl_context
*ctx
,
54 struct gl_texture_image
*texImage
)
56 /* Nothing special for the subclass yet */
57 _mesa_delete_texture_image(ctx
, texImage
);
62 * Called via ctx->Driver.AllocTextureImageBuffer()
65 _swrast_alloc_texture_image_buffer(struct gl_context
*ctx
,
66 struct gl_texture_image
*texImage
,
67 gl_format format
, GLsizei width
,
68 GLsizei height
, GLsizei depth
)
70 struct swrast_texture_image
*swImg
= swrast_texture_image(texImage
);
71 GLuint bytes
= _mesa_format_image_size(format
, width
, height
, depth
);
73 /* This _should_ be true (revisit if these ever fail) */
74 assert(texImage
->Width
== width
);
75 assert(texImage
->Height
== height
);
76 assert(texImage
->Depth
== depth
);
78 assert(!texImage
->Data
);
79 texImage
->Data
= _mesa_align_malloc(bytes
, 512);
81 if ((width
== 1 || _mesa_is_pow_two(texImage
->Width2
)) &&
82 (height
== 1 || _mesa_is_pow_two(texImage
->Height2
)) &&
83 (depth
== 1 || _mesa_is_pow_two(texImage
->Depth2
)))
84 swImg
->_IsPowerOfTwo
= GL_TRUE
;
86 swImg
->_IsPowerOfTwo
= GL_FALSE
;
88 return texImage
->Data
!= NULL
;
93 * Called via ctx->Driver.FreeTextureImageBuffer()
96 _swrast_free_texture_image_buffer(struct gl_context
*ctx
,
97 struct gl_texture_image
*texImage
)
99 if (texImage
->Data
&& !texImage
->IsClientData
) {
100 _mesa_align_free(texImage
->Data
);
103 texImage
->Data
= NULL
;
108 * Error checking for debugging only.
111 _mesa_check_map_teximage(struct gl_texture_image
*texImage
,
112 GLuint slice
, GLuint x
, GLuint y
, GLuint w
, GLuint h
)
115 if (texImage
->TexObject
->Target
== GL_TEXTURE_1D
)
116 assert(y
== 0 && h
== 1);
118 assert(x
< texImage
->Width
|| texImage
->Width
== 0);
119 assert(y
< texImage
->Height
|| texImage
->Height
== 0);
120 assert(x
+ w
<= texImage
->Width
);
121 assert(y
+ h
<= texImage
->Height
);
125 * Map a 2D slice of a texture image into user space.
126 * (x,y,w,h) defines a region of interest (ROI). Reading/writing texels
127 * outside of the ROI is undefined.
129 * \param texImage the texture image
130 * \param slice the 3D image slice or array texture slice
131 * \param x, y, w, h region of interest
132 * \param mode bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT
133 * \param mapOut returns start of mapping of region of interest
134 * \param rowStrideOut returns row stride (in bytes)
137 _swrast_map_teximage(struct gl_context
*ctx
,
138 struct gl_texture_image
*texImage
,
140 GLuint x
, GLuint y
, GLuint w
, GLuint h
,
146 GLint stride
, texelSize
;
149 _mesa_check_map_teximage(texImage
, slice
, x
, y
, w
, h
);
151 texelSize
= _mesa_get_format_bytes(texImage
->TexFormat
);
152 stride
= _mesa_format_row_stride(texImage
->TexFormat
, texImage
->Width
);
153 _mesa_get_format_block_size(texImage
->TexFormat
, &bw
, &bh
);
155 assert(texImage
->Data
);
157 map
= texImage
->Data
;
159 if (texImage
->TexObject
->Target
== GL_TEXTURE_3D
||
160 texImage
->TexObject
->Target
== GL_TEXTURE_2D_ARRAY
) {
161 GLuint sliceSize
= _mesa_format_image_size(texImage
->TexFormat
,
165 assert(slice
< texImage
->Depth
);
166 map
+= slice
* sliceSize
;
169 /* apply x/y offset to map address */
170 map
+= stride
* (y
/ bh
) + texelSize
* (x
/ bw
);
173 *rowStrideOut
= stride
;
177 _swrast_unmap_teximage(struct gl_context
*ctx
,
178 struct gl_texture_image
*texImage
,