Added big-endian texture formats.
Moved CI->RGBA palette lookup into texel fetch function.
This commit is contained in:
@@ -1,13 +1,8 @@
|
||||
/**
|
||||
* \file colormac.h
|
||||
* Color-related macros
|
||||
*/
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 5.1
|
||||
* Version: 6.1
|
||||
*
|
||||
* Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2004 Brian Paul 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"),
|
||||
@@ -28,6 +23,11 @@
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* \file colormac.h
|
||||
* Color-related macros
|
||||
*/
|
||||
|
||||
|
||||
#ifndef COLORMAC_H
|
||||
#define COLORMAC_H
|
||||
@@ -174,66 +174,42 @@ do { \
|
||||
|
||||
|
||||
/**
|
||||
* \name Generic color packing macros
|
||||
* \name Generic color packing macros. All inputs should be GLubytes.
|
||||
*
|
||||
* \todo We may move these into texutil.h at some point.
|
||||
* \todo We may move these into texstore.h at some point.
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
#define PACK_COLOR_8888( a, b, c, d ) \
|
||||
(((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
|
||||
#define PACK_COLOR_8888( R, G, B, A ) \
|
||||
(((R) << 24) | ((G) << 16) | ((B) << 8) | (A))
|
||||
|
||||
#define PACK_COLOR_888( a, b, c ) \
|
||||
(((a) << 16) | ((b) << 8) | (c))
|
||||
#define PACK_COLOR_888( R, G, B ) \
|
||||
(((R) << 16) | ((G) << 8) | (B))
|
||||
|
||||
#define PACK_COLOR_565( a, b, c ) \
|
||||
((((a) & 0xf8) << 8) | (((b) & 0xfc) << 3) | (((c) & 0xf8) >> 3))
|
||||
#define PACK_COLOR_565( R, G, B ) \
|
||||
((((R) & 0xf8) << 8) | (((G) & 0xfc) << 3) | (((B) & 0xf8) >> 3))
|
||||
|
||||
#define PACK_COLOR_1555( a, b, c, d ) \
|
||||
((((b) & 0xf8) << 7) | (((c) & 0xf8) << 2) | (((d) & 0xf8) >> 3) | \
|
||||
((a) ? 0x8000 : 0))
|
||||
#define PACK_COLOR_1555( A, B, G, R ) \
|
||||
((((B) & 0xf8) << 7) | (((G) & 0xf8) << 2) | (((R) & 0xf8) >> 3) | \
|
||||
((A) ? 0x8000 : 0))
|
||||
|
||||
#define PACK_COLOR_4444( a, b, c, d ) \
|
||||
((((a) & 0xf0) << 8) | (((b) & 0xf0) << 4) | ((c) & 0xf0) | ((d) >> 4))
|
||||
#define PACK_COLOR_5551( R, G, B, A ) \
|
||||
((((B) & 0xf8) << 8) | \
|
||||
(((G) & 0xf8) << 3) | \
|
||||
(((R) & 0xf8) >> 2) | \
|
||||
(((A) & 0x80) >> 7))
|
||||
|
||||
#define PACK_COLOR_88( a, b ) \
|
||||
(((a) << 8) | (b))
|
||||
#define PACK_COLOR_4444( R, G, B, A ) \
|
||||
((((R) & 0xf0) << 8) | (((G) & 0xf0) << 4) | ((B) & 0xf0) | ((A) >> 4))
|
||||
|
||||
#define PACK_COLOR_332( a, b, c ) \
|
||||
(((a) & 0xe0) | (((b) & 0xe0) >> 3) | (((c) & 0xc0) >> 6))
|
||||
#define PACK_COLOR_88( L, A ) \
|
||||
(((L) << 8) | (A))
|
||||
|
||||
#define PACK_COLOR_332( R, G, B ) \
|
||||
(((R) & 0xe0) | (((G) & 0xe0) >> 3) | (((B) & 0xc0) >> 6))
|
||||
|
||||
#ifdef MESA_BIG_ENDIAN
|
||||
|
||||
#define PACK_COLOR_8888_LE( a, b, c, d ) PACK_COLOR_8888( d, c, b, a )
|
||||
|
||||
#define PACK_COLOR_565_LE( a, b, c ) \
|
||||
(((a) & 0xf8) | (((b) & 0xe0) >> 5) | (((b) & 0x1c) << 11) | \
|
||||
(((c) & 0xf8) << 5))
|
||||
|
||||
#define PACK_COLOR_1555_LE( a, b, c, d ) \
|
||||
((((b) & 0xf8) >> 1) | (((c) & 0xc0) >> 6) | (((c) & 0x38) << 10) | \
|
||||
(((d) & 0xf8) << 5) | ((a) ? 0x80 : 0))
|
||||
|
||||
#define PACK_COLOR_4444_LE( a, b, c, d ) PACK_COLOR_4444( c, d, a, b )
|
||||
|
||||
#define PACK_COLOR_88_LE( a, b ) PACK_COLOR_88( b, a )
|
||||
|
||||
#else /* little endian */
|
||||
|
||||
#define PACK_COLOR_8888_LE( a, b, c, d ) PACK_COLOR_8888( a, b, c, d )
|
||||
|
||||
#define PACK_COLOR_565_LE( a, b, c ) PACK_COLOR_565( a, b, c )
|
||||
|
||||
#define PACK_COLOR_1555_LE( a, b, c, d ) PACK_COLOR_1555( a, b, c, d )
|
||||
|
||||
#define PACK_COLOR_4444_LE( a, b, c, d ) PACK_COLOR_4444( a, b, c, d )
|
||||
|
||||
#define PACK_COLOR_88_LE( a, b ) PACK_COLOR_88( a, b )
|
||||
|
||||
#endif /* endianness */
|
||||
|
||||
/*@}*/
|
||||
#define PACK_COLOR_233( B, G, R ) \
|
||||
(((B) & 0xc0) | (((G) & 0xe0) >> 2) | (((R) & 0xe0) >> 5))
|
||||
|
||||
|
||||
#endif /* COLORMAC_H */
|
||||
|
@@ -1116,6 +1116,8 @@ struct gl_texture_image {
|
||||
|
||||
const struct gl_texture_format *TexFormat;
|
||||
|
||||
struct gl_texture_object *TexObject; /**< Pointer back to parent object */
|
||||
|
||||
FetchTexelFuncC FetchTexelc; /**< GLchan texel fetch function pointer */
|
||||
FetchTexelFuncF FetchTexelf; /**< Float texel fetch function pointer */
|
||||
|
||||
|
@@ -217,28 +217,6 @@ const struct gl_texture_format _mesa_texformat_intensity = {
|
||||
fetch_texel_3d_f_intensity, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_color_index = {
|
||||
MESA_FORMAT_COLOR_INDEX, /* MesaFormat */
|
||||
GL_COLOR_INDEX, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
0, /* BlueBits */
|
||||
0, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
CHAN_BITS, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
sizeof(GLchan), /* TexelBytes */
|
||||
_mesa_texstore_color_index, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_color_index, /* FetchTexel1D */
|
||||
fetch_texel_2d_color_index, /* FetchTexel2D */
|
||||
fetch_texel_3d_color_index, /* FetchTexel3D */
|
||||
fetch_texel_1d_f_color_index, /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_color_index, /* FetchTexel2Df */
|
||||
fetch_texel_3d_f_color_index, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_depth_component_float32 = {
|
||||
MESA_FORMAT_DEPTH_COMPONENT_FLOAT32, /* MesaFormat */
|
||||
GL_DEPTH_COMPONENT, /* BaseFormat */
|
||||
@@ -577,6 +555,28 @@ const struct gl_texture_format _mesa_texformat_rgba8888 = {
|
||||
fetch_texel_3d_f_rgba8888, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_abgr8888 = {
|
||||
MESA_FORMAT_ABGR8888, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
8, /* RedBits */
|
||||
8, /* GreenBits */
|
||||
8, /* BlueBits */
|
||||
8, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
4, /* TexelBytes */
|
||||
_mesa_texstore_abgr8888, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_abgr8888, /* FetchTexel1D */
|
||||
fetch_texel_2d_abgr8888, /* FetchTexel2D */
|
||||
fetch_texel_3d_abgr8888, /* FetchTexel3D */
|
||||
fetch_texel_1d_f_abgr8888, /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_abgr8888, /* FetchTexel2Df */
|
||||
fetch_texel_3d_f_abgr8888, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_argb8888 = {
|
||||
MESA_FORMAT_ARGB8888, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
@@ -599,6 +599,28 @@ const struct gl_texture_format _mesa_texformat_argb8888 = {
|
||||
fetch_texel_3d_f_argb8888, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgra8888 = {
|
||||
MESA_FORMAT_BGRA8888, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
8, /* RedBits */
|
||||
8, /* GreenBits */
|
||||
8, /* BlueBits */
|
||||
8, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
4, /* TexelBytes */
|
||||
_mesa_texstore_bgra8888, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgra8888, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgra8888, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgra8888, /* FetchTexel3D */
|
||||
fetch_texel_1d_f_bgra8888, /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_bgra8888, /* FetchTexel2Df */
|
||||
fetch_texel_3d_f_bgra8888, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_rgb888 = {
|
||||
MESA_FORMAT_RGB888, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
@@ -621,6 +643,28 @@ const struct gl_texture_format _mesa_texformat_rgb888 = {
|
||||
fetch_texel_3d_f_rgb888, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgr888 = {
|
||||
MESA_FORMAT_BGR888, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
8, /* RedBits */
|
||||
8, /* GreenBits */
|
||||
8, /* BlueBits */
|
||||
0, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
3, /* TexelBytes */
|
||||
_mesa_texstore_bgr888, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgr888, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgr888, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgr888, /* FetchTexel3D */
|
||||
fetch_texel_1d_f_bgr888, /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_bgr888, /* FetchTexel2Df */
|
||||
fetch_texel_3d_f_bgr888, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_rgb565 = {
|
||||
MESA_FORMAT_RGB565, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
@@ -643,6 +687,28 @@ const struct gl_texture_format _mesa_texformat_rgb565 = {
|
||||
fetch_texel_3d_f_rgb565, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgr565 = {
|
||||
MESA_FORMAT_BGR565, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
5, /* RedBits */
|
||||
6, /* GreenBits */
|
||||
5, /* BlueBits */
|
||||
0, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
2, /* TexelBytes */
|
||||
_mesa_texstore_bgr565, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgr565, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgr565, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgr565, /* FetchTexel3D */
|
||||
fetch_texel_1d_f_bgr565, /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_bgr565, /* FetchTexel2Df */
|
||||
fetch_texel_3d_f_bgr565, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_argb4444 = {
|
||||
MESA_FORMAT_ARGB4444, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
@@ -665,6 +731,28 @@ const struct gl_texture_format _mesa_texformat_argb4444 = {
|
||||
fetch_texel_3d_f_argb4444, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgra4444 = {
|
||||
MESA_FORMAT_BGRA4444, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
4, /* RedBits */
|
||||
4, /* GreenBits */
|
||||
4, /* BlueBits */
|
||||
4, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
2, /* TexelBytes */
|
||||
_mesa_texstore_bgra4444, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgra4444, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgra4444, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgra4444, /* FetchTexel3D */
|
||||
fetch_texel_1d_f_bgra4444, /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_bgra4444, /* FetchTexel2Df */
|
||||
fetch_texel_3d_f_bgra4444, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_argb1555 = {
|
||||
MESA_FORMAT_ARGB1555, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
@@ -687,6 +775,28 @@ const struct gl_texture_format _mesa_texformat_argb1555 = {
|
||||
fetch_texel_3d_f_argb1555, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgra5551 = {
|
||||
MESA_FORMAT_BGRA5551, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
5, /* RedBits */
|
||||
5, /* GreenBits */
|
||||
5, /* BlueBits */
|
||||
1, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
2, /* TexelBytes */
|
||||
_mesa_texstore_bgra5551, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgra5551, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgra5551, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgra5551, /* FetchTexel3D */
|
||||
fetch_texel_1d_f_bgra5551, /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_bgra5551, /* FetchTexel2Df */
|
||||
fetch_texel_3d_f_bgra5551, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_al88 = {
|
||||
MESA_FORMAT_AL88, /* MesaFormat */
|
||||
GL_LUMINANCE_ALPHA, /* BaseFormat */
|
||||
@@ -709,6 +819,28 @@ const struct gl_texture_format _mesa_texformat_al88 = {
|
||||
fetch_texel_3d_f_al88, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_la88 = {
|
||||
MESA_FORMAT_LA88, /* MesaFormat */
|
||||
GL_LUMINANCE_ALPHA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
0, /* BlueBits */
|
||||
8, /* AlphaBits */
|
||||
8, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
2, /* TexelBytes */
|
||||
_mesa_texstore_la88, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_la88, /* FetchTexel1D */
|
||||
fetch_texel_2d_la88, /* FetchTexel2D */
|
||||
fetch_texel_3d_la88, /* FetchTexel3D */
|
||||
fetch_texel_1d_f_la88, /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_la88, /* FetchTexel2Df */
|
||||
fetch_texel_3d_f_la88, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_rgb332 = {
|
||||
MESA_FORMAT_RGB332, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
@@ -731,6 +863,28 @@ const struct gl_texture_format _mesa_texformat_rgb332 = {
|
||||
fetch_texel_3d_f_rgb332, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgr233 = {
|
||||
MESA_FORMAT_BGR233, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
3, /* RedBits */
|
||||
3, /* GreenBits */
|
||||
2, /* BlueBits */
|
||||
0, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
1, /* TexelBytes */
|
||||
_mesa_texstore_bgr233, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgr233, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgr233, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgr233, /* FetchTexel3D */
|
||||
fetch_texel_1d_f_bgr233, /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_bgr233, /* FetchTexel2Df */
|
||||
fetch_texel_3d_f_bgr233, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_a8 = {
|
||||
MESA_FORMAT_A8, /* MesaFormat */
|
||||
GL_ALPHA, /* BaseFormat */
|
||||
@@ -863,177 +1017,6 @@ const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
|
||||
fetch_texel_3d_f_ycbcr_rev, /* FetchTexel3Df */
|
||||
};
|
||||
|
||||
|
||||
/* Big-endian */
|
||||
#if 0
|
||||
const struct gl_texture_format _mesa_texformat_abgr8888 = {
|
||||
MESA_FORMAT_ABGR8888, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
8, /* RedBits */
|
||||
8, /* GreenBits */
|
||||
8, /* BlueBits */
|
||||
8, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
4, /* TexelBytes */
|
||||
NULL, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_abgr8888, /* FetchTexel1D */
|
||||
fetch_texel_2d_abgr8888, /* FetchTexel2D */
|
||||
fetch_texel_3d_abgr8888, /* FetchTexel3D */
|
||||
/* XXX float fetchers */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgra8888 = {
|
||||
MESA_FORMAT_BGRA8888, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
GL_UNSIGNED_INT_8_8_8_8, /* Type */
|
||||
8, /* RedBits */
|
||||
8, /* GreenBits */
|
||||
8, /* BlueBits */
|
||||
8, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
4, /* TexelBytes */
|
||||
NULL, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgra8888, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgra8888, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgra8888, /* FetchTexel3D */
|
||||
/* XXX float fetchers */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgr888 = {
|
||||
MESA_FORMAT_BGR888, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
GL_UNSIGNED_BYTE, /* Type */
|
||||
8, /* RedBits */
|
||||
8, /* GreenBits */
|
||||
8, /* BlueBits */
|
||||
0, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
3, /* TexelBytes */
|
||||
NULL, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgr888, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgr888, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgr888, /* FetchTexel3D */
|
||||
/* XXX float fetchers */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgr565 = {
|
||||
MESA_FORMAT_BGR565, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
GL_UNSIGNED_SHORT_5_6_5, /* Type */
|
||||
5, /* RedBits */
|
||||
6, /* GreenBits */
|
||||
5, /* BlueBits */
|
||||
0, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
2, /* TexelBytes */
|
||||
NULL, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgr565, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgr565, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgr565, /* FetchTexel3D */
|
||||
/* XXX float fetchers */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgra4444 = {
|
||||
MESA_FORMAT_BGRA4444, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
GL_UNSIGNED_SHORT_4_4_4_4_REV, /* Type */
|
||||
4, /* RedBits */
|
||||
4, /* GreenBits */
|
||||
4, /* BlueBits */
|
||||
4, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
2, /* TexelBytes */
|
||||
NULL, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgra4444, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgra4444, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgra4444, /* FetchTexel3D */
|
||||
/* XXX float fetchers */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgra5551 = {
|
||||
MESA_FORMAT_BGRA5551, /* MesaFormat */
|
||||
GL_RGBA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
GL_UNSIGNED_SHORT_1_5_5_5_REV, /* Type */
|
||||
5, /* RedBits */
|
||||
5, /* GreenBits */
|
||||
5, /* BlueBits */
|
||||
1, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
2, /* TexelBytes */
|
||||
NULL, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgra1555, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgra1555, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgra1555, /* FetchTexel3D */
|
||||
/* XXX float fetchers */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_la88 = {
|
||||
MESA_FORMAT_LA88, /* MesaFormat */
|
||||
GL_LUMINANCE_ALPHA, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
GL_UNSIGNED_BYTE, /* Type */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
0, /* BlueBits */
|
||||
8, /* AlphaBits */
|
||||
8, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
2, /* TexelBytes */
|
||||
NULL, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_la88, /* FetchTexel1D */
|
||||
fetch_texel_2d_la88, /* FetchTexel2D */
|
||||
fetch_texel_3d_la88, /* FetchTexel3D */
|
||||
/* XXX float fetchers */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_bgr233 = {
|
||||
MESA_FORMAT_BGR233, /* MesaFormat */
|
||||
GL_RGB, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB /* DataType */
|
||||
GL_UNSIGNED_BYTE_3_3_2, /* Type */
|
||||
3, /* RedBits */
|
||||
3, /* GreenBits */
|
||||
2, /* BlueBits */
|
||||
0, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
0, /* DepthBits */
|
||||
1, /* TexelBytes */
|
||||
NULL, /* StoreTexImageFunc */
|
||||
fetch_texel_1d_bgr233, /* FetchTexel1D */
|
||||
fetch_texel_2d_bgr233, /* FetchTexel2D */
|
||||
fetch_texel_3d_bgr233, /* FetchTexel3D */
|
||||
/* XXX float fetchers */
|
||||
};
|
||||
#endif
|
||||
|
||||
/*@}*/
|
||||
|
||||
|
||||
@@ -1092,11 +1075,12 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
|
||||
/* RGBA formats */
|
||||
case 4:
|
||||
case GL_RGBA:
|
||||
case GL_RGBA8:
|
||||
case GL_RGB10_A2:
|
||||
case GL_RGBA12:
|
||||
case GL_RGBA16:
|
||||
return &_mesa_texformat_rgba;
|
||||
case GL_RGBA8:
|
||||
return &_mesa_texformat_rgba8888;
|
||||
case GL_RGB5_A1:
|
||||
return &_mesa_texformat_argb1555;
|
||||
case GL_RGBA2:
|
||||
@@ -1120,10 +1104,11 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
|
||||
/* Alpha formats */
|
||||
case GL_ALPHA:
|
||||
case GL_ALPHA4:
|
||||
case GL_ALPHA8:
|
||||
case GL_ALPHA12:
|
||||
case GL_ALPHA16:
|
||||
return &_mesa_texformat_alpha;
|
||||
case GL_ALPHA8:
|
||||
return &_mesa_texformat_a8;
|
||||
|
||||
/* Luminance formats */
|
||||
case 1:
|
||||
@@ -1161,7 +1146,6 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
|
||||
case GL_COLOR_INDEX4_EXT:
|
||||
case GL_COLOR_INDEX12_EXT:
|
||||
case GL_COLOR_INDEX16_EXT:
|
||||
return &_mesa_texformat_color_index;
|
||||
case GL_COLOR_INDEX8_EXT:
|
||||
return &_mesa_texformat_ci8;
|
||||
|
||||
|
@@ -66,13 +66,21 @@ enum _format {
|
||||
/* msb <------ TEXEL BITS -----------> lsb */
|
||||
/* ---- ---- ---- ---- ---- ---- ---- ---- */
|
||||
MESA_FORMAT_RGBA8888, /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
|
||||
MESA_FORMAT_ABGR8888, /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
|
||||
MESA_FORMAT_ARGB8888, /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
|
||||
MESA_FORMAT_BGRA8888, /* BBBB BBBB GGGG GGGG RRRR RRRR AAAA AAAA */
|
||||
MESA_FORMAT_RGB888, /* RRRR RRRR GGGG GGGG BBBB BBBB */
|
||||
MESA_FORMAT_BGR888, /* BBBB BBBB GGGG GGGG RRRR RRRR */
|
||||
MESA_FORMAT_RGB565, /* RRRR RGGG GGGB BBBB */
|
||||
MESA_FORMAT_BGR565, /* BBBB BGGG GGGR RRRR */
|
||||
MESA_FORMAT_ARGB4444, /* AAAA RRRR GGGG BBBB */
|
||||
MESA_FORMAT_BGRA4444, /* AAAA RRRR GGGG BBBB */
|
||||
MESA_FORMAT_ARGB1555, /* ARRR RRGG GGGB BBBB */
|
||||
MESA_FORMAT_BGRA5551, /* BBBB BGGG GGRR RRRA */
|
||||
MESA_FORMAT_AL88, /* AAAA AAAA LLLL LLLL */
|
||||
MESA_FORMAT_LA88, /* LLLL LLLL AAAA AAAA */
|
||||
MESA_FORMAT_RGB332, /* RRRG GGBB */
|
||||
MESA_FORMAT_BGR233, /* BBGG GRRR */
|
||||
MESA_FORMAT_A8, /* AAAA AAAA */
|
||||
MESA_FORMAT_L8, /* LLLL LLLL */
|
||||
MESA_FORMAT_I8, /* IIII IIII */
|
||||
@@ -81,24 +89,6 @@ enum _format {
|
||||
MESA_FORMAT_YCBCR_REV, /* UorV UorV YYYY YYYY */
|
||||
/*@}*/
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* \name Upcoming little-endian formats
|
||||
*/
|
||||
/*@{*/
|
||||
/* msb <------ TEXEL BITS -----------> lsb */
|
||||
/* ---- ---- ---- ---- ---- ---- ---- ---- */
|
||||
MESA_FORMAT_ABGR8888, /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
|
||||
MESA_FORMAT_BGRA8888, /* BBBB BBBB GGGG GGGG RRRR RRRR AAAA AAAA */
|
||||
MESA_FORMAT_BGR888, /* BBBB BBBB GGGG GGGG RRRR RRRR */
|
||||
MESA_FORMAT_BGR565, /* BBBB BGGG GGGR RRRR */
|
||||
MESA_FORMAT_BGRA4444, /* BBBB GGGG RRRR AAAA */
|
||||
MESA_FORMAT_BGRA5551, /* BBBB BGGG GGRR RRRA */
|
||||
MESA_FORMAT_LA88, /* LLLL LLLL AAAA AAAA */
|
||||
MESA_FORMAT_BGR233, /* BBGG GRRR */
|
||||
/*@}*/
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \name Compressed texture formats.
|
||||
*/
|
||||
@@ -128,7 +118,6 @@ enum _format {
|
||||
MESA_FORMAT_LUMINANCE,
|
||||
MESA_FORMAT_LUMINANCE_ALPHA,
|
||||
MESA_FORMAT_INTENSITY,
|
||||
MESA_FORMAT_COLOR_INDEX,
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
@@ -167,7 +156,6 @@ extern const struct gl_texture_format _mesa_texformat_alpha;
|
||||
extern const struct gl_texture_format _mesa_texformat_luminance;
|
||||
extern const struct gl_texture_format _mesa_texformat_luminance_alpha;
|
||||
extern const struct gl_texture_format _mesa_texformat_intensity;
|
||||
extern const struct gl_texture_format _mesa_texformat_color_index;
|
||||
/*@}*/
|
||||
|
||||
/** Depth textures */
|
||||
@@ -195,17 +183,26 @@ extern const struct gl_texture_format _mesa_texformat_intensity_float16;
|
||||
/** \name Assorted hardware-friendly formats */
|
||||
/*@{*/
|
||||
extern const struct gl_texture_format _mesa_texformat_rgba8888;
|
||||
extern const struct gl_texture_format _mesa_texformat_abgr8888;
|
||||
extern const struct gl_texture_format _mesa_texformat_argb8888;
|
||||
extern const struct gl_texture_format _mesa_texformat_bgra8888;
|
||||
extern const struct gl_texture_format _mesa_texformat_rgb888;
|
||||
extern const struct gl_texture_format _mesa_texformat_bgr888;
|
||||
extern const struct gl_texture_format _mesa_texformat_rgb565;
|
||||
extern const struct gl_texture_format _mesa_texformat_bgr565;
|
||||
extern const struct gl_texture_format _mesa_texformat_argb4444;
|
||||
extern const struct gl_texture_format _mesa_texformat_bgra4444;
|
||||
extern const struct gl_texture_format _mesa_texformat_argb1555;
|
||||
extern const struct gl_texture_format _mesa_texformat_bgra5551;
|
||||
extern const struct gl_texture_format _mesa_texformat_al88;
|
||||
extern const struct gl_texture_format _mesa_texformat_la88;
|
||||
extern const struct gl_texture_format _mesa_texformat_rgb332;
|
||||
extern const struct gl_texture_format _mesa_texformat_bgr233;
|
||||
extern const struct gl_texture_format _mesa_texformat_a8;
|
||||
extern const struct gl_texture_format _mesa_texformat_l8;
|
||||
extern const struct gl_texture_format _mesa_texformat_i8;
|
||||
extern const struct gl_texture_format _mesa_texformat_ci8;
|
||||
|
||||
/*@}*/
|
||||
|
||||
/** \name YCbCr formats */
|
||||
|
@@ -228,23 +228,6 @@ static void FETCH(f_intensity)( const struct gl_texture_image *texImage,
|
||||
}
|
||||
|
||||
|
||||
/* Fetch CI texel from 1D, 2D or 3D CI texture, returning 1 GLchan */
|
||||
static void FETCH(color_index)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
|
||||
texel[0] = src[0];
|
||||
}
|
||||
|
||||
/* Fetch CI texel from 1D, 2D or 3D CI texture, returning 1 GLfloat */
|
||||
static void FETCH(f_color_index)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
const GLchan *src = CHAN_SRC( texImage, i, j, k, 1 );
|
||||
texel[0] = (GLfloat) src[0];
|
||||
}
|
||||
|
||||
|
||||
/* Fetch depth texel from 1D, 2D or 3D float32 DEPTH texture,
|
||||
* returning 1 GLfloat.
|
||||
* Note: no GLchan version of this function.
|
||||
@@ -610,6 +593,29 @@ static void FETCH(f_rgba8888)( const struct gl_texture_image *texImage,
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D abgr8888 texture, return 4 GLchans */
|
||||
static void FETCH(abgr8888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( src[0] );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( src[1] );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( src[2] );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( src[3] );
|
||||
}
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D abgr8888 texture, return 4 GLfloats */
|
||||
static void FETCH(f_abgr8888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
|
||||
texel[RCOMP] = UBYTE_TO_FLOAT( src[0] );
|
||||
texel[GCOMP] = UBYTE_TO_FLOAT( src[1] );
|
||||
texel[BCOMP] = UBYTE_TO_FLOAT( src[2] );
|
||||
texel[ACOMP] = UBYTE_TO_FLOAT( src[3] );
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D argb8888 texture, return 4 GLchans */
|
||||
static void FETCH(argb8888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
@@ -633,6 +639,29 @@ static void FETCH(f_argb8888)( const struct gl_texture_image *texImage,
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgra8888 texture, return 4 GLchans */
|
||||
static void FETCH(bgra8888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( src[1] );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( src[2] );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( src[3] );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( src[0] );
|
||||
}
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgra8888 texture, return 4 GLfloats */
|
||||
static void FETCH(f_bgra8888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
|
||||
texel[RCOMP] = UBYTE_TO_FLOAT( src[1] );
|
||||
texel[GCOMP] = UBYTE_TO_FLOAT( src[2] );
|
||||
texel[BCOMP] = UBYTE_TO_FLOAT( src[3] );
|
||||
texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D rgb888 texture, return 4 GLchans */
|
||||
static void FETCH(rgb888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
@@ -656,6 +685,29 @@ static void FETCH(f_rgb888)( const struct gl_texture_image *texImage,
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgr888 texture, return 4 GLchans */
|
||||
static void FETCH(bgr888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 );
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( src[0] );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( src[1] );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( src[2] );
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
}
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgr888 texture, return 4 GLfloats */
|
||||
static void FETCH(f_bgr888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 );
|
||||
texel[RCOMP] = UBYTE_TO_FLOAT( src[0] );
|
||||
texel[GCOMP] = UBYTE_TO_FLOAT( src[1] );
|
||||
texel[BCOMP] = UBYTE_TO_FLOAT( src[2] );
|
||||
texel[ACOMP] = CHAN_MAXF;
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D rgb565 texture, return 4 GLchans */
|
||||
static void FETCH(rgb565)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
@@ -681,7 +733,32 @@ static void FETCH(f_rgb565)( const struct gl_texture_image *texImage,
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D rgb565 texture, return 4 GLchans */
|
||||
/* Fetch color texel from 1D, 2D or 3D bgr565 texture, return 4 GLchans */
|
||||
static void FETCH(bgr565)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLushort *src = USHORT_SRC( texImage, i, j, k );
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xf8) * 255 / 0xf8 );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) * 255 / 0xfc );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) * 255 / 0xf8 );
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
}
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgr565 texture, return 4 GLfloats */
|
||||
static void FETCH(f_bgr565)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
const GLushort *src = USHORT_SRC( texImage, i, j, k );
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = ((s << 3) & 0xf8) * (1.0F / 248.0F);
|
||||
texel[GCOMP] = ((s >> 3) & 0xfc) * (1.0F / 252.0F);
|
||||
texel[BCOMP] = ((s >> 8) & 0xf8) * (1.0F / 248.0F);
|
||||
texel[ACOMP] = CHAN_MAXF;
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D argb444 texture, return 4 GLchans */
|
||||
static void FETCH(argb4444)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
@@ -693,7 +770,7 @@ static void FETCH(argb4444)( const struct gl_texture_image *texImage,
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf );
|
||||
}
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D rgb565 texture, return 4 GLfloats */
|
||||
/* Fetch color texel from 1D, 2D or 3D argb4444 texture, return 4 GLfloats */
|
||||
static void FETCH(f_argb4444)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
@@ -706,6 +783,31 @@ static void FETCH(f_argb4444)( const struct gl_texture_image *texImage,
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgra444 texture, return 4 GLchans */
|
||||
static void FETCH(bgra4444)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLushort *src = USHORT_SRC( texImage, i, j, k );
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 4) & 0xf) * 255 / 0xf );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf) * 255 / 0xf );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( ((s ) & 0xf) * 255 / 0xf );
|
||||
}
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgra4444 texture, return 4 GLfloats */
|
||||
static void FETCH(f_bgra4444)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
const GLushort *src = USHORT_SRC( texImage, i, j, k );
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F);
|
||||
texel[GCOMP] = ((s >> 8) & 0xf) * (1.0F / 15.0F);
|
||||
texel[BCOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F);
|
||||
texel[ACOMP] = ((s ) & 0xf) * (1.0F / 15.0F);
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */
|
||||
static void FETCH(argb1555)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
@@ -731,6 +833,31 @@ static void FETCH(f_argb1555)( const struct gl_texture_image *texImage,
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgra5551 texture, return 4 GLchans */
|
||||
static void FETCH(bgra5551)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLushort *src = USHORT_SRC( texImage, i, j, k );
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 1) & 0x1f) * 255 / 0x1f );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 6) & 0x1f) * 255 / 0x1f );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( ((s >> 11) & 0x1f) * 255 / 0x1f );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( ((s ) & 0x01) * 255 );
|
||||
}
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgra5551 texture, return 4 GLfloats */
|
||||
static void FETCH(f_bgra5551)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
const GLushort *src = USHORT_SRC( texImage, i, j, k );
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = ((s >> 1) & 0x1f) * (1.0F / 31.0F);
|
||||
texel[GCOMP] = ((s >> 6) & 0x1f) * (1.0F / 31.0F);
|
||||
texel[BCOMP] = ((s >> 11) & 0x1f) * (1.0F / 31.0F);
|
||||
texel[ACOMP] = ((s ) & 0x01);
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D al88 texture, return 4 GLchans */
|
||||
static void FETCH(al88)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
@@ -754,6 +881,29 @@ static void FETCH(f_al88)( const struct gl_texture_image *texImage,
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D la88 texture, return 4 GLchans */
|
||||
static void FETCH(la88)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 );
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( src[1] );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( src[0] );
|
||||
}
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D la88 texture, return 4 GLfloats */
|
||||
static void FETCH(f_la88)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 );
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = UBYTE_TO_FLOAT( src[1] );
|
||||
texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D rgb332 texture, return 4 GLchans */
|
||||
static void FETCH(rgb332)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
@@ -779,6 +929,31 @@ static void FETCH(f_rgb332)( const struct gl_texture_image *texImage,
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgr233 texture, return 4 GLchans */
|
||||
static void FETCH(bgr233)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
|
||||
const GLubyte s = *src;
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( ((s & 0x07) * 255 / 0x07) );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( ((s & 0x38) * 255 / 0x38) );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( ((s & 0xc0) * 255 / 0xc0) );
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
}
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D bgr233 texture, return 4 GLfloats */
|
||||
static void FETCH(f_bgr233)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
|
||||
const GLubyte s = *src;
|
||||
texel[RCOMP] = (s & 0x07) * (1.0F / 7.0F);
|
||||
texel[GCOMP] = (s & 0x38) * (1.0F / 56.0F);
|
||||
texel[BCOMP] = (s & 0xc0) * (1.0F / 192.0F);
|
||||
texel[ACOMP] = CHAN_MAXF;
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D a8 texture, return 4 GLchans */
|
||||
static void FETCH(a8)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
@@ -848,22 +1023,86 @@ static void FETCH(f_i8)( const struct gl_texture_image *texImage,
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D ci8 texture, return 1 GLchan */
|
||||
/* Fetch CI texel from 1D, 2D or 3D ci8 texture, lookup the index in a
|
||||
* color table, and return 4 GLchans.
|
||||
*/
|
||||
static void FETCH(ci8)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
|
||||
GLchan *index = (GLchan *) texel;
|
||||
*index = UBYTE_TO_CHAN( *src );
|
||||
const GLuint index = *src;
|
||||
const struct gl_color_table *palette;
|
||||
const GLchan *table;
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
if (ctx->Texture.SharedPalette) {
|
||||
palette = &ctx->Texture.Palette;
|
||||
}
|
||||
else {
|
||||
palette = &texImage->TexObject->Palette;
|
||||
}
|
||||
if (palette->Size == 0)
|
||||
return; /* undefined results */
|
||||
ASSERT(palette->Type != GL_FLOAT);
|
||||
table = (const GLchan *) palette->Table;
|
||||
|
||||
switch (palette->Format) {
|
||||
case GL_ALPHA:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = 0;
|
||||
texel[ACOMP] = table[index];
|
||||
return;
|
||||
case GL_LUMINANCE:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = table[index];
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
break;
|
||||
case GL_INTENSITY:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] =
|
||||
texel[ACOMP] = table[index];
|
||||
return;
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
texel[RCOMP] =
|
||||
texel[GCOMP] =
|
||||
texel[BCOMP] = table[index * 2 + 0];
|
||||
texel[ACOMP] = table[index * 2 + 1];
|
||||
return;
|
||||
case GL_RGB:
|
||||
texel[RCOMP] = table[index * 3 + 0];
|
||||
texel[GCOMP] = table[index * 3 + 1];
|
||||
texel[BCOMP] = table[index * 3 + 2];
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
return;
|
||||
case GL_RGBA:
|
||||
texel[RCOMP] = table[index * 4 + 0];
|
||||
texel[GCOMP] = table[index * 4 + 1];
|
||||
texel[BCOMP] = table[index * 4 + 2];
|
||||
texel[ACOMP] = table[index * 4 + 3];
|
||||
return;
|
||||
default:
|
||||
_mesa_problem(ctx, "Bad palette format in palette_sample");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Fetch color texel from 1D, 2D or 3D ci8 texture, return 1 GLfloat */
|
||||
/* Fetch CI texel from 1D, 2D or 3D ci8 texture, lookup the index in a
|
||||
* color table, and return 4 GLfloats.
|
||||
*/
|
||||
static void FETCH(f_ci8)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
|
||||
texel[0] = UBYTE_TO_FLOAT( *src );
|
||||
GLchan rgba[4];
|
||||
/* Sample as GLchan */
|
||||
FETCH(ci8)(texImage, i, j, k, rgba);
|
||||
/* and return as floats */
|
||||
texel[RCOMP] = CHAN_TO_FLOAT(rgba[RCOMP]);
|
||||
texel[GCOMP] = CHAN_TO_FLOAT(rgba[GCOMP]);
|
||||
texel[BCOMP] = CHAN_TO_FLOAT(rgba[BCOMP]);
|
||||
texel[ACOMP] = CHAN_TO_FLOAT(rgba[ACOMP]);
|
||||
}
|
||||
|
||||
|
||||
@@ -1002,95 +1241,6 @@ static void FETCH(f_ycbcr_rev)( const struct gl_texture_image *texImage,
|
||||
|
||||
|
||||
|
||||
/* big-endian */
|
||||
|
||||
#if 0
|
||||
static void FETCH(abgr8888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( src[3] );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( src[2] );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( src[1] );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( src[0] );
|
||||
}
|
||||
|
||||
static void FETCH(bgra8888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 4 );
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( src[2] );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( src[1] );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( src[3] );
|
||||
}
|
||||
|
||||
static void FETCH(bgr888)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 3 );
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( src[2] );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( src[1] );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
}
|
||||
|
||||
static void FETCH(bgr565)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLushort *src = USHORT_SRC( texImage, i, j, k );
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf8) * 255 / 0xf8 );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 3) & 0xfc) * 255 / 0xfc );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xf8) * 255 / 0xf8 );
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
}
|
||||
|
||||
static void FETCH(bgra4444)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLushort *src = USHORT_SRC( texImage, i, j, k );
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 8) & 0xf) * 255 / 0xf );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 4) & 0xf) * 255 / 0xf );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0xf) * 255 / 0xf );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( ((s >> 12) & 0xf) * 255 / 0xf );
|
||||
}
|
||||
|
||||
static void FETCH(bgra5551)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLushort *src = USHORT_SRC( texImage, i, j, k );
|
||||
const GLushort s = *src;
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( ((s >> 10) & 0x1f) * 255 / 0x1f );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( ((s >> 5) & 0x1f) * 255 / 0x1f );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( ((s ) & 0x1f) * 255 / 0x1f );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( ((s >> 15) & 0x01) * 255 );
|
||||
}
|
||||
|
||||
static void FETCH(la88)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 2 );
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( src[0] );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( src[0] );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( src[0] );
|
||||
texel[ACOMP] = UBYTE_TO_CHAN( src[1] );
|
||||
}
|
||||
|
||||
static void FETCH(bgr233)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLchan *texel )
|
||||
{
|
||||
const GLubyte *src = UBYTE_SRC( texImage, i, j, k, 1 );
|
||||
const GLubyte s = *src;
|
||||
texel[RCOMP] = UBYTE_TO_CHAN( ((s ) & 0xe0) * 255 / 0xe0 );
|
||||
texel[GCOMP] = UBYTE_TO_CHAN( ((s << 3) & 0xe0) * 255 / 0xe0 );
|
||||
texel[BCOMP] = UBYTE_TO_CHAN( ((s << 5) & 0xc0) * 255 / 0xc0 );
|
||||
texel[ACOMP] = CHAN_MAX;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#undef CHAN_SRC
|
||||
#undef UBYTE_SRC
|
||||
#undef USHORT_SRC
|
||||
|
@@ -502,7 +502,7 @@ _mesa_set_tex_image(struct gl_texture_object *tObj,
|
||||
case GL_TEXTURE_2D:
|
||||
case GL_TEXTURE_3D:
|
||||
tObj->Image[0][level] = texImage;
|
||||
return;
|
||||
break;
|
||||
case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB:
|
||||
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB:
|
||||
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB:
|
||||
@@ -517,11 +517,13 @@ _mesa_set_tex_image(struct gl_texture_object *tObj,
|
||||
case GL_TEXTURE_RECTANGLE_NV:
|
||||
ASSERT(level == 0);
|
||||
tObj->Image[0][level] = texImage;
|
||||
return;
|
||||
break;
|
||||
default:
|
||||
_mesa_problem(NULL, "bad target in _mesa_set_tex_image()");
|
||||
return;
|
||||
}
|
||||
/* Set the 'back' pointer */
|
||||
texImage->TexObject = tObj;
|
||||
}
|
||||
|
||||
|
||||
@@ -757,6 +759,8 @@ _mesa_get_proxy_tex_image(GLcontext *ctx, GLenum target, GLint level)
|
||||
return NULL;
|
||||
}
|
||||
ctx->Texture.Proxy1D->Image[0][level] = texImage;
|
||||
/* Set the 'back' pointer */
|
||||
texImage->TexObject = ctx->Texture.Proxy1D;
|
||||
}
|
||||
return texImage;
|
||||
case GL_PROXY_TEXTURE_2D:
|
||||
@@ -770,6 +774,8 @@ _mesa_get_proxy_tex_image(GLcontext *ctx, GLenum target, GLint level)
|
||||
return NULL;
|
||||
}
|
||||
ctx->Texture.Proxy2D->Image[0][level] = texImage;
|
||||
/* Set the 'back' pointer */
|
||||
texImage->TexObject = ctx->Texture.Proxy2D;
|
||||
}
|
||||
return texImage;
|
||||
case GL_PROXY_TEXTURE_3D:
|
||||
@@ -783,6 +789,8 @@ _mesa_get_proxy_tex_image(GLcontext *ctx, GLenum target, GLint level)
|
||||
return NULL;
|
||||
}
|
||||
ctx->Texture.Proxy3D->Image[0][level] = texImage;
|
||||
/* Set the 'back' pointer */
|
||||
texImage->TexObject = ctx->Texture.Proxy3D;
|
||||
}
|
||||
return texImage;
|
||||
case GL_PROXY_TEXTURE_CUBE_MAP:
|
||||
@@ -796,6 +804,8 @@ _mesa_get_proxy_tex_image(GLcontext *ctx, GLenum target, GLint level)
|
||||
return NULL;
|
||||
}
|
||||
ctx->Texture.ProxyCubeMap->Image[0][level] = texImage;
|
||||
/* Set the 'back' pointer */
|
||||
texImage->TexObject = ctx->Texture.ProxyCubeMap;
|
||||
}
|
||||
return texImage;
|
||||
case GL_PROXY_TEXTURE_RECTANGLE_NV:
|
||||
@@ -809,6 +819,8 @@ _mesa_get_proxy_tex_image(GLcontext *ctx, GLenum target, GLint level)
|
||||
return NULL;
|
||||
}
|
||||
ctx->Texture.ProxyRect->Image[0][level] = texImage;
|
||||
/* Set the 'back' pointer */
|
||||
texImage->TexObject = ctx->Texture.ProxyRect;
|
||||
}
|
||||
return texImage;
|
||||
default:
|
||||
@@ -1922,8 +1934,6 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
{
|
||||
const GLint width = texImage->Width;
|
||||
const GLint height = texImage->Height;
|
||||
@@ -1940,10 +1950,25 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
|
||||
if (format == GL_COLOR_INDEX) {
|
||||
GLuint indexRow[MAX_WIDTH];
|
||||
GLint col;
|
||||
for (col = 0; col < width; col++) {
|
||||
GLchan indx;
|
||||
(*texImage->FetchTexelc)(texImage, col, row, img, &indx);
|
||||
indexRow[col] = indx;
|
||||
/* Can't use FetchTexel here because that returns RGBA */
|
||||
if (texImage->TexFormat->IndexBits == 8) {
|
||||
const GLubyte *src = (const GLubyte *) texImage->Data;
|
||||
for (col = 0; col < width; col++) {
|
||||
indexRow[col] = src[texImage->Width *
|
||||
(img * texImage->Height + row) + col];
|
||||
}
|
||||
}
|
||||
else if (texImage->TexFormat->IndexBits == 16) {
|
||||
const GLushort *src = (const GLushort *) texImage->Data;
|
||||
for (col = 0; col < width; col++) {
|
||||
indexRow[col] = src[texImage->Width *
|
||||
(img * texImage->Height + row) + col];
|
||||
}
|
||||
}
|
||||
else {
|
||||
_mesa_problem(ctx,
|
||||
"Color index problem in _mesa_GetTexImage");
|
||||
return;
|
||||
}
|
||||
_mesa_pack_index_span(ctx, width, type, dest,
|
||||
indexRow, &ctx->Pack,
|
||||
@@ -1954,7 +1979,7 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
|
||||
GLint col;
|
||||
for (col = 0; col < width; col++) {
|
||||
(*texImage->FetchTexelf)(texImage, col, row, img,
|
||||
(GLvoid *) &depthRow[col]);
|
||||
depthRow + col);
|
||||
}
|
||||
_mesa_pack_depth_span(ctx, width, dest, type,
|
||||
depthRow, &ctx->Pack);
|
||||
|
@@ -670,50 +670,6 @@ _mesa_texstore_rgba(GLcontext *ctx, GLuint dims,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Store a color index texture image
|
||||
*/
|
||||
GLboolean
|
||||
_mesa_texstore_color_index(STORE_PARAMS)
|
||||
{
|
||||
ASSERT(dstFormat == &_mesa_texformat_color_index);
|
||||
ASSERT(dstFormat->TexelBytes == 1 * sizeof(GLchan));
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
baseInternalFormat == GL_COLOR_INDEX &&
|
||||
srcFormat == GL_COLOR_INDEX &&
|
||||
srcType == CHAN_TYPE) {
|
||||
/* simple memcpy path */
|
||||
memcpy_texture(dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
|
||||
dstRowStride, dstImageStride,
|
||||
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
|
||||
srcAddr, srcPacking);
|
||||
}
|
||||
else {
|
||||
/* general path */
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
GLint img, row;
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = dstImage;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
const GLvoid *src = _mesa_image_address(srcPacking,
|
||||
srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
|
||||
_mesa_unpack_index_span(ctx, srcWidth, CHAN_TYPE, dstRow,
|
||||
srcType, src, srcPacking,
|
||||
ctx->_ImageTransferState);
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
dstImage += dstImageStride;
|
||||
}
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Store a floating point depth component texture image.
|
||||
*/
|
||||
@@ -805,8 +761,6 @@ _mesa_texstore_depth_component16(STORE_PARAMS)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Store an rgb565 texture image.
|
||||
*/
|
||||
@@ -892,6 +846,91 @@ _mesa_texstore_rgb565(STORE_PARAMS)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Store an bgr565 texture image.
|
||||
*/
|
||||
GLboolean
|
||||
_mesa_texstore_bgr565(STORE_PARAMS)
|
||||
{
|
||||
ASSERT(dstFormat == &_mesa_texformat_bgr565);
|
||||
ASSERT(dstFormat->TexelBytes == 2);
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
baseInternalFormat == GL_RGB &&
|
||||
srcFormat == GL_RGB &&
|
||||
srcType == GL_UNSIGNED_SHORT_5_6_5_REV) {
|
||||
/* simple memcpy path */
|
||||
memcpy_texture(dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
|
||||
dstRowStride, dstImageStride,
|
||||
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
|
||||
srcAddr, srcPacking);
|
||||
}
|
||||
else if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
baseInternalFormat == GL_RGB &&
|
||||
srcFormat == GL_BGR &&
|
||||
srcType == GL_UNSIGNED_BYTE &&
|
||||
dims == 2) {
|
||||
/* do optimized tex store */
|
||||
const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
|
||||
srcFormat, srcType);
|
||||
const GLubyte *src = (const GLubyte *)
|
||||
_mesa_image_address(srcPacking, srcAddr, srcWidth, srcHeight,
|
||||
srcFormat, srcType, 0, 0, 0);
|
||||
GLubyte *dst = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
GLint row, col;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
const GLubyte *srcUB = (const GLubyte *) src;
|
||||
GLushort *dstUS = (GLushort *) dst;
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstUS[col] = PACK_COLOR_565( srcUB[2], srcUB[1], srcUB[0] );
|
||||
srcUB += 3;
|
||||
}
|
||||
dst += dstRowStride;
|
||||
src += srcRowStride;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* general path */
|
||||
const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
|
||||
baseInternalFormat,
|
||||
dstFormat->BaseFormat,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
srcFormat, srcType, srcAddr,
|
||||
srcPacking);
|
||||
const GLchan *src = tempImage;
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
GLint img, row, col;
|
||||
if (!tempImage)
|
||||
return GL_FALSE;
|
||||
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = dstImage;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
GLushort *dstUS = (GLushort *) dstRow;
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstUS[col] = PACK_COLOR_565( CHAN_TO_UBYTE(src[BCOMP]),
|
||||
CHAN_TO_UBYTE(src[GCOMP]),
|
||||
CHAN_TO_UBYTE(src[RCOMP]) );
|
||||
src += 3;
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
dstImage += dstImageStride;
|
||||
}
|
||||
_mesa_free((void *) tempImage);
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_rgba8888(STORE_PARAMS)
|
||||
{
|
||||
@@ -951,6 +990,65 @@ _mesa_texstore_rgba8888(STORE_PARAMS)
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_abgr8888(STORE_PARAMS)
|
||||
{
|
||||
const GLuint ui = 1;
|
||||
const GLubyte littleEndian = *((const GLubyte *) &ui);
|
||||
|
||||
ASSERT(dstFormat == &_mesa_texformat_abgr8888);
|
||||
ASSERT(dstFormat->TexelBytes == 4);
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
baseInternalFormat == GL_RGBA &&
|
||||
srcFormat == GL_ABGR_EXT &&
|
||||
((srcType == GL_UNSIGNED_INT_8_8_8_8_REV && littleEndian) ||
|
||||
(srcType == GL_UNSIGNED_INT_8_8_8_8 && !littleEndian))) {
|
||||
/* simple memcpy path */
|
||||
memcpy_texture(dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
|
||||
dstRowStride, dstImageStride,
|
||||
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
|
||||
srcAddr, srcPacking);
|
||||
}
|
||||
else {
|
||||
/* general path */
|
||||
const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
|
||||
baseInternalFormat,
|
||||
dstFormat->BaseFormat,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
srcFormat, srcType, srcAddr,
|
||||
srcPacking);
|
||||
const GLchan *src = tempImage;
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
GLint img, row, col;
|
||||
if (!tempImage)
|
||||
return GL_FALSE;
|
||||
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = dstImage;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
GLuint *dstUI = (GLuint *) dstRow;
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[ACOMP]),
|
||||
CHAN_TO_UBYTE(src[BCOMP]),
|
||||
CHAN_TO_UBYTE(src[GCOMP]),
|
||||
CHAN_TO_UBYTE(src[RCOMP]) );
|
||||
src += 4;
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
dstImage += dstImageStride;
|
||||
}
|
||||
_mesa_free((void *) tempImage);
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_argb8888(STORE_PARAMS)
|
||||
{
|
||||
@@ -1011,6 +1109,65 @@ _mesa_texstore_argb8888(STORE_PARAMS)
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_bgra8888(STORE_PARAMS)
|
||||
{
|
||||
const GLuint ui = 1;
|
||||
const GLubyte littleEndian = *((const GLubyte *) &ui);
|
||||
|
||||
ASSERT(dstFormat == &_mesa_texformat_bgra8888);
|
||||
ASSERT(dstFormat->TexelBytes == 4);
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
baseInternalFormat == GL_RGBA &&
|
||||
srcFormat == GL_BGRA &&
|
||||
((srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
|
||||
(srcType == GL_UNSIGNED_INT_8_8_8_8_REV && !littleEndian) ||
|
||||
(srcType == GL_UNSIGNED_INT_8_8_8_8 && littleEndian))) {
|
||||
/* simple memcpy path */
|
||||
memcpy_texture(dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
|
||||
dstRowStride, dstImageStride,
|
||||
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
|
||||
srcAddr, srcPacking);
|
||||
}
|
||||
else {
|
||||
/* general path */
|
||||
const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
|
||||
baseInternalFormat,
|
||||
dstFormat->BaseFormat,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
srcFormat, srcType, srcAddr,
|
||||
srcPacking);
|
||||
const GLchan *src = tempImage;
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
GLint img, row, col;
|
||||
if (!tempImage)
|
||||
return GL_FALSE;
|
||||
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = dstImage;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
GLuint *dstUI = (GLuint *) dstRow;
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[BCOMP]),
|
||||
CHAN_TO_UBYTE(src[GCOMP]),
|
||||
CHAN_TO_UBYTE(src[RCOMP]),
|
||||
CHAN_TO_UBYTE(src[ACOMP]) );
|
||||
src += 4;
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
dstImage += dstImageStride;
|
||||
}
|
||||
_mesa_free((void *) tempImage);
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_rgb888(STORE_PARAMS)
|
||||
@@ -1037,7 +1194,7 @@ _mesa_texstore_rgb888(STORE_PARAMS)
|
||||
!srcPacking->SwapBytes &&
|
||||
srcFormat == GL_RGBA &&
|
||||
srcType == GL_UNSIGNED_BYTE) {
|
||||
/* extract BGR from RGBA */
|
||||
/* extract RGB from RGBA */
|
||||
int img, row, col;
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
@@ -1116,6 +1273,91 @@ _mesa_texstore_rgb888(STORE_PARAMS)
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_bgr888(STORE_PARAMS)
|
||||
{
|
||||
const GLuint ui = 1;
|
||||
const GLubyte littleEndian = *((const GLubyte *) &ui);
|
||||
|
||||
ASSERT(dstFormat == &_mesa_texformat_bgr888);
|
||||
ASSERT(dstFormat->TexelBytes == 3);
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
baseInternalFormat == GL_RGB &&
|
||||
srcFormat == GL_RGB &&
|
||||
srcType == GL_UNSIGNED_BYTE &&
|
||||
littleEndian) {
|
||||
/* simple memcpy path */
|
||||
memcpy_texture(dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
|
||||
dstRowStride, dstImageStride,
|
||||
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
|
||||
srcAddr, srcPacking);
|
||||
}
|
||||
else if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
srcFormat == GL_RGBA &&
|
||||
srcType == GL_UNSIGNED_BYTE) {
|
||||
/* extract BGR from RGBA */
|
||||
int img, row, col;
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
const GLint srcRowStride = _mesa_image_row_stride(srcPacking,
|
||||
srcWidth, srcFormat, srcType);
|
||||
GLubyte *srcRow = (GLubyte *) _mesa_image_address(srcPacking, srcAddr,
|
||||
srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
|
||||
GLubyte *dstRow = dstImage;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP];
|
||||
dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
|
||||
dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP];
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
srcRow += srcRowStride;
|
||||
}
|
||||
dstImage += dstImageStride;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* general path */
|
||||
const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
|
||||
baseInternalFormat,
|
||||
dstFormat->BaseFormat,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
srcFormat, srcType, srcAddr,
|
||||
srcPacking);
|
||||
const GLchan *src = (const GLubyte *) tempImage;
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
GLint img, row, col;
|
||||
if (!tempImage)
|
||||
return GL_FALSE;
|
||||
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = dstImage;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]);
|
||||
dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
|
||||
dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]);
|
||||
src += 3;
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
dstImage += dstImageStride;
|
||||
}
|
||||
_mesa_free((void *) tempImage);
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_argb4444(STORE_PARAMS)
|
||||
{
|
||||
@@ -1175,6 +1417,65 @@ _mesa_texstore_argb4444(STORE_PARAMS)
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_bgra4444(STORE_PARAMS)
|
||||
{
|
||||
const GLuint ui = 1;
|
||||
const GLubyte littleEndian = *((const GLubyte *) &ui);
|
||||
|
||||
ASSERT(dstFormat == &_mesa_texformat_bgra4444);
|
||||
ASSERT(dstFormat->TexelBytes == 2);
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
baseInternalFormat == GL_RGBA &&
|
||||
srcFormat == GL_BGRA &&
|
||||
((srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV && !littleEndian) ||
|
||||
(srcType == GL_UNSIGNED_SHORT_4_4_4_4 && littleEndian))) {
|
||||
/* simple memcpy path */
|
||||
memcpy_texture(dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
|
||||
dstRowStride, dstImageStride,
|
||||
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
|
||||
srcAddr, srcPacking);
|
||||
}
|
||||
else {
|
||||
/* general path */
|
||||
const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
|
||||
baseInternalFormat,
|
||||
dstFormat->BaseFormat,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
srcFormat, srcType, srcAddr,
|
||||
srcPacking);
|
||||
const GLchan *src = tempImage;
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
GLint img, row, col;
|
||||
if (!tempImage)
|
||||
return GL_FALSE;
|
||||
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = dstImage;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
GLushort *dstUS = (GLushort *) dstRow;
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstUS[col] = PACK_COLOR_4444( CHAN_TO_UBYTE(src[BCOMP]),
|
||||
CHAN_TO_UBYTE(src[GCOMP]),
|
||||
CHAN_TO_UBYTE(src[RCOMP]),
|
||||
CHAN_TO_UBYTE(src[ACOMP]) );
|
||||
src += 4;
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
dstImage += dstImageStride;
|
||||
}
|
||||
_mesa_free((void *) tempImage);
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_argb1555(STORE_PARAMS)
|
||||
{
|
||||
@@ -1233,6 +1534,64 @@ _mesa_texstore_argb1555(STORE_PARAMS)
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_bgra5551(STORE_PARAMS)
|
||||
{
|
||||
const GLuint ui = 1;
|
||||
const GLubyte littleEndian = *((const GLubyte *) &ui);
|
||||
|
||||
ASSERT(dstFormat == &_mesa_texformat_bgra5551);
|
||||
ASSERT(dstFormat->TexelBytes == 2);
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
baseInternalFormat == GL_RGBA &&
|
||||
srcFormat == GL_BGRA &&
|
||||
((srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV && !littleEndian) ||
|
||||
(srcType == GL_UNSIGNED_SHORT_5_5_5_1 && littleEndian))) {
|
||||
/* simple memcpy path */
|
||||
memcpy_texture(dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
|
||||
dstRowStride, dstImageStride,
|
||||
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
|
||||
srcAddr, srcPacking);
|
||||
}
|
||||
else {
|
||||
/* general path */
|
||||
const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
|
||||
baseInternalFormat,
|
||||
dstFormat->BaseFormat,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
srcFormat, srcType, srcAddr,
|
||||
srcPacking);
|
||||
const GLchan *src =tempImage;
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
GLint img, row, col;
|
||||
if (!tempImage)
|
||||
return GL_FALSE;
|
||||
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = dstImage;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
GLushort *dstUS = (GLushort *) dstRow;
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstUS[col] = PACK_COLOR_5551( CHAN_TO_UBYTE(src[RCOMP]),
|
||||
CHAN_TO_UBYTE(src[GCOMP]),
|
||||
CHAN_TO_UBYTE(src[BCOMP]),
|
||||
CHAN_TO_UBYTE(src[ACOMP]) );
|
||||
src += 4;
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
dstImage += dstImageStride;
|
||||
}
|
||||
_mesa_free((void *) tempImage);
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_al88(STORE_PARAMS)
|
||||
@@ -1291,6 +1650,63 @@ _mesa_texstore_al88(STORE_PARAMS)
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_la88(STORE_PARAMS)
|
||||
{
|
||||
const GLuint ui = 1;
|
||||
const GLubyte littleEndian = *((const GLubyte *) &ui);
|
||||
|
||||
ASSERT(dstFormat == &_mesa_texformat_la88);
|
||||
ASSERT(dstFormat->TexelBytes == 2);
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
baseInternalFormat == GL_LUMINANCE_ALPHA &&
|
||||
srcFormat == GL_LUMINANCE_ALPHA &&
|
||||
srcType == GL_UNSIGNED_BYTE &&
|
||||
!littleEndian) {
|
||||
/* simple memcpy path */
|
||||
memcpy_texture(dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
|
||||
dstRowStride, dstImageStride,
|
||||
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
|
||||
srcAddr, srcPacking);
|
||||
}
|
||||
else {
|
||||
/* general path */
|
||||
const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
|
||||
baseInternalFormat,
|
||||
dstFormat->BaseFormat,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
srcFormat, srcType, srcAddr,
|
||||
srcPacking);
|
||||
const GLchan *src = tempImage;
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
GLint img, row, col;
|
||||
if (!tempImage)
|
||||
return GL_FALSE;
|
||||
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = dstImage;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
GLushort *dstUS = (GLushort *) dstRow;
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstUS[col] = PACK_COLOR_88( CHAN_TO_UBYTE(src[RCOMP]),
|
||||
CHAN_TO_UBYTE(src[ACOMP]) );
|
||||
src += 2;
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
dstImage += dstImageStride;
|
||||
}
|
||||
_mesa_free((void *) tempImage);
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_rgb332(STORE_PARAMS)
|
||||
{
|
||||
@@ -1343,6 +1759,58 @@ _mesa_texstore_rgb332(STORE_PARAMS)
|
||||
}
|
||||
|
||||
|
||||
GLboolean
|
||||
_mesa_texstore_bgr233(STORE_PARAMS)
|
||||
{
|
||||
ASSERT(dstFormat == &_mesa_texformat_bgr233);
|
||||
ASSERT(dstFormat->TexelBytes == 1);
|
||||
|
||||
if (!ctx->_ImageTransferState &&
|
||||
!srcPacking->SwapBytes &&
|
||||
baseInternalFormat == GL_RGB &&
|
||||
srcFormat == GL_BGR && srcType == GL_UNSIGNED_BYTE_3_3_2) {
|
||||
/* simple memcpy path */
|
||||
memcpy_texture(dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
|
||||
dstRowStride, dstImageStride,
|
||||
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
|
||||
srcAddr, srcPacking);
|
||||
}
|
||||
else {
|
||||
/* general path */
|
||||
const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
|
||||
baseInternalFormat,
|
||||
dstFormat->BaseFormat,
|
||||
srcWidth, srcHeight, srcDepth,
|
||||
srcFormat, srcType, srcAddr,
|
||||
srcPacking);
|
||||
const GLchan *src = tempImage;
|
||||
GLubyte *dstImage = (GLubyte *) dstAddr
|
||||
+ dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * dstFormat->TexelBytes;
|
||||
GLint img, row, col;
|
||||
if (!tempImage)
|
||||
return GL_FALSE;
|
||||
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLubyte *dstRow = dstImage;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
for (col = 0; col < srcWidth; col++) {
|
||||
dstRow[col] = PACK_COLOR_233( CHAN_TO_UBYTE(src[BCOMP]),
|
||||
CHAN_TO_UBYTE(src[GCOMP]),
|
||||
CHAN_TO_UBYTE(src[RCOMP]) );
|
||||
src += 3;
|
||||
}
|
||||
dstRow += dstRowStride;
|
||||
}
|
||||
dstImage += dstImageStride;
|
||||
}
|
||||
_mesa_free((void *) tempImage);
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8.
|
||||
@@ -2300,7 +2768,6 @@ do_row(const struct gl_texture_format *format, GLint srcWidth,
|
||||
case MESA_FORMAT_ALPHA:
|
||||
case MESA_FORMAT_LUMINANCE:
|
||||
case MESA_FORMAT_INTENSITY:
|
||||
case MESA_FORMAT_COLOR_INDEX:
|
||||
{
|
||||
GLuint i, j, k;
|
||||
const GLchan *rowA = (const GLchan *) srcRowA;
|
||||
@@ -2353,7 +2820,9 @@ do_row(const struct gl_texture_format *format, GLint srcWidth,
|
||||
return;
|
||||
/* Begin hardware formats */
|
||||
case MESA_FORMAT_RGBA8888:
|
||||
case MESA_FORMAT_ABGR8888:
|
||||
case MESA_FORMAT_ARGB8888:
|
||||
case MESA_FORMAT_BGRA8888:
|
||||
{
|
||||
GLuint i, j, k;
|
||||
const GLubyte (*rowA)[4] = (const GLubyte (*)[4]) srcRowA;
|
||||
@@ -2373,6 +2842,7 @@ do_row(const struct gl_texture_format *format, GLint srcWidth,
|
||||
}
|
||||
return;
|
||||
case MESA_FORMAT_RGB888:
|
||||
case MESA_FORMAT_BGR888:
|
||||
{
|
||||
GLuint i, j, k;
|
||||
const GLubyte (*rowA)[3] = (const GLubyte (*)[3]) srcRowA;
|
||||
@@ -2390,6 +2860,7 @@ do_row(const struct gl_texture_format *format, GLint srcWidth,
|
||||
}
|
||||
return;
|
||||
case MESA_FORMAT_RGB565:
|
||||
case MESA_FORMAT_BGR565:
|
||||
{
|
||||
GLuint i, j, k;
|
||||
const GLushort *rowA = (const GLushort *) srcRowA;
|
||||
@@ -2417,6 +2888,7 @@ do_row(const struct gl_texture_format *format, GLint srcWidth,
|
||||
}
|
||||
return;
|
||||
case MESA_FORMAT_ARGB4444:
|
||||
case MESA_FORMAT_BGRA4444:
|
||||
{
|
||||
GLuint i, j, k;
|
||||
const GLushort *rowA = (const GLushort *) srcRowA;
|
||||
|
@@ -57,14 +57,22 @@ extern GLboolean _mesa_texstore_rgba(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_color_index(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_depth_component16(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_depth_component_float32(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_rgb565(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_rgba8888(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_abgr8888(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_argb8888(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_bgra8888(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_rgb888(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_bgr888(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_rgb565(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_bgr565(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_argb4444(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_bgra4444(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_argb1555(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_bgra5551(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_al88(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_la88(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_rgb332(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_bgr233(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_a8(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_ci8(STORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_ycbcr(STORE_PARAMS);
|
||||
|
@@ -346,57 +346,6 @@ repeat_remainder(GLint a, GLint b)
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Get texture palette entry.
|
||||
*/
|
||||
static void
|
||||
palette_sample(const GLcontext *ctx,
|
||||
const struct gl_texture_object *tObj,
|
||||
GLint index, GLchan rgba[4] )
|
||||
{
|
||||
const GLchan *palette;
|
||||
GLenum format;
|
||||
|
||||
if (ctx->Texture.SharedPalette) {
|
||||
ASSERT(ctx->Texture.Palette.Type != GL_FLOAT);
|
||||
palette = (const GLchan *) ctx->Texture.Palette.Table;
|
||||
format = ctx->Texture.Palette.Format;
|
||||
}
|
||||
else {
|
||||
ASSERT(tObj->Palette.Type != GL_FLOAT);
|
||||
palette = (const GLchan *) tObj->Palette.Table;
|
||||
format = tObj->Palette.Format;
|
||||
}
|
||||
|
||||
switch (format) {
|
||||
case GL_ALPHA:
|
||||
rgba[ACOMP] = palette[index];
|
||||
return;
|
||||
case GL_LUMINANCE:
|
||||
case GL_INTENSITY:
|
||||
rgba[RCOMP] = palette[index];
|
||||
return;
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
rgba[RCOMP] = palette[(index << 1) + 0];
|
||||
rgba[ACOMP] = palette[(index << 1) + 1];
|
||||
return;
|
||||
case GL_RGB:
|
||||
rgba[RCOMP] = palette[index * 3 + 0];
|
||||
rgba[GCOMP] = palette[index * 3 + 1];
|
||||
rgba[BCOMP] = palette[index * 3 + 2];
|
||||
return;
|
||||
case GL_RGBA:
|
||||
rgba[RCOMP] = palette[(index << 2) + 0];
|
||||
rgba[GCOMP] = palette[(index << 2) + 1];
|
||||
rgba[BCOMP] = palette[(index << 2) + 2];
|
||||
rgba[ACOMP] = palette[(index << 2) + 3];
|
||||
return;
|
||||
default:
|
||||
_mesa_problem(ctx, "Bad palette format in palette_sample");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* The lambda[] array values are always monotonic. Either the whole span
|
||||
* will be minified, magnified, or split between the two. This function
|
||||
@@ -519,9 +468,6 @@ sample_1d_nearest(GLcontext *ctx,
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i, 0, 0, rgba);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, rgba[0], rgba);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -571,18 +517,12 @@ sample_1d_linear(GLcontext *ctx,
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, 0, 0, t0);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t0[0], t0);
|
||||
}
|
||||
}
|
||||
if (useBorderColor & I1BIT) {
|
||||
COPY_CHAN4(t1, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, 0, 0, t1);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t1[0], t1);
|
||||
}
|
||||
}
|
||||
|
||||
#if CHAN_TYPE == GL_FLOAT
|
||||
@@ -848,9 +788,6 @@ sample_2d_nearest(GLcontext *ctx,
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i, j, 0, rgba);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, rgba[0], rgba);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -916,36 +853,24 @@ sample_2d_linear(GLcontext *ctx,
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j0, 0, t00);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t00[0], t00);
|
||||
}
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J0BIT)) {
|
||||
COPY_CHAN4(t10, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j0, 0, t10);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t10[0], t10);
|
||||
}
|
||||
}
|
||||
if (useBorderColor & (I0BIT | J1BIT)) {
|
||||
COPY_CHAN4(t01, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j1, 0, t01);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t01[0], t01);
|
||||
}
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J1BIT)) {
|
||||
COPY_CHAN4(t11, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j1, 0, t11);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t11[0], t11);
|
||||
}
|
||||
}
|
||||
#if CHAN_TYPE == GL_FLOAT
|
||||
rgba[0] = w00 * t00[0] + w10 * t10[0] + w01 * t01[0] + w11 * t11[0];
|
||||
@@ -1454,9 +1379,6 @@ sample_3d_nearest(GLcontext *ctx,
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i, j, k, rgba);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, rgba[0], rgba);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1537,36 +1459,24 @@ sample_3d_linear(GLcontext *ctx,
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j0, k0, t000);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t000[0], t000);
|
||||
}
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J0BIT | K0BIT)) {
|
||||
COPY_CHAN4(t100, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j0, k0, t100);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t100[0], t100);
|
||||
}
|
||||
}
|
||||
if (useBorderColor & (I0BIT | J1BIT | K0BIT)) {
|
||||
COPY_CHAN4(t010, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j1, k0, t010);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t010[0], t010);
|
||||
}
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J1BIT | K0BIT)) {
|
||||
COPY_CHAN4(t110, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j1, k0, t110);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t110[0], t110);
|
||||
}
|
||||
}
|
||||
|
||||
if (useBorderColor & (I0BIT | J0BIT | K1BIT)) {
|
||||
@@ -1574,36 +1484,24 @@ sample_3d_linear(GLcontext *ctx,
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j0, k1, t001);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t001[0], t001);
|
||||
}
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J0BIT | K1BIT)) {
|
||||
COPY_CHAN4(t101, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j0, k1, t101);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t101[0], t101);
|
||||
}
|
||||
}
|
||||
if (useBorderColor & (I0BIT | J1BIT | K1BIT)) {
|
||||
COPY_CHAN4(t011, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i0, j1, k1, t011);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t011[0], t011);
|
||||
}
|
||||
}
|
||||
if (useBorderColor & (I1BIT | J1BIT | K1BIT)) {
|
||||
COPY_CHAN4(t111, tObj->_BorderChan);
|
||||
}
|
||||
else {
|
||||
img->FetchTexelc(img, i1, j1, k1, t111);
|
||||
if (img->Format == GL_COLOR_INDEX) {
|
||||
palette_sample(ctx, tObj, t111[0], t111);
|
||||
}
|
||||
}
|
||||
|
||||
#if CHAN_TYPE == GL_FLOAT
|
||||
@@ -2171,9 +2069,6 @@ sample_nearest_rect(GLcontext *ctx, GLuint texUnit,
|
||||
GLint row, col;
|
||||
/* NOTE: we DO NOT use [0, 1] texture coordinates! */
|
||||
if (tObj->WrapS == GL_CLAMP) {
|
||||
/* Note: we use width-1, not what the spec says, but it actually
|
||||
* does work correctly.
|
||||
*/
|
||||
col = IFLOOR( CLAMP(texcoords[i][0], 0.0F, width - 1) );
|
||||
}
|
||||
else if (tObj->WrapS == GL_CLAMP_TO_EDGE) {
|
||||
|
Reference in New Issue
Block a user