Re: [Mesa-dev] [PATCH] u_vbuf: Simplify the format fallback translation.
Reviewed-by: Marek Olšák Marek On Sun, Aug 24, 2014 at 1:38 AM, Eric Anholt wrote: > Individual caps made supporting new fallbacks more complicated than it > needed to be. Instead, just make a table of fallbacks at context init > time. > > v2: Fix inverted "do we need to install vbuf?" flagging caught by Marek. > --- > > Sorry for the crap patch, hopefully this has the fixees from your review. > > src/gallium/auxiliary/cso_cache/cso_context.c | 12 +- > src/gallium/auxiliary/util/u_vbuf.c | 181 > -- > src/gallium/auxiliary/util/u_vbuf.h | 11 +- > 3 files changed, 87 insertions(+), 117 deletions(-) > > diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c > b/src/gallium/auxiliary/cso_cache/cso_context.c > index ca91b67..3d8860f 100644 > --- a/src/gallium/auxiliary/cso_cache/cso_context.c > +++ b/src/gallium/auxiliary/cso_cache/cso_context.c > @@ -239,18 +239,8 @@ static void cso_init_vbuf(struct cso_context *cso) > { > struct u_vbuf_caps caps; > > - u_vbuf_get_caps(cso->pipe->screen, &caps); > - > /* Install u_vbuf if there is anything unsupported. */ > - if (!caps.buffer_offset_unaligned || > - !caps.buffer_stride_unaligned || > - !caps.velem_src_offset_unaligned || > - !caps.format_fixed32 || > - !caps.format_float16 || > - !caps.format_float64 || > - !caps.format_norm32 || > - !caps.format_scaled32 || > - !caps.user_vertex_buffers) { > + if (u_vbuf_get_caps(cso->pipe->screen, &caps)) { >cso->vbuf = u_vbuf_create(cso->pipe, &caps, > cso->aux_vertex_buffer_index); > } > diff --git a/src/gallium/auxiliary/util/u_vbuf.c > b/src/gallium/auxiliary/util/u_vbuf.c > index c475ee1..26017fa 100644 > --- a/src/gallium/auxiliary/util/u_vbuf.c > +++ b/src/gallium/auxiliary/util/u_vbuf.c > @@ -191,47 +191,90 @@ u_vbuf_create_vertex_elements(struct u_vbuf *mgr, > unsigned count, >const struct pipe_vertex_element *attribs); > static void u_vbuf_delete_vertex_elements(struct u_vbuf *mgr, void *cso); > > +static const struct { > + enum pipe_format from, to; > +} vbuf_format_fallbacks[] = { > + { PIPE_FORMAT_R32_FIXED,PIPE_FORMAT_R32_FLOAT }, > + { PIPE_FORMAT_R32G32_FIXED, PIPE_FORMAT_R32G32_FLOAT }, > + { PIPE_FORMAT_R32G32B32_FIXED, PIPE_FORMAT_R32G32B32_FLOAT }, > + { PIPE_FORMAT_R32G32B32A32_FIXED, PIPE_FORMAT_R32G32B32A32_FLOAT }, > + { PIPE_FORMAT_R16_FLOAT,PIPE_FORMAT_R32_FLOAT }, > + { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R32G32_FLOAT }, > + { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R32G32B32_FLOAT }, > + { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT }, > + { PIPE_FORMAT_R64_FLOAT,PIPE_FORMAT_R32_FLOAT }, > + { PIPE_FORMAT_R64G64_FLOAT, PIPE_FORMAT_R32G32_FLOAT }, > + { PIPE_FORMAT_R64G64B64_FLOAT, PIPE_FORMAT_R32G32B32_FLOAT }, > + { PIPE_FORMAT_R64G64B64A64_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT }, > + { PIPE_FORMAT_R32_UNORM,PIPE_FORMAT_R32_FLOAT }, > + { PIPE_FORMAT_R32G32_UNORM, PIPE_FORMAT_R32G32_FLOAT }, > + { PIPE_FORMAT_R32G32B32_UNORM, PIPE_FORMAT_R32G32B32_FLOAT }, > + { PIPE_FORMAT_R32G32B32A32_UNORM, PIPE_FORMAT_R32G32B32A32_FLOAT }, > + { PIPE_FORMAT_R32_SNORM,PIPE_FORMAT_R32_FLOAT }, > + { PIPE_FORMAT_R32G32_SNORM, PIPE_FORMAT_R32G32_FLOAT }, > + { PIPE_FORMAT_R32G32B32_SNORM, PIPE_FORMAT_R32G32B32_FLOAT }, > + { PIPE_FORMAT_R32G32B32A32_SNORM, PIPE_FORMAT_R32G32B32A32_FLOAT }, > + { PIPE_FORMAT_R32_USCALED, PIPE_FORMAT_R32_FLOAT }, > + { PIPE_FORMAT_R32G32_USCALED, PIPE_FORMAT_R32G32_FLOAT }, > + { PIPE_FORMAT_R32G32B32_USCALED,PIPE_FORMAT_R32G32B32_FLOAT }, > + { PIPE_FORMAT_R32G32B32A32_USCALED, PIPE_FORMAT_R32G32B32A32_FLOAT }, > + { PIPE_FORMAT_R32_SSCALED, PIPE_FORMAT_R32_FLOAT }, > + { PIPE_FORMAT_R32G32_SSCALED, PIPE_FORMAT_R32G32_FLOAT }, > + { PIPE_FORMAT_R32G32B32_SSCALED,PIPE_FORMAT_R32G32B32_FLOAT }, > + { PIPE_FORMAT_R32G32B32A32_SSCALED, PIPE_FORMAT_R32G32B32A32_FLOAT }, > +}; > > -void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps) > +boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps) > { > - caps->format_fixed32 = > - screen->is_format_supported(screen, PIPE_FORMAT_R32_FIXED, PIPE_BUFFER, > - 0, PIPE_BIND_VERTEX_BUFFER); > - > - caps->format_float16 = > - screen->is_format_supported(screen, PIPE_FORMAT_R16_FLOAT, PIPE_BUFFER, > - 0, PIPE_BIND_VERTEX_BUFFER); > - > - caps->format_float64 = > - screen->is_format_supported(screen, PIPE_FORMAT_R64_FLOAT, PIPE_BUFFER, > - 0, PIPE_BIND_VERTEX_BUFFER); > - > - caps->format_norm32 = > - screen->is_format_supported(scree
[Mesa-dev] [PATCH] u_vbuf: Simplify the format fallback translation.
Individual caps made supporting new fallbacks more complicated than it needed to be. Instead, just make a table of fallbacks at context init time. v2: Fix inverted "do we need to install vbuf?" flagging caught by Marek. --- Sorry for the crap patch, hopefully this has the fixees from your review. src/gallium/auxiliary/cso_cache/cso_context.c | 12 +- src/gallium/auxiliary/util/u_vbuf.c | 181 -- src/gallium/auxiliary/util/u_vbuf.h | 11 +- 3 files changed, 87 insertions(+), 117 deletions(-) diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index ca91b67..3d8860f 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -239,18 +239,8 @@ static void cso_init_vbuf(struct cso_context *cso) { struct u_vbuf_caps caps; - u_vbuf_get_caps(cso->pipe->screen, &caps); - /* Install u_vbuf if there is anything unsupported. */ - if (!caps.buffer_offset_unaligned || - !caps.buffer_stride_unaligned || - !caps.velem_src_offset_unaligned || - !caps.format_fixed32 || - !caps.format_float16 || - !caps.format_float64 || - !caps.format_norm32 || - !caps.format_scaled32 || - !caps.user_vertex_buffers) { + if (u_vbuf_get_caps(cso->pipe->screen, &caps)) { cso->vbuf = u_vbuf_create(cso->pipe, &caps, cso->aux_vertex_buffer_index); } diff --git a/src/gallium/auxiliary/util/u_vbuf.c b/src/gallium/auxiliary/util/u_vbuf.c index c475ee1..26017fa 100644 --- a/src/gallium/auxiliary/util/u_vbuf.c +++ b/src/gallium/auxiliary/util/u_vbuf.c @@ -191,47 +191,90 @@ u_vbuf_create_vertex_elements(struct u_vbuf *mgr, unsigned count, const struct pipe_vertex_element *attribs); static void u_vbuf_delete_vertex_elements(struct u_vbuf *mgr, void *cso); +static const struct { + enum pipe_format from, to; +} vbuf_format_fallbacks[] = { + { PIPE_FORMAT_R32_FIXED,PIPE_FORMAT_R32_FLOAT }, + { PIPE_FORMAT_R32G32_FIXED, PIPE_FORMAT_R32G32_FLOAT }, + { PIPE_FORMAT_R32G32B32_FIXED, PIPE_FORMAT_R32G32B32_FLOAT }, + { PIPE_FORMAT_R32G32B32A32_FIXED, PIPE_FORMAT_R32G32B32A32_FLOAT }, + { PIPE_FORMAT_R16_FLOAT,PIPE_FORMAT_R32_FLOAT }, + { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R32G32_FLOAT }, + { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R32G32B32_FLOAT }, + { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT }, + { PIPE_FORMAT_R64_FLOAT,PIPE_FORMAT_R32_FLOAT }, + { PIPE_FORMAT_R64G64_FLOAT, PIPE_FORMAT_R32G32_FLOAT }, + { PIPE_FORMAT_R64G64B64_FLOAT, PIPE_FORMAT_R32G32B32_FLOAT }, + { PIPE_FORMAT_R64G64B64A64_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT }, + { PIPE_FORMAT_R32_UNORM,PIPE_FORMAT_R32_FLOAT }, + { PIPE_FORMAT_R32G32_UNORM, PIPE_FORMAT_R32G32_FLOAT }, + { PIPE_FORMAT_R32G32B32_UNORM, PIPE_FORMAT_R32G32B32_FLOAT }, + { PIPE_FORMAT_R32G32B32A32_UNORM, PIPE_FORMAT_R32G32B32A32_FLOAT }, + { PIPE_FORMAT_R32_SNORM,PIPE_FORMAT_R32_FLOAT }, + { PIPE_FORMAT_R32G32_SNORM, PIPE_FORMAT_R32G32_FLOAT }, + { PIPE_FORMAT_R32G32B32_SNORM, PIPE_FORMAT_R32G32B32_FLOAT }, + { PIPE_FORMAT_R32G32B32A32_SNORM, PIPE_FORMAT_R32G32B32A32_FLOAT }, + { PIPE_FORMAT_R32_USCALED, PIPE_FORMAT_R32_FLOAT }, + { PIPE_FORMAT_R32G32_USCALED, PIPE_FORMAT_R32G32_FLOAT }, + { PIPE_FORMAT_R32G32B32_USCALED,PIPE_FORMAT_R32G32B32_FLOAT }, + { PIPE_FORMAT_R32G32B32A32_USCALED, PIPE_FORMAT_R32G32B32A32_FLOAT }, + { PIPE_FORMAT_R32_SSCALED, PIPE_FORMAT_R32_FLOAT }, + { PIPE_FORMAT_R32G32_SSCALED, PIPE_FORMAT_R32G32_FLOAT }, + { PIPE_FORMAT_R32G32B32_SSCALED,PIPE_FORMAT_R32G32B32_FLOAT }, + { PIPE_FORMAT_R32G32B32A32_SSCALED, PIPE_FORMAT_R32G32B32A32_FLOAT }, +}; -void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps) +boolean u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps) { - caps->format_fixed32 = - screen->is_format_supported(screen, PIPE_FORMAT_R32_FIXED, PIPE_BUFFER, - 0, PIPE_BIND_VERTEX_BUFFER); - - caps->format_float16 = - screen->is_format_supported(screen, PIPE_FORMAT_R16_FLOAT, PIPE_BUFFER, - 0, PIPE_BIND_VERTEX_BUFFER); - - caps->format_float64 = - screen->is_format_supported(screen, PIPE_FORMAT_R64_FLOAT, PIPE_BUFFER, - 0, PIPE_BIND_VERTEX_BUFFER); - - caps->format_norm32 = - screen->is_format_supported(screen, PIPE_FORMAT_R32_UNORM, PIPE_BUFFER, - 0, PIPE_BIND_VERTEX_BUFFER) && - screen->is_format_supported(screen, PIPE_FORMAT_R32_SNORM, PIPE_BUFFER, - 0, PIPE_BIND_VERTEX_BUFFER); - - caps->format_scaled32 =