diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/common/utils.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/swrast/swrast.c | 50 | ||||
-rw-r--r-- | src/mesa/drivers/dri/swrast/swrast_priv.h | 25 | ||||
-rw-r--r-- | src/mesa/drivers/dri/swrast/swrast_span.c | 78 | ||||
-rw-r--r-- | src/mesa/drivers/dri/swrast/swrast_spantemp.h | 24 |
5 files changed, 105 insertions, 75 deletions
diff --git a/src/mesa/drivers/dri/common/utils.h b/src/mesa/drivers/dri/common/utils.h index 31a26eda21c..0c09a7e68fb 100644 --- a/src/mesa/drivers/dri/common/utils.h +++ b/src/mesa/drivers/dri/common/utils.h @@ -29,7 +29,8 @@ #ifndef DRI_DEBUG_H #define DRI_DEBUG_H -#include "GL/internal/dri_interface.h" +#include <GL/gl.h> +#include <GL/internal/dri_interface.h> #include "context.h" typedef struct __DRIutilversionRec2 __DRIutilversion2; diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c index 6a9eb1573b6..c4dba591987 100644 --- a/src/mesa/drivers/dri/swrast/swrast.c +++ b/src/mesa/drivers/dri/swrast/swrast.c @@ -19,8 +19,18 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include <GL/gl.h> -#include <GL/internal/dri_interface.h> +/* + * DRI software rasterizer + * + * This is the mesa swrast module packaged into a DRI driver structure. + * + * The front-buffer is allocated by the loader. The loader provides read/write + * callbacks for access to the front-buffer. The driver uses a scratch row for + * front-buffer rendering to avoid repeated calls to the loader. + * + * The back-buffer is allocated by the driver and is private. + */ + #include "context.h" #include "extensions.h" #include "framebuffer.h" @@ -96,6 +106,11 @@ const struct dri_extension card_extensions[] = { NULL, NULL } }; + +/** + * Screen and config-related functions + */ + static void setupLoaderExtensions(__DRIscreen *psp, const __DRIextension **extensions) @@ -223,17 +238,14 @@ static const __DRIextension **driGetExtensions(__DRIscreen *psp) /** - * swrast_buffer.c + * Framebuffer and renderbuffer-related functions. */ static GLuint choose_pixel_format(const GLvisual *v) { if (v->rgbMode) { - /* XXX 24bpp packed, 8bpp, xmesa gets bitsPerPixel from xserver */ int bpp = v->rgbBits; - if (bpp == 24) - bpp = 32; if (bpp == 32 && v->redMask == 0xff0000 @@ -275,6 +287,7 @@ swrast_alloc_front_storage(GLcontext *ctx, struct gl_renderbuffer *rb, { struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb); int bpp; + unsigned mask = PITCH_ALIGN_BITS - 1; TRACE; @@ -297,15 +310,15 @@ swrast_alloc_front_storage(GLcontext *ctx, struct gl_renderbuffer *rb, return GL_FALSE; } - /* always pad to 32 bits */ - xrb->pitch = ((width * bpp + 0x1f) & ~0x1f) / 8; + /* always pad to PITCH_ALIGN_BITS */ + xrb->pitch = ((width * bpp + mask) & ~mask) / 8; return GL_TRUE; } static GLboolean swrast_alloc_back_storage(GLcontext *ctx, struct gl_renderbuffer *rb, - GLenum internalFormat, GLuint width, GLuint height) + GLenum internalFormat, GLuint width, GLuint height) { struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb); @@ -336,11 +349,11 @@ swrast_new_renderbuffer(const GLvisual *visual, GLboolean front) xrb->Base.Delete = swrast_delete_renderbuffer; if (front) { xrb->Base.AllocStorage = swrast_alloc_front_storage; - swrast_set_span_funcs_pixmap(xrb, pixel_format); + swrast_set_span_funcs_front(xrb, pixel_format); } else { xrb->Base.AllocStorage = swrast_alloc_back_storage; - swrast_set_span_funcs_ximage(xrb, pixel_format); + swrast_set_span_funcs_back(xrb, pixel_format); } switch (pixel_format) { @@ -476,7 +489,7 @@ static void driSwapBuffers(__DRIdrawable *buf) /** - * swrast_dd.c + * General device driver functions. */ static void @@ -510,7 +523,7 @@ get_string(GLcontext *ctx, GLenum pname) case GL_VENDOR: return (const GLubyte *) "Mesa Project"; case GL_RENDERER: - return (const GLubyte *) "X.Org"; + return (const GLubyte *) "Software Rasterizer"; default: return NULL; } @@ -547,7 +560,7 @@ swrast_init_driver_functions(struct dd_function_table *driver) /** - * swrast_context.c + * Context-related functions. */ static __DRIcontext * @@ -645,10 +658,11 @@ static int driBindContext(__DRIcontext *ctx, if (!draw || !read) return GL_FALSE; - /* check for same context and buffer */ mesaCtx = &ctx->Base; mesaDraw = &draw->Base; mesaRead = &read->Base; + + /* check for same context and buffer */ if (mesaCtx == _mesa_get_current_context() && mesaCtx->DrawBuffer == mesaDraw && mesaCtx->ReadBuffer == mesaRead) { @@ -684,12 +698,12 @@ static int driUnbindContext(__DRIcontext *ctx) static const __DRIcoreExtension driCoreExtension = { { __DRI_CORE, __DRI_CORE_VERSION }, - NULL, + NULL, /* driCreateNewScreen */ driDestroyScreen, driGetExtensions, driGetConfigAttrib, driIndexConfigAttrib, - NULL, + NULL, /* driCreateNewDrawable */ driDestroyDrawable, driSwapBuffers, driCreateNewContext, @@ -702,7 +716,7 @@ static const __DRIcoreExtension driCoreExtension = { static const __DRIswrastExtension driSWRastExtension = { { __DRI_SWRAST, __DRI_SWRAST_VERSION }, driCreateNewScreen, - driCreateNewDrawable, + driCreateNewDrawable }; /* This is the table of extensions that the loader will dlsym() for. */ diff --git a/src/mesa/drivers/dri/swrast/swrast_priv.h b/src/mesa/drivers/dri/swrast/swrast_priv.h index e12743bd563..a3e3922f128 100644 --- a/src/mesa/drivers/dri/swrast/swrast_priv.h +++ b/src/mesa/drivers/dri/swrast/swrast_priv.h @@ -35,8 +35,12 @@ #include <GL/internal/dri_interface.h> #include "mtypes.h" + +/** + * Debugging + */ #define DEBUG_CORE 0 -#define DEBUG_SPAN 1 +#define DEBUG_SPAN 0 #if DEBUG_CORE #define TRACE _mesa_printf("--> %s\n", __FUNCTION__) @@ -77,12 +81,14 @@ struct __DRIdrawableRec { __DRIscreen *driScreenPriv; + /* scratch row for optimized front-buffer rendering */ char *row; }; struct swrast_renderbuffer { struct gl_renderbuffer Base; + /* renderbuffer pitch (in bytes) */ GLuint pitch; }; @@ -114,14 +120,23 @@ swrast_renderbuffer(struct gl_renderbuffer *rb) #define PF_R3G3B2 4 /**< 8-bit TrueColor: 3-R, 3-G, 2-B bits */ +/** + * Renderbuffer pitch alignment (in bits). + * + * The xorg loader requires padding images to 32 bits. However, this should + * become a screen/drawable parameter XXX + */ +#define PITCH_ALIGN_BITS 32 + + /* swrast_span.c */ extern void -swrast_set_span_funcs_ximage(struct swrast_renderbuffer *xrb, - GLuint pixel_format); +swrast_set_span_funcs_back(struct swrast_renderbuffer *xrb, + GLuint pixel_format); extern void -swrast_set_span_funcs_pixmap(struct swrast_renderbuffer *xrb, - GLuint pixel_format); +swrast_set_span_funcs_front(struct swrast_renderbuffer *xrb, + GLuint pixel_format); #endif /* _SWRAST_PRIV_H_ */ diff --git a/src/mesa/drivers/dri/swrast/swrast_span.c b/src/mesa/drivers/dri/swrast/swrast_span.c index 35b9ddffe67..5e990368b2e 100644 --- a/src/mesa/drivers/dri/swrast/swrast_span.c +++ b/src/mesa/drivers/dri/swrast/swrast_span.c @@ -118,7 +118,7 @@ static const GLubyte kernel[16] = { /* - * Generate code for image span functions. + * Generate code for back-buffer span functions. */ /* 32-bit BGRA */ @@ -189,11 +189,11 @@ static const GLubyte kernel[16] = { /* - * Generate code for pixmap span functions. + * Generate code for front-buffer span functions. */ /* 32-bit BGRA */ -#define NAME(FUNC) FUNC##_A8R8G8B8_pixmap +#define NAME(FUNC) FUNC##_A8R8G8B8_front #define RB_TYPE GLubyte #define SPAN_VARS \ struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb); @@ -211,7 +211,7 @@ static const GLubyte kernel[16] = { /* 16-bit BGR */ -#define NAME(FUNC) FUNC##_R5G6B5_pixmap +#define NAME(FUNC) FUNC##_R5G6B5_front #define RB_TYPE GLubyte #define SPAN_VARS \ struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb); @@ -227,7 +227,7 @@ static const GLubyte kernel[16] = { /* 8-bit BGR */ -#define NAME(FUNC) FUNC##_R3G3B2_pixmap +#define NAME(FUNC) FUNC##_R3G3B2_front #define RB_TYPE GLubyte #define SPAN_VARS \ struct swrast_renderbuffer *xrb = swrast_renderbuffer(rb); @@ -243,7 +243,7 @@ static const GLubyte kernel[16] = { /* 8-bit color index */ -#define NAME(FUNC) FUNC##_CI8_pixmap +#define NAME(FUNC) FUNC##_CI8_front #define CI_MODE #define RB_TYPE GLubyte #define SPAN_VARS \ @@ -260,14 +260,14 @@ static const GLubyte kernel[16] = { /* - * Images are malloced memory used for private back-buffers. + * Back-buffers are malloced memory and always private. * * BACK_PIXMAP (not supported) * BACK_XIMAGE */ void -swrast_set_span_funcs_ximage(struct swrast_renderbuffer *xrb, - GLuint pixel_format) +swrast_set_span_funcs_back(struct swrast_renderbuffer *xrb, + GLuint pixel_format) { switch (pixel_format) { case PF_A8R8G8B8: @@ -313,7 +313,7 @@ swrast_set_span_funcs_ximage(struct swrast_renderbuffer *xrb, /* - * Pixmaps are used for front-buffers. + * Front-buffers are provided by the loader, the xorg loader uses pixmaps. * * WINDOW, An X window * GLXWINDOW, GLX window @@ -321,44 +321,44 @@ swrast_set_span_funcs_ximage(struct swrast_renderbuffer *xrb, * PBUFFER GLX Pbuffer */ void -swrast_set_span_funcs_pixmap(struct swrast_renderbuffer *xrb, - GLuint pixel_format) +swrast_set_span_funcs_front(struct swrast_renderbuffer *xrb, + GLuint pixel_format) { switch (pixel_format) { case PF_A8R8G8B8: - xrb->Base.GetRow = get_row_A8R8G8B8_pixmap; - xrb->Base.GetValues = get_values_A8R8G8B8_pixmap; - xrb->Base.PutRow = put_row_A8R8G8B8_pixmap; - xrb->Base.PutRowRGB = put_row_rgb_A8R8G8B8_pixmap; - xrb->Base.PutMonoRow = put_mono_row_A8R8G8B8_pixmap; - xrb->Base.PutValues = put_values_A8R8G8B8_pixmap; - xrb->Base.PutMonoValues = put_mono_values_A8R8G8B8_pixmap; + xrb->Base.GetRow = get_row_A8R8G8B8_front; + xrb->Base.GetValues = get_values_A8R8G8B8_front; + xrb->Base.PutRow = put_row_A8R8G8B8_front; + xrb->Base.PutRowRGB = put_row_rgb_A8R8G8B8_front; + xrb->Base.PutMonoRow = put_mono_row_A8R8G8B8_front; + xrb->Base.PutValues = put_values_A8R8G8B8_front; + xrb->Base.PutMonoValues = put_mono_values_A8R8G8B8_front; break; case PF_R5G6B5: - xrb->Base.GetRow = get_row_R5G6B5_pixmap; - xrb->Base.GetValues = get_values_R5G6B5_pixmap; - xrb->Base.PutRow = put_row_R5G6B5_pixmap; - xrb->Base.PutRowRGB = put_row_rgb_R5G6B5_pixmap; - xrb->Base.PutMonoRow = put_mono_row_R5G6B5_pixmap; - xrb->Base.PutValues = put_values_R5G6B5_pixmap; - xrb->Base.PutMonoValues = put_mono_values_R5G6B5_pixmap; + xrb->Base.GetRow = get_row_R5G6B5_front; + xrb->Base.GetValues = get_values_R5G6B5_front; + xrb->Base.PutRow = put_row_R5G6B5_front; + xrb->Base.PutRowRGB = put_row_rgb_R5G6B5_front; + xrb->Base.PutMonoRow = put_mono_row_R5G6B5_front; + xrb->Base.PutValues = put_values_R5G6B5_front; + xrb->Base.PutMonoValues = put_mono_values_R5G6B5_front; break; case PF_R3G3B2: - xrb->Base.GetRow = get_row_R3G3B2_pixmap; - xrb->Base.GetValues = get_values_R3G3B2_pixmap; - xrb->Base.PutRow = put_row_R3G3B2_pixmap; - xrb->Base.PutRowRGB = put_row_rgb_R3G3B2_pixmap; - xrb->Base.PutMonoRow = put_mono_row_R3G3B2_pixmap; - xrb->Base.PutValues = put_values_R3G3B2_pixmap; - xrb->Base.PutMonoValues = put_mono_values_R3G3B2_pixmap; + xrb->Base.GetRow = get_row_R3G3B2_front; + xrb->Base.GetValues = get_values_R3G3B2_front; + xrb->Base.PutRow = put_row_R3G3B2_front; + xrb->Base.PutRowRGB = put_row_rgb_R3G3B2_front; + xrb->Base.PutMonoRow = put_mono_row_R3G3B2_front; + xrb->Base.PutValues = put_values_R3G3B2_front; + xrb->Base.PutMonoValues = put_mono_values_R3G3B2_front; break; case PF_CI8: - xrb->Base.GetRow = get_row_CI8_pixmap; - xrb->Base.GetValues = get_values_CI8_pixmap; - xrb->Base.PutRow = put_row_CI8_pixmap; - xrb->Base.PutMonoRow = put_mono_row_CI8_pixmap; - xrb->Base.PutValues = put_values_CI8_pixmap; - xrb->Base.PutMonoValues = put_mono_values_CI8_pixmap; + xrb->Base.GetRow = get_row_CI8_front; + xrb->Base.GetValues = get_values_CI8_front; + xrb->Base.PutRow = put_row_CI8_front; + xrb->Base.PutMonoRow = put_mono_row_CI8_front; + xrb->Base.PutValues = put_values_CI8_front; + xrb->Base.PutMonoValues = put_mono_values_CI8_front; break; default: assert(0); diff --git a/src/mesa/drivers/dri/swrast/swrast_spantemp.h b/src/mesa/drivers/dri/swrast/swrast_spantemp.h index 7c60c15974f..e7a9c86d7de 100644 --- a/src/mesa/drivers/dri/swrast/swrast_spantemp.h +++ b/src/mesa/drivers/dri/swrast/swrast_spantemp.h @@ -24,12 +24,12 @@ /* - * This is a modified version of swrast/s_spantemp.h for rendering to X11 - * drawables. The no-mask paths use a scratch row to avoid repeated calls - * to xserver. + * Modified version of swrast/s_spantemp.h for front-buffer rendering. The + * no-mask paths use a scratch row to avoid repeated calls to the loader. * - * For the mask paths we always use an array of 4 elements of RB_TYPE because - * we should pad "image" pitch to 32 bits. + * For the mask paths we always use an array of 4 elements of RB_TYPE. This is + * to satisfy the xorg loader requirement of an image pitch of 32 bits and + * should be ok for other loaders also. */ @@ -54,12 +54,12 @@ static inline void GET_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLubyte *p ) { __DRIcontext *ctx = swrast_context(glCtx); - __DRIdrawable *draw = swrast_drawable(glCtx->ReadBuffer); + __DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer); __DRIscreen *screen = ctx->driScreenPriv; - screen->swrast_loader->getImage(draw, x, y, 1, 1, (char *)p, - draw->loaderPrivate); + screen->swrast_loader->getImage(read, x, y, 1, 1, (char *)p, + read->loaderPrivate); } static inline void @@ -79,12 +79,12 @@ static inline void GET_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row ) { __DRIcontext *ctx = swrast_context(glCtx); - __DRIdrawable *draw = swrast_drawable(glCtx->ReadBuffer); + __DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer); __DRIscreen *screen = ctx->driScreenPriv; - screen->swrast_loader->getImage(draw, x, y, n, 1, row, - draw->loaderPrivate); + screen->swrast_loader->getImage(read, x, y, n, 1, row, + read->loaderPrivate); } #endif /* _SWRAST_SPANTEMP_ONCE */ @@ -133,7 +133,7 @@ NAME(get_row)( GLcontext *ctx, struct gl_renderbuffer *rb, RB_TYPE (*dest)[RB_COMPONENTS] = (RB_TYPE (*)[RB_COMPONENTS]) values; #endif GLuint i; - char *row = swrast_drawable(ctx->DrawBuffer)->row; + char *row = swrast_drawable(ctx->ReadBuffer)->row; INIT_PIXEL_PTR(pixel, x, y); GET_ROW( ctx, x, YFLIP(xrb, y), count, row ); for (i = 0; i < count; i++) { |