intel: Add spans code for the ARB_texture_rg support.

This starts spantmp2.h down the path of using MESA_FORMAT_* for
specifying the format instead of the crazy GL format/type combo.
This commit is contained in:
Eric Anholt 2010-12-09 17:30:41 -08:00
parent a7e2d64971
commit 28bab24e16
2 changed files with 154 additions and 0 deletions

View File

@ -48,6 +48,15 @@
#define HW_WRITE_CLIPLOOP() HW_CLIPLOOP()
#endif
#ifdef SPANTMP_MESA_FMT
#define SPANTMP_PIXEL_FMT GL_NONE
#define SPANTMP_PIXEL_TYPE GL_NONE
#endif
#ifndef SPANTMP_MESA_FMT
#define SPANTMP_MESA_FMT MESA_FORMAT_COUNT
#endif
#if (SPANTMP_PIXEL_FMT == GL_RGB) && (SPANTMP_PIXEL_TYPE == GL_UNSIGNED_SHORT_5_6_5)
/**
@ -445,6 +454,118 @@
rgba[3] = p; \
} while (0)
#elif (SPANTMP_MESA_FMT == MESA_FORMAT_R8)
#ifndef GET_VALUE
#ifndef GET_PTR
#define GET_PTR(_x, _y) ( buf + (_x) + (_y) * pitch)
#endif
#define GET_VALUE(_x, _y) *(volatile GLubyte *)(GET_PTR(_x, _y))
#define PUT_VALUE(_x, _y, _v) *(volatile GLubyte *)(GET_PTR(_x, _y)) = (_v)
#endif /* GET_VALUE */
# define INIT_MONO_PIXEL(p, color) \
p = color[0]
# define WRITE_RGBA(_x, _y, r, g, b, a) \
PUT_VALUE(_x, _y, r)
#define WRITE_PIXEL(_x, _y, p) PUT_VALUE(_x, _y, p)
#define READ_RGBA( rgba, _x, _y ) \
do { \
GLubyte p = GET_VALUE(_x, _y); \
rgba[0] = p; \
rgba[1] = 0; \
rgba[2] = 0; \
rgba[3] = 0; \
} while (0)
#elif (SPANTMP_MESA_FMT == MESA_FORMAT_RG88)
#ifndef GET_VALUE
#ifndef GET_PTR
#define GET_PTR(_x, _y) ( buf + (_x) * 2 + (_y) * pitch)
#endif
#define GET_VALUE(_x, _y) *(volatile GLushort *)(GET_PTR(_x, _y))
#define PUT_VALUE(_x, _y, _v) *(volatile GLushort *)(GET_PTR(_x, _y)) = (_v)
#endif /* GET_VALUE */
# define INIT_MONO_PIXEL(p, color) \
PACK_COLOR_8888(color[0], color[1], 0, 0)
# define WRITE_RGBA(_x, _y, r, g, b, a) \
PUT_VALUE(_x, _y, r)
#define WRITE_PIXEL(_x, _y, p) PUT_VALUE(_x, _y, p)
#define READ_RGBA( rgba, _x, _y ) \
do { \
GLushort p = GET_VALUE(_x, _y); \
rgba[0] = p & 0xff; \
rgba[1] = (p >> 8) & 0xff; \
rgba[2] = 0; \
rgba[3] = 0; \
} while (0)
#elif (SPANTMP_MESA_FMT == MESA_FORMAT_R16)
#ifndef GET_VALUE
#ifndef GET_PTR
#define GET_PTR(_x, _y) ( buf + (_x) * 2 + (_y) * pitch)
#endif
#define GET_VALUE(_x, _y) *(volatile GLushort *)(GET_PTR(_x, _y))
#define PUT_VALUE(_x, _y, _v) *(volatile GLushort *)(GET_PTR(_x, _y)) = (_v)
#endif /* GET_VALUE */
# define INIT_MONO_PIXEL(p, color) \
p = color[0]
# define WRITE_RGBA(_x, _y, r, g, b, a) \
PUT_VALUE(_x, _y, r)
#define WRITE_PIXEL(_x, _y, p) PUT_VALUE(_x, _y, p)
#define READ_RGBA( rgba, _x, _y ) \
do { \
GLushort p = GET_VALUE(_x, _y); \
rgba[0] = p; \
rgba[1] = 0; \
rgba[2] = 0; \
rgba[3] = 0; \
} while (0)
#elif (SPANTMP_MESA_FMT == MESA_FORMAT_RG1616)
#ifndef GET_VALUE
#ifndef GET_PTR
#define GET_PTR(_x, _y) ( buf + (_x) * 4 + (_y) * pitch)
#endif
#define GET_VALUE(_x, _y) *(volatile GLuint *)(GET_PTR(_x, _y))
#define PUT_VALUE(_x, _y, _v) *(volatile GLuint *)(GET_PTR(_x, _y)) = (_v)
#endif /* GET_VALUE */
# define INIT_MONO_PIXEL(p, color) \
((color[1] << 16) | (color[0]))
# define WRITE_RGBA(_x, _y, r, g, b, a) \
PUT_VALUE(_x, _y, r)
#define WRITE_PIXEL(_x, _y, p) PUT_VALUE(_x, _y, p)
#define READ_RGBA( rgba, _x, _y ) \
do { \
GLuint p = GET_VALUE(_x, _y); \
rgba[0] = p & 0xffff; \
rgba[1] = (p >> 16) & 0xffff; \
rgba[2] = 0; \
rgba[3] = 0; \
} while (0)
#else
#error SPANTMP_PIXEL_FMT must be set to a valid value!
#endif
@ -914,3 +1035,4 @@ static void TAG(InitPointers)(struct gl_renderbuffer *rb)
#undef GET_PTR
#undef SPANTMP_PIXEL_FMT
#undef SPANTMP_PIXEL_TYPE
#undef SPANTMP_MESA_FMT

