[Mesa-dev] [PATCH 1/3] glsl: Add convenience function get_sampler_instance
Ian Romanick
idr at freedesktop.org
Thu Dec 4 14:20:33 PST 2014
On 12/04/2014 02:00 PM, Carl Worth wrote:
> This is similar to the existing functions get_instance, get_array_instance,
> etc. for getting a type singleton. The new get_sampler_instance() function
> will be used by the upcoming shader cache.
> ---
> src/glsl/glsl_types.cpp | 111 ++++++++++++++++++++++++++++++++++++++++++++++++
> src/glsl/glsl_types.h | 9 ++++
> 2 files changed, 120 insertions(+)
>
> diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
> index 5f99193..7b28fe4 100644
> --- a/src/glsl/glsl_types.cpp
> +++ b/src/glsl/glsl_types.cpp
> @@ -475,6 +475,117 @@ glsl_type::get_instance(unsigned base_type, unsigned rows, unsigned columns)
> return error_type;
> }
>
> +const glsl_type *
> +glsl_type::get_sampler_instance(enum glsl_sampler_dim dim,
> + bool shadow,
> + bool array,
> + unsigned type)
Shouldn't type be glsl_base_type instead of unsigned?
> +{
> + switch (type) {
> + case GLSL_TYPE_FLOAT:
> + switch (dim) {
> + case GLSL_SAMPLER_DIM_1D:
> + if (shadow)
> + return (array ? sampler1DArrayShadow_type : sampler1DShadow_type);
> + else
> + return (array ? sampler1DArray_type : sampler1D_type);
> + case GLSL_SAMPLER_DIM_2D:
> + if (shadow)
> + return (array ? sampler2DArrayShadow_type : sampler2DShadow_type
> +);
It's weird that the closing paren ended up here. I don't think the
parens are necessary, so maybe drop them?
> + else
> + return (array ? sampler2DArray_type : sampler2D_type);
> + case GLSL_SAMPLER_DIM_3D:
> + if (shadow || array)
> + return error_type;
> + else
> + return sampler3D_type;
> + case GLSL_SAMPLER_DIM_CUBE:
> + if (shadow)
> + return (array ? samplerCubeArrayShadow_type : samplerCubeShadow_type);
> + else
> + return (array ? samplerCubeArray_type : samplerCube_type);
> + case GLSL_SAMPLER_DIM_RECT:
> + if (array)
> + return error_type;
> + if (shadow)
> + return sampler2DRectShadow_type;
> + else
> + return sampler2DRect_type;
> + case GLSL_SAMPLER_DIM_BUF:
> + if (shadow || array)
> + return error_type;
> + else
> + return samplerBuffer_type;
> + case GLSL_SAMPLER_DIM_MS:
> + if (shadow)
> + return error_type;
> + return (array ? sampler2DMSArray_type : sampler2DMS_type);
> + case GLSL_SAMPLER_DIM_EXTERNAL:
> + if (shadow || array)
> + return error_type;
> + else
> + return samplerExternalOES_type;
> + }
> + case GLSL_TYPE_INT:
> + if (shadow)
> + return error_type;
> + switch (dim) {
> + case GLSL_SAMPLER_DIM_1D:
> + return (array ? isampler1DArray_type : isampler1D_type);
> + case GLSL_SAMPLER_DIM_2D:
> + return (array ? isampler2DArray_type : isampler2D_type);
> + case GLSL_SAMPLER_DIM_3D:
> + if (array)
> + return error_type;
> + return isampler3D_type;
> + case GLSL_SAMPLER_DIM_CUBE:
> + return (array ? isamplerCubeArray_type : isamplerCube_type);
> + case GLSL_SAMPLER_DIM_RECT:
> + if (array)
> + return error_type;
> + return isampler2DRect_type;
> + case GLSL_SAMPLER_DIM_BUF:
> + if (array)
> + return error_type;
> + return isamplerBuffer_type;
> + case GLSL_SAMPLER_DIM_MS:
> + return (array ? isampler2DMSArray_type : isampler2DMS_type);
> + case GLSL_SAMPLER_DIM_EXTERNAL:
> + return error_type;
> + }
> + case GLSL_TYPE_UINT:
> + if (shadow)
> + return error_type;
> + switch (dim) {
> + case GLSL_SAMPLER_DIM_1D:
> + return (array ? usampler1DArray_type : usampler1D_type);
> + case GLSL_SAMPLER_DIM_2D:
> + return (array ? usampler2DArray_type : usampler2D_type);
> + case GLSL_SAMPLER_DIM_3D:
> + if (array)
> + return error_type;
> + return usampler3D_type;
> + case GLSL_SAMPLER_DIM_CUBE:
> + return (array ? usamplerCubeArray_type : usamplerCube_type);
> + case GLSL_SAMPLER_DIM_RECT:
> + if (array)
> + return error_type;
> + return usampler2DRect_type;
> + case GLSL_SAMPLER_DIM_BUF:
> + if (array)
> + return error_type;
> + return usamplerBuffer_type;
> + case GLSL_SAMPLER_DIM_MS:
> + return (array ? usampler2DMSArray_type : usampler2DMS_type);
> + case GLSL_SAMPLER_DIM_EXTERNAL:
> + return error_type;
> + }
> + }
> +
> + assert(!"Should not get here.");
> + return error_type;
> +}
>
> const glsl_type *
> glsl_type::get_array_instance(const glsl_type *base, unsigned array_size)
> diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
> index 474b129..d7f740c 100644
> --- a/src/glsl/glsl_types.h
> +++ b/src/glsl/glsl_types.h
> @@ -244,6 +244,15 @@ struct glsl_type {
> unsigned columns);
>
> /**
> + * Get the instance of a sampler type
> + */
> + static const glsl_type *get_sampler_instance(enum glsl_sampler_dim dim,
> + bool shadow,
> + bool array,
> + unsigned type);
> +
> +
> + /**
> * Get the instance of an array type
> */
> static const glsl_type *get_array_instance(const glsl_type *base,
>
More information about the mesa-dev
mailing list