mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-06 14:20:39 +01:00
Replace supported_formats with is_format_supported interface.
The old supported_formats interface returned a list of formats supported by a pipe/winsys implementation. This was reasonable when gallium had a fixed list of predefined format. Now things has changed and the definition of PIPE_FORMAT is more flexible. The new shiny is_format_supported interface gets PIPE_FORMAT as an argument and returns a boolean whether this particular format is supported.
This commit is contained in:
parent
b85cd7b700
commit
3c81219672
10 changed files with 75 additions and 98 deletions
|
|
@ -1616,7 +1616,7 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
|
|||
#if 0
|
||||
mesaCtx->st->pipe->surface_alloc = xmesa_surface_alloc;
|
||||
#endif
|
||||
mesaCtx->st->pipe->supported_formats = xmesa_supported_formats;
|
||||
mesaCtx->st->pipe->is_format_supported = xmesa_is_format_supported;
|
||||
mesaCtx->st->pipe->get_tile_rgba = xmesa_get_tile_rgba;
|
||||
mesaCtx->st->pipe->put_tile_rgba = xmesa_put_tile_rgba;
|
||||
|
||||
|
|
|
|||
|
|
@ -195,18 +195,16 @@ xmesa_surface_alloc(struct pipe_context *pipe, GLuint pipeFormat)
|
|||
}
|
||||
|
||||
|
||||
const GLuint *
|
||||
xmesa_supported_formats(struct pipe_context *pipe, GLuint *numFormats)
|
||||
boolean
|
||||
xmesa_is_format_supported(struct pipe_context *pipe, uint format)
|
||||
{
|
||||
static const GLuint formats[] = {
|
||||
PIPE_FORMAT_U_A8_R8_G8_B8,
|
||||
PIPE_FORMAT_S_R16_G16_B16_A16,
|
||||
PIPE_FORMAT_S8_Z24
|
||||
switch( format ) {
|
||||
case PIPE_FORMAT_U_A8_R8_G8_B8:
|
||||
case PIPE_FORMAT_S_R16_G16_B16_A16:
|
||||
case PIPE_FORMAT_S8_Z24:
|
||||
return TRUE;
|
||||
};
|
||||
|
||||
*numFormats = sizeof(formats) / sizeof(formats[0]);
|
||||
|
||||
return formats;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -618,8 +618,8 @@ xmesa_surface_alloc(struct pipe_context *pipe, GLuint format);
|
|||
extern struct pipe_surface *
|
||||
xmesa_new_color_surface(struct pipe_context *pipe, GLuint format);
|
||||
|
||||
extern const uint *
|
||||
xmesa_supported_formats(struct pipe_context *pipe, uint *numFormats);
|
||||
extern boolean
|
||||
xmesa_is_format_supported(struct pipe_context *pipe, uint format);
|
||||
|
||||
extern void
|
||||
xmesa_get_tile_rgba(struct pipe_context *pipe, struct pipe_surface *ps,
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ struct pipe_context *failover_create( struct pipe_context *hw,
|
|||
|
||||
failover->pipe.winsys = hw->winsys;
|
||||
failover->pipe.destroy = failover_destroy;
|
||||
failover->pipe.supported_formats = hw->supported_formats;
|
||||
failover->pipe.is_format_supported = hw->is_format_supported;
|
||||
failover->pipe.max_texture_size = hw->max_texture_size;
|
||||
failover->pipe.get_name = hw->get_name;
|
||||
failover->pipe.get_vendor = hw->get_vendor;
|
||||
|
|
|
|||
|
|
@ -40,16 +40,16 @@
|
|||
|
||||
|
||||
/**
|
||||
* Return list of supported surface/texture formats.
|
||||
* Query format support.
|
||||
* If we find texture and drawable support differs, add a selector
|
||||
* parameter or another function.
|
||||
*/
|
||||
static const unsigned *
|
||||
i915_supported_formats(struct pipe_context *pipe,
|
||||
// unsigned type,
|
||||
unsigned *numFormats)
|
||||
static boolean
|
||||
i915_is_format_supported( struct pipe_context *pipe,
|
||||
uint format )
|
||||
{
|
||||
#if 0
|
||||
/* XXX: This is broken -- rewrite if still needed. */
|
||||
static const unsigned tex_supported[] = {
|
||||
PIPE_FORMAT_U_R8_G8_B8_A8,
|
||||
PIPE_FORMAT_U_A8_R8_G8_B8,
|
||||
|
|
@ -97,13 +97,13 @@ i915_supported_formats(struct pipe_context *pipe,
|
|||
return NULL;
|
||||
}
|
||||
#else
|
||||
static const unsigned render_supported[] = {
|
||||
PIPE_FORMAT_U_A8_R8_G8_B8,
|
||||
PIPE_FORMAT_U_R5_G6_B5,
|
||||
PIPE_FORMAT_S8_Z24,
|
||||
switch( format ) {
|
||||
case PIPE_FORMAT_U_A8_R8_G8_B8:
|
||||
case PIPE_FORMAT_U_R5_G6_B5:
|
||||
case PIPE_FORMAT_S8_Z24:
|
||||
return TRUE;
|
||||
};
|
||||
*numFormats = 3;
|
||||
return render_supported;
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -303,7 +303,7 @@ struct pipe_context *i915_create( struct pipe_winsys *pipe_winsys,
|
|||
i915->pipe.winsys = pipe_winsys;
|
||||
|
||||
i915->pipe.destroy = i915_destroy;
|
||||
i915->pipe.supported_formats = i915_supported_formats;
|
||||
i915->pipe.is_format_supported = i915_is_format_supported;
|
||||
i915->pipe.max_texture_size = i915_max_texture_size;
|
||||
i915->pipe.get_param = i915_get_param;
|
||||
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@ struct pipe_context {
|
|||
/*
|
||||
* Queries
|
||||
*/
|
||||
const unsigned *(*supported_formats)(struct pipe_context *pipe,
|
||||
unsigned *numFormats);
|
||||
boolean (*is_format_supported)( struct pipe_context *pipe,
|
||||
uint format );
|
||||
|
||||
void (*max_texture_size)(struct pipe_context *pipe,
|
||||
unsigned textureType, /* PIPE_TEXTURE_x */
|
||||
|
|
|
|||
|
|
@ -46,14 +46,16 @@
|
|||
|
||||
|
||||
/**
|
||||
* Return list of supported surface/texture formats.
|
||||
* Query format support.
|
||||
* If we find texture and drawable support differs, add a selector
|
||||
* parameter or another function.
|
||||
*/
|
||||
static const unsigned *
|
||||
softpipe_supported_formats(struct pipe_context *pipe, unsigned *numFormats)
|
||||
static boolean
|
||||
softpipe_is_format_supported( struct pipe_context *pipe,
|
||||
uint format )
|
||||
{
|
||||
#if 0
|
||||
/* XXX: This is broken -- rewrite if still needed. */
|
||||
static const unsigned supported[] = {
|
||||
PIPE_FORMAT_U_R8_G8_B8_A8,
|
||||
PIPE_FORMAT_U_A8_R8_G8_B8,
|
||||
|
|
@ -76,7 +78,7 @@ softpipe_supported_formats(struct pipe_context *pipe, unsigned *numFormats)
|
|||
return supported;
|
||||
#else
|
||||
struct softpipe_context *softpipe = softpipe_context( pipe );
|
||||
return softpipe->winsys->supported_formats( softpipe->winsys, numFormats );
|
||||
return softpipe->winsys->is_format_supported( softpipe->winsys, format );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -298,7 +300,7 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,
|
|||
softpipe->pipe.destroy = softpipe_destroy;
|
||||
|
||||
/* queries */
|
||||
softpipe->pipe.supported_formats = softpipe_supported_formats;
|
||||
softpipe->pipe.is_format_supported = softpipe_is_format_supported;
|
||||
softpipe->pipe.max_texture_size = softpipe_max_texture_size;
|
||||
softpipe->pipe.get_param = softpipe_get_param;
|
||||
|
||||
|
|
|
|||
|
|
@ -35,8 +35,8 @@
|
|||
*/
|
||||
|
||||
struct softpipe_winsys {
|
||||
const unsigned *(*supported_formats)(struct softpipe_winsys *sws,
|
||||
unsigned *numFormats);
|
||||
boolean (*is_format_supported)( struct softpipe_winsys *sws,
|
||||
uint format );
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -937,31 +937,26 @@ make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height,
|
|||
{
|
||||
struct pipe_context *pipe = ctx->st->pipe;
|
||||
const uint flags = PIPE_SURFACE_FLAG_TEXTURE;
|
||||
uint numFormats, i, format = 0, cpp, comp, pitch;
|
||||
const uint *formats = ctx->st->pipe->supported_formats(pipe, &numFormats);
|
||||
uint format = 0, cpp, comp, pitch;
|
||||
ubyte *dest;
|
||||
struct pipe_mipmap_tree *mt;
|
||||
int row, col;
|
||||
|
||||
/* find a texture format we know */
|
||||
for (i = 0; i < numFormats; i++) {
|
||||
switch (formats[i]) {
|
||||
case PIPE_FORMAT_U_I8:
|
||||
format = formats[i];
|
||||
cpp = 1;
|
||||
comp = 0;
|
||||
break;
|
||||
case PIPE_FORMAT_U_A8_R8_G8_B8:
|
||||
format = formats[i];
|
||||
cpp = 4;
|
||||
comp = 3; /* alpha channel */ /*XXX little-endian dependency */
|
||||
break;
|
||||
default:
|
||||
/* XXX support more formats */
|
||||
;
|
||||
}
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_I8 )) {
|
||||
format = PIPE_FORMAT_U_I8;
|
||||
cpp = 1;
|
||||
comp = 0;
|
||||
}
|
||||
else if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8_R8_G8_B8 )) {
|
||||
format = PIPE_FORMAT_U_A8_R8_G8_B8;
|
||||
cpp = 4;
|
||||
comp = 3; /* alpha channel */ /*XXX little-endian dependency */
|
||||
}
|
||||
else {
|
||||
/* XXX support more formats */
|
||||
assert( 0 );
|
||||
}
|
||||
assert(format);
|
||||
|
||||
/**
|
||||
* Create a mipmap tree.
|
||||
|
|
|
|||
|
|
@ -342,24 +342,6 @@ st_mesa_format_to_pipe_format(GLuint mesaFormat)
|
|||
}
|
||||
}
|
||||
|
||||
/* XXX: This function should be implemented by pipe object. */
|
||||
static GLboolean
|
||||
allow_format(
|
||||
struct pipe_context *pipe,
|
||||
unsigned format )
|
||||
{
|
||||
const GLuint *supported;
|
||||
GLuint i, n;
|
||||
|
||||
supported = pipe->supported_formats( pipe, &n );
|
||||
for (i = 0; i < n; i++) {
|
||||
if (supported[i] == format) {
|
||||
return GL_TRUE;
|
||||
}
|
||||
}
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search list of formats for first RGBA format.
|
||||
*/
|
||||
|
|
@ -367,13 +349,13 @@ static GLuint
|
|||
default_rgba_format(
|
||||
struct pipe_context *pipe )
|
||||
{
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_R8_G8_B8_A8 )) {
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_R8_G8_B8_A8 )) {
|
||||
return PIPE_FORMAT_U_R8_G8_B8_A8;
|
||||
}
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_A8_R8_G8_B8 )) {
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8_R8_G8_B8 )) {
|
||||
return PIPE_FORMAT_U_A8_R8_G8_B8;
|
||||
}
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_R5_G6_B5 )) {
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_R5_G6_B5 )) {
|
||||
return PIPE_FORMAT_U_R5_G6_B5;
|
||||
}
|
||||
return PIPE_FORMAT_NONE;
|
||||
|
|
@ -387,7 +369,7 @@ static GLuint
|
|||
default_deep_rgba_format(
|
||||
struct pipe_context *pipe )
|
||||
{
|
||||
if (allow_format( pipe, PIPE_FORMAT_S_R16_G16_B16_A16 )) {
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_S_R16_G16_B16_A16 )) {
|
||||
return PIPE_FORMAT_S_R16_G16_B16_A16;
|
||||
}
|
||||
return PIPE_FORMAT_NONE;
|
||||
|
|
@ -401,13 +383,13 @@ static GLuint
|
|||
default_depth_format(
|
||||
struct pipe_context *pipe )
|
||||
{
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_Z16 )) {
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_Z16 )) {
|
||||
return PIPE_FORMAT_U_Z16;
|
||||
}
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_Z32 )) {
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_Z32 )) {
|
||||
return PIPE_FORMAT_U_Z32;
|
||||
}
|
||||
if (allow_format( pipe, PIPE_FORMAT_S8_Z24 )) {
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8_Z24 )) {
|
||||
return PIPE_FORMAT_S8_Z24;
|
||||
}
|
||||
return PIPE_FORMAT_NONE;
|
||||
|
|
@ -437,15 +419,15 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
|
|||
case GL_COMPRESSED_RGBA:
|
||||
if (format == GL_BGRA) {
|
||||
if (type == GL_UNSIGNED_BYTE || type == GL_UNSIGNED_INT_8_8_8_8_REV) {
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_A8_R8_G8_B8 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8_R8_G8_B8 ))
|
||||
return PIPE_FORMAT_U_A8_R8_G8_B8;
|
||||
}
|
||||
else if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_A4_R4_G4_B4 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A4_R4_G4_B4 ))
|
||||
return PIPE_FORMAT_U_A4_R4_G4_B4;
|
||||
}
|
||||
else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_A1_R5_G5_B5 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A1_R5_G5_B5 ))
|
||||
return PIPE_FORMAT_U_A1_R5_G5_B5;
|
||||
}
|
||||
}
|
||||
|
|
@ -455,7 +437,7 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
|
|||
case GL_RGB:
|
||||
case GL_COMPRESSED_RGB:
|
||||
if (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) {
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_R5_G6_B5 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_R5_G6_B5 ))
|
||||
return PIPE_FORMAT_U_R5_G6_B5;
|
||||
}
|
||||
return default_rgba_format( pipe );
|
||||
|
|
@ -469,12 +451,12 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
|
|||
|
||||
case GL_RGBA4:
|
||||
case GL_RGBA2:
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_A4_R4_G4_B4 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A4_R4_G4_B4 ))
|
||||
return PIPE_FORMAT_U_A4_R4_G4_B4;
|
||||
return default_rgba_format( pipe );
|
||||
|
||||
case GL_RGB5_A1:
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_A1_R5_G5_B5 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A1_R5_G5_B5 ))
|
||||
return PIPE_FORMAT_U_A1_R5_G5_B5;
|
||||
return default_rgba_format( pipe );
|
||||
|
||||
|
|
@ -487,7 +469,7 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
|
|||
case GL_RGB5:
|
||||
case GL_RGB4:
|
||||
case GL_R3_G3_B2:
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_A1_R5_G5_B5 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A1_R5_G5_B5 ))
|
||||
return PIPE_FORMAT_U_A1_R5_G5_B5;
|
||||
return default_rgba_format( pipe );
|
||||
|
||||
|
|
@ -497,7 +479,7 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
|
|||
case GL_ALPHA12:
|
||||
case GL_ALPHA16:
|
||||
case GL_COMPRESSED_ALPHA:
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_A8 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8 ))
|
||||
return PIPE_FORMAT_U_A8;
|
||||
return default_rgba_format( pipe );
|
||||
|
||||
|
|
@ -508,7 +490,7 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
|
|||
case GL_LUMINANCE12:
|
||||
case GL_LUMINANCE16:
|
||||
case GL_COMPRESSED_LUMINANCE:
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_A8 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8 ))
|
||||
return PIPE_FORMAT_U_A8;
|
||||
return default_rgba_format( pipe );
|
||||
|
||||
|
|
@ -521,7 +503,7 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
|
|||
case GL_LUMINANCE12_ALPHA12:
|
||||
case GL_LUMINANCE16_ALPHA16:
|
||||
case GL_COMPRESSED_LUMINANCE_ALPHA:
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_A8_L8 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8_L8 ))
|
||||
return PIPE_FORMAT_U_A8_L8;
|
||||
return default_rgba_format( pipe );
|
||||
|
||||
|
|
@ -531,17 +513,17 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
|
|||
case GL_INTENSITY12:
|
||||
case GL_INTENSITY16:
|
||||
case GL_COMPRESSED_INTENSITY:
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_I8 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_I8 ))
|
||||
return PIPE_FORMAT_U_I8;
|
||||
return default_rgba_format( pipe );
|
||||
|
||||
case GL_YCBCR_MESA:
|
||||
if (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_BYTE) {
|
||||
if (allow_format( pipe, PIPE_FORMAT_YCBCR ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_YCBCR ))
|
||||
return PIPE_FORMAT_YCBCR;
|
||||
}
|
||||
else {
|
||||
if (allow_format( pipe, PIPE_FORMAT_YCBCR_REV ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_YCBCR_REV ))
|
||||
return PIPE_FORMAT_YCBCR_REV;
|
||||
}
|
||||
return PIPE_FORMAT_NONE;
|
||||
|
|
@ -570,15 +552,15 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
|
|||
#endif
|
||||
|
||||
case GL_DEPTH_COMPONENT16:
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_Z16 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_Z16 ))
|
||||
return PIPE_FORMAT_U_Z16;
|
||||
/* fall-through */
|
||||
case GL_DEPTH_COMPONENT24:
|
||||
if (allow_format( pipe, PIPE_FORMAT_S8_Z24 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8_Z24 ))
|
||||
return PIPE_FORMAT_S8_Z24;
|
||||
/* fall-through */
|
||||
case GL_DEPTH_COMPONENT32:
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_Z32 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_Z32 ))
|
||||
return PIPE_FORMAT_U_Z32;
|
||||
/* fall-through */
|
||||
case GL_DEPTH_COMPONENT:
|
||||
|
|
@ -589,15 +571,15 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
|
|||
case GL_STENCIL_INDEX4_EXT:
|
||||
case GL_STENCIL_INDEX8_EXT:
|
||||
case GL_STENCIL_INDEX16_EXT:
|
||||
if (allow_format( pipe, PIPE_FORMAT_U_S8 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_S8 ))
|
||||
return PIPE_FORMAT_U_S8;
|
||||
if (allow_format( pipe, PIPE_FORMAT_S8_Z24 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8_Z24 ))
|
||||
return PIPE_FORMAT_S8_Z24;
|
||||
return PIPE_FORMAT_NONE;
|
||||
|
||||
case GL_DEPTH_STENCIL_EXT:
|
||||
case GL_DEPTH24_STENCIL8_EXT:
|
||||
if (allow_format( pipe, PIPE_FORMAT_S8_Z24 ))
|
||||
if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8_Z24 ))
|
||||
return PIPE_FORMAT_S8_Z24;
|
||||
return PIPE_FORMAT_NONE;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue