[Mesa-dev] [PATCH] gallium: add support for GLES texture float extensions

Roland Scheidegger sroland at vmware.com
Tue Aug 11 14:42:06 PDT 2015


FWIW d3d10 has the same requirements, the "any filter" needs to be
supported for half float formats, but is optional for float formats
(d3d10.1 made it required for floats).
https://msdn.microsoft.com/en-us/library/windows/desktop/cc627090%28v=vs.85%29.aspx
So there might well be some more hw where this distinction matters.
(I am actually not sure if some hw exists which can support fp16
textures but not filter those, but it may well exist as well...)

Roland


Am 11.08.2015 um 23:31 schrieb Ilia Mirkin:
> Marek, take a look at
> 
> https://urldefense.proofpoint.com/v2/url?u=http-3A__people.freedesktop.org_-7Eimirkin_glxinfo_glxinfo.html-23p-3Des-26v-3DVendor&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Vjtt0vs_iqoI31UfJxBl7yv9I2FeiaeAYgMTLKRBc_I&m=OkMiJkJEj5ds-m5m2oxrnCCFE3bMkkKpNEmbVjwlc5Q&s=d7nQU9RZIsjSWR1o4YW4E55BXoW-Pw6v3UFDh5sivrY&e= 
> 
> Note that a4xx supports all 4 exts, but a3xx supports
> half_float_linear but not float_linear. Thoughts?
> 
> On Tue, Aug 11, 2015 at 5:25 PM, Marek Olšák <maraeo at gmail.com> wrote:
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> ---
>>  src/gallium/docs/source/screen.rst               |  2 ++
>>  src/gallium/drivers/freedreno/freedreno_screen.c |  1 +
>>  src/gallium/drivers/i915/i915_screen.c           |  1 +
>>  src/gallium/drivers/ilo/ilo_screen.c             |  1 +
>>  src/gallium/drivers/llvmpipe/lp_screen.c         |  1 +
>>  src/gallium/drivers/nouveau/nv30/nv30_screen.c   |  1 +
>>  src/gallium/drivers/nouveau/nv50/nv50_screen.c   |  1 +
>>  src/gallium/drivers/nouveau/nvc0/nvc0_screen.c   |  1 +
>>  src/gallium/drivers/r300/r300_screen.c           |  1 +
>>  src/gallium/drivers/r600/r600_pipe.c             |  1 +
>>  src/gallium/drivers/radeonsi/si_pipe.c           |  1 +
>>  src/gallium/drivers/softpipe/sp_screen.c         |  1 +
>>  src/gallium/drivers/svga/svga_screen.c           |  1 +
>>  src/gallium/drivers/vc4/vc4_screen.c             |  1 +
>>  src/gallium/include/pipe/p_defines.h             |  1 +
>>  src/mesa/state_tracker/st_extensions.c           | 12 ++++++++++++
>>  16 files changed, 28 insertions(+)
>>
>> diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
>> index dbdccc7..3b2a470 100644
>> --- a/src/gallium/docs/source/screen.rst
>> +++ b/src/gallium/docs/source/screen.rst
>> @@ -258,6 +258,8 @@ The integer capabilities:
>>    How many per-patch outputs and inputs are supported between tessellation
>>    control and tessellation evaluation shaders, not counting in TESSINNER and
>>    TESSOUTER. The minimum allowed value for OpenGL is 30.
>> +* ``PIPE_CAP_TEXTURE_FLOAT_LINEAR``: Whether the linear minification and
>> +  magnification filters are supported with floating-point textures.
>>
>>
>>  .. _pipe_capf:
>> diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
>> index 417d7c6..4cc6494 100644
>> --- a/src/gallium/drivers/freedreno/freedreno_screen.c
>> +++ b/src/gallium/drivers/freedreno/freedreno_screen.c
>> @@ -222,6 +222,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>>         case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
>>         case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
>>         case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
>> +       case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>                 return 0;
>>
>>         case PIPE_CAP_MAX_VIEWPORTS:
>> diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
>> index 6083687..05691be 100644
>> --- a/src/gallium/drivers/i915/i915_screen.c
>> +++ b/src/gallium/drivers/i915/i915_screen.c
>> @@ -244,6 +244,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
>>     case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
>>     case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
>>     case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
>> +   case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>        return 0;
>>
>>     case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
>> diff --git a/src/gallium/drivers/ilo/ilo_screen.c b/src/gallium/drivers/ilo/ilo_screen.c
>> index 338643e..12c538a 100644
>> --- a/src/gallium/drivers/ilo/ilo_screen.c
>> +++ b/src/gallium/drivers/ilo/ilo_screen.c
>> @@ -451,6 +451,7 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
>>     case PIPE_CAP_TEXTURE_GATHER_SM5:
>>        return 0;
>>     case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
>> +   case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>        return true;
>>     case PIPE_CAP_FAKE_SW_MSAA:
>>     case PIPE_CAP_TEXTURE_QUERY_LOD:
>> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
>> index 1c6c82e..a935e20 100644
>> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
>> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
>> @@ -288,6 +288,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>>     case PIPE_CAP_VERTEXID_NOBASE:
>>        return 0;
>>     case PIPE_CAP_POLYGON_OFFSET_CLAMP:
>> +   case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>        return 1;
>>     case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
>>     case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
>> diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>> index 97cf058..3a03843 100644
>> --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>> +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
>> @@ -164,6 +164,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>>     case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
>>     case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
>>     case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
>> +   case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>        return 0;
>>
>>     case PIPE_CAP_VENDOR_ID:
>> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> index d869544..1107bef 100644
>> --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
>> @@ -176,6 +176,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>>     case PIPE_CAP_CLIP_HALFZ:
>>     case PIPE_CAP_POLYGON_OFFSET_CLAMP:
>>     case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
>> +   case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>        return 1;
>>     case PIPE_CAP_SEAMLESS_CUBE_MAP:
>>        return 1; /* class_3d >= NVA0_3D_CLASS; */
>> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>> index 5c382b8..d3e6cef 100644
>> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
>> @@ -175,6 +175,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>>     case PIPE_CAP_CLIP_HALFZ:
>>     case PIPE_CAP_POLYGON_OFFSET_CLAMP:
>>     case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
>> +   case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>        return 1;
>>     case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
>>        return (class_3d >= NVE4_3D_CLASS) ? 1 : 0;
>> diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
>> index f1df79c..d874310 100644
>> --- a/src/gallium/drivers/r300/r300_screen.c
>> +++ b/src/gallium/drivers/r300/r300_screen.c
>> @@ -192,6 +192,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>>          case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
>>          case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
>>          case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
>> +        case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>              return 0;
>>
>>          /* SWTCL-only features. */
>> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
>> index c4f5c74..ac77c12 100644
>> --- a/src/gallium/drivers/r600/r600_pipe.c
>> +++ b/src/gallium/drivers/r600/r600_pipe.c
>> @@ -270,6 +270,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>>         case PIPE_CAP_CLIP_HALFZ:
>>         case PIPE_CAP_POLYGON_OFFSET_CLAMP:
>>         case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
>> +       case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>                 return 1;
>>
>>         case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
>> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
>> index 9e40241..26694a9 100644
>> --- a/src/gallium/drivers/radeonsi/si_pipe.c
>> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
>> @@ -276,6 +276,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>>         case PIPE_CAP_TGSI_TEXCOORD:
>>         case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
>>         case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
>> +       case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>                 return 1;
>>
>>         case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
>> diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
>> index ed8e545..34585eb 100644
>> --- a/src/gallium/drivers/softpipe/sp_screen.c
>> +++ b/src/gallium/drivers/softpipe/sp_screen.c
>> @@ -234,6 +234,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>>     case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
>>        return 1;
>>     case PIPE_CAP_CLIP_HALFZ:
>> +   case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>        return 1;
>>     case PIPE_CAP_VERTEXID_NOBASE:
>>        return 0;
>> diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
>> index ac5abe8..6ee7ea0 100644
>> --- a/src/gallium/drivers/svga/svga_screen.c
>> +++ b/src/gallium/drivers/svga/svga_screen.c
>> @@ -310,6 +310,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
>>     case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
>>     case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
>>     case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
>> +   case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>        return 0;
>>     }
>>
>> diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c
>> index a20818d..bdee407 100644
>> --- a/src/gallium/drivers/vc4/vc4_screen.c
>> +++ b/src/gallium/drivers/vc4/vc4_screen.c
>> @@ -177,6 +177,7 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>>          case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
>>          case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
>>         case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
>> +       case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
>>                  return 0;
>>
>>                  /* Stream output. */
>> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
>> index 8532826..b5d7d34 100644
>> --- a/src/gallium/include/pipe/p_defines.h
>> +++ b/src/gallium/include/pipe/p_defines.h
>> @@ -607,6 +607,7 @@ enum pipe_cap
>>     PIPE_CAP_RESOURCE_FROM_USER_MEMORY,
>>     PIPE_CAP_DEVICE_RESET_STATUS_QUERY,
>>     PIPE_CAP_MAX_SHADER_PATCH_VARYINGS,
>> +   PIPE_CAP_TEXTURE_FLOAT_LINEAR,
>>  };
>>
>>  #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
>> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
>> index 13d636f..5459891 100644
>> --- a/src/mesa/state_tracker/st_extensions.c
>> +++ b/src/mesa/state_tracker/st_extensions.c
>> @@ -492,6 +492,12 @@ void st_init_extensions(struct pipe_screen *screen,
>>          { PIPE_FORMAT_R32G32B32A32_FLOAT,
>>            PIPE_FORMAT_R16G16B16A16_FLOAT } },
>>
>> +      { { o(OES_texture_float) },
>> +        { PIPE_FORMAT_R32G32B32A32_FLOAT } },
>> +
>> +      { { o(OES_texture_half_float) },
>> +        { PIPE_FORMAT_R16G16B16A16_FLOAT } },
>> +
>>        { { o(ARB_texture_rgb10_a2ui) },
>>          { PIPE_FORMAT_R10G10B10A2_UINT,
>>            PIPE_FORMAT_B10G10R10A2_UINT },
>> @@ -670,6 +676,12 @@ void st_init_extensions(struct pipe_screen *screen,
>>     if (extensions->ARB_stencil_texturing)
>>        extensions->ARB_texture_stencil8 = GL_TRUE;
>>
>> +   if (screen->get_param(screen, PIPE_CAP_TEXTURE_FLOAT_LINEAR)) {
>> +      extensions->OES_texture_float_linear = extensions->OES_texture_float;
>> +      extensions->OES_texture_half_float_linear =
>> +         extensions->OES_texture_half_float;
>> +   }
>> +
>>     /* Figure out GLSL support. */
>>     glsl_feature_level = screen->get_param(screen, PIPE_CAP_GLSL_FEATURE_LEVEL);
>>
>> --
>> 2.1.4
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Vjtt0vs_iqoI31UfJxBl7yv9I2FeiaeAYgMTLKRBc_I&m=OkMiJkJEj5ds-m5m2oxrnCCFE3bMkkKpNEmbVjwlc5Q&s=0RDlQW-gJWj5hm4dv75dwwftNwftHRbvOL8mDGCRW50&e= 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Vjtt0vs_iqoI31UfJxBl7yv9I2FeiaeAYgMTLKRBc_I&m=OkMiJkJEj5ds-m5m2oxrnCCFE3bMkkKpNEmbVjwlc5Q&s=0RDlQW-gJWj5hm4dv75dwwftNwftHRbvOL8mDGCRW50&e= 
> 



More information about the mesa-dev mailing list