[Mesa-dev] [PATCH shader-db] run: Add separate shader objects support.
Tapani Pälli
tapani.palli at intel.com
Thu Sep 17 23:09:04 PDT 2015
On 09/17/2015 11:09 PM, Kenneth Graunke wrote:
> With this patch, if a .shader_test file contains
>
> [require]
> ...
> GL_ARB_separate_shader_objects
>
> then the shader will be compiled using glCreateShaderProgramv, and thus
> be a proper separate shader object. Drivers may choose to lay out the
> inputs/outputs of SSO programs slightly differently, resulting in
> different code.
> ---
> run.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/run.c b/run.c
> index de85665..34bd87e 100644
> --- a/run.c
> +++ b/run.c
> @@ -71,6 +71,7 @@ static struct shader *
> get_shaders(const struct context_info *core, const struct context_info *compat,
> const char *text, size_t text_size,
> enum shader_type *type, unsigned *num_shaders,
> + bool *use_separate_shader_objects,
> const char *shader_name)
> {
> static const char *req = "[require]";
> @@ -132,6 +133,10 @@ get_shaders(const struct context_info *core, const struct context_info *compat,
> shader_name, (int)(newline - extension_text), extension_text);
> return NULL;
> }
> + if (memcmp(extension_text, "GL_ARB_separate_shader_objects",
> + newline - extension_text) == 0) {
> + *use_separate_shader_objects = true;
> + }
> }
>
> /* Find the shaders. */
> @@ -572,9 +577,11 @@ main(int argc, char **argv)
>
> enum shader_type type;
> unsigned num_shaders;
> + bool use_separate_shader_objects;
> struct shader *shader = get_shaders(&core, &compat,
> text, shader_test[i].filesize,
> &type, &num_shaders,
> + &use_separate_shader_objects,
> current_shader_name);
> if (unlikely(shader == NULL)) {
> continue;
> @@ -590,7 +597,12 @@ main(int argc, char **argv)
> }
> ctx_is_core = type == TYPE_CORE;
>
> - if (type == TYPE_CORE || type == TYPE_COMPAT) {
> + if (use_separate_shader_objects) {
> + for (unsigned i = 0; i < num_shaders; i++) {
> + GLuint prog = glCreateShaderProgramv(shader[i].type, 1,
> + &shader[i].text);
> + }
> + } else if (type == TYPE_CORE || type == TYPE_COMPAT) {
Alternatively you could set
glProgramParameteri(prog, GL_PROGRAM_SEPARABLE, GL_TRUE);
before linking, this should achieve same goal with smaller change.
> GLuint prog = glCreateProgram();
>
> for (unsigned i = 0; i < num_shaders; i++) {
>
// Tapani
More information about the mesa-dev
mailing list