mesa: Add renderbuffer accessors for R8/RG88/R16/RG1616.
This will replace the current (broken by trying to use an enum in the preprocessor) spantmp2.h support I wrote for the intel driver. Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -53,6 +53,45 @@
|
||||
* Routines for get/put values in common buffer formats follow.
|
||||
*/
|
||||
|
||||
/* Returns a bytes per pixel of the DataType in the get/put span
|
||||
* functions for at least a subset of the available combinations a
|
||||
* renderbuffer can have.
|
||||
*
|
||||
* It would be nice to see gl_renderbuffer start talking about a
|
||||
* gl_format instead of a GLenum DataType.
|
||||
*/
|
||||
static int
|
||||
get_datatype_bytes(struct gl_renderbuffer *rb)
|
||||
{
|
||||
int component_size;
|
||||
|
||||
switch (rb->DataType) {
|
||||
case GL_FLOAT:
|
||||
case GL_UNSIGNED_INT:
|
||||
case GL_UNSIGNED_INT_24_8_EXT:
|
||||
component_size = 4;
|
||||
break;
|
||||
case GL_UNSIGNED_SHORT:
|
||||
component_size = 2;
|
||||
break;
|
||||
case GL_UNSIGNED_BYTE:
|
||||
component_size = 1;
|
||||
break;
|
||||
default:
|
||||
component_size = 1;
|
||||
assert(0);
|
||||
}
|
||||
|
||||
switch (rb->_BaseFormat) {
|
||||
case GL_DEPTH_COMPONENT:
|
||||
case GL_DEPTH_STENCIL:
|
||||
return component_size;
|
||||
default:
|
||||
return 4 * component_size;
|
||||
}
|
||||
}
|
||||
|
||||
/* This is commonly used by most of the accessors. */
|
||||
static void *
|
||||
get_pointer_generic(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
||||
GLint x, GLint y)
|
||||
@@ -74,6 +113,105 @@ get_row_generic(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
||||
memcpy(values, src, count * _mesa_get_format_bytes(rb->Format));
|
||||
}
|
||||
|
||||
/* For the GL_RED/GL_RG/GL_RGB format/DataType combinations (and
|
||||
* GL_LUMINANCE/GL_INTENSITY?), the Put functions are a matter of
|
||||
* storing those initial components of the value per pixel into the
|
||||
* destination.
|
||||
*/
|
||||
static void
|
||||
put_row_generic(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
||||
GLuint count, GLint x, GLint y,
|
||||
const void *values, const GLubyte *mask)
|
||||
{
|
||||
void *row = rb->GetPointer(ctx, rb, x, y);
|
||||
int format_bytes = _mesa_get_format_bytes(rb->Format) / sizeof(GLfloat);
|
||||
int datatype_bytes = get_datatype_bytes(rb);
|
||||
unsigned int i;
|
||||
|
||||
if (mask) {
|
||||
for (i = 0; i < count; i++) {
|
||||
void *dst = row + i * format_bytes;
|
||||
const void *src = values + i * datatype_bytes;
|
||||
|
||||
if (mask[i]) {
|
||||
memcpy(dst, src, format_bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < count; i++) {
|
||||
void *dst = row + i * format_bytes;
|
||||
const void *src = values + i * datatype_bytes;
|
||||
memcpy(dst, src, format_bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
put_mono_row_generic(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
||||
GLuint count, GLint x, GLint y,
|
||||
const void *value, const GLubyte *mask)
|
||||
{
|
||||
void *row = rb->GetPointer(ctx, rb, x, y);
|
||||
int format_bytes = _mesa_get_format_bytes(rb->Format) / sizeof(GLfloat);
|
||||
unsigned int i;
|
||||
|
||||
if (mask) {
|
||||
for (i = 0; i < count; i++) {
|
||||
void *dst = row + i * format_bytes;
|
||||
if (mask[i]) {
|
||||
memcpy(dst, value, format_bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i < count; i++) {
|
||||
void *dst = row + i * format_bytes;
|
||||
memcpy(dst, value, format_bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
put_values_generic(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
||||
GLuint count, const GLint x[], const GLint y[],
|
||||
const void *values, const GLubyte *mask)
|
||||
{
|
||||
int format_bytes = _mesa_get_format_bytes(rb->Format) / sizeof(GLfloat);
|
||||
int datatype_bytes = get_datatype_bytes(rb);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (!mask || mask[i]) {
|
||||
void *row = rb->GetPointer(ctx, rb, x[i], y[i]);
|
||||
void *dst = row + i * format_bytes;
|
||||
const void *src = values + i * datatype_bytes;
|
||||
|
||||
memcpy(dst, src, format_bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
put_mono_values_generic(struct gl_context *ctx,
|
||||
struct gl_renderbuffer *rb,
|
||||
GLuint count, const GLint x[], const GLint y[],
|
||||
const void *value, const GLubyte *mask)
|
||||
{
|
||||
int format_bytes = _mesa_get_format_bytes(rb->Format) / sizeof(GLfloat);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (!mask || mask[i]) {
|
||||
void *row = rb->GetPointer(ctx, rb, x[i], y[i]);
|
||||
void *dst = row + i * format_bytes;
|
||||
memcpy(dst, value, format_bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* Functions for buffers of 1 X GLubyte values.
|
||||
* Typically stencil.
|
||||
@@ -829,6 +967,134 @@ put_mono_values_ushort4(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* Functions for MESA_FORMAT_R8.
|
||||
*/
|
||||
static void
|
||||
get_row_r8(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
|
||||
GLint x, GLint y, void *values)
|
||||
{
|
||||
const GLubyte *src = rb->GetPointer(ctx, rb, x, y);
|
||||
GLuint *dst = values;
|
||||
GLuint i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
dst[i] = 0xff000000 | src[i];
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
get_values_r8(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
|
||||
const GLint x[], const GLint y[], void *values)
|
||||
{
|
||||
GLuint *dst = (GLuint *) values;
|
||||
GLuint i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
const GLubyte *src = rb->GetPointer(ctx, rb, x[i], y[i]);
|
||||
dst[i] = 0xff000000 | *src;
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* Functions for MESA_FORMAT_RG88.
|
||||
*/
|
||||
static void
|
||||
get_row_rg88(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
|
||||
GLint x, GLint y, void *values)
|
||||
{
|
||||
const GLushort *src = rb->GetPointer(ctx, rb, x, y);
|
||||
GLuint *dst = values;
|
||||
GLuint i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
dst[i] = 0xff000000 | src[i];
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
get_values_rg88(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
||||
GLuint count, const GLint x[], const GLint y[], void *values)
|
||||
{
|
||||
GLuint *dst = (GLuint *) values;
|
||||
GLuint i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
const GLshort *src = rb->GetPointer(ctx, rb, x[i], y[i]);
|
||||
dst[i] = 0xff000000 | *src;
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* Functions for MESA_FORMAT_R16.
|
||||
*/
|
||||
static void
|
||||
get_row_r16(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
|
||||
GLint x, GLint y, void *values)
|
||||
{
|
||||
const GLushort *src = rb->GetPointer(ctx, rb, x, y);
|
||||
GLushort *dst = values;
|
||||
GLuint i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
dst[i * 4 + RCOMP] = src[i];
|
||||
dst[i * 4 + GCOMP] = 0;
|
||||
dst[i * 4 + BCOMP] = 0;
|
||||
dst[i * 4 + ACOMP] = 0xffff;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
get_values_r16(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
|
||||
const GLint x[], const GLint y[], void *values)
|
||||
{
|
||||
GLushort *dst = values;
|
||||
GLuint i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
const GLushort *src = rb->GetPointer(ctx, rb, x[i], y[i]);
|
||||
dst[i * 4 + RCOMP] = *src;
|
||||
dst[i * 4 + GCOMP] = 0;
|
||||
dst[i * 4 + BCOMP] = 0;
|
||||
dst[i * 4 + ACOMP] = 0xffff;
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
* Functions for MESA_FORMAT_RG1616.
|
||||
*/
|
||||
static void
|
||||
get_row_rg1616(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count,
|
||||
GLint x, GLint y, void *values)
|
||||
{
|
||||
const GLushort *src = rb->GetPointer(ctx, rb, x, y);
|
||||
GLushort *dst = values;
|
||||
GLuint i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
dst[i * 4 + RCOMP] = src[i * 2];
|
||||
dst[i * 4 + GCOMP] = src[i * 2 + 1];
|
||||
dst[i * 4 + BCOMP] = 0;
|
||||
dst[i * 4 + ACOMP] = 0xffff;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
get_values_rg1616(struct gl_context *ctx, struct gl_renderbuffer *rb,
|
||||
GLuint count, const GLint x[], const GLint y[], void *values)
|
||||
{
|
||||
GLushort *dst = values;
|
||||
GLuint i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
const GLshort *src = rb->GetPointer(ctx, rb, x[i], y[i]);
|
||||
dst[i * 4 + RCOMP] = src[0];
|
||||
dst[i * 4 + GCOMP] = src[1];
|
||||
dst[i * 4 + BCOMP] = 0;
|
||||
dst[i * 4 + ACOMP] = 0xffff;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This is the default software fallback for gl_renderbuffer's span
|
||||
* access functions.
|
||||
@@ -866,6 +1132,50 @@ _mesa_set_renderbuffer_accessors(struct gl_renderbuffer *rb)
|
||||
rb->PutMonoValues = put_mono_values_ubyte4;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_R8:
|
||||
rb->DataType = GL_UNSIGNED_BYTE;
|
||||
rb->GetValues = get_values_r8;
|
||||
rb->GetRow = get_row_r8;
|
||||
rb->PutRow = put_row_generic;
|
||||
rb->PutRowRGB = put_row_generic;
|
||||
rb->PutMonoRow = put_mono_row_generic;
|
||||
rb->PutValues = put_values_generic;
|
||||
rb->PutMonoValues = put_mono_values_generic;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_RG88:
|
||||
rb->DataType = GL_UNSIGNED_BYTE;
|
||||
rb->GetValues = get_values_rg88;
|
||||
rb->GetRow = get_row_rg88;
|
||||
rb->PutRow = put_row_generic;
|
||||
rb->PutRowRGB = put_row_generic;
|
||||
rb->PutMonoRow = put_mono_row_generic;
|
||||
rb->PutValues = put_values_generic;
|
||||
rb->PutMonoValues = put_mono_values_generic;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_R16:
|
||||
rb->DataType = GL_UNSIGNED_SHORT;
|
||||
rb->GetValues = get_values_r16;
|
||||
rb->GetRow = get_row_r16;
|
||||
rb->PutRow = put_row_generic;
|
||||
rb->PutRowRGB = put_row_generic;
|
||||
rb->PutMonoRow = put_mono_row_generic;
|
||||
rb->PutValues = put_values_generic;
|
||||
rb->PutMonoValues = put_mono_values_generic;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_RG1616:
|
||||
rb->DataType = GL_UNSIGNED_SHORT;
|
||||
rb->GetValues = get_values_rg1616;
|
||||
rb->GetRow = get_row_rg1616;
|
||||
rb->PutRow = put_row_generic;
|
||||
rb->PutRowRGB = put_row_generic;
|
||||
rb->PutMonoRow = put_mono_row_generic;
|
||||
rb->PutValues = put_values_generic;
|
||||
rb->PutMonoValues = put_mono_values_generic;
|
||||
break;
|
||||
|
||||
case MESA_FORMAT_SIGNED_RGBA_16:
|
||||
rb->DataType = GL_SHORT;
|
||||
rb->GetValues = get_values_ushort4;
|
||||
|
Reference in New Issue
Block a user