⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamma_span.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 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 + -