[Mesa-dev] [PATCH 04/11] mesa: plumb offset/size parameters through GetTexImage code
Brian Paul
brianp at vmware.com
Sat Dec 13 06:42:47 PST 2014
Needed for GL_ARB_get_texture_sub_image. But at this point, the
offsets are always zero and the sizes match the whole texture image.
---
src/mesa/main/texgetimage.c | 105 ++++++++++++++++++++++++--------------------
1 file changed, 58 insertions(+), 47 deletions(-)
diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c
index 03ad5f4..71c25bb 100644
--- a/src/mesa/main/texgetimage.c
+++ b/src/mesa/main/texgetimage.c
@@ -74,12 +74,11 @@ type_needs_clamping(GLenum type)
*/
static void
get_tex_depth(struct gl_context *ctx, GLuint dimensions,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLint depth,
GLenum format, GLenum type, GLvoid *pixels,
struct gl_texture_image *texImage)
{
- const GLint width = texImage->Width;
- GLint height = texImage->Height;
- GLint depth = texImage->Depth;
GLint img, row;
GLfloat *depthRow = malloc(width * sizeof(GLfloat));
@@ -98,9 +97,9 @@ get_tex_depth(struct gl_context *ctx, GLuint dimensions,
GLint srcRowStride;
/* map src texture buffer */
- ctx->Driver.MapTextureImage(ctx, texImage, img,
- 0, 0, width, height, GL_MAP_READ_BIT,
- &srcMap, &srcRowStride);
+ ctx->Driver.MapTextureImage(ctx, texImage, zoffset + img,
+ xoffset, yoffset, width, height,
+ GL_MAP_READ_BIT, &srcMap, &srcRowStride);
if (srcMap) {
for (row = 0; row < height; row++) {
@@ -129,12 +128,11 @@ get_tex_depth(struct gl_context *ctx, GLuint dimensions,
*/
static void
get_tex_depth_stencil(struct gl_context *ctx, GLuint dimensions,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLint depth,
GLenum format, GLenum type, GLvoid *pixels,
struct gl_texture_image *texImage)
{
- const GLint width = texImage->Width;
- const GLint height = texImage->Height;
- const GLint depth = texImage->Depth;
GLint img, row;
assert(format == GL_DEPTH_STENCIL);
@@ -146,9 +144,9 @@ get_tex_depth_stencil(struct gl_context *ctx, GLuint dimensions,
GLint rowstride;
/* map src texture buffer */
- ctx->Driver.MapTextureImage(ctx, texImage, img,
- 0, 0, width, height, GL_MAP_READ_BIT,
- &srcMap, &rowstride);
+ ctx->Driver.MapTextureImage(ctx, texImage, zoffset + img,
+ xoffset, yoffset, width, height,
+ GL_MAP_READ_BIT, &srcMap, &rowstride);
if (srcMap) {
for (row = 0; row < height; row++) {
@@ -180,12 +178,11 @@ get_tex_depth_stencil(struct gl_context *ctx, GLuint dimensions,
*/
static void
get_tex_ycbcr(struct gl_context *ctx, GLuint dimensions,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLint depth,
GLenum format, GLenum type, GLvoid *pixels,
struct gl_texture_image *texImage)
{
- const GLint width = texImage->Width;
- const GLint height = texImage->Height;
- const GLint depth = texImage->Depth;
GLint img, row;
for (img = 0; img < depth; img++) {
@@ -193,9 +190,9 @@ get_tex_ycbcr(struct gl_context *ctx, GLuint dimensions,
GLint rowstride;
/* map src texture buffer */
- ctx->Driver.MapTextureImage(ctx, texImage, img,
- 0, 0, width, height, GL_MAP_READ_BIT,
- &srcMap, &rowstride);
+ ctx->Driver.MapTextureImage(ctx, texImage, zoffset + img,
+ xoffset, yoffset, width, height,
+ GL_MAP_READ_BIT, &srcMap, &rowstride);
if (srcMap) {
for (row = 0; row < height; row++) {
@@ -233,6 +230,8 @@ get_tex_ycbcr(struct gl_context *ctx, GLuint dimensions,
*/
static void
get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLint depth,
GLenum format, GLenum type, GLvoid *pixels,
struct gl_texture_image *texImage,
GLbitfield transferOps)
@@ -243,9 +242,6 @@ get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions,
const GLenum baseFormat = _mesa_get_format_base_format(texFormat);
const GLenum destBaseFormat = _mesa_base_tex_format(ctx, format);
GLenum rebaseFormat = GL_NONE;
- const GLuint width = texImage->Width;
- const GLuint height = texImage->Height;
- const GLuint depth = texImage->Depth;
GLfloat *tempImage, *tempSlice, *srcRow;
GLuint row, slice;
@@ -264,8 +260,8 @@ get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions,
tempSlice = tempImage + slice * 4 * width * height;
- ctx->Driver.MapTextureImage(ctx, texImage, slice,
- 0, 0, width, height,
+ ctx->Driver.MapTextureImage(ctx, texImage, zoffset + slice,
+ xoffset, yoffset, width, height,
GL_MAP_READ_BIT,
&srcMap, &srcRowStride);
if (srcMap) {
@@ -368,6 +364,8 @@ _mesa_base_pack_format(GLenum format)
*/
static void
get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLint depth,
GLenum format, GLenum type, GLvoid *pixels,
struct gl_texture_image *texImage,
GLbitfield transferOps)
@@ -375,11 +373,8 @@ get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions,
/* don't want to apply sRGB -> RGB conversion here so override the format */
const mesa_format texFormat =
_mesa_get_srgb_format_linear(texImage->TexFormat);
- const GLuint width = texImage->Width;
GLenum destBaseFormat = _mesa_base_pack_format(format);
GLenum rebaseFormat = GL_NONE;
- GLuint height = texImage->Height;
- GLuint depth = texImage->Depth;
GLuint img, row;
GLfloat (*rgba)[4];
GLuint (*rgba_uint)[4];
@@ -472,9 +467,9 @@ get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions,
GLint rowstride;
/* map src texture buffer */
- ctx->Driver.MapTextureImage(ctx, texImage, img,
- 0, 0, width, height, GL_MAP_READ_BIT,
- &srcMap, &rowstride);
+ ctx->Driver.MapTextureImage(ctx, texImage, zoffset + img,
+ xoffset, yoffset, width, height,
+ GL_MAP_READ_BIT, &srcMap, &rowstride);
if (srcMap) {
for (row = 0; row < height; row++) {
const GLubyte *src = srcMap + row * rowstride;
@@ -506,7 +501,7 @@ get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions,
}
/* Unmap the src texture buffer */
- ctx->Driver.UnmapTextureImage(ctx, texImage, img);
+ ctx->Driver.UnmapTextureImage(ctx, texImage, zoffset + img);
}
else {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetTexImage");
@@ -524,6 +519,8 @@ get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions,
*/
static void
get_tex_rgba(struct gl_context *ctx, GLuint dimensions,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLint depth,
GLenum format, GLenum type, GLvoid *pixels,
struct gl_texture_image *texImage)
{
@@ -545,11 +542,17 @@ get_tex_rgba(struct gl_context *ctx, GLuint dimensions,
}
if (_mesa_is_format_compressed(texImage->TexFormat)) {
- get_tex_rgba_compressed(ctx, dimensions, format, type,
+ get_tex_rgba_compressed(ctx, dimensions,
+ xoffset, yoffset, zoffset,
+ width, height, depth,
+ format, type,
pixels, texImage, transferOps);
}
else {
- get_tex_rgba_uncompressed(ctx, dimensions, format, type,
+ get_tex_rgba_uncompressed(ctx, dimensions,
+ xoffset, yoffset, zoffset,
+ width, height, depth,
+ format, type,
pixels, texImage, transferOps);
}
}
@@ -560,8 +563,10 @@ get_tex_rgba(struct gl_context *ctx, GLuint dimensions,
* \return GL_TRUE if done, GL_FALSE otherwise
*/
static GLboolean
-get_tex_memcpy(struct gl_context *ctx, GLenum format, GLenum type,
- GLvoid *pixels,
+get_tex_memcpy(struct gl_context *ctx,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ GLsizei width, GLsizei height, GLint depth,
+ GLenum format, GLenum type, GLvoid *pixels,
struct gl_texture_image *texImage)
{
const GLenum target = texImage->TexObject->Target;
@@ -585,27 +590,27 @@ get_tex_memcpy(struct gl_context *ctx, GLenum format, GLenum type,
if (memCopy) {
const GLuint bpp = _mesa_get_format_bytes(texImage->TexFormat);
- const GLuint bytesPerRow = texImage->Width * bpp;
+ const GLuint bytesPerRow = width * bpp;
GLubyte *dst =
- _mesa_image_address2d(&ctx->Pack, pixels, texImage->Width,
- texImage->Height, format, type, 0, 0);
+ _mesa_image_address2d(&ctx->Pack, pixels, width, height,
+ format, type, 0, 0);
const GLint dstRowStride =
- _mesa_image_row_stride(&ctx->Pack, texImage->Width, format, type);
+ _mesa_image_row_stride(&ctx->Pack, width, format, type);
GLubyte *src;
GLint srcRowStride;
/* map src texture buffer */
- ctx->Driver.MapTextureImage(ctx, texImage, 0,
- 0, 0, texImage->Width, texImage->Height,
+ ctx->Driver.MapTextureImage(ctx, texImage, zoffset,
+ xoffset, yoffset, width, height,
GL_MAP_READ_BIT, &src, &srcRowStride);
if (src) {
if (bytesPerRow == dstRowStride && bytesPerRow == srcRowStride) {
- memcpy(dst, src, bytesPerRow * texImage->Height);
+ memcpy(dst, src, bytesPerRow * height);
}
else {
GLuint row;
- for (row = 0; row < texImage->Height; row++) {
+ for (row = 0; row < height; row++) {
memcpy(dst, src, bytesPerRow);
dst += dstRowStride;
src += srcRowStride;
@@ -663,20 +668,26 @@ _mesa_get_texsubimage(struct gl_context *ctx,
pixels = ADD_POINTERS(buf, pixels);
}
- if (get_tex_memcpy(ctx, format, type, pixels, texImage)) {
+ if (get_tex_memcpy(ctx, xoffset, yoffset, zoffset, width, height, depth,
+ format, type, pixels, texImage)) {
/* all done */
}
else if (format == GL_DEPTH_COMPONENT) {
- get_tex_depth(ctx, dimensions, format, type, pixels, texImage);
+ get_tex_depth(ctx, dimensions, xoffset, yoffset, zoffset,
+ width, height, depth, format, type, pixels, texImage);
}
else if (format == GL_DEPTH_STENCIL_EXT) {
- get_tex_depth_stencil(ctx, dimensions, format, type, pixels, texImage);
+ get_tex_depth_stencil(ctx, dimensions, xoffset, yoffset, zoffset,
+ width, height, depth,
+ format, type, pixels, texImage);
}
else if (format == GL_YCBCR_MESA) {
- get_tex_ycbcr(ctx, dimensions, format, type, pixels, texImage);
+ get_tex_ycbcr(ctx, dimensions, xoffset, yoffset, zoffset,
+ width, height, depth, format, type, pixels, texImage);
}
else {
- get_tex_rgba(ctx, dimensions, format, type, pixels, texImage);
+ get_tex_rgba(ctx, dimensions, xoffset, yoffset, zoffset,
+ width, height, depth, format, type, pixels, texImage);
}
if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
--
1.9.1
More information about the mesa-dev
mailing list