On 12/17/2013 12:28 PM, Paul Berry wrote:
On 17 December 2013 10:51, Brian Paul <bri...@vmware.com
<mailto:bri...@vmware.com>> wrote:

    On 12/17/2013 11:23 AM, Paul Berry wrote:

        We already have a function for converting a shader type index to a
        string: _mesa_glsl_shader_target_name(__).
        ---
           src/glsl/link_atomics.cpp |  8 +++-----
           src/glsl/linker.cpp       | 16 ++++++----------
           2 files changed, 9 insertions(+), 15 deletions(-)

        diff --git a/src/glsl/link_atomics.cpp b/src/glsl/link_atomics.cpp
        index 33903ad..cac5615 100644
        --- a/src/glsl/link_atomics.cpp
        +++ b/src/glsl/link_atomics.cpp
        @@ -21,6 +21,7 @@
            * DEALINGS IN THE SOFTWARE.
            */

        +#include "glsl_parser_extras.h"
           #include "ir.h"
           #include "ir_uniform.h"
           #include "linker.h"
        @@ -214,9 +215,6 @@ link_check_atomic_counter___resources(struct
        gl_context *ctx,
                                               struct gl_shader_program
        *prog)
           {
              STATIC_ASSERT(MESA_SHADER___TYPES == 3);
        -   static const char *shader_names[MESA_SHADER___TYPES] = {
        -      "vertex", "geometry", "fragment"
        -   };
              const unsigned max_atomic_counters[MESA___SHADER_TYPES] = {
                 ctx->Const.VertexProgram.__MaxAtomicCounters,
                 ctx->Const.GeometryProgram.__MaxAtomicCounters,
        @@ -260,11 +258,11 @@
        link_check_atomic_counter___resources(struct gl_context *ctx,
              for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
                 if (atomic_counters[i] > max_atomic_counters[i])
                    linker_error(prog, "Too many %s shader atomic counters",
        -                      shader_names[i]);
        +
          _mesa_glsl_shader_target_name(__(gl_shader_type) i));

                 if (atomic_buffers[i] > max_atomic_buffers[i])
                    linker_error(prog, "Too many %s shader atomic
        counter buffers",
        -                      shader_names[i]);
        +
          _mesa_glsl_shader_target_name(__(gl_shader_type) i));
              }

              if (total_atomic_counters >
        ctx->Const.__MaxCombinedAtomicCounters)
        diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
        index a6133ea..1406f13 100644
        --- a/src/glsl/linker.cpp
        +++ b/src/glsl/linker.cpp
        @@ -1893,10 +1893,6 @@ store_fragdepth_layout(struct
        gl_shader_program *prog)
           static void
           check_resources(struct gl_context *ctx, struct
        gl_shader_program *prog)
           {
        -   static const char *const shader_names[MESA_SHADER___TYPES] = {
        -      "vertex", "geometry", "fragment"
        -   };
        -
              const unsigned max_samplers[MESA_SHADER___TYPES] = {
                 ctx->Const.VertexProgram.__MaxTextureImageUnits,
                 ctx->Const.GeometryProgram.__MaxTextureImageUnits,
        @@ -1929,7 +1925,7 @@ check_resources(struct gl_context *ctx,
        struct gl_shader_program *prog)

                 if (sh->num_samplers > max_samplers[i]) {
                  linker_error(prog, "Too many %s shader texture samplers",
        -                     shader_names[i]);
        +
        _mesa_glsl_shader_target_name(__(gl_shader_type) i));
                 }

                 if (sh->num_uniform_components >
        max_default_uniform___components[i]) {
        @@ -1938,11 +1934,11 @@ check_resources(struct gl_context *ctx,
        struct gl_shader_program *prog)
                                      "components, but the driver will
        try to optimize "
                                      "them out; this is non-portable
        out-of-spec "
                                    "behavior\n",
        -                           shader_names[i]);
        +
        _mesa_glsl_shader_target_name(__(gl_shader_type) i));
                    } else {
                       linker_error(prog, "Too many %s shader default
        uniform block "
                                  "components",
        -                         shader_names[i]);
        +
        _mesa_glsl_shader_target_name(__(gl_shader_type) i));
                    }
                 }

        @@ -1952,10 +1948,10 @@ check_resources(struct gl_context *ctx,
        struct gl_shader_program *prog)
                       linker_warning(prog, "Too many %s shader uniform
        components, "
                                      "but the driver will try to
        optimize them out; "
                                      "this is non-portable out-of-spec
        behavior\n",
        -                           shader_names[i]);
        +
        _mesa_glsl_shader_target_name(__(gl_shader_type) i));
                    } else {
                       linker_error(prog, "Too many %s shader uniform
        components",
        -                         shader_names[i]);
        +
        _mesa_glsl_shader_target_name(__(gl_shader_type) i));
                    }
                 }
              }
        @@ -1979,7 +1975,7 @@ check_resources(struct gl_context *ctx,
        struct gl_shader_program *prog)
                  for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
                     if (blocks[i] > max_uniform_blocks[i]) {
                        linker_error(prog, "Too many %s uniform blocks
        (%d/%d)",
        -                           shader_names[i],
        +
        _mesa_glsl_shader_target_name(__(gl_shader_type) i),
                                     blocks[i],
                                     max_uniform_blocks[i]);
                        break;


    Could the variable 'i' be declared as gl_shader_type to avoid all
    the casting?

    -Brian


I'm not thrilled about the casting either.  I'm worried that some time
in the future someone will try removing one of the casts, see that there
is no compiler error, and come to the wrong conclusion that the cast
does nothing.  (In reality, the cast is necessary because it's selecting
between two overloads of _mesa_glsl_shader_target_name(), one which
takes a GLenum and one which takes a gl_shader_type).


Unfortunatly, declaring i as gl_shader_type isn't a great fix because it
forces casting to be added elsewhere.  The top of the "for" loop would
have to change to something like:

    for (gl_shader_type i = (gl_shader_type) 0; i < MESA_SHADER_TYPES;
         i = (gl_shader_type) (i + 1)) {

which seems pretty ugly.

Yeah.  I didn't realize C++ was pickier than C in this area.


How about this idea instead: rather than use function overloading to
distinguish between the two meanings of _mesa_glsl_shader_target_name(),
have two functions with separate names, e.g.:

const char *_mesa_gl_shader_type_to_string(unsigned): converts
MESA_SHADER_VERTEX -> "vertex", etc.

const char *_mesa_shader_target_enum_to_string(GLenum): converts
GL_VERTEX_SHADER -> "vertex", etc.

That would eliminate the need for typecasts, and it would reduce the
danger of someone calling the wrong function by mistake.

That sounds fine. Though I think slightly shorter functions names could be used:

_mesa_shader_type_to_string(), _mesa_shader_enum_to_string()

But no big deal.

-Brian

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to