On Sat, Dec 13, 2014 at 6:42 AM, Brian Paul <bri...@vmware.com> wrote: > > In preparation for getting texture sub images. > --- > src/mesa/drivers/common/meta.c | 88 > +++++++++++++++++--------- > src/mesa/drivers/common/meta.h | 4 ++ > src/mesa/drivers/common/meta_generate_mipmap.c | 4 +- > 3 files changed, 64 insertions(+), 32 deletions(-) > > diff --git a/src/mesa/drivers/common/meta.c > b/src/mesa/drivers/common/meta.c > index 87532c1..a84e512 100644 > --- a/src/mesa/drivers/common/meta.c > +++ b/src/mesa/drivers/common/meta.c > @@ -2450,30 +2450,53 @@ _mesa_meta_Bitmap(struct gl_context *ctx, > > /** > * Compute the texture coordinates for the four vertices of a quad for > - * drawing a 2D texture image or slice of a cube/3D texture. > + * drawing a 2D texture image or slice of a cube/3D texture. The offset > + * and width, height specify a sub-region of the 2D image. > + * > * \param faceTarget GL_TEXTURE_1D/2D/3D or cube face name > * \param slice slice of a 1D/2D array texture or 3D texture > - * \param width width of the texture image > - * \param height height of the texture image > + * \param xoffset X position of sub texture > + * \param yoffset Y position of sub texture > + * \param width width of the sub texture image > + * \param height height of the sub texture image > + * \param total_width total width of the texture image > + * \param total_height total height of the texture image > + * \param total_depth total depth of the texture image > * \param coords0/1/2/3 returns the computed texcoords > */ >
I'm confused. Here you take the args width, height, then total_width, total_height, and total_depth. But in the definition of _mesa_meta_setup_texture_coords in meta.h, you have width, height, depth, total_width, and total_height. void > _mesa_meta_setup_texture_coords(GLenum faceTarget, > GLint slice, > + GLint xoffset, > + GLint yoffset, > GLint width, > GLint height, > - GLint depth, > + GLint total_width, > + GLint total_height, > + GLint total_depth, > GLfloat coords0[4], > GLfloat coords1[4], > GLfloat coords2[4], > GLfloat coords3[4]) > { > - static const GLfloat st[4][2] = { > - {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f} > - }; > + float st[4][2]; > GLuint i; > + const float s0 = (float) xoffset / (float) total_width; > + const float s1 = (float) (xoffset + width) / (float) total_width; > + const float t0 = (float) yoffset / (float) total_height; > + const float t1 = (float) (yoffset + height) / (float) total_height; > GLfloat r; > > + /* setup the reference texcoords */ > + st[0][0] = s0; > + st[0][1] = t0; > + st[1][0] = s1; > + st[1][1] = t0; > + st[2][0] = s1; > + st[2][1] = t1; > + st[3][0] = s0; > + st[3][1] = t1; > + > if (faceTarget == GL_TEXTURE_CUBE_MAP_ARRAY) > faceTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + slice % 6; > > @@ -2490,52 +2513,52 @@ _mesa_meta_setup_texture_coords(GLenum faceTarget, > case GL_TEXTURE_3D: > case GL_TEXTURE_2D_ARRAY: > if (faceTarget == GL_TEXTURE_3D) { > - assert(slice < depth); > - assert(depth >= 1); > - r = (slice + 0.5f) / depth; > + assert(slice < total_depth); > + assert(total_depth >= 1); > + r = (slice + 0.5f) / total_depth; > } > else if (faceTarget == GL_TEXTURE_2D_ARRAY) > r = (float) slice; > else > r = 0.0F; > - coords0[0] = 0.0F; /* s */ > - coords0[1] = 0.0F; /* t */ > + coords0[0] = st[0][0]; /* s */ > + coords0[1] = st[0][1]; /* t */ > coords0[2] = r; /* r */ > - coords1[0] = 1.0F; > - coords1[1] = 0.0F; > + coords1[0] = st[1][0]; > + coords1[1] = st[1][1]; > coords1[2] = r; > - coords2[0] = 1.0F; > - coords2[1] = 1.0F; > + coords2[0] = st[2][0]; > + coords2[1] = st[2][1]; > coords2[2] = r; > - coords3[0] = 0.0F; > - coords3[1] = 1.0F; > + coords3[0] = st[3][0]; > + coords3[1] = st[3][1]; > coords3[2] = r; > break; > case GL_TEXTURE_RECTANGLE_ARB: > - coords0[0] = 0.0F; /* s */ > - coords0[1] = 0.0F; /* t */ > + coords0[0] = (float) xoffset; /* s */ > + coords0[1] = (float) yoffset; /* t */ > coords0[2] = 0.0F; /* r */ > - coords1[0] = (float) width; > - coords1[1] = 0.0F; > + coords1[0] = (float) (xoffset + width); > + coords1[1] = (float) yoffset; > coords1[2] = 0.0F; > - coords2[0] = (float) width; > - coords2[1] = (float) height; > + coords2[0] = (float) (xoffset + width); > + coords2[1] = (float) (yoffset + height); > coords2[2] = 0.0F; > - coords3[0] = 0.0F; > - coords3[1] = (float) height; > + coords3[0] = (float) xoffset; > + coords3[1] = (float) (yoffset + height); > coords3[2] = 0.0F; > break; > case GL_TEXTURE_1D_ARRAY: > - coords0[0] = 0.0F; /* s */ > + coords0[0] = st[0][0]; /* s */ > coords0[1] = (float) slice; /* t */ > coords0[2] = 0.0F; /* r */ > - coords1[0] = 1.0f; > + coords1[0] = st[1][0]; > coords1[1] = (float) slice; > coords1[2] = 0.0F; > - coords2[0] = 1.0F; > + coords2[0] = st[2][0]; > coords2[1] = (float) slice; > coords2[2] = 0.0F; > - coords3[0] = 0.0F; > + coords3[0] = st[3][0]; > coords3[1] = (float) slice; > coords3[2] = 0.0F; > break; > @@ -3069,7 +3092,10 @@ decompress_texture_image(struct gl_context *ctx, > /* Silence valgrind warnings about reading uninitialized stack. */ > memset(verts, 0, sizeof(verts)); > > - _mesa_meta_setup_texture_coords(faceTarget, slice, width, height, > depth, > + _mesa_meta_setup_texture_coords(faceTarget, slice, > + 0, 0, width, height, > + texImage->Width, texImage->Height, > + texImage->Depth, > verts[0].tex, > verts[1].tex, > verts[2].tex, > diff --git a/src/mesa/drivers/common/meta.h > b/src/mesa/drivers/common/meta.h > index 6ecf3c0..03e5191 100644 > --- a/src/mesa/drivers/common/meta.h > +++ b/src/mesa/drivers/common/meta.h > @@ -569,9 +569,13 @@ _mesa_meta_alloc_texture(struct temp_texture *tex, > void > _mesa_meta_setup_texture_coords(GLenum faceTarget, > GLint slice, > + GLint xoffset, > + GLint yoffset, > GLint width, > GLint height, > GLint depth, > + GLint total_width, > + GLint total_height, > GLfloat coords0[4], > GLfloat coords1[4], > GLfloat coords2[4], > diff --git a/src/mesa/drivers/common/meta_generate_mipmap.c > b/src/mesa/drivers/common/meta_generate_mipmap.c > index 8ffd8da..58b9a53 100644 > --- a/src/mesa/drivers/common/meta_generate_mipmap.c > +++ b/src/mesa/drivers/common/meta_generate_mipmap.c > @@ -317,7 +317,9 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, > GLenum target, > /* Setup texture coordinates */ > _mesa_meta_setup_texture_coords(faceTarget, > layer, > - 0, 0, 1, /* width, height never > used here */ > + 0, 0, /* xoffset, yoffset */ > + srcWidth, srcHeight, /* img size > */ > + srcWidth, srcHeight, srcDepth, > verts[0].tex, > verts[1].tex, > verts[2].tex, > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev