📄 gamma_span.c
字号:
/* $XFree86: xc/lib/GL/mesa/src/drv/gamma/gamma_span.c,v 1.4 2002/11/05 17:46:07 tsi Exp $ */#include "gamma_context.h"#include "gamma_lock.h"#include "colormac.h"#include "swrast/swrast.h"#define DBG 0#define LOCAL_VARS \ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); \ gammaScreenPtr gammascrn = gmesa->gammaScreen; \ __DRIscreenPrivate *sPriv = gmesa->driScreen; \ __DRIdrawablePrivate *dPriv = gmesa->driDrawable; \ GLuint pitch = sPriv->fbWidth * gammascrn->cpp; \ GLuint height = dPriv->h; \ char *buf = (char *)(sPriv->pFB + \ gmesa->drawOffset + \ (dPriv->x * gammascrn->cpp) + \ (dPriv->y * pitch)); \ GLuint p; \ (void) buf; (void) p/* FIXME! Depth/Stencil read/writes don't work ! */#define LOCAL_DEPTH_VARS \ gammaScreenPtr gammascrn = gmesa->gammaScreen; \ __DRIdrawablePrivate *dPriv = gmesa->driDrawable; \ __DRIscreenPrivate *sPriv = gmesa->driScreen; \ GLuint pitch = gammascrn->depthPitch; \ GLuint height = dPriv->h; \ char *buf = (char *)(sPriv->pFB + \ gammascrn->depthOffset + \ dPriv->x * gammascrn->cpp + \ dPriv->y * pitch)#define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS#define Y_FLIP( _y ) (height - _y - 1)#define HW_LOCK() \ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); \ FLUSH_DMA_BUFFER(gmesa); \ gammaGetLock( gmesa, DRM_LOCK_FLUSH | DRM_LOCK_QUIESCENT ); \ GAMMAHW_LOCK( gmesa );#define HW_UNLOCK() GAMMAHW_UNLOCK( gmesa )/* ================================================================ * Color buffer *//* 16 bit, RGB565 color spanline and pixel functions */#define INIT_MONO_PIXEL(p, color) \ p = PACK_COLOR_565( color[0], color[1], color[2] )#define WRITE_RGBA( _x, _y, r, g, b, a ) \ *(GLushort *)(buf + _x*2 + _y*pitch) = ((((int)r & 0xf8) << 8) | \ (((int)g & 0xfc) << 3) | \ (((int)b & 0xf8) >> 3))#define WRITE_PIXEL( _x, _y, p ) \ *(GLushort *)(buf + _x*2 + _y*pitch) = p#define READ_RGBA( rgba, _x, _y ) \ do { \ GLushort p = *(GLushort *)(buf + _x*2 + _y*pitch); \ rgba[0] = (p >> 8) & 0xf8; \ rgba[1] = (p >> 3) & 0xfc; \ rgba[2] = (p << 3) & 0xf8; \ rgba[3] = 0xff; \ if ( rgba[0] & 0x08 ) rgba[0] |= 0x07; \ if ( rgba[1] & 0x04 ) rgba[1] |= 0x03; \ if ( rgba[2] & 0x08 ) rgba[2] |= 0x07; \ } while (0)#define TAG(x) gamma##x##_RGB565#include "spantmp.h"/* 32 bit, ARGB8888 color spanline and pixel functions */#undef INIT_MONO_PIXEL#define INIT_MONO_PIXEL(p, color) \ p = PACK_COLOR_8888( color[3], color[0], color[1], color[2] )#define WRITE_RGBA( _x, _y, r, g, b, a ) \ *(GLuint *)(buf + _x*4 + _y*pitch) = ((b << 0) | \ (g << 8) | \ (r << 16) | \ (a << 24) )#define WRITE_PIXEL( _x, _y, p ) \ *(GLuint *)(buf + _x*4 + _y*pitch) = p#define READ_RGBA( rgba, _x, _y ) \do { \ GLuint p = *(GLuint *)(buf + _x*4 + _y*pitch); \ rgba[0] = (p >> 16) & 0xff; \ rgba[1] = (p >> 8) & 0xff; \ rgba[2] = (p >> 0) & 0xff; \ rgba[3] = (p >> 24) & 0xff; \} while (0)#define TAG(x) gamma##x##_ARGB8888#include "spantmp.h"/* 16 bit depthbuffer functions. */#define VALUE_TYPE GLushort#define WRITE_DEPTH( _x, _y, d ) \ *(GLushort *)(buf + (_x)*2 + (_y)*pitch) = d;#define READ_DEPTH( d, _x, _y ) \ d = *(GLushort *)(buf + (_x)*2 + (_y)*pitch); #define TAG(x) gamma##x##_16#include "depthtmp.h"#if 0 /* Unused *//* 32 bit depthbuffer functions. */#define VALUE_TYPE GLuint#define WRITE_DEPTH( _x, _y, d ) \ *(GLuint *)(buf + (_x)*4 + (_y)*pitch) = d;#define READ_DEPTH( d, _x, _y ) \ d = *(GLuint *)(buf + (_x)*4 + (_y)*pitch); #define TAG(x) gamma##x##_32#include "depthtmp.h"#endif/* 24/8 bit interleaved depth/stencil functions */#define VALUE_TYPE GLuint#define WRITE_DEPTH( _x, _y, d ) { \ GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*pitch); \ tmp &= 0xff; \ tmp |= (d) & 0xffffff00; \ *(GLuint *)(buf + (_x)*4 + (_y)*pitch) = tmp; \}#define READ_DEPTH( d, _x, _y ) \ d = *(GLuint *)(buf + (_x)*4 + (_y)*pitch) & ~0xff; #define TAG(x) gamma##x##_24_8#include "depthtmp.h"#if 0#define WRITE_STENCIL( _x, _y, d ) { \ GLuint tmp = *(GLuint *)(buf + _x*4 + _y*pitch); \ tmp &= 0xffffff00; \ tmp |= d & 0xff; \ *(GLuint *)(buf + _x*4 + _y*pitch) = tmp; \}#define READ_STENCIL( d, _x, _y ) \ d = *(GLuint *)(buf + _x*4 + _y*pitch) & 0xff; #define TAG(x) gamma##x##_24_8#include "stenciltmp.h"static void gammaReadRGBASpan8888( const GLcontext *ctx, GLuint n, GLint x, GLint y, GLubyte rgba[][4]){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); gammaScreenPtr gammascrn = gmesa->gammaScreen; u_int32_t dwords1, dwords2, i = 0; char *src = (char *)rgba[0]; GLuint read = n * gammascrn->cpp; /* Number of bytes we are expecting */ u_int32_t data; FLUSH_DMA_BUFFER(gmesa); CHECK_DMA_BUFFER(gmesa, 16); WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode & ~(LBReadSrcEnable | LBReadDstEnable)); WRITE(gmesa->buf, ColorDDAMode, ColorDDAEnable); WRITE(gmesa->buf, LBWriteMode, LBWriteModeDisable); WRITE(gmesa->buf, FBReadMode, (gmesa->FBReadMode & ~FBReadSrcEnable) | FBReadDstEnable | FBDataTypeColor); WRITE(gmesa->buf, FilterMode, 0x200); /* Pass FBColorData */ WRITE(gmesa->buf, FBWriteMode, FBW_UploadColorData | FBWriteModeDisable); WRITE(gmesa->buf, StartXSub, (x+n)<<16); WRITE(gmesa->buf, StartXDom, x<<16); WRITE(gmesa->buf, StartY, y<<16); WRITE(gmesa->buf, GLINTCount, 1); WRITE(gmesa->buf, dXDom, 0<<16); WRITE(gmesa->buf, dXSub, 0<<16); WRITE(gmesa->buf, dY, 1<<16); WRITE(gmesa->buf, Render, PrimitiveTrapezoid); FLUSH_DMA_BUFFER(gmesa);moredata: dwords1 = *(volatile u_int32_t*)(void *)(((u_int8_t*)gammascrn->regions[0].map) + (GlintOutFIFOWords)); dwords2 = *(volatile u_int32_t*)(void *)(((u_int8_t*)gammascrn->regions[2].map) + (GlintOutFIFOWords)); if (dwords1) { memcpy(src, (char*)gammascrn->regions[1].map + 0x1000, dwords1 << 2); src += dwords1 << 2; read -= dwords1 << 2; } if (dwords2) { memcpy(src, (char*)gammascrn->regions[3].map + 0x1000, dwords2 << 2); src += dwords2 << 2; read -= dwords2 << 2; } if (read) goto moredata;done: CHECK_DMA_BUFFER(gmesa, 6); WRITE(gmesa->buf, ColorDDAMode, gmesa->ColorDDAMode); WRITE(gmesa->buf, LBWriteMode, LBWriteModeEnable); WRITE(gmesa->buf, LBReadMode, gmesa->LBReadMode); WRITE(gmesa->buf, FBReadMode, gmesa->FBReadMode); WRITE(gmesa->buf, FBWriteMode, FBWriteModeEnable); WRITE(gmesa->buf, FilterMode, 0x400);}#endifstatic void gammaSetBuffer( GLcontext *ctx, GLframebuffer *colorBuffer, GLuint bufferBit ){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); switch ( bufferBit ) { case BUFFER_BIT_FRONT_LEFT: gmesa->readOffset = 0; break; case BUFFER_BIT_BACK_LEFT: gmesa->readOffset = gmesa->driScreen->fbHeight * gmesa->driScreen->fbWidth * gmesa->gammaScreen->cpp; break; default: _mesa_problem(ctx, "Unexpected buffer 0x%x in gammaSetBuffer()", bufferBit); }}void gammaDDInitSpanFuncs( GLcontext *ctx ){ gammaContextPtr gmesa = GAMMA_CONTEXT(ctx); struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference(ctx); swdd->SetBuffer = gammaSetBuffer; switch ( gmesa->gammaScreen->cpp ) { case 2: swdd->WriteRGBASpan = gammaWriteRGBASpan_RGB565; swdd->WriteRGBSpan = gammaWriteRGBSpan_RGB565; swdd->WriteMonoRGBASpan = gammaWriteMonoRGBASpan_RGB565; swdd->WriteRGBAPixels = gammaWriteRGBAPixels_RGB565; swdd->WriteMonoRGBAPixels = gammaWriteMonoRGBAPixels_RGB565; swdd->ReadRGBASpan = gammaReadRGBASpan_RGB565; swdd->ReadRGBAPixels = gammaReadRGBAPixels_RGB565; break; case 4: swdd->WriteRGBASpan = gammaWriteRGBASpan_ARGB8888; swdd->WriteRGBSpan = gammaWriteRGBSpan_ARGB8888; swdd->WriteMonoRGBASpan = gammaWriteMonoRGBASpan_ARGB8888; swdd->WriteRGBAPixels = gammaWriteRGBAPixels_ARGB8888; swdd->WriteMonoRGBAPixels = gammaWriteMonoRGBAPixels_ARGB8888;#if 1 swdd->ReadRGBASpan = gammaReadRGBASpan_ARGB8888;#else swdd->ReadRGBASpan = gammaReadRGBASpan8888;#endif swdd->ReadRGBAPixels = gammaReadRGBAPixels_ARGB8888; break; default: break; } switch ( gmesa->glCtx->Visual.depthBits ) { case 16: swdd->ReadDepthSpan = gammaReadDepthSpan_16; swdd->WriteDepthSpan = gammaWriteDepthSpan_16; swdd->ReadDepthPixels = gammaReadDepthPixels_16; swdd->WriteDepthPixels = gammaWriteDepthPixels_16; break; case 24: swdd->ReadDepthSpan = gammaReadDepthSpan_24_8; swdd->WriteDepthSpan = gammaWriteDepthSpan_24_8; swdd->ReadDepthPixels = gammaReadDepthPixels_24_8; swdd->WriteDepthPixels = gammaWriteDepthPixels_24_8;#if 0 swdd->ReadStencilSpan = gammaReadStencilSpan_24_8; swdd->WriteStencilSpan = gammaWriteStencilSpan_24_8; swdd->ReadStencilPixels = gammaReadStencilPixels_24_8; swdd->WriteStencilPixels = gammaWriteStencilPixels_24_8;#endif break; default: break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -