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, > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev