mesa: Add a function to set up the default renderbuffer accessors.
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -923,7 +923,121 @@ put_mono_values_ushort4(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the default software fallback for gl_renderbuffer's span
|
||||||
|
* access functions.
|
||||||
|
*
|
||||||
|
* The assumptions are that rb->Data will be a pointer to (0,0), that pixels
|
||||||
|
* are packed in the type of rb->Format, and that subsequent rows appear
|
||||||
|
* rb->RowStride pixels later.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
_mesa_set_renderbuffer_accessors(struct gl_renderbuffer *rb)
|
||||||
|
{
|
||||||
|
switch (rb->Format) {
|
||||||
|
case MESA_FORMAT_RGB888:
|
||||||
|
rb->DataType = GL_UNSIGNED_BYTE;
|
||||||
|
rb->GetPointer = get_pointer_ubyte3;
|
||||||
|
rb->GetRow = get_row_ubyte3;
|
||||||
|
rb->GetValues = get_values_ubyte3;
|
||||||
|
rb->PutRow = put_row_ubyte3;
|
||||||
|
rb->PutRowRGB = put_row_rgb_ubyte3;
|
||||||
|
rb->PutMonoRow = put_mono_row_ubyte3;
|
||||||
|
rb->PutValues = put_values_ubyte3;
|
||||||
|
rb->PutMonoValues = put_mono_values_ubyte3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MESA_FORMAT_RGBA8888:
|
||||||
|
rb->DataType = GL_UNSIGNED_BYTE;
|
||||||
|
rb->GetPointer = get_pointer_ubyte4;
|
||||||
|
rb->GetRow = get_row_ubyte4;
|
||||||
|
rb->GetValues = get_values_ubyte4;
|
||||||
|
rb->PutRow = put_row_ubyte4;
|
||||||
|
rb->PutRowRGB = put_row_rgb_ubyte4;
|
||||||
|
rb->PutMonoRow = put_mono_row_ubyte4;
|
||||||
|
rb->PutValues = put_values_ubyte4;
|
||||||
|
rb->PutMonoValues = put_mono_values_ubyte4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MESA_FORMAT_SIGNED_RGBA_16:
|
||||||
|
rb->DataType = GL_SHORT;
|
||||||
|
rb->GetPointer = get_pointer_ushort4;
|
||||||
|
rb->GetRow = get_row_ushort4;
|
||||||
|
rb->GetValues = get_values_ushort4;
|
||||||
|
rb->PutRow = put_row_ushort4;
|
||||||
|
rb->PutRowRGB = put_row_rgb_ushort4;
|
||||||
|
rb->PutMonoRow = put_mono_row_ushort4;
|
||||||
|
rb->PutValues = put_values_ushort4;
|
||||||
|
rb->PutMonoValues = put_mono_values_ushort4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
case MESA_FORMAT_A8:
|
||||||
|
rb->DataType = GL_UNSIGNED_BYTE;
|
||||||
|
rb->GetPointer = get_pointer_alpha8;
|
||||||
|
rb->GetRow = get_row_alpha8;
|
||||||
|
rb->GetValues = get_values_alpha8;
|
||||||
|
rb->PutRow = put_row_alpha8;
|
||||||
|
rb->PutRowRGB = NULL;
|
||||||
|
rb->PutMonoRow = put_mono_row_alpha8;
|
||||||
|
rb->PutValues = put_values_alpha8;
|
||||||
|
rb->PutMonoValues = put_mono_values_alpha8;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case MESA_FORMAT_S8:
|
||||||
|
rb->DataType = GL_UNSIGNED_BYTE;
|
||||||
|
rb->GetPointer = get_pointer_ubyte;
|
||||||
|
rb->GetRow = get_row_ubyte;
|
||||||
|
rb->GetValues = get_values_ubyte;
|
||||||
|
rb->PutRow = put_row_ubyte;
|
||||||
|
rb->PutRowRGB = NULL;
|
||||||
|
rb->PutMonoRow = put_mono_row_ubyte;
|
||||||
|
rb->PutValues = put_values_ubyte;
|
||||||
|
rb->PutMonoValues = put_mono_values_ubyte;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MESA_FORMAT_Z16:
|
||||||
|
rb->DataType = GL_UNSIGNED_SHORT;
|
||||||
|
rb->GetPointer = get_pointer_ushort;
|
||||||
|
rb->GetRow = get_row_ushort;
|
||||||
|
rb->GetValues = get_values_ushort;
|
||||||
|
rb->PutRow = put_row_ushort;
|
||||||
|
rb->PutRowRGB = NULL;
|
||||||
|
rb->PutMonoRow = put_mono_row_ushort;
|
||||||
|
rb->PutValues = put_values_ushort;
|
||||||
|
rb->PutMonoValues = put_mono_values_ushort;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MESA_FORMAT_Z32:
|
||||||
|
case MESA_FORMAT_X8_Z24:
|
||||||
|
rb->DataType = GL_UNSIGNED_INT;
|
||||||
|
rb->GetPointer = get_pointer_uint;
|
||||||
|
rb->GetRow = get_row_uint;
|
||||||
|
rb->GetValues = get_values_uint;
|
||||||
|
rb->PutRow = put_row_uint;
|
||||||
|
rb->PutRowRGB = NULL;
|
||||||
|
rb->PutMonoRow = put_mono_row_uint;
|
||||||
|
rb->PutValues = put_values_uint;
|
||||||
|
rb->PutMonoValues = put_mono_values_uint;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MESA_FORMAT_Z24_S8:
|
||||||
|
rb->DataType = GL_UNSIGNED_INT_24_8_EXT;
|
||||||
|
rb->GetPointer = get_pointer_uint;
|
||||||
|
rb->GetRow = get_row_uint;
|
||||||
|
rb->GetValues = get_values_uint;
|
||||||
|
rb->PutRow = put_row_uint;
|
||||||
|
rb->PutRowRGB = NULL;
|
||||||
|
rb->PutMonoRow = put_mono_row_uint;
|
||||||
|
rb->PutValues = put_values_uint;
|
||||||
|
rb->PutMonoValues = put_mono_values_uint;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a software fallback for the gl_renderbuffer->AllocStorage
|
* This is a software fallback for the gl_renderbuffer->AllocStorage
|
||||||
@@ -944,8 +1058,6 @@ _mesa_soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *
|
|||||||
GLenum internalFormat,
|
GLenum internalFormat,
|
||||||
GLuint width, GLuint height)
|
GLuint width, GLuint height)
|
||||||
{
|
{
|
||||||
GLuint pixelSize;
|
|
||||||
|
|
||||||
switch (internalFormat) {
|
switch (internalFormat) {
|
||||||
case GL_RGB:
|
case GL_RGB:
|
||||||
case GL_R3_G3_B2:
|
case GL_R3_G3_B2:
|
||||||
@@ -956,16 +1068,6 @@ _mesa_soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *
|
|||||||
case GL_RGB12:
|
case GL_RGB12:
|
||||||
case GL_RGB16:
|
case GL_RGB16:
|
||||||
rb->Format = MESA_FORMAT_RGB888;
|
rb->Format = MESA_FORMAT_RGB888;
|
||||||
rb->DataType = GL_UNSIGNED_BYTE;
|
|
||||||
rb->GetPointer = get_pointer_ubyte3;
|
|
||||||
rb->GetRow = get_row_ubyte3;
|
|
||||||
rb->GetValues = get_values_ubyte3;
|
|
||||||
rb->PutRow = put_row_ubyte3;
|
|
||||||
rb->PutRowRGB = put_row_rgb_ubyte3;
|
|
||||||
rb->PutMonoRow = put_mono_row_ubyte3;
|
|
||||||
rb->PutValues = put_values_ubyte3;
|
|
||||||
rb->PutMonoValues = put_mono_values_ubyte3;
|
|
||||||
pixelSize = 3 * sizeof(GLubyte);
|
|
||||||
break;
|
break;
|
||||||
case GL_RGBA:
|
case GL_RGBA:
|
||||||
case GL_RGBA2:
|
case GL_RGBA2:
|
||||||
@@ -977,45 +1079,15 @@ _mesa_soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *
|
|||||||
case GL_RGBA12:
|
case GL_RGBA12:
|
||||||
#endif
|
#endif
|
||||||
rb->Format = MESA_FORMAT_RGBA8888;
|
rb->Format = MESA_FORMAT_RGBA8888;
|
||||||
rb->DataType = GL_UNSIGNED_BYTE;
|
|
||||||
rb->GetPointer = get_pointer_ubyte4;
|
|
||||||
rb->GetRow = get_row_ubyte4;
|
|
||||||
rb->GetValues = get_values_ubyte4;
|
|
||||||
rb->PutRow = put_row_ubyte4;
|
|
||||||
rb->PutRowRGB = put_row_rgb_ubyte4;
|
|
||||||
rb->PutMonoRow = put_mono_row_ubyte4;
|
|
||||||
rb->PutValues = put_values_ubyte4;
|
|
||||||
rb->PutMonoValues = put_mono_values_ubyte4;
|
|
||||||
pixelSize = 4 * sizeof(GLubyte);
|
|
||||||
break;
|
break;
|
||||||
case GL_RGBA16:
|
case GL_RGBA16:
|
||||||
case GL_RGBA16_SNORM:
|
case GL_RGBA16_SNORM:
|
||||||
/* for accum buffer */
|
/* for accum buffer */
|
||||||
rb->Format = MESA_FORMAT_SIGNED_RGBA_16;
|
rb->Format = MESA_FORMAT_SIGNED_RGBA_16;
|
||||||
rb->DataType = GL_SHORT;
|
|
||||||
rb->GetPointer = get_pointer_ushort4;
|
|
||||||
rb->GetRow = get_row_ushort4;
|
|
||||||
rb->GetValues = get_values_ushort4;
|
|
||||||
rb->PutRow = put_row_ushort4;
|
|
||||||
rb->PutRowRGB = put_row_rgb_ushort4;
|
|
||||||
rb->PutMonoRow = put_mono_row_ushort4;
|
|
||||||
rb->PutValues = put_values_ushort4;
|
|
||||||
rb->PutMonoValues = put_mono_values_ushort4;
|
|
||||||
pixelSize = 4 * sizeof(GLushort);
|
|
||||||
break;
|
break;
|
||||||
#if 0
|
#if 0
|
||||||
case GL_ALPHA8:
|
case GL_ALPHA8:
|
||||||
rb->Format = MESA_FORMAT_A8;
|
rb->Format = MESA_FORMAT_A8;
|
||||||
rb->DataType = GL_UNSIGNED_BYTE;
|
|
||||||
rb->GetPointer = get_pointer_alpha8;
|
|
||||||
rb->GetRow = get_row_alpha8;
|
|
||||||
rb->GetValues = get_values_alpha8;
|
|
||||||
rb->PutRow = put_row_alpha8;
|
|
||||||
rb->PutRowRGB = NULL;
|
|
||||||
rb->PutMonoRow = put_mono_row_alpha8;
|
|
||||||
rb->PutValues = put_values_alpha8;
|
|
||||||
rb->PutMonoValues = put_mono_values_alpha8;
|
|
||||||
pixelSize = sizeof(GLubyte);
|
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case GL_STENCIL_INDEX:
|
case GL_STENCIL_INDEX:
|
||||||
@@ -1024,76 +1096,28 @@ _mesa_soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *
|
|||||||
case GL_STENCIL_INDEX8_EXT:
|
case GL_STENCIL_INDEX8_EXT:
|
||||||
case GL_STENCIL_INDEX16_EXT:
|
case GL_STENCIL_INDEX16_EXT:
|
||||||
rb->Format = MESA_FORMAT_S8;
|
rb->Format = MESA_FORMAT_S8;
|
||||||
rb->DataType = GL_UNSIGNED_BYTE;
|
|
||||||
rb->GetPointer = get_pointer_ubyte;
|
|
||||||
rb->GetRow = get_row_ubyte;
|
|
||||||
rb->GetValues = get_values_ubyte;
|
|
||||||
rb->PutRow = put_row_ubyte;
|
|
||||||
rb->PutRowRGB = NULL;
|
|
||||||
rb->PutMonoRow = put_mono_row_ubyte;
|
|
||||||
rb->PutValues = put_values_ubyte;
|
|
||||||
rb->PutMonoValues = put_mono_values_ubyte;
|
|
||||||
pixelSize = sizeof(GLubyte);
|
|
||||||
break;
|
break;
|
||||||
case GL_DEPTH_COMPONENT:
|
case GL_DEPTH_COMPONENT:
|
||||||
case GL_DEPTH_COMPONENT16:
|
case GL_DEPTH_COMPONENT16:
|
||||||
rb->Format = MESA_FORMAT_Z16;
|
rb->Format = MESA_FORMAT_Z16;
|
||||||
rb->DataType = GL_UNSIGNED_SHORT;
|
|
||||||
rb->GetPointer = get_pointer_ushort;
|
|
||||||
rb->GetRow = get_row_ushort;
|
|
||||||
rb->GetValues = get_values_ushort;
|
|
||||||
rb->PutRow = put_row_ushort;
|
|
||||||
rb->PutRowRGB = NULL;
|
|
||||||
rb->PutMonoRow = put_mono_row_ushort;
|
|
||||||
rb->PutValues = put_values_ushort;
|
|
||||||
rb->PutMonoValues = put_mono_values_ushort;
|
|
||||||
pixelSize = sizeof(GLushort);
|
|
||||||
break;
|
break;
|
||||||
case GL_DEPTH_COMPONENT24:
|
case GL_DEPTH_COMPONENT24:
|
||||||
rb->DataType = GL_UNSIGNED_INT;
|
|
||||||
rb->GetPointer = get_pointer_uint;
|
|
||||||
rb->GetRow = get_row_uint;
|
|
||||||
rb->GetValues = get_values_uint;
|
|
||||||
rb->PutRow = put_row_uint;
|
|
||||||
rb->PutRowRGB = NULL;
|
|
||||||
rb->PutMonoRow = put_mono_row_uint;
|
|
||||||
rb->PutValues = put_values_uint;
|
|
||||||
rb->PutMonoValues = put_mono_values_uint;
|
|
||||||
rb->Format = MESA_FORMAT_X8_Z24;
|
rb->Format = MESA_FORMAT_X8_Z24;
|
||||||
pixelSize = sizeof(GLuint);
|
|
||||||
break;
|
break;
|
||||||
case GL_DEPTH_COMPONENT32:
|
case GL_DEPTH_COMPONENT32:
|
||||||
rb->DataType = GL_UNSIGNED_INT;
|
|
||||||
rb->GetPointer = get_pointer_uint;
|
|
||||||
rb->GetRow = get_row_uint;
|
|
||||||
rb->GetValues = get_values_uint;
|
|
||||||
rb->PutRow = put_row_uint;
|
|
||||||
rb->PutRowRGB = NULL;
|
|
||||||
rb->PutMonoRow = put_mono_row_uint;
|
|
||||||
rb->PutValues = put_values_uint;
|
|
||||||
rb->PutMonoValues = put_mono_values_uint;
|
|
||||||
rb->Format = MESA_FORMAT_Z32;
|
rb->Format = MESA_FORMAT_Z32;
|
||||||
pixelSize = sizeof(GLuint);
|
|
||||||
break;
|
break;
|
||||||
case GL_DEPTH_STENCIL_EXT:
|
case GL_DEPTH_STENCIL_EXT:
|
||||||
case GL_DEPTH24_STENCIL8_EXT:
|
case GL_DEPTH24_STENCIL8_EXT:
|
||||||
rb->Format = MESA_FORMAT_Z24_S8;
|
rb->Format = MESA_FORMAT_Z24_S8;
|
||||||
rb->DataType = GL_UNSIGNED_INT_24_8_EXT;
|
|
||||||
rb->GetPointer = get_pointer_uint;
|
|
||||||
rb->GetRow = get_row_uint;
|
|
||||||
rb->GetValues = get_values_uint;
|
|
||||||
rb->PutRow = put_row_uint;
|
|
||||||
rb->PutRowRGB = NULL;
|
|
||||||
rb->PutMonoRow = put_mono_row_uint;
|
|
||||||
rb->PutValues = put_values_uint;
|
|
||||||
rb->PutMonoValues = put_mono_values_uint;
|
|
||||||
pixelSize = sizeof(GLuint);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* unsupported format */
|
/* unsupported format */
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_mesa_set_renderbuffer_accessors(rb);
|
||||||
|
|
||||||
ASSERT(rb->DataType);
|
ASSERT(rb->DataType);
|
||||||
ASSERT(rb->GetPointer);
|
ASSERT(rb->GetPointer);
|
||||||
ASSERT(rb->GetRow);
|
ASSERT(rb->GetRow);
|
||||||
@@ -1113,7 +1137,7 @@ _mesa_soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *
|
|||||||
|
|
||||||
if (width > 0 && height > 0) {
|
if (width > 0 && height > 0) {
|
||||||
/* allocate new buffer storage */
|
/* allocate new buffer storage */
|
||||||
rb->Data = malloc(width * height * pixelSize);
|
rb->Data = malloc(width * height * _mesa_get_format_bytes(rb->Format));
|
||||||
|
|
||||||
if (rb->Data == NULL) {
|
if (rb->Data == NULL) {
|
||||||
rb->Width = 0;
|
rb->Width = 0;
|
||||||
@@ -1121,7 +1145,7 @@ _mesa_soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *
|
|||||||
rb->RowStride = 0;
|
rb->RowStride = 0;
|
||||||
_mesa_error(ctx, GL_OUT_OF_MEMORY,
|
_mesa_error(ctx, GL_OUT_OF_MEMORY,
|
||||||
"software renderbuffer allocation (%d x %d x %d)",
|
"software renderbuffer allocation (%d x %d x %d)",
|
||||||
width, height, pixelSize);
|
width, height, _mesa_get_format_bytes(rb->Format));
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -46,6 +46,8 @@ _mesa_delete_renderbuffer(struct gl_renderbuffer *rb);
|
|||||||
extern struct gl_renderbuffer *
|
extern struct gl_renderbuffer *
|
||||||
_mesa_new_soft_renderbuffer(struct gl_context *ctx, GLuint name);
|
_mesa_new_soft_renderbuffer(struct gl_context *ctx, GLuint name);
|
||||||
|
|
||||||
|
extern void
|
||||||
|
_mesa_set_renderbuffer_accessors(struct gl_renderbuffer *rb);
|
||||||
|
|
||||||
extern GLboolean
|
extern GLboolean
|
||||||
_mesa_soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
_mesa_soft_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
||||||
|
Reference in New Issue
Block a user