📄 fxdd.c
字号:
struct gl_pixelstore_attrib scissoredUnpack; if (ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F || (ctx->_ImageTransferState & (IMAGE_SCALE_BIAS_BIT| IMAGE_MAP_COLOR_BIT)) || (swrast->_RasterMask & (ALPHATEST_BIT | /*BLEND_BIT |*/ /* blending ok, through pixpipe */ DEPTH_BIT | /* could be done with RGB:DEPTH */ FOG_BIT | /* could be done with RGB:DEPTH */ LOGIC_OP_BIT | /*CLIP_BIT |*/ /* clipping ok, below */ STENCIL_BIT | MASKING_BIT | MULTI_DRAW_BIT | OCCLUSION_BIT | /* nope! at least not yet */ TEXTURE_BIT | FRAGPROG_BIT)) || fxMesa->fallback) { _swrast_DrawPixels( ctx, x, y, width, height, format, type, unpack, pixels ); return; } /* make sure the pixelpipe is configured correctly */ fxSetupFXUnits(ctx); /* FIXME! _RasterMask & CLIP_BIT gets set if we're out of Viewport, also! */ if (ctx->Scissor.Enabled) { /* This is a bit tricky, but by carefully adjusting the px, py, * width, height, skipPixels and skipRows values we can do * scissoring without special code in the rendering loop. */ /* we'll construct a new pixelstore struct */ finalUnpack = &scissoredUnpack; scissoredUnpack = *unpack; if (scissoredUnpack.RowLength == 0) scissoredUnpack.RowLength = width; /* clip left */ if (x < ctx->Scissor.X) { scissoredUnpack.SkipPixels += (ctx->Scissor.X - x); width -= (ctx->Scissor.X - x); x = ctx->Scissor.X; } /* clip right */ if (x + width >= ctx->Scissor.X + ctx->Scissor.Width) { width -= (x + width - (ctx->Scissor.X + ctx->Scissor.Width)); } /* clip bottom */ if (y < ctx->Scissor.Y) { scissoredUnpack.SkipRows += (ctx->Scissor.Y - y); height -= (ctx->Scissor.Y - y); y = ctx->Scissor.Y; } /* clip top */ if (y + height >= ctx->Scissor.Y + ctx->Scissor.Height) { height -= (y + height - (ctx->Scissor.Y + ctx->Scissor.Height)); } if (width <= 0 || height <= 0) return; } else { finalUnpack = unpack; } info.size = sizeof(info); if (!grLfbLock(GR_LFB_WRITE_ONLY, fxMesa->currentFB, GR_LFBWRITEMODE_565, GR_ORIGIN_LOWER_LEFT, FXTRUE, &info)) { _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels); return; } { const GLint winX = 0; const GLint winY = 0; const GLint dstStride = info.strideInBytes / 2; /* stride in GLushorts */ GLushort *dst = (GLushort *) info.lfbPtr + (winY + y) * dstStride + (winX + x); if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR565(src[2], src[1], src[0]); src += 4; } dst += dstStride; } } else if (format == GL_RGB && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR565(src[2], src[1], src[0]); src += 3; } dst += dstStride; } } else { grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels); return; } } grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB);}static voidfxDDDrawPixels565_rev (GLcontext * ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, const struct gl_pixelstore_attrib *unpack, const GLvoid * pixels){ fxMesaContext fxMesa = FX_CONTEXT(ctx); SWcontext *swrast = SWRAST_CONTEXT(ctx); GrLfbInfo_t info; const struct gl_pixelstore_attrib *finalUnpack; struct gl_pixelstore_attrib scissoredUnpack; if (ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F || (ctx->_ImageTransferState & (IMAGE_SCALE_BIAS_BIT| IMAGE_MAP_COLOR_BIT)) || (swrast->_RasterMask & (ALPHATEST_BIT | /*BLEND_BIT |*/ /* blending ok, through pixpipe */ DEPTH_BIT | /* could be done with RGB:DEPTH */ FOG_BIT | /* could be done with RGB:DEPTH */ LOGIC_OP_BIT | /*CLIP_BIT |*/ /* clipping ok, below */ STENCIL_BIT | MASKING_BIT | MULTI_DRAW_BIT | OCCLUSION_BIT | /* nope! at least not yet */ TEXTURE_BIT | FRAGPROG_BIT)) || fxMesa->fallback) { _swrast_DrawPixels( ctx, x, y, width, height, format, type, unpack, pixels ); return; } /* make sure the pixelpipe is configured correctly */ fxSetupFXUnits(ctx); /* FIXME! _RasterMask & CLIP_BIT gets set if we're out of Viewport, also! */ if (ctx->Scissor.Enabled) { /* This is a bit tricky, but by carefully adjusting the px, py, * width, height, skipPixels and skipRows values we can do * scissoring without special code in the rendering loop. */ /* we'll construct a new pixelstore struct */ finalUnpack = &scissoredUnpack; scissoredUnpack = *unpack; if (scissoredUnpack.RowLength == 0) scissoredUnpack.RowLength = width; /* clip left */ if (x < ctx->Scissor.X) { scissoredUnpack.SkipPixels += (ctx->Scissor.X - x); width -= (ctx->Scissor.X - x); x = ctx->Scissor.X; } /* clip right */ if (x + width >= ctx->Scissor.X + ctx->Scissor.Width) { width -= (x + width - (ctx->Scissor.X + ctx->Scissor.Width)); } /* clip bottom */ if (y < ctx->Scissor.Y) { scissoredUnpack.SkipRows += (ctx->Scissor.Y - y); height -= (ctx->Scissor.Y - y); y = ctx->Scissor.Y; } /* clip top */ if (y + height >= ctx->Scissor.Y + ctx->Scissor.Height) { height -= (y + height - (ctx->Scissor.Y + ctx->Scissor.Height)); } if (width <= 0 || height <= 0) return; } else { finalUnpack = unpack; } info.size = sizeof(info); if (!grLfbLock(GR_LFB_WRITE_ONLY, fxMesa->currentFB, GR_LFBWRITEMODE_565, GR_ORIGIN_LOWER_LEFT, FXTRUE, &info)) { _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels); return; } { const GLint winX = 0; const GLint winY = 0; const GLint dstStride = info.strideInBytes / 2; /* stride in GLushorts */ GLushort *dst = (GLushort *) info.lfbPtr + (winY + y) * dstStride + (winX + x); if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR565(src[0], src[1], src[2]); src += 4; } dst += dstStride; } } else if (format == GL_RGB && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR565(src[0], src[1], src[2]); src += 3; } dst += dstStride; } } else { grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels); return; } } grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB);}static voidfxDDDrawPixels8888 (GLcontext * ctx, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, const struct gl_pixelstore_attrib *unpack, const GLvoid * pixels){ fxMesaContext fxMesa = FX_CONTEXT(ctx); SWcontext *swrast = SWRAST_CONTEXT(ctx); GrLfbInfo_t info; const struct gl_pixelstore_attrib *finalUnpack; struct gl_pixelstore_attrib scissoredUnpack; if (ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F || (ctx->_ImageTransferState & (IMAGE_SCALE_BIAS_BIT| IMAGE_MAP_COLOR_BIT)) || (swrast->_RasterMask & (/*ALPHATEST_BIT |*/ /*BLEND_BIT |*/ /* blending ok, through pixpipe */ DEPTH_BIT | /* could be done with RGB:DEPTH */ FOG_BIT | /* could be done with RGB:DEPTH */ LOGIC_OP_BIT | /*CLIP_BIT |*/ /* clipping ok, below */ STENCIL_BIT | /*MASKING_BIT |*/ /* masking ok, we're in 32bpp */ MULTI_DRAW_BIT | OCCLUSION_BIT | /* nope! at least not yet */ TEXTURE_BIT | FRAGPROG_BIT)) || fxMesa->fallback) { _swrast_DrawPixels( ctx, x, y, width, height, format, type, unpack, pixels ); return; } /* make sure the pixelpipe is configured correctly */ fxSetupFXUnits(ctx); /* FIXME! _RasterMask & CLIP_BIT gets set if we're out of Viewport, also! */ if (ctx->Scissor.Enabled) { /* This is a bit tricky, but by carefully adjusting the px, py, * width, height, skipPixels and skipRows values we can do * scissoring without special code in the rendering loop. */ /* we'll construct a new pixelstore struct */ finalUnpack = &scissoredUnpack; scissoredUnpack = *unpack; if (scissoredUnpack.RowLength == 0) scissoredUnpack.RowLength = width; /* clip left */ if (x < ctx->Scissor.X) { scissoredUnpack.SkipPixels += (ctx->Scissor.X - x); width -= (ctx->Scissor.X - x); x = ctx->Scissor.X; } /* clip right */ if (x + width >= ctx->Scissor.X + ctx->Scissor.Width) { width -= (x + width - (ctx->Scissor.X + ctx->Scissor.Width)); } /* clip bottom */ if (y < ctx->Scissor.Y) { scissoredUnpack.SkipRows += (ctx->Scissor.Y - y); height -= (ctx->Scissor.Y - y); y = ctx->Scissor.Y; } /* clip top */ if (y + height >= ctx->Scissor.Y + ctx->Scissor.Height) { height -= (y + height - (ctx->Scissor.Y + ctx->Scissor.Height)); } if (width <= 0 || height <= 0) return; } else { finalUnpack = unpack; } info.size = sizeof(info); if (!grLfbLock(GR_LFB_WRITE_ONLY, fxMesa->currentFB, GR_LFBWRITEMODE_8888, GR_ORIGIN_LOWER_LEFT, FXTRUE, &info)) { _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels); return; } { const GLint winX = 0; const GLint winY = 0; const GLint dstStride = info.strideInBytes / 4; /* stride in GLuints */ GLuint *dst = (GLuint *) info.lfbPtr + (winY + y) * dstStride + (winX + x); if (format == GL_RGBA && type == GL_UNSIGNED_BYTE) { /* directly memcpy 8A8R8G8B pixels to screen */ const GLint widthInBytes = width * 4; GLint row; for (row = 0; row < height; row++) { GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, pixels, width, height, format, type, row, 0); MEMCPY(dst, src, widthInBytes); dst += dstStride; } } else if (format == GL_RGB && type == GL_UNSIGNED_BYTE) { GLint row; for (row = 0; row < height; row++) { GLubyte *src = (GLubyte *) _mesa_image_address2d(finalUnpack, pixels, width, height, format, type, row, 0); GLint col; for (col = 0; col < width; col++) { dst[col] = TDFXPACKCOLOR8888(src[2], src[1], src[0], 255); src += 3; } dst += dstStride; } } else { grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB); _swrast_DrawPixels(ctx, x, y, width, height, format, type, finalUnpack, pixels); return; } } grLfbUnlock(GR_LFB_WRITE_ONLY, fxMesa->currentFB);}static voidfxDDFinish(GLcontext * ctx){ grFlush();}/* KW: Put the word Mesa in the render string because quakeworld * checks for this rather than doing a glGet(GL_MAX_TEXTURE_SIZE). * Why? */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -