mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 04:38:03 +02:00
accomodate newtexstore
fixed wgl interface for fxMesa
This commit is contained in:
parent
18514500c4
commit
5be4c27b28
4 changed files with 114 additions and 74 deletions
|
|
@ -1320,6 +1320,7 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
|
|||
return;
|
||||
}
|
||||
/* unpack image, apply transfer ops and store in tempImage */
|
||||
#if !NEWTEXSTORE
|
||||
_mesa_transfer_teximage(ctx, 2, texImage->Format,
|
||||
_final_texImage_TexFormat,
|
||||
tempImage,
|
||||
|
|
@ -1327,6 +1328,15 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
|
|||
width * texelBytes, /* dstRowStride */
|
||||
0, /* dstImageStride */
|
||||
format, type, pixels, packing);
|
||||
#else
|
||||
texImage->TexFormat->StoreImage(ctx, 2, texImage->Format,
|
||||
_final_texImage_TexFormat, tempImage,
|
||||
0, 0, 0, /* dstX/Y/Zoffset */
|
||||
width * texelBytes, /* dstRowStride */
|
||||
0, /* dstImageStride */
|
||||
width, height, 1,
|
||||
format, type, pixels, packing);
|
||||
#endif
|
||||
_mesa_rescale_teximage2d(texelBytes,
|
||||
mml->width * texelBytes, /* dst stride */
|
||||
width, height, /* src */
|
||||
|
|
@ -1337,12 +1347,22 @@ fxDDTexImage2D(GLcontext * ctx, GLenum target, GLint level,
|
|||
else {
|
||||
/* no rescaling needed */
|
||||
/* unpack image, apply transfer ops and store in texImage->Data */
|
||||
#if !NEWTEXSTORE
|
||||
_mesa_transfer_teximage(ctx, 2, texImage->Format,
|
||||
_final_texImage_TexFormat, _final_texImage_Data,
|
||||
width, height, 1, 0, 0, 0,
|
||||
mml->width * texelBytes,
|
||||
0, /* dstImageStride */
|
||||
format, type, pixels, packing);
|
||||
#else
|
||||
texImage->TexFormat->StoreImage(ctx, 2, texImage->Format,
|
||||
_final_texImage_TexFormat, _final_texImage_Data,
|
||||
0, 0, 0, /* dstX/Y/Zoffset */
|
||||
mml->width * texelBytes, /* dstRowStride */
|
||||
0, /* dstImageStride */
|
||||
width, height, 1,
|
||||
format, type, pixels, packing);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* now compress */
|
||||
|
|
@ -1431,6 +1451,7 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
|
|||
return;
|
||||
}
|
||||
|
||||
#if !NEWTEXSTORE
|
||||
_mesa_transfer_teximage(ctx, 2, texImage->Format,/* Tex int format */
|
||||
texImage->TexFormat, /* dest format */
|
||||
(GLubyte *) tempImage, /* dest */
|
||||
|
|
@ -1439,6 +1460,15 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
|
|||
width * texelBytes, /* dest row stride */
|
||||
0, /* dst image stride */
|
||||
format, type, pixels, packing);
|
||||
#else
|
||||
texImage->TexFormat->StoreImage(ctx, 2, texImage->Format,
|
||||
texImage->TexFormat, tempImage,
|
||||
0, 0, 0, /* dstX/Y/Zoffset */
|
||||
width * texelBytes, /* dstRowStride */
|
||||
0, /* dstImageStride */
|
||||
width, height, 1,
|
||||
format, type, pixels, packing);
|
||||
#endif
|
||||
|
||||
/* now rescale */
|
||||
/* compute address of dest subimage within the overal tex image */
|
||||
|
|
@ -1456,6 +1486,7 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
|
|||
}
|
||||
else {
|
||||
/* no rescaling needed */
|
||||
#if !NEWTEXSTORE
|
||||
_mesa_transfer_teximage(ctx, 2, texImage->Format, /* Tex int format */
|
||||
texImage->TexFormat, /* dest format */
|
||||
(GLubyte *) texImage->Data,/* dest */
|
||||
|
|
@ -1464,6 +1495,15 @@ fxDDTexSubImage2D(GLcontext * ctx, GLenum target, GLint level,
|
|||
mml->width * texelBytes, /* dest row stride */
|
||||
0, /* dst image stride */
|
||||
format, type, pixels, packing);
|
||||
#else
|
||||
texImage->TexFormat->StoreImage(ctx, 2, texImage->Format,
|
||||
texImage->TexFormat, (GLubyte *) texImage->Data,
|
||||
xoffset, yoffset, 0, /* dstX/Y/Zoffset */
|
||||
mml->width * texelBytes, /* dstRowStride */
|
||||
0, /* dstImageStride */
|
||||
width, height, 1,
|
||||
format, type, pixels, packing);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* [dBorca]
|
||||
|
|
|
|||
|
|
@ -67,77 +67,77 @@ fxTexValidate(GLcontext * ctx, struct gl_texture_object *tObj)
|
|||
|
||||
#if FX_RESCALE_BIG_TEXURES_HACK
|
||||
{
|
||||
extern void _mesa_rescale_teximage2d( GLuint bytesPerPixel,
|
||||
GLuint dstRowStride,
|
||||
GLint srcWidth, GLint srcHeight,
|
||||
GLint dstWidth, GLint dstHeight,
|
||||
const GLvoid *srcImage, GLvoid *dstImage );
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
/* [dBorca]
|
||||
* Ooooooook! Here's a(nother) long story.
|
||||
* We get here because we need to handle a texture larger
|
||||
* than hardware can support. Two cases:
|
||||
* 1) we have mipmaps. Then we just push up to the first supported
|
||||
* LOD. A possible drawback is that Mesa will ignore the skipped
|
||||
* LODs on further texture handling.
|
||||
* Will this interfere with GL_TEXTURE_[MIN|BASE]_LEVEL? How?
|
||||
* 2) we don't have mipmaps. We need to rescale the big LOD in place.
|
||||
* The above approach is somehow dumb! we might have rescaled
|
||||
* once in TexImage2D to accomodate aspect ratio, and now we
|
||||
* are rescaling again. The thing is, in TexImage2D we don't
|
||||
* know whether we'll hit 1) or 2) by the time of validation.
|
||||
* NB: we could handle mml->[wh]Scale nicely, using (biased) shifts.
|
||||
*
|
||||
* Which brings me to another issue. How can we handle NPOT textures?
|
||||
* - rescaling NPOT to the next bigger POT (mml->[wh]Scale can't shift)
|
||||
* - upping the max LOD to the next power-of-two, in fxTexGetInfo; then
|
||||
* choosing non-power-of-two values for ti->[st]Scale... Anyhow, we
|
||||
* still need to align mipmaps correctly in texture memory!
|
||||
*/
|
||||
if ((tObj->MinFilter == GL_NEAREST) || (tObj->MinFilter == GL_LINEAR)) {
|
||||
/* no mipmaps! */
|
||||
struct gl_texture_image *texImage = tObj->Image[0][minl];
|
||||
tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage);
|
||||
GLint _w, _h, maxSize = 1 << fxMesa->textureMaxLod;
|
||||
if ((mml->width > maxSize) || (mml->height > maxSize)) {
|
||||
/* need to rescale */
|
||||
GLint texelBytes = texImage->TexFormat->TexelBytes;
|
||||
GLvoid *texImage_Data = texImage->Data;
|
||||
_w = MIN2(texImage->Width, maxSize);
|
||||
_h = MIN2(texImage->Height, maxSize);
|
||||
if (TDFX_DEBUG & VERBOSE_TEXTURE) {
|
||||
fprintf(stderr, "fxTexValidate: rescaling %d x %d -> %d x %d\n",
|
||||
texImage->Width, texImage->Height, _w, _h);
|
||||
}
|
||||
/* we should leave these as is and... (!) */
|
||||
texImage->Width = _w;
|
||||
texImage->Height = _h;
|
||||
fxTexGetInfo(_w, _h, NULL, NULL, NULL, NULL,
|
||||
&(mml->wScale), &(mml->hScale));
|
||||
_w *= mml->wScale;
|
||||
_h *= mml->hScale;
|
||||
texImage->Data = MESA_PBUFFER_ALLOC(_w * _h * texelBytes);
|
||||
_mesa_rescale_teximage2d(texelBytes,
|
||||
_w * texelBytes, /* dst stride */
|
||||
mml->width, mml->height, /* src */
|
||||
_w, _h, /* dst */
|
||||
texImage_Data /*src*/, texImage->Data /*dst*/ );
|
||||
MESA_PBUFFER_FREE(texImage_Data);
|
||||
mml->width = _w;
|
||||
mml->height = _h;
|
||||
/* (!) ... and set mml->wScale = _w / texImage->Width */
|
||||
}
|
||||
} else {
|
||||
/* mipmapping */
|
||||
if (maxl - minl > fxMesa->textureMaxLod) {
|
||||
/* skip a certain number of LODs */
|
||||
minl += maxl - fxMesa->textureMaxLod;
|
||||
if (TDFX_DEBUG & VERBOSE_TEXTURE) {
|
||||
fprintf(stderr, "fxTexValidate: skipping %d LODs\n", minl - ti->minLevel);
|
||||
}
|
||||
ti->minLevel = tObj->BaseLevel = minl;
|
||||
}
|
||||
}
|
||||
extern void _mesa_rescale_teximage2d( GLuint bytesPerPixel,
|
||||
GLuint dstRowStride,
|
||||
GLint srcWidth, GLint srcHeight,
|
||||
GLint dstWidth, GLint dstHeight,
|
||||
const GLvoid *srcImage, GLvoid *dstImage );
|
||||
fxMesaContext fxMesa = FX_CONTEXT(ctx);
|
||||
/* [dBorca]
|
||||
* Ooooooook! Here's a(nother) long story.
|
||||
* We get here because we need to handle a texture larger
|
||||
* than hardware can support. Two cases:
|
||||
* 1) we have mipmaps. Then we just push up to the first supported
|
||||
* LOD. A possible drawback is that Mesa will ignore the skipped
|
||||
* LODs on further texture handling.
|
||||
* Will this interfere with GL_TEXTURE_[MIN|BASE]_LEVEL? How?
|
||||
* 2) we don't have mipmaps. We need to rescale the big LOD in place.
|
||||
* The above approach is somehow dumb! we might have rescaled
|
||||
* once in TexImage2D to accomodate aspect ratio, and now we
|
||||
* are rescaling again. The thing is, in TexImage2D we don't
|
||||
* know whether we'll hit 1) or 2) by the time of validation.
|
||||
* NB: we could handle mml->[wh]Scale nicely, using (biased) shifts.
|
||||
*
|
||||
* Which brings me to another issue. How can we handle NPOT textures?
|
||||
* - rescaling NPOT to the next bigger POT (mml->[wh]Scale can't shift)
|
||||
* - upping the max LOD to the next power-of-two, in fxTexGetInfo; then
|
||||
* choosing non-power-of-two values for ti->[st]Scale... Anyhow, we
|
||||
* still need to align mipmaps correctly in texture memory!
|
||||
*/
|
||||
if ((tObj->MinFilter == GL_NEAREST) || (tObj->MinFilter == GL_LINEAR)) {
|
||||
/* no mipmaps! */
|
||||
struct gl_texture_image *texImage = tObj->Image[0][minl];
|
||||
tfxMipMapLevel *mml = FX_MIPMAP_DATA(texImage);
|
||||
GLint _w, _h, maxSize = 1 << fxMesa->textureMaxLod;
|
||||
if ((mml->width > maxSize) || (mml->height > maxSize)) {
|
||||
/* need to rescale */
|
||||
GLint texelBytes = texImage->TexFormat->TexelBytes;
|
||||
GLvoid *texImage_Data = texImage->Data;
|
||||
_w = MIN2(texImage->Width, maxSize);
|
||||
_h = MIN2(texImage->Height, maxSize);
|
||||
if (TDFX_DEBUG & VERBOSE_TEXTURE) {
|
||||
fprintf(stderr, "fxTexValidate: rescaling %d x %d -> %d x %d\n",
|
||||
texImage->Width, texImage->Height, _w, _h);
|
||||
}
|
||||
/* we should leave these as is and... (!) */
|
||||
texImage->Width = _w;
|
||||
texImage->Height = _h;
|
||||
fxTexGetInfo(_w, _h, NULL, NULL, NULL, NULL,
|
||||
&(mml->wScale), &(mml->hScale));
|
||||
_w *= mml->wScale;
|
||||
_h *= mml->hScale;
|
||||
texImage->Data = MESA_PBUFFER_ALLOC(_w * _h * texelBytes);
|
||||
_mesa_rescale_teximage2d(texelBytes,
|
||||
_w * texelBytes, /* dst stride */
|
||||
mml->width, mml->height, /* src */
|
||||
_w, _h, /* dst */
|
||||
texImage_Data /*src*/, texImage->Data /*dst*/ );
|
||||
MESA_PBUFFER_FREE(texImage_Data);
|
||||
mml->width = _w;
|
||||
mml->height = _h;
|
||||
/* (!) ... and set mml->wScale = _w / texImage->Width */
|
||||
}
|
||||
} else {
|
||||
/* mipmapping */
|
||||
if (maxl - minl > fxMesa->textureMaxLod) {
|
||||
/* skip a certain number of LODs */
|
||||
minl += maxl - fxMesa->textureMaxLod;
|
||||
if (TDFX_DEBUG & VERBOSE_TEXTURE) {
|
||||
fprintf(stderr, "fxTexValidate: skipping %d LODs\n", minl - ti->minLevel);
|
||||
}
|
||||
ti->minLevel = tObj->BaseLevel = minl;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -815,7 +815,7 @@ wglDescribePixelFormat(HDC hdc, int iPixelFormat, UINT nBytes,
|
|||
if (iPixelFormat < 1 || iPixelFormat > qt_valid_pix ||
|
||||
((nBytes != sizeof(PIXELFORMATDESCRIPTOR)) && (nBytes != 0))) {
|
||||
SetLastError(0);
|
||||
return (0);
|
||||
return (qt_valid_pix);
|
||||
}
|
||||
|
||||
if (nBytes != 0)
|
||||
|
|
|
|||
|
|
@ -968,6 +968,8 @@ _mesa_convert_texsubimage3d( GLint mesaFormat, /* dest */
|
|||
return convert_texsubimage3d_tab[mesaFormat]( &convert );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/* Nearest filtering only (for broken hardware that can't support
|
||||
|
|
@ -1036,5 +1038,3 @@ do { \
|
|||
_mesa_problem(NULL,"unexpected bytes/pixel in _mesa_rescale_teximage2d");
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue