From e508f7f08e6fa4292136a377150fc058c041fbc0 Mon Sep 17 00:00:00 2001 From: Alan Hourihane Date: Tue, 30 Sep 2003 11:28:16 +0000 Subject: add gamma driver - no kernel driver yet (build tested, not physically tested) --- src/mesa/drivers/dri/gamma/gamma_macros.h | 328 ++++++++++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 src/mesa/drivers/dri/gamma/gamma_macros.h (limited to 'src/mesa/drivers/dri/gamma/gamma_macros.h') diff --git a/src/mesa/drivers/dri/gamma/gamma_macros.h b/src/mesa/drivers/dri/gamma/gamma_macros.h new file mode 100644 index 0000000000..bf9cf5f11f --- /dev/null +++ b/src/mesa/drivers/dri/gamma/gamma_macros.h @@ -0,0 +1,328 @@ +/* $XFree86: xc/lib/GL/mesa/src/drv/gamma/gamma_macros.h,v 1.5 2002/02/22 21:33:02 dawes Exp $ */ +/************************************************************************** + +Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sub license, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice (including the +next paragraph) shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +**************************************************************************/ + +/* + * Authors: + * Kevin E. Martin + * + */ + +#ifndef _GAMMA_MACROS_H_ +#define _GAMMA_MACROS_H_ + +#ifdef GLX_DIRECT_RENDERING + +#define DEBUG_DRMDMA +#define DEBUG_ERRORS +#define DEBUG_COMMANDS_NOT +#define DEBUG_VERBOSE_NOT +#define DEBUG_VERBOSE_EXTRA_NOT + +#define RANDOMIZE_COLORS_NOT +#define TURN_OFF_CLEARS_NOT +#define CULL_ALL_PRIMS_NOT +#define TURN_OFF_DEPTH_NOT +#define TURN_OFF_BLEND_NOT +#define FAST_CLEAR_4_NOT +#define FORCE_DEPTH32_NOT +#define DONT_SEND_DMA_NOT +#define TURN_OFF_FCP_NOT +#define TURN_OFF_TEXTURES_NOT +#define DO_VALIDATE + +#define GAMMA_DMA_BUFFER_SIZE 4096 + +#if 0 +#define GAMMA_DMA_SEND_FLAGS DRM_DMA_PRIORITY +#define GAMMA_DMA_SEND_FLAGS DRM_DMA_BLOCK +#else +/* MUST use non-blocking dma flags for drawable lock routines */ +#define GAMMA_DMA_SEND_FLAGS 0 +#endif + +#if 0 +#define GAMMA_DMA_GET_FLAGS \ + (DRM_DMA_SMALLER_OK | DRM_DMA_LARGER_OK | DRM_DMA_WAIT) +#else +#define GAMMA_DMA_GET_FLAGS DRM_DMA_WAIT +#endif + +#if defined(DEBUG_DRMDMA) || defined(DEBUG_COMMANDS) || defined(DEBUG_VERBOSE) +#include +#endif + +/* Note: The argument to DEBUG_GLCMDS() _must_ be enclosed in parenthesis */ +#ifdef DEBUG_VERBOSE +#define DEBUG_GLCMDS(s) printf s +#else +#define DEBUG_GLCMDS(s) +#endif + +/* Note: The argument to DEBUG_DMACMDS() _must_ be enclosed in parenthesis */ +#ifdef DEBUG_DRMDMA +#define DEBUG_DMACMDS(s) printf s +#else +#define DEBUG_DMACMDS(s) +#endif + +/* Note: The argument to DEBUG_WRITE() _must_ be enclosed in parenthesis */ +#ifdef DEBUG_COMMANDS +#define DEBUG_WRITE(s) printf s +#else +#define DEBUG_WRITE(s) +#endif + +/* Note: The argument to DEBUG_ERROR() _must_ be enclosed in parenthesis */ +#ifdef DEBUG_ERRORS +#define DEBUG_ERROR(s) printf s +#else +#define DEBUG_ERROR(s) +#endif + +#define WRITEV(buf,val1,val2,val3,val4) \ +do { \ + buf++->i = 0x9C008300; \ + buf++->f = val1; \ + buf++->f = val2; \ + buf++->f = val3; \ + buf++->f = val4; \ +} while (0) + +#define WRITE(buf,reg,val) \ +do { \ + buf++->i = Glint##reg##Tag; \ + buf++->i = val; \ + DEBUG_WRITE(("WRITE(buf, %s, 0x%08x);\n", #reg, (int)val)); \ +} while (0) + +#define WRITEF(buf,reg,val) \ +do { \ + buf++->i = Glint##reg##Tag; \ + buf++->f = val; \ + DEBUG_WRITE(("WRITEF(buf, %s, %f);\n", #reg, (float)val)); \ +} while (0) + +#define CHECK_WC_DMA_BUFFER(gcp,n) \ +do { \ + (gcp)->WCbufCount += (n<<1); \ +} while (0) + +#define CHECK_DMA_BUFFER(gcp,n) \ +do { \ + if ((gcp)->bufCount+(n<<1) >= (gcp)->bufSize) \ + PROCESS_DMA_BUFFER(gcp); \ + (gcp)->bufCount += (n<<1); \ +} while (0) + +#define CHECK_DMA_BUFFER2(gcp,n) \ +do { \ + if ((gcp)->bufCount+n >= (gcp)->bufSize) \ + PROCESS_DMA_BUFFER(gcp); \ + (gcp)->bufCount += n; \ +} while (0) + +#define FLUSH_DMA_BUFFER(gcp) \ +do { \ + if (gcp->bufCount) \ + PROCESS_DMA_BUFFER(gcp); \ +} while (0) + +#ifdef DONT_SEND_DMA +#define GET_DMA(fd, hHWCtx, n, idx, size) +#define SEND_DMA(fd, hHWCtx,n, idx, cnt) +#else +#define GET_DMA(fd, hHWCtx, n, idx, size) \ +do { \ + drmDMAReq dma; \ + int retcode, i; \ + \ + dma.context = (hHWCtx); \ + dma.send_count = 0; \ + dma.send_list = NULL; \ + dma.send_sizes = NULL; \ + dma.flags = GAMMA_DMA_GET_FLAGS; \ + dma.request_count = (n); \ + dma.request_size = GAMMA_DMA_BUFFER_SIZE; \ + dma.request_list = (idx); \ + dma.request_sizes = (size); \ + \ + do { \ + if ((retcode = drmDMA((fd), &dma))) { \ + DEBUG_DMACMDS(("drmDMA returned %d\n", retcode)); \ + } \ + } while (!(dma).granted_count); \ + \ + for (i = 0; i < (n); i++) { \ + (size)[i] >>= 2; /* Convert from bytes to words */ \ + } \ +} while (0) + +#define SEND_DMA(fd, hHWCtx, n, idx, cnt) \ +do { \ + drmDMAReq dma; \ + int retcode, i; \ + \ + for (i = 0; i < (n); i++) { \ + (cnt)[i] <<= 2; /* Convert from words to bytes */ \ + } \ + \ + dma.context = (hHWCtx); \ + dma.send_count = 1; \ + dma.send_list = (idx); \ + dma.send_sizes = (cnt); \ + dma.flags = GAMMA_DMA_SEND_FLAGS; \ + dma.request_count = 0; \ + dma.request_size = 0; \ + dma.request_list = NULL; \ + dma.request_sizes = NULL; \ + \ + if ((retcode = drmDMA((fd), &dma))) { \ + DEBUG_DMACMDS(("drmDMA returned %d\n", retcode)); \ + } \ + \ + for (i = 0; i < (n); i++) { \ + (cnt)[i] = 0; \ + } \ +} while (0) +#endif + +#define GET_FIRST_DMA(fd, hHWCtx, n, idx, size, buf, cnt, gPriv) \ +do { \ + int i; \ + \ + GET_DMA(fd, hHWCtx, n, idx, size); \ + \ + for (i = 0; i < (n); i++) { \ + (buf)[i] = (dmaBuf)(gPriv)->bufs->list[(idx)[i]].address; \ + (cnt)[i] = 0; \ + } \ +} while (0) + +#define PROCESS_DMA_BUFFER_TOP_HALF(gcp) \ +do { \ + SEND_DMA((gcp)->driFd, \ + (gcp)->hHWContext, 1, &(gcp)->bufIndex, &(gcp)->bufCount); \ +} while (0) + +#define PROCESS_DMA_BUFFER_BOTTOM_HALF(gcp) \ +do { \ + GET_DMA((gcp)->driFd, \ + (gcp)->hHWContext, 1, &(gcp)->bufIndex, &(gcp)->bufSize); \ + \ + (gcp)->buf = \ + (dmaBuf)(gcp)->gammaScreen->bufs->list[(gcp)->bufIndex].address; \ +} while (0) + +#define PROCESS_DMA_BUFFER(gcp) \ +do { \ + VALIDATE_DRAWABLE_INFO(gcp); \ + PROCESS_DMA_BUFFER_TOP_HALF(gcp); \ + PROCESS_DMA_BUFFER_BOTTOM_HALF(gcp); \ +} while (0) + +#ifdef DO_VALIDATE +#define VALIDATE_DRAWABLE_INFO_NO_LOCK(gcp) \ +do { \ + /*__DRIscreenPrivate *psp = gcp->driScreen;*/ \ + __DRIdrawablePrivate *pdp = gcp->driDrawable; \ + \ + if (*(pdp->pStamp) != pdp->lastStamp) { \ + int old_index = pdp->index; \ + while (*(pdp->pStamp) != pdp->lastStamp) { \ + DRI_VALIDATE_DRAWABLE_INFO_ONCE(pdp); \ + } \ + if (pdp->index != old_index) { \ + gcp->Window &= ~W_GIDMask; \ + gcp->Window |= (pdp->index << 5); \ + CHECK_WC_DMA_BUFFER(gcp, 1); \ + WRITE(gcp->WCbuf, GLINTWindow, gcp->Window|(gcp->FrameCount<<9));\ + } \ + \ + gammaUpdateViewportOffset( gcp->glCtx); \ + \ + if (pdp->numClipRects == 1 && \ + pdp->pClipRects->x1 == pdp->x && \ + pdp->pClipRects->x2 == (pdp->x+pdp->w) && \ + pdp->pClipRects->y1 == pdp->y && \ + pdp->pClipRects->y2 == (pdp->y+pdp->h)) { \ + CHECK_WC_DMA_BUFFER(gcp, 1); \ + WRITE(gcp->WCbuf, Rectangle2DControl, 0); \ + gcp->NotClipped = GL_TRUE; \ + } else { \ + CHECK_WC_DMA_BUFFER(gcp, 1); \ + WRITE(gcp->WCbuf, Rectangle2DControl, 1); \ + gcp->NotClipped = GL_FALSE; \ + } \ + gcp->WindowChanged = GL_TRUE; \ + \ + if (gcp->WCbufCount) { \ + SEND_DMA((gcp)->gammaScreen->driScreen->fd, \ + (gcp)->hHWContext, 1, &(gcp)->WCbufIndex, \ + &(gcp)->WCbufCount); \ + (gcp)->WCbufIndex = -1; \ + } \ + } \ +} while (0) + +#define VALIDATE_DRAWABLE_INFO_NO_LOCK_POST(gcp) \ +do { \ + if ((gcp)->WCbufIndex < 0) { \ + GET_DMA((gcp)->gammaScreen->driScreen->fd, \ + (gcp)->hHWContext, 1, &(gcp)->WCbufIndex, \ + &(gcp)->WCbufSize); \ + \ + (gcp)->WCbuf = \ + (dmaBuf)(gcp)->gammaScreen->bufs-> \ + list[(gcp)->WCbufIndex].address; \ + } \ +} while (0) + +#define VALIDATE_DRAWABLE_INFO(gcp) \ +do { \ + __DRIscreenPrivate *psp = gcp->driScreen; \ +if (gcp->driDrawable) { \ + DRM_SPINLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); \ + VALIDATE_DRAWABLE_INFO_NO_LOCK(gcp); \ + DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID); \ + VALIDATE_DRAWABLE_INFO_NO_LOCK_POST(gcp); \ +} \ +} while (0) +#else +#define VALIDATE_DRAWABLE_INFO(gcp) +#endif + +#define CALC_LOG2(l2,s) \ +do { \ + int __s = s; \ + l2 = 0; \ + while (__s > 1) { ++l2; __s >>= 1; } \ +} while (0) + +#endif + +#endif /* _GAMMA_MACROS_H_ */ -- cgit v1.2.3