mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-05 11:10:10 +01:00
gallium: add and use generic function for querying patented format support (v2)
v2: Unsigned floats are allowed regardless of the configure switch.
This commit is contained in:
parent
848f7d368d
commit
75fa5c99a8
10 changed files with 78 additions and 41 deletions
|
|
@ -36,6 +36,55 @@
|
|||
#include "u_memory.h"
|
||||
#include "u_rect.h"
|
||||
#include "u_format.h"
|
||||
#include "u_format_s3tc.h"
|
||||
|
||||
#include "pipe/p_defines.h"
|
||||
|
||||
|
||||
boolean
|
||||
util_format_is_float(enum pipe_format format)
|
||||
{
|
||||
const struct util_format_description *desc = util_format_description(format);
|
||||
unsigned i;
|
||||
|
||||
assert(desc);
|
||||
if (!desc) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Find the first non-void channel. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == 4) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
|
||||
boolean
|
||||
util_format_is_supported(enum pipe_format format, unsigned bind)
|
||||
{
|
||||
if (util_format_is_s3tc(format) && !util_format_s3tc_enabled) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#ifndef TEXTURE_FLOAT_ENABLED
|
||||
if ((bind & PIPE_BIND_RENDER_TARGET) &&
|
||||
format != PIPE_FORMAT_R9G9B9E5_FLOAT &&
|
||||
format != PIPE_FORMAT_R11G11B10_FLOAT &&
|
||||
util_format_is_float(format)) {
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -473,6 +473,10 @@ util_format_colormask(const struct util_format_description *desc)
|
|||
}
|
||||
|
||||
|
||||
boolean
|
||||
util_format_is_float(enum pipe_format format);
|
||||
|
||||
|
||||
/**
|
||||
* Whether the src format can be blitted to destation format with a simple
|
||||
* memcpy.
|
||||
|
|
@ -481,6 +485,12 @@ boolean
|
|||
util_is_format_compatible(const struct util_format_description *src_desc,
|
||||
const struct util_format_description *dst_desc);
|
||||
|
||||
/**
|
||||
* Whether the format is supported by Gallium for the given bindings.
|
||||
* This covers S3TC textures and floating-point render targets.
|
||||
*/
|
||||
boolean
|
||||
util_format_is_supported(enum pipe_format format, unsigned bind);
|
||||
|
||||
/**
|
||||
* Whether this format is a rgab8 variant.
|
||||
|
|
|
|||
|
|
@ -285,6 +285,9 @@ i915_is_format_supported(struct pipe_screen *screen,
|
|||
const enum pipe_format *list;
|
||||
uint i;
|
||||
|
||||
if (!util_format_is_supported(format, tex_usage))
|
||||
return FALSE;
|
||||
|
||||
if (sample_count > 1)
|
||||
return FALSE;
|
||||
|
||||
|
|
|
|||
|
|
@ -333,6 +333,9 @@ brw_is_format_supported(struct pipe_screen *screen,
|
|||
const enum pipe_format *list;
|
||||
uint i;
|
||||
|
||||
if (!util_format_is_supported(format, tex_usage))
|
||||
return FALSE;
|
||||
|
||||
if (sample_count > 1)
|
||||
return FALSE;
|
||||
|
||||
|
|
|
|||
|
|
@ -45,17 +45,8 @@ nv50_screen_is_format_supported(struct pipe_screen *pscreen,
|
|||
if (sample_count > 1)
|
||||
return FALSE;
|
||||
|
||||
if (!util_format_s3tc_enabled) {
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_DXT1_RGB:
|
||||
case PIPE_FORMAT_DXT1_RGBA:
|
||||
case PIPE_FORMAT_DXT3_RGBA:
|
||||
case PIPE_FORMAT_DXT5_RGBA:
|
||||
return FALSE;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!util_format_is_supported(format, bindings))
|
||||
return FALSE;
|
||||
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_Z16_UNORM:
|
||||
|
|
|
|||
|
|
@ -39,17 +39,8 @@ nvc0_screen_is_format_supported(struct pipe_screen *pscreen,
|
|||
if (sample_count > 1)
|
||||
return FALSE;
|
||||
|
||||
if (!util_format_s3tc_enabled) {
|
||||
switch (format) {
|
||||
case PIPE_FORMAT_DXT1_RGB:
|
||||
case PIPE_FORMAT_DXT1_RGBA:
|
||||
case PIPE_FORMAT_DXT3_RGBA:
|
||||
case PIPE_FORMAT_DXT5_RGBA:
|
||||
return FALSE;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!util_format_is_supported(format, bindings))
|
||||
return FALSE;
|
||||
|
||||
/* transfers & shared are always supported */
|
||||
bindings &= ~(PIPE_BIND_TRANSFER_READ |
|
||||
|
|
|
|||
|
|
@ -208,6 +208,9 @@ nvfx_screen_is_format_supported(struct pipe_screen *pscreen,
|
|||
{
|
||||
struct nvfx_screen *screen = nvfx_screen(pscreen);
|
||||
|
||||
if (!util_format_is_supported(format, bind))
|
||||
return FALSE;
|
||||
|
||||
if (sample_count > 1)
|
||||
return FALSE;
|
||||
|
||||
|
|
|
|||
|
|
@ -334,6 +334,9 @@ static boolean r300_is_format_supported(struct pipe_screen* screen,
|
|||
format == PIPE_FORMAT_R16G16B16_FLOAT ||
|
||||
format == PIPE_FORMAT_R16G16B16A16_FLOAT;
|
||||
|
||||
if (!util_format_is_supported(format, usage))
|
||||
return FALSE;
|
||||
|
||||
/* Check multisampling support. */
|
||||
switch (sample_count) {
|
||||
case 0:
|
||||
|
|
|
|||
|
|
@ -741,25 +741,6 @@ static uint32_t r300_get_border_color(enum pipe_format format,
|
|||
return uc.ui;
|
||||
}
|
||||
|
||||
static boolean util_format_is_float(enum pipe_format format)
|
||||
{
|
||||
const struct util_format_description *desc = util_format_description(format);
|
||||
unsigned i;
|
||||
|
||||
if (!format)
|
||||
return FALSE;
|
||||
|
||||
/* Find the first non-void channel. */
|
||||
for (i = 0; i < 4; i++)
|
||||
if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID)
|
||||
break;
|
||||
|
||||
if (i == 4)
|
||||
return FALSE;
|
||||
|
||||
return desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
static void r300_merge_textures_and_samplers(struct r300_context* r300)
|
||||
{
|
||||
struct r300_textures_state *state =
|
||||
|
|
|
|||
|
|
@ -523,6 +523,9 @@ static boolean r600_is_format_supported(struct pipe_screen* screen,
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (!util_format_is_supported(format, usage))
|
||||
return FALSE;
|
||||
|
||||
/* Multisample */
|
||||
if (sample_count > 1)
|
||||
return FALSE;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue