Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2005-2007  Brian Paul   All Rights Reserved.
  3.  * Copyright (C) 2008  VMware, Inc.   All Rights Reserved.
  4.  * Copyright © 2010 Intel Corporation
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the "Software"),
  8.  * to deal in the Software without restriction, including without limitation
  9.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10.  * and/or sell copies of the Software, and to permit persons to whom the
  11.  * Software is furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice (including the next
  14.  * paragraph) shall be included in all copies or substantial portions of the
  15.  * Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  22.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  23.  * DEALINGS IN THE SOFTWARE.
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include "ir.h"
  28. #include "glsl_types.h"
  29. #include "ir_visitor.h"
  30.  
  31. extern "C" {
  32. #include "main/compiler.h"
  33. #include "main/mtypes.h"
  34. #include "program/prog_parameter.h"
  35. }
  36.  
  37. static void fail_link(struct gl_shader_program *prog, const char *fmt, ...) PRINTFLIKE(2, 3);
  38.  
  39. static void fail_link(struct gl_shader_program *prog, const char *fmt, ...)
  40. {
  41.    va_list args;
  42.    va_start(args, fmt);
  43.    ralloc_vasprintf_append(&prog->InfoLog, fmt, args);
  44.    va_end(args);
  45.  
  46.    prog->LinkStatus = GL_FALSE;
  47. }
  48.  
  49. class get_sampler_name : public ir_hierarchical_visitor
  50. {
  51. public:
  52.    get_sampler_name(ir_dereference *last,
  53.                     struct gl_shader_program *shader_program)
  54.    {
  55.       this->mem_ctx = ralloc_context(NULL);
  56.       this->shader_program = shader_program;
  57.       this->name = NULL;
  58.       this->offset = 0;
  59.       this->last = last;
  60.    }
  61.  
  62.    ~get_sampler_name()
  63.    {
  64.       ralloc_free(this->mem_ctx);
  65.    }
  66.  
  67.    virtual ir_visitor_status visit(ir_dereference_variable *ir)
  68.    {
  69.       this->name = ir->var->name;
  70.       return visit_continue;
  71.    }
  72.  
  73.    virtual ir_visitor_status visit_leave(ir_dereference_record *ir)
  74.    {
  75.       this->name = ralloc_asprintf(mem_ctx, "%s.%s", name, ir->field);
  76.       return visit_continue;
  77.    }
  78.  
  79.    virtual ir_visitor_status visit_leave(ir_dereference_array *ir)
  80.    {
  81.       ir_constant *index = ir->array_index->as_constant();
  82.       int i;
  83.  
  84.       if (index) {
  85.          i = index->value.i[0];
  86.       } else {
  87.          /* GLSL 1.10 and 1.20 allowed variable sampler array indices,
  88.           * while GLSL 1.30 requires that the array indices be
  89.           * constant integer expressions.  We don't expect any driver
  90.           * to actually work with a really variable array index, so
  91.           * all that would work would be an unrolled loop counter that ends
  92.           * up being constant above.
  93.           */
  94.          ralloc_strcat(&shader_program->InfoLog,
  95.                        "warning: Variable sampler array index unsupported.\n"
  96.                        "This feature of the language was removed in GLSL 1.20 "
  97.                        "and is unlikely to be supported for 1.10 in Mesa.\n");
  98.          i = 0;
  99.       }
  100.       if (ir != last) {
  101.          this->name = ralloc_asprintf(mem_ctx, "%s[%d]", name, i);
  102.       } else {
  103.          offset = i;
  104.       }
  105.       return visit_continue;
  106.    }
  107.  
  108.    struct gl_shader_program *shader_program;
  109.    const char *name;
  110.    void *mem_ctx;
  111.    int offset;
  112.    ir_dereference *last;
  113. };
  114.  
  115. extern "C" {
  116. int
  117. _mesa_get_sampler_uniform_value(class ir_dereference *sampler,
  118.                                 struct gl_shader_program *shader_program,
  119.                                 const struct gl_program *prog)
  120. {
  121.    get_sampler_name getname(sampler, shader_program);
  122.  
  123.    sampler->accept(&getname);
  124.  
  125.    GLint index = _mesa_lookup_parameter_index(prog->Parameters, -1,
  126.                                               getname.name);
  127.  
  128.    if (index < 0) {
  129.       fail_link(shader_program,
  130.                 "failed to find sampler named %s.\n", getname.name);
  131.       return 0;
  132.    }
  133.  
  134.    index += getname.offset;
  135.  
  136.    return prog->Parameters->ParameterValues[index][0];
  137. }
  138. }
  139.