On Mon, Oct 24, 2011 at 5:15 PM, Eric Anholt <e...@anholt.net> wrote: > We wanted to reuse this in the Intel driver. > --- > src/mesa/main/mtypes.h | 14 ++++++++ > src/mesa/main/teximage.c | 57 +++++++++++++++++++++++++++++-- > src/mesa/state_tracker/st_cb_texture.c | 58 > ++------------------------------ > src/mesa/state_tracker/st_extensions.c | 2 + > 4 files changed, 73 insertions(+), 58 deletions(-) > > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > index 719dff3..3309119 100644 > --- a/src/mesa/main/mtypes.h > +++ b/src/mesa/main/mtypes.h > @@ -1457,6 +1457,20 @@ struct gl_texture_attrib > /** GL_ARB_seamless_cubemap */ > GLboolean CubeMapSeamless; > > + /** > + * Whether the implementation strips out and ignores texture borders. > + * > + * Many GPU hardware implementations don't support rendering with texture > + * borders and mipmapped textures. (Note: not static border color, but > the > + * old 1-pixel border around each edge). Implementations then have to do > + * slow fallbacks to be correct, or just ignore the border and be fast but > + * wrong. Setting the flag stripts the border off of TexImage calls, > + * providing "fast but wrong" at significantly reduced driver complexity. > + * > + * Texture borders are deprecated in GL 3.0. > + **/ > + GLboolean StripTextureBorder;
I think I'd like to see this put into the gl_constants state to make it obvious that this is driver-specified constant state and not some kind of settable texture state. > + > /** Texture units/samplers used by vertex or fragment texturing */ > GLbitfield _EnabledUnits; > > diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c > index 798201a..f1d1a7c 100644 > --- a/src/mesa/main/teximage.c > +++ b/src/mesa/main/teximage.c > @@ -2246,6 +2246,45 @@ _mesa_choose_texture_format(struct gl_context *ctx, > return f; > } > > +/** > + * Adjust pixel unpack params and image dimensions to strip off the > + * texture border. > + * > + * Gallium and intel don't support texture borders. They've seldem been used > + * and seldom been implemented correctly anyway. > + * > + * \param unpackNew returns the new pixel unpack parameters > + */ > +static void > +strip_texture_border(GLint *border, > + GLint *width, GLint *height, GLint *depth, > + const struct gl_pixelstore_attrib *unpack, > + struct gl_pixelstore_attrib *unpackNew) > +{ > + assert(*border > 0); /* sanity check */ > + > + *unpackNew = *unpack; > + > + if (unpackNew->RowLength == 0) > + unpackNew->RowLength = *width; > + > + if (depth && unpackNew->ImageHeight == 0) > + unpackNew->ImageHeight = *height; > + > + unpackNew->SkipPixels += *border; > + if (height) > + unpackNew->SkipRows += *border; > + if (depth) > + unpackNew->SkipImages += *border; > + > + assert(*width >= 3); > + *width = *width - 2 * *border; > + if (height && *height >= 3) > + *height = *height - 2 * *border; > + if (depth && *depth >= 3) > + *depth = *depth - 2 * *border; > + *border = 0; > +} > > /** > * Common code to implement all the glTexImage1D/2D/3D functions. > @@ -2258,6 +2297,8 @@ teximage(struct gl_context *ctx, GLuint dims, > const GLvoid *pixels) > { > GLboolean error; > + struct gl_pixelstore_attrib unpack_no_border; > + const struct gl_pixelstore_attrib *unpack = &ctx->Unpack; > > ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); > > @@ -2322,6 +2363,16 @@ teximage(struct gl_context *ctx, GLuint dims, > return; /* error was recorded */ > } > > + /* Allow a hardware driver to just strip out the border, to provide > + * reliable but slightly incorrect hardware rendering instead of > + * rarely-tested software fallback rendering. > + */ > + if (border && ctx->Texture.StripTextureBorder) { > + strip_texture_border(&border, &width, &height, &depth, unpack, > + &unpack_no_border); > + unpack = &unpack_no_border; > + } > + I think we also need this code in the glCopyTexImage() path. -Brian _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev