Re: [Mesa-dev] [PATCH] u_vbuf: Simplify the format fallback translation.

2014-08-23 Thread Marek Olšák
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.

2014-08-23 Thread Eric Anholt
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 =