mirror of
https://github.com/brl/mutter.git
synced 2024-11-22 08:00:42 -05:00
Add support for RG textures
This adds COGL_PIXEL_FORMAT_RG_88 and COGL_TEXTURE_COMPONENTS_RG in order to support two-component textures. The RG components for a texture is only supported if COGL_FEATURE_ID_TEXTURE_RG is advertised. This is only available on GL 3, GL 2 with the GL_ARB_texture_rg extension or GLES with the GL_EXT_texture_rg extension. The RG pixel format is always supported for images because Cogl can easily do the conversion if an application uses this format to upload to a texture with a different format. If an application tries to create an RG texture when the feature isn't supported then it will raise an error when the texture is allocated. https://bugzilla.gnome.org/show_bug.cgi?id=712830 Reviewed-by: Robert Bragg <robert@linux.intel.com> (cherry picked from commit 568677ab3bcb62ababad1623be0d6b9b117d0a26) Conflicts: cogl/cogl-bitmap-packing.h cogl/cogl-types.h cogl/driver/gl/gl/cogl-driver-gl.c tests/conform/test-read-texture-formats.c tests/conform/test-write-texture-formats.c
This commit is contained in:
parent
06c75ea2e7
commit
eb7ef457cb
@ -319,6 +319,7 @@ _cogl_bitmap_needs_short_temp_buffer (CoglPixelFormat format)
|
|||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
|
|
||||||
case COGL_PIXEL_FORMAT_A_8:
|
case COGL_PIXEL_FORMAT_A_8:
|
||||||
|
case COGL_PIXEL_FORMAT_RG_88:
|
||||||
case COGL_PIXEL_FORMAT_RGB_565:
|
case COGL_PIXEL_FORMAT_RGB_565:
|
||||||
case COGL_PIXEL_FORMAT_RGBA_4444:
|
case COGL_PIXEL_FORMAT_RGBA_4444:
|
||||||
case COGL_PIXEL_FORMAT_RGBA_5551:
|
case COGL_PIXEL_FORMAT_RGBA_5551:
|
||||||
@ -507,6 +508,35 @@ _cogl_bitmap_convert (CoglBitmap *src_bmp,
|
|||||||
return dst_bmp;
|
return dst_bmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CoglBool
|
||||||
|
driver_can_convert (CoglContext *ctx,
|
||||||
|
CoglPixelFormat src_format,
|
||||||
|
CoglPixelFormat internal_format)
|
||||||
|
{
|
||||||
|
if (!_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_FORMAT_CONVERSION))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (src_format == internal_format)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* If the driver doesn't natively support alpha textures then it
|
||||||
|
* won't work correctly to convert to/from component-alpha
|
||||||
|
* textures */
|
||||||
|
if (!_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_ALPHA_TEXTURES) &&
|
||||||
|
(src_format == COGL_PIXEL_FORMAT_A_8 ||
|
||||||
|
internal_format == COGL_PIXEL_FORMAT_A_8))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* Same for red-green textures. If red-green textures aren't
|
||||||
|
* supported then the internal format should never be RG_88 but we
|
||||||
|
* should still be able to convert from an RG source image */
|
||||||
|
if (!cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_RG) &&
|
||||||
|
src_format == COGL_PIXEL_FORMAT_RG_88)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
CoglBitmap *
|
CoglBitmap *
|
||||||
_cogl_bitmap_convert_for_upload (CoglBitmap *src_bmp,
|
_cogl_bitmap_convert_for_upload (CoglBitmap *src_bmp,
|
||||||
CoglPixelFormat internal_format,
|
CoglPixelFormat internal_format,
|
||||||
@ -527,15 +557,7 @@ _cogl_bitmap_convert_for_upload (CoglBitmap *src_bmp,
|
|||||||
limited number of formats so we must convert using the Cogl
|
limited number of formats so we must convert using the Cogl
|
||||||
bitmap code instead */
|
bitmap code instead */
|
||||||
|
|
||||||
/* If the driver doesn't natively support alpha textures then it
|
if (driver_can_convert (ctx, src_format, internal_format))
|
||||||
* won't work correctly to convert to/from component-alpha
|
|
||||||
* textures */
|
|
||||||
|
|
||||||
if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_FORMAT_CONVERSION) &&
|
|
||||||
(_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_ALPHA_TEXTURES) ||
|
|
||||||
(src_format != COGL_PIXEL_FORMAT_A_8 &&
|
|
||||||
internal_format != COGL_PIXEL_FORMAT_A_8) ||
|
|
||||||
src_format == internal_format))
|
|
||||||
{
|
{
|
||||||
/* If the source format does not have the same premult flag as the
|
/* If the source format does not have the same premult flag as the
|
||||||
internal_format then we need to copy and convert it */
|
internal_format then we need to copy and convert it */
|
||||||
|
@ -78,6 +78,22 @@ G_PASTE (_cogl_unpack_g_8_, component_size) (const uint8_t *src,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline static void
|
||||||
|
G_PASTE (_cogl_unpack_rg_88_, component_size) (const uint8_t *src,
|
||||||
|
component_type *dst,
|
||||||
|
int width)
|
||||||
|
{
|
||||||
|
while (width-- > 0)
|
||||||
|
{
|
||||||
|
dst[0] = UNPACK_BYTE (src[0]);
|
||||||
|
dst[1] = UNPACK_BYTE (src[1]);
|
||||||
|
dst[2] = 0;
|
||||||
|
dst[3] = UNPACK_BYTE (255);
|
||||||
|
dst += 4;
|
||||||
|
src += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline static void
|
inline static void
|
||||||
G_PASTE (_cogl_unpack_rgb_888_, component_size) (const uint8_t *src,
|
G_PASTE (_cogl_unpack_rgb_888_, component_size) (const uint8_t *src,
|
||||||
component_type *dst,
|
component_type *dst,
|
||||||
@ -321,6 +337,9 @@ G_PASTE (_cogl_unpack_, component_size) (CoglPixelFormat format,
|
|||||||
case COGL_PIXEL_FORMAT_G_8:
|
case COGL_PIXEL_FORMAT_G_8:
|
||||||
G_PASTE (_cogl_unpack_g_8_, component_size) (src, dst, width);
|
G_PASTE (_cogl_unpack_g_8_, component_size) (src, dst, width);
|
||||||
break;
|
break;
|
||||||
|
case COGL_PIXEL_FORMAT_RG_88:
|
||||||
|
G_PASTE (_cogl_unpack_rg_88_, component_size) (src, dst, width);
|
||||||
|
break;
|
||||||
case COGL_PIXEL_FORMAT_RGB_888:
|
case COGL_PIXEL_FORMAT_RGB_888:
|
||||||
G_PASTE (_cogl_unpack_rgb_888_, component_size) (src, dst, width);
|
G_PASTE (_cogl_unpack_rgb_888_, component_size) (src, dst, width);
|
||||||
break;
|
break;
|
||||||
@ -424,6 +443,20 @@ G_PASTE (_cogl_pack_g_8_, component_size) (const component_type *src,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline static void
|
||||||
|
G_PASTE (_cogl_pack_rg_88_, component_size) (const component_type *src,
|
||||||
|
uint8_t *dst,
|
||||||
|
int width)
|
||||||
|
{
|
||||||
|
while (width-- > 0)
|
||||||
|
{
|
||||||
|
dst[0] = PACK_BYTE (src[0]);
|
||||||
|
dst[1] = PACK_BYTE (src[1]);
|
||||||
|
src += 4;
|
||||||
|
dst += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline static void
|
inline static void
|
||||||
G_PASTE (_cogl_pack_rgb_888_, component_size) (const component_type *src,
|
G_PASTE (_cogl_pack_rgb_888_, component_size) (const component_type *src,
|
||||||
uint8_t *dst,
|
uint8_t *dst,
|
||||||
@ -665,6 +698,9 @@ G_PASTE (_cogl_pack_, component_size) (CoglPixelFormat format,
|
|||||||
case COGL_PIXEL_FORMAT_G_8:
|
case COGL_PIXEL_FORMAT_G_8:
|
||||||
G_PASTE (_cogl_pack_g_8_, component_size) (src, dst, width);
|
G_PASTE (_cogl_pack_g_8_, component_size) (src, dst, width);
|
||||||
break;
|
break;
|
||||||
|
case COGL_PIXEL_FORMAT_RG_88:
|
||||||
|
G_PASTE (_cogl_pack_rg_88_, component_size) (src, dst, width);
|
||||||
|
break;
|
||||||
case COGL_PIXEL_FORMAT_RGB_888:
|
case COGL_PIXEL_FORMAT_RGB_888:
|
||||||
G_PASTE (_cogl_pack_rgb_888_, component_size) (src, dst, width);
|
G_PASTE (_cogl_pack_rgb_888_, component_size) (src, dst, width);
|
||||||
break;
|
break;
|
||||||
|
@ -200,6 +200,9 @@ cogl_is_context (void *object);
|
|||||||
* and %COGL_FEATURE_ID_TEXTURE_NPOT_REPEAT features combined.
|
* and %COGL_FEATURE_ID_TEXTURE_NPOT_REPEAT features combined.
|
||||||
* @COGL_FEATURE_ID_TEXTURE_RECTANGLE: Support for rectangular
|
* @COGL_FEATURE_ID_TEXTURE_RECTANGLE: Support for rectangular
|
||||||
* textures with non-normalized texture coordinates.
|
* textures with non-normalized texture coordinates.
|
||||||
|
* @COGL_FEATURE_ID_TEXTURE_RG: Support for
|
||||||
|
* %COGL_TEXTURE_COMPONENTS_RG as the internal components of a
|
||||||
|
* texture.
|
||||||
* @COGL_FEATURE_ID_TEXTURE_3D: 3D texture support
|
* @COGL_FEATURE_ID_TEXTURE_3D: 3D texture support
|
||||||
* @COGL_FEATURE_ID_OFFSCREEN: Offscreen rendering support
|
* @COGL_FEATURE_ID_OFFSCREEN: Offscreen rendering support
|
||||||
* @COGL_FEATURE_ID_OFFSCREEN_MULTISAMPLE: Multisample support for
|
* @COGL_FEATURE_ID_OFFSCREEN_MULTISAMPLE: Multisample support for
|
||||||
@ -263,6 +266,7 @@ typedef enum _CoglFeatureID
|
|||||||
COGL_FEATURE_ID_PRESENTATION_TIME,
|
COGL_FEATURE_ID_PRESENTATION_TIME,
|
||||||
COGL_FEATURE_ID_FENCE,
|
COGL_FEATURE_ID_FENCE,
|
||||||
COGL_FEATURE_ID_PER_VERTEX_POINT_SIZE,
|
COGL_FEATURE_ID_PER_VERTEX_POINT_SIZE,
|
||||||
|
COGL_FEATURE_ID_TEXTURE_RG,
|
||||||
|
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
_COGL_N_FEATURE_IDS /*< skip >*/
|
_COGL_N_FEATURE_IDS /*< skip >*/
|
||||||
|
@ -1377,6 +1377,14 @@ cogl_texture_allocate (CoglTexture *texture,
|
|||||||
if (texture->allocated)
|
if (texture->allocated)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
if (texture->components == COGL_TEXTURE_COMPONENTS_RG &&
|
||||||
|
!cogl_has_feature (texture->context, COGL_FEATURE_ID_TEXTURE_RG))
|
||||||
|
_cogl_set_error (error,
|
||||||
|
COGL_TEXTURE_ERROR,
|
||||||
|
COGL_TEXTURE_ERROR_FORMAT,
|
||||||
|
"A red-green texture was requested but the driver "
|
||||||
|
"does not support them");
|
||||||
|
|
||||||
texture->allocated = texture->vtable->allocate (texture, error);
|
texture->allocated = texture->vtable->allocate (texture, error);
|
||||||
|
|
||||||
return texture->allocated;
|
return texture->allocated;
|
||||||
@ -1396,6 +1404,11 @@ _cogl_texture_set_internal_format (CoglTexture *texture,
|
|||||||
texture->components = COGL_TEXTURE_COMPONENTS_A;
|
texture->components = COGL_TEXTURE_COMPONENTS_A;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (internal_format == COGL_PIXEL_FORMAT_RG_88)
|
||||||
|
{
|
||||||
|
texture->components = COGL_TEXTURE_COMPONENTS_RG;
|
||||||
|
return;
|
||||||
|
}
|
||||||
else if (internal_format & COGL_DEPTH_BIT)
|
else if (internal_format & COGL_DEPTH_BIT)
|
||||||
{
|
{
|
||||||
texture->components = COGL_TEXTURE_COMPONENTS_DEPTH;
|
texture->components = COGL_TEXTURE_COMPONENTS_DEPTH;
|
||||||
@ -1437,6 +1450,8 @@ _cogl_texture_determine_internal_format (CoglTexture *texture,
|
|||||||
}
|
}
|
||||||
case COGL_TEXTURE_COMPONENTS_A:
|
case COGL_TEXTURE_COMPONENTS_A:
|
||||||
return COGL_PIXEL_FORMAT_A_8;
|
return COGL_PIXEL_FORMAT_A_8;
|
||||||
|
case COGL_TEXTURE_COMPONENTS_RG:
|
||||||
|
return COGL_PIXEL_FORMAT_RG_88;
|
||||||
case COGL_TEXTURE_COMPONENTS_RGB:
|
case COGL_TEXTURE_COMPONENTS_RGB:
|
||||||
if (src_format != COGL_PIXEL_FORMAT_ANY &&
|
if (src_format != COGL_PIXEL_FORMAT_ANY &&
|
||||||
!(src_format & COGL_A_BIT) && !(src_format & COGL_DEPTH_BIT))
|
!(src_format & COGL_A_BIT) && !(src_format & COGL_DEPTH_BIT))
|
||||||
|
@ -127,6 +127,9 @@ cogl_is_texture (void *object);
|
|||||||
/**
|
/**
|
||||||
* CoglTextureComponents:
|
* CoglTextureComponents:
|
||||||
* @COGL_TEXTURE_COMPONENTS_A: Only the alpha component
|
* @COGL_TEXTURE_COMPONENTS_A: Only the alpha component
|
||||||
|
* @COGL_TEXTURE_COMPONENTS_RG: Red and green components. Note that
|
||||||
|
* this can only be used if the %COGL_FEATURE_ID_TEXTURE_RG feature
|
||||||
|
* is advertised.
|
||||||
* @COGL_TEXTURE_COMPONENTS_RGB: Red, green and blue components
|
* @COGL_TEXTURE_COMPONENTS_RGB: Red, green and blue components
|
||||||
* @COGL_TEXTURE_COMPONENTS_RGBA: Red, green, blue and alpha components
|
* @COGL_TEXTURE_COMPONENTS_RGBA: Red, green, blue and alpha components
|
||||||
* @COGL_TEXTURE_COMPONENTS_DEPTH: Only a depth component
|
* @COGL_TEXTURE_COMPONENTS_DEPTH: Only a depth component
|
||||||
@ -138,6 +141,7 @@ cogl_is_texture (void *object);
|
|||||||
typedef enum _CoglTextureComponents
|
typedef enum _CoglTextureComponents
|
||||||
{
|
{
|
||||||
COGL_TEXTURE_COMPONENTS_A = 1,
|
COGL_TEXTURE_COMPONENTS_A = 1,
|
||||||
|
COGL_TEXTURE_COMPONENTS_RG,
|
||||||
COGL_TEXTURE_COMPONENTS_RGB,
|
COGL_TEXTURE_COMPONENTS_RGB,
|
||||||
COGL_TEXTURE_COMPONENTS_RGBA,
|
COGL_TEXTURE_COMPONENTS_RGBA,
|
||||||
COGL_TEXTURE_COMPONENTS_DEPTH
|
COGL_TEXTURE_COMPONENTS_DEPTH
|
||||||
@ -158,6 +162,15 @@ typedef enum _CoglTextureComponents
|
|||||||
* a %CoglBitmap or a data pointer default to the same components as
|
* a %CoglBitmap or a data pointer default to the same components as
|
||||||
* the pixel format of the data.
|
* the pixel format of the data.
|
||||||
*
|
*
|
||||||
|
* Note that the %COGL_TEXTURE_COMPONENTS_RG format is not available
|
||||||
|
* on all drivers. The availability can be determined by checking for
|
||||||
|
* the %COGL_FEATURE_ID_TEXTURE_RG feature. If this format is used on
|
||||||
|
* a driver where it is not available then %COGL_TEXTURE_ERROR_FORMAT
|
||||||
|
* will be raised when the texture is allocated. Even if the feature
|
||||||
|
* is not available then %COGL_PIXEL_FORMAT_RG_88 can still be used as
|
||||||
|
* an image format as long as %COGL_TEXTURE_COMPONENTS_RG isn't used
|
||||||
|
* as the texture's components.
|
||||||
|
*
|
||||||
* Since: 1.18
|
* Since: 1.18
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
|
@ -298,6 +298,9 @@ typedef struct _CoglTextureVertex CoglTextureVertex;
|
|||||||
* CoglPixelFormat:
|
* CoglPixelFormat:
|
||||||
* @COGL_PIXEL_FORMAT_ANY: Any format
|
* @COGL_PIXEL_FORMAT_ANY: Any format
|
||||||
* @COGL_PIXEL_FORMAT_A_8: 8 bits alpha mask
|
* @COGL_PIXEL_FORMAT_A_8: 8 bits alpha mask
|
||||||
|
* @COGL_PIXEL_FORMAT_RG_88: RG, 16 bits. Note that red-green textures
|
||||||
|
* are only available if %COGL_FEATURE_ID_TEXTURE_RG is advertised.
|
||||||
|
* See cogl_texture_set_components() for details.
|
||||||
* @COGL_PIXEL_FORMAT_RGB_565: RGB, 16 bits
|
* @COGL_PIXEL_FORMAT_RGB_565: RGB, 16 bits
|
||||||
* @COGL_PIXEL_FORMAT_RGBA_4444: RGBA, 16 bits
|
* @COGL_PIXEL_FORMAT_RGBA_4444: RGBA, 16 bits
|
||||||
* @COGL_PIXEL_FORMAT_RGBA_5551: RGBA, 16 bits
|
* @COGL_PIXEL_FORMAT_RGBA_5551: RGBA, 16 bits
|
||||||
@ -355,6 +358,8 @@ typedef enum { /*< prefix=COGL_PIXEL_FORMAT >*/
|
|||||||
COGL_PIXEL_FORMAT_YUV = 7,
|
COGL_PIXEL_FORMAT_YUV = 7,
|
||||||
COGL_PIXEL_FORMAT_G_8 = 8,
|
COGL_PIXEL_FORMAT_G_8 = 8,
|
||||||
|
|
||||||
|
COGL_PIXEL_FORMAT_RG_88 = 9,
|
||||||
|
|
||||||
COGL_PIXEL_FORMAT_RGB_888 = 2,
|
COGL_PIXEL_FORMAT_RGB_888 = 2,
|
||||||
COGL_PIXEL_FORMAT_BGR_888 = (2 | COGL_BGR_BIT),
|
COGL_PIXEL_FORMAT_BGR_888 = (2 | COGL_BGR_BIT),
|
||||||
|
|
||||||
|
@ -68,6 +68,10 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
|
|||||||
*out_format = COGL_PIXEL_FORMAT_G_8;
|
*out_format = COGL_PIXEL_FORMAT_G_8;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
case GL_RG:
|
||||||
|
*out_format = COGL_PIXEL_FORMAT_RG_88;
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
case GL_RGB: case GL_RGB4: case GL_RGB5: case GL_RGB8:
|
case GL_RGB: case GL_RGB4: case GL_RGB5: case GL_RGB8:
|
||||||
case GL_RGB10: case GL_RGB12: case GL_RGB16: case GL_R3_G3_B2:
|
case GL_RGB10: case GL_RGB12: case GL_RGB16: case GL_R3_G3_B2:
|
||||||
|
|
||||||
@ -124,6 +128,26 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
|
|||||||
gltype = GL_UNSIGNED_BYTE;
|
gltype = GL_UNSIGNED_BYTE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case COGL_PIXEL_FORMAT_RG_88:
|
||||||
|
if (cogl_has_feature (context, COGL_FEATURE_ID_TEXTURE_RG))
|
||||||
|
{
|
||||||
|
glintformat = GL_RG;
|
||||||
|
glformat = GL_RG;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* If red-green textures aren't supported then we'll use RGB
|
||||||
|
* as an internal format. Note this should only end up
|
||||||
|
* mattering for downloading the data because Cogl will
|
||||||
|
* refuse to allocate a texture with RG components if RG
|
||||||
|
* textures aren't supported */
|
||||||
|
glintformat = GL_RGB;
|
||||||
|
glformat = GL_RGB;
|
||||||
|
required_format = COGL_PIXEL_FORMAT_RGB_888;
|
||||||
|
}
|
||||||
|
gltype = GL_UNSIGNED_BYTE;
|
||||||
|
break;
|
||||||
|
|
||||||
case COGL_PIXEL_FORMAT_RGB_888:
|
case COGL_PIXEL_FORMAT_RGB_888:
|
||||||
glintformat = GL_RGB;
|
glintformat = GL_RGB;
|
||||||
glformat = GL_RGB;
|
glformat = GL_RGB;
|
||||||
@ -637,6 +661,12 @@ _cogl_driver_update_features (CoglContext *ctx,
|
|||||||
if (ctx->glFenceSync)
|
if (ctx->glFenceSync)
|
||||||
COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_FENCE, TRUE);
|
COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_FENCE, TRUE);
|
||||||
|
|
||||||
|
if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 3, 0) ||
|
||||||
|
_cogl_check_extension ("GL_ARB_texture_rg", gl_extensions))
|
||||||
|
COGL_FLAGS_SET (ctx->features,
|
||||||
|
COGL_FEATURE_ID_TEXTURE_RG,
|
||||||
|
TRUE);
|
||||||
|
|
||||||
/* Cache features */
|
/* Cache features */
|
||||||
for (i = 0; i < G_N_ELEMENTS (private_features); i++)
|
for (i = 0; i < G_N_ELEMENTS (private_features); i++)
|
||||||
ctx->private_features[i] |= private_features[i];
|
ctx->private_features[i] |= private_features[i];
|
||||||
|
@ -44,6 +44,12 @@
|
|||||||
#ifndef GL_DEPTH_STENCIL
|
#ifndef GL_DEPTH_STENCIL
|
||||||
#define GL_DEPTH_STENCIL 0x84F9
|
#define GL_DEPTH_STENCIL 0x84F9
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef GL_RG
|
||||||
|
#define GL_RG 0x8227
|
||||||
|
#endif
|
||||||
|
#ifndef GL_RG8
|
||||||
|
#define GL_RG8 0x822B
|
||||||
|
#endif
|
||||||
|
|
||||||
static CoglBool
|
static CoglBool
|
||||||
_cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
|
_cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
|
||||||
@ -81,6 +87,26 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
|
|||||||
gltype = GL_UNSIGNED_BYTE;
|
gltype = GL_UNSIGNED_BYTE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case COGL_PIXEL_FORMAT_RG_88:
|
||||||
|
if (cogl_has_feature (context, COGL_FEATURE_ID_TEXTURE_RG))
|
||||||
|
{
|
||||||
|
glintformat = GL_RG8;
|
||||||
|
glformat = GL_RG;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* If red-green textures aren't supported then we'll use RGB
|
||||||
|
* as an internal format. Note this should only end up
|
||||||
|
* mattering for downloading the data because Cogl will
|
||||||
|
* refuse to allocate a texture with RG components if RG
|
||||||
|
* textures aren't supported */
|
||||||
|
glintformat = GL_RGB;
|
||||||
|
glformat = GL_RGB;
|
||||||
|
required_format = COGL_PIXEL_FORMAT_RGB_888;
|
||||||
|
}
|
||||||
|
gltype = GL_UNSIGNED_BYTE;
|
||||||
|
break;
|
||||||
|
|
||||||
case COGL_PIXEL_FORMAT_BGRA_8888:
|
case COGL_PIXEL_FORMAT_BGRA_8888:
|
||||||
case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
|
case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
|
||||||
/* There is an extension to support this format */
|
/* There is an extension to support this format */
|
||||||
@ -367,6 +393,11 @@ _cogl_driver_update_features (CoglContext *context,
|
|||||||
_cogl_check_extension ("GL_OES_egl_sync", gl_extensions))
|
_cogl_check_extension ("GL_OES_egl_sync", gl_extensions))
|
||||||
COGL_FLAGS_SET (private_features, COGL_PRIVATE_FEATURE_OES_EGL_SYNC, TRUE);
|
COGL_FLAGS_SET (private_features, COGL_PRIVATE_FEATURE_OES_EGL_SYNC, TRUE);
|
||||||
|
|
||||||
|
if (_cogl_check_extension ("GL_EXT_texture_rg", gl_extensions))
|
||||||
|
COGL_FLAGS_SET (context->features,
|
||||||
|
COGL_FEATURE_ID_TEXTURE_RG,
|
||||||
|
TRUE);
|
||||||
|
|
||||||
/* Cache features */
|
/* Cache features */
|
||||||
for (i = 0; i < G_N_ELEMENTS (private_features); i++)
|
for (i = 0; i < G_N_ELEMENTS (private_features); i++)
|
||||||
context->private_features[i] |= private_features[i];
|
context->private_features[i] |= private_features[i];
|
||||||
|
@ -42,6 +42,12 @@ check_flags (TestFlags flags,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flags & TEST_REQUIREMENT_TEXTURE_RG &&
|
||||||
|
!cogl_has_feature (test_ctx, COGL_FEATURE_ID_TEXTURE_RG))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (flags & TEST_REQUIREMENT_POINT_SPRITE &&
|
if (flags & TEST_REQUIREMENT_POINT_SPRITE &&
|
||||||
!cogl_has_feature (test_ctx, COGL_FEATURE_ID_POINT_SPRITE))
|
!cogl_has_feature (test_ctx, COGL_FEATURE_ID_POINT_SPRITE))
|
||||||
{
|
{
|
||||||
|
@ -35,13 +35,14 @@ typedef enum _TestFlags
|
|||||||
TEST_REQUIREMENT_NPOT = 1<<2,
|
TEST_REQUIREMENT_NPOT = 1<<2,
|
||||||
TEST_REQUIREMENT_TEXTURE_3D = 1<<3,
|
TEST_REQUIREMENT_TEXTURE_3D = 1<<3,
|
||||||
TEST_REQUIREMENT_TEXTURE_RECTANGLE = 1<<4,
|
TEST_REQUIREMENT_TEXTURE_RECTANGLE = 1<<4,
|
||||||
TEST_REQUIREMENT_POINT_SPRITE = 1<<5,
|
TEST_REQUIREMENT_TEXTURE_RG = 1<<5,
|
||||||
TEST_REQUIREMENT_GLES2_CONTEXT = 1<<6,
|
TEST_REQUIREMENT_POINT_SPRITE = 1<<6,
|
||||||
TEST_REQUIREMENT_MAP_WRITE = 1<<7,
|
TEST_REQUIREMENT_GLES2_CONTEXT = 1<<7,
|
||||||
TEST_REQUIREMENT_GLSL = 1<<8,
|
TEST_REQUIREMENT_MAP_WRITE = 1<<8,
|
||||||
TEST_REQUIREMENT_OFFSCREEN = 1<<9,
|
TEST_REQUIREMENT_GLSL = 1<<9,
|
||||||
TEST_REQUIREMENT_FENCE = 1<<10,
|
TEST_REQUIREMENT_OFFSCREEN = 1<<10,
|
||||||
TEST_REQUIREMENT_PER_VERTEX_POINT_SIZE = 1<<11
|
TEST_REQUIREMENT_FENCE = 1<<11,
|
||||||
|
TEST_REQUIREMENT_PER_VERTEX_POINT_SIZE = 1<<12
|
||||||
} TestFlags;
|
} TestFlags;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -67,6 +67,7 @@ test_sources = \
|
|||||||
test-pipeline-cache-unrefs-texture.c \
|
test-pipeline-cache-unrefs-texture.c \
|
||||||
test-texture-no-allocate.c \
|
test-texture-no-allocate.c \
|
||||||
test-pipeline-shader-state.c \
|
test-pipeline-shader-state.c \
|
||||||
|
test-texture-rg.c \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
if !USING_EMSCRIPTEN
|
if !USING_EMSCRIPTEN
|
||||||
|
@ -149,6 +149,8 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
ADD_TEST (test_texture_no_allocate, 0, 0);
|
ADD_TEST (test_texture_no_allocate, 0, 0);
|
||||||
|
|
||||||
|
ADD_TEST (test_texture_rg, TEST_REQUIREMENT_TEXTURE_RG, 0);
|
||||||
|
|
||||||
g_printerr ("Unknown test name \"%s\"\n", argv[1]);
|
g_printerr ("Unknown test name \"%s\"\n", argv[1]);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -79,6 +79,23 @@ test_read_888 (CoglTexture2D *tex_2d,
|
|||||||
test_utils_compare_pixel (pixel, expected_pixel);
|
test_utils_compare_pixel (pixel, expected_pixel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_read_88 (CoglTexture2D *tex_2d,
|
||||||
|
CoglPixelFormat format,
|
||||||
|
uint32_t expected_pixel)
|
||||||
|
{
|
||||||
|
uint8_t pixel[4];
|
||||||
|
|
||||||
|
pixel[2] = 0x00;
|
||||||
|
|
||||||
|
cogl_texture_get_data (tex_2d,
|
||||||
|
format,
|
||||||
|
2, /* rowstride */
|
||||||
|
pixel);
|
||||||
|
|
||||||
|
test_utils_compare_pixel (pixel, expected_pixel);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
test_read_8888 (CoglTexture2D *tex_2d,
|
test_read_8888 (CoglTexture2D *tex_2d,
|
||||||
CoglPixelFormat format,
|
CoglPixelFormat format,
|
||||||
@ -162,6 +179,11 @@ test_read_texture_formats (void)
|
|||||||
test_read_byte (tex_2d, COGL_PIXEL_FORMAT_G_8, 0x9c);
|
test_read_byte (tex_2d, COGL_PIXEL_FORMAT_G_8, 0x9c);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* We should always be able to read into an RG buffer regardless of
|
||||||
|
* whether RG textures are supported because Cogl will do the
|
||||||
|
* conversion for us */
|
||||||
|
test_read_88 (tex_2d, COGL_PIXEL_FORMAT_RG_88, 0x123400ff);
|
||||||
|
|
||||||
test_read_short (tex_2d, COGL_PIXEL_FORMAT_RGB_565,
|
test_read_short (tex_2d, COGL_PIXEL_FORMAT_RGB_565,
|
||||||
5, 0x12, 6, 0x34, 5, 0x56,
|
5, 0x12, 6, 0x34, 5, 0x56,
|
||||||
-1);
|
-1);
|
||||||
|
74
tests/conform/test-texture-rg.c
Normal file
74
tests/conform/test-texture-rg.c
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#include <cogl/cogl.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "test-utils.h"
|
||||||
|
|
||||||
|
#define TEX_WIDTH 8
|
||||||
|
#define TEX_HEIGHT 8
|
||||||
|
|
||||||
|
static CoglTexture2D *
|
||||||
|
make_texture (void)
|
||||||
|
{
|
||||||
|
uint8_t tex_data[TEX_WIDTH * TEX_HEIGHT * 2], *p = tex_data;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
for (y = 0; y < TEX_HEIGHT; y++)
|
||||||
|
for (x = 0; x < TEX_WIDTH; x++)
|
||||||
|
{
|
||||||
|
*(p++) = x * 256 / TEX_WIDTH;
|
||||||
|
*(p++) = y * 256 / TEX_HEIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cogl_texture_2d_new_from_data (test_ctx,
|
||||||
|
TEX_WIDTH, TEX_HEIGHT,
|
||||||
|
COGL_PIXEL_FORMAT_RG_88,
|
||||||
|
TEX_WIDTH * 2,
|
||||||
|
tex_data,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test_texture_rg (void)
|
||||||
|
{
|
||||||
|
CoglPipeline *pipeline;
|
||||||
|
CoglTexture2D *tex;
|
||||||
|
int fb_width, fb_height;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
fb_width = cogl_framebuffer_get_width (test_fb);
|
||||||
|
fb_height = cogl_framebuffer_get_height (test_fb);
|
||||||
|
|
||||||
|
tex = make_texture ();
|
||||||
|
|
||||||
|
g_assert (cogl_texture_get_components (tex) == COGL_TEXTURE_COMPONENTS_RG);
|
||||||
|
|
||||||
|
pipeline = cogl_pipeline_new (test_ctx);
|
||||||
|
|
||||||
|
cogl_pipeline_set_layer_texture (pipeline, 0, tex);
|
||||||
|
cogl_pipeline_set_layer_filters (pipeline,
|
||||||
|
0,
|
||||||
|
COGL_PIPELINE_FILTER_NEAREST,
|
||||||
|
COGL_PIPELINE_FILTER_NEAREST);
|
||||||
|
|
||||||
|
cogl_framebuffer_draw_rectangle (test_fb,
|
||||||
|
pipeline,
|
||||||
|
-1.0f, 1.0f,
|
||||||
|
1.0f, -1.0f);
|
||||||
|
|
||||||
|
for (y = 0; y < TEX_HEIGHT; y++)
|
||||||
|
for (x = 0; x < TEX_WIDTH; x++)
|
||||||
|
{
|
||||||
|
test_utils_check_pixel_rgb (test_fb,
|
||||||
|
x * fb_width / TEX_WIDTH +
|
||||||
|
fb_width / (TEX_WIDTH * 2),
|
||||||
|
y * fb_height / TEX_HEIGHT +
|
||||||
|
fb_height / (TEX_HEIGHT * 2),
|
||||||
|
x * 256 / TEX_WIDTH,
|
||||||
|
y * 256 / TEX_HEIGHT,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
|
cogl_object_unref (pipeline);
|
||||||
|
cogl_object_unref (tex);
|
||||||
|
}
|
@ -141,6 +141,11 @@ test_write_texture_formats (void)
|
|||||||
test_write_byte (test_ctx, COGL_PIXEL_FORMAT_G_8, 0x34, 0x340000ff);
|
test_write_byte (test_ctx, COGL_PIXEL_FORMAT_G_8, 0x34, 0x340000ff);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* We should always be able to read from an RG buffer regardless of
|
||||||
|
* whether RG textures are supported because Cogl will do the
|
||||||
|
* conversion for us */
|
||||||
|
test_write_bytes (test_ctx, COGL_PIXEL_FORMAT_RG_88, 0x123456ff, 0x123400ff);
|
||||||
|
|
||||||
test_write_short (test_ctx, COGL_PIXEL_FORMAT_RGB_565, 0x0843, 0x080819ff);
|
test_write_short (test_ctx, COGL_PIXEL_FORMAT_RGB_565, 0x0843, 0x080819ff);
|
||||||
test_write_short (test_ctx, COGL_PIXEL_FORMAT_RGBA_4444_PRE, 0x1234, 0x11223344);
|
test_write_short (test_ctx, COGL_PIXEL_FORMAT_RGBA_4444_PRE, 0x1234, 0x11223344);
|
||||||
test_write_short (test_ctx, COGL_PIXEL_FORMAT_RGBA_5551_PRE, 0x0887, 0x081019ff);
|
test_write_short (test_ctx, COGL_PIXEL_FORMAT_RGBA_5551_PRE, 0x0887, 0x081019ff);
|
||||||
|
Loading…
Reference in New Issue
Block a user