View File

@ -113,6 +113,26 @@ intel_set_span_functions(struct intel_context *intel,
#define TAG2(x,y) intel_##x##y##_A8
#include "spantmp2.h"
#define SPANTMP_MESA_FMT MESA_FORMAT_R8
#define TAG(x) intel_##x##_R8
#define TAG2(x,y) intel_##x##y##_R8
#include "spantmp2.h"
#define SPANTMP_MESA_FMT MESA_FORMAT_RG88
#define TAG(x) intel_##x##_RG88
#define TAG2(x,y) intel_##x##y##_RG88
#include "spantmp2.h"
#define SPANTMP_MESA_FMT MESA_FORMAT_R16
#define TAG(x) intel_##x##_R16
#define TAG2(x,y) intel_##x##y##_R16
#include "spantmp2.h"
#define SPANTMP_MESA_FMT MESA_FORMAT_RG1616
#define TAG(x) intel_##x##_RG1616
#define TAG2(x,y) intel_##x##y##_RG1616
#include "spantmp2.h"
#define LOCAL_DEPTH_VARS \
struct intel_renderbuffer *irb = intel_renderbuffer(rb); \
const GLint yScale = rb->Name ? 1 : -1; \
@ -376,6 +396,18 @@ intel_set_span_functions(struct intel_context *intel,
case MESA_FORMAT_S8_Z24:
intel_InitDepthPointers_z24_s8(rb);
break;
case MESA_FORMAT_R8:
intel_InitPointers_R8(rb);
break;
case MESA_FORMAT_RG88:
intel_InitPointers_RG88(rb);
break;
case MESA_FORMAT_R16:
intel_InitPointers_R16(rb);
break;
case MESA_FORMAT_RG1616:
intel_InitPointers_RG1616(rb);
break;
default:
_mesa_problem(NULL,
"Unexpected MesaFormat %d in intelSetSpanFunctions",