Re: [Mesa-dev] [PATCH] gallium: fix drivers to report something for PIPE_CAP_VIEWPORT_SUBPIXEL_BITS

2018-08-28 Thread Roland Scheidegger
This is not correct.

The problem here is that there's only a viewport subpixel accuracy
query, but the state tracker uses this to both set subpixel (which is
raterization subpixel accuracy) as well as viewport subpixel bits.
The former needs to be at least 4 (dx10 requires 8), whereas the latter
still is ok to be 0.

For instance, llvmpipe and probably a bunch of other drivers would have
8 subpixel bits for rasterization, but they use actual integers for
viewport bounds, hence 0 bits. It would be incorrect to report 8 bits
for viewport accuracy (even though without msaa it matters little).

So I suspect to fix this properly you'd need a new pipe cap bit (whereas
0 as default for viewport subpixels would be just fine, but not for
rasterization subpixel).

Roland



Am 28.08.2018 um 20:19 schrieb Marek Olšák:
> From: Marek Olšák 
> 
> ---
>  src/gallium/drivers/etnaviv/etnaviv_screen.c | 4 +++-
>  src/gallium/drivers/freedreno/freedreno_screen.c | 4 +++-
>  src/gallium/drivers/i915/i915_screen.c   | 4 +++-
>  src/gallium/drivers/llvmpipe/lp_screen.c | 3 ++-
>  src/gallium/drivers/nouveau/nv30/nv30_screen.c   | 3 ++-
>  src/gallium/drivers/nouveau/nv50/nv50_screen.c   | 4 +++-
>  src/gallium/drivers/nouveau/nvc0/nvc0_screen.c   | 4 +++-
>  src/gallium/drivers/r300/r300_screen.c   | 5 -
>  src/gallium/drivers/softpipe/sp_screen.c | 3 ++-
>  src/gallium/drivers/svga/svga_screen.c   | 4 +++-
>  src/gallium/drivers/swr/swr_screen.cpp   | 4 +++-
>  src/gallium/drivers/v3d/v3d_screen.c | 4 +++-
>  src/gallium/drivers/vc4/vc4_screen.c | 4 +++-
>  src/gallium/drivers/virgl/virgl_screen.c | 3 ++-
>  14 files changed, 39 insertions(+), 14 deletions(-)
> 
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c 
> b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> index 9669bd2f601..4fe1c9ebead 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> @@ -162,20 +162,23 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum 
> pipe_cap param)
>NON_POWER_OF_TWO); */
>  
> case PIPE_CAP_TEXTURE_SWIZZLE:
> case PIPE_CAP_PRIMITIVE_RESTART:
>return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
>  
> case PIPE_CAP_ENDIANNESS:
>return PIPE_ENDIAN_LITTLE; /* on most Viv hw this is configurable 
> (feature
>  ENDIANNESS_CONFIG) */
>  
> +   case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
> +  return 8;
> +
> /* Unsupported features. */
> case PIPE_CAP_SEAMLESS_CUBE_MAP:
> case PIPE_CAP_COMPUTE: /* XXX supported on gc2000 */
> case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: /* only one colorbuffer 
> supported, so mixing makes no sense */
> case PIPE_CAP_CONDITIONAL_RENDER: /* no occlusion queries */
> case PIPE_CAP_TGSI_INSTANCEID: /* no idea, really */
> case PIPE_CAP_START_INSTANCE: /* instancing not supported AFAIK */
> case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: /* instancing not 
> supported AFAIK */
> case PIPE_CAP_SHADER_STENCIL_EXPORT: /* Fragment shader cannot export 
> stencil value */
> case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: /* no dual-source supported 
> */
> @@ -237,21 +240,20 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum 
> pipe_cap param)
> case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
> case PIPE_CAP_QUERY_BUFFER_OBJECT:
> case PIPE_CAP_QUERY_MEMORY_INFO:
> case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
> case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
> case PIPE_CAP_CULL_DISTANCE:
> case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
> case PIPE_CAP_TGSI_VOTE:
> case PIPE_CAP_MAX_WINDOW_RECTANGLES:
> case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
> -   case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
> case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
> case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
> case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
> case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
> case PIPE_CAP_TGSI_FS_FBFETCH:
> case PIPE_CAP_TGSI_MUL_ZERO_WINS:
> case PIPE_CAP_DOUBLES:
> case PIPE_CAP_INT64:
> case PIPE_CAP_INT64_DIVMOD:
> case PIPE_CAP_TGSI_TEX_TXF_LZ:
> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c 
> b/src/gallium/drivers/freedreno/freedreno_screen.c
> index 489986703cd..394edbcd1fe 100644
> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
> @@ -291,20 +291,23 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum 
> pipe_cap param)
>   case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
>   if (is_a5xx(screen) || is_a6xx(screen))
>   return 4;
>   return 0;
>  
>   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
>   if (is_a4xx(screen) || is_a5xx(screen) || is_a6xx(screen))
>   return 4;
>   return 0;
>  
> + ca

[Mesa-dev] [PATCH] gallium: fix drivers to report something for PIPE_CAP_VIEWPORT_SUBPIXEL_BITS

2018-08-28 Thread Marek Olšák
From: Marek Olšák 

---
 src/gallium/drivers/etnaviv/etnaviv_screen.c | 4 +++-
 src/gallium/drivers/freedreno/freedreno_screen.c | 4 +++-
 src/gallium/drivers/i915/i915_screen.c   | 4 +++-
 src/gallium/drivers/llvmpipe/lp_screen.c | 3 ++-
 src/gallium/drivers/nouveau/nv30/nv30_screen.c   | 3 ++-
 src/gallium/drivers/nouveau/nv50/nv50_screen.c   | 4 +++-
 src/gallium/drivers/nouveau/nvc0/nvc0_screen.c   | 4 +++-
 src/gallium/drivers/r300/r300_screen.c   | 5 -
 src/gallium/drivers/softpipe/sp_screen.c | 3 ++-
 src/gallium/drivers/svga/svga_screen.c   | 4 +++-
 src/gallium/drivers/swr/swr_screen.cpp   | 4 +++-
 src/gallium/drivers/v3d/v3d_screen.c | 4 +++-
 src/gallium/drivers/vc4/vc4_screen.c | 4 +++-
 src/gallium/drivers/virgl/virgl_screen.c | 3 ++-
 14 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c 
b/src/gallium/drivers/etnaviv/etnaviv_screen.c
index 9669bd2f601..4fe1c9ebead 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
@@ -162,20 +162,23 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
   NON_POWER_OF_TWO); */
 
case PIPE_CAP_TEXTURE_SWIZZLE:
case PIPE_CAP_PRIMITIVE_RESTART:
   return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
 
case PIPE_CAP_ENDIANNESS:
   return PIPE_ENDIAN_LITTLE; /* on most Viv hw this is configurable 
(feature
 ENDIANNESS_CONFIG) */
 
+   case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
+  return 8;
+
/* Unsupported features. */
case PIPE_CAP_SEAMLESS_CUBE_MAP:
case PIPE_CAP_COMPUTE: /* XXX supported on gc2000 */
case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: /* only one colorbuffer supported, 
so mixing makes no sense */
case PIPE_CAP_CONDITIONAL_RENDER: /* no occlusion queries */
case PIPE_CAP_TGSI_INSTANCEID: /* no idea, really */
case PIPE_CAP_START_INSTANCE: /* instancing not supported AFAIK */
case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: /* instancing not supported 
AFAIK */
case PIPE_CAP_SHADER_STENCIL_EXPORT: /* Fragment shader cannot export 
stencil value */
case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: /* no dual-source supported */
@@ -237,21 +240,20 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
case PIPE_CAP_QUERY_BUFFER_OBJECT:
case PIPE_CAP_QUERY_MEMORY_INFO:
case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
case PIPE_CAP_CULL_DISTANCE:
case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
case PIPE_CAP_TGSI_VOTE:
case PIPE_CAP_MAX_WINDOW_RECTANGLES:
case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
-   case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
case PIPE_CAP_TGSI_FS_FBFETCH:
case PIPE_CAP_TGSI_MUL_ZERO_WINS:
case PIPE_CAP_DOUBLES:
case PIPE_CAP_INT64:
case PIPE_CAP_INT64_DIVMOD:
case PIPE_CAP_TGSI_TEX_TXF_LZ:
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c 
b/src/gallium/drivers/freedreno/freedreno_screen.c
index 489986703cd..394edbcd1fe 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -291,20 +291,23 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
if (is_a5xx(screen) || is_a6xx(screen))
return 4;
return 0;
 
case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
if (is_a4xx(screen) || is_a5xx(screen) || is_a6xx(screen))
return 4;
return 0;
 
+   case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
+   return 8;
+
/* Unsupported features. */
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
case PIPE_CAP_USER_VERTEX_BUFFERS:
case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
case PIPE_CAP_TEXTURE_GATHER_SM5:
case PIPE_CAP_SAMPLE_SHADING:
@@ -328,21 +331,20 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
case PIPE_CAP_GENERATE_MIPMAP:
case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
case PIPE_CAP_CULL_DISTANCE:
case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
case PIPE_CAP_TGSI_V