<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    On 20.11.2010 14:04, Marek Olšák wrote:
    <blockquote
      cite="mid:AANLkTi=KquqhZ3aa+Vi+q1xFPEAySMgpbAQd0P+RCVF5@mail.gmail.com"
      type="cite">Hi,<br>
      <br>
      Sorry that I am asking this but if a patch appears to be ignored
      on ML, should I push it to master anyway or should I ping you?<br>
      <br>
      The reason I'd like to add this CAP is to leverage what has
      already been implemented in GLSL2.<br>
      <br>
      Ideally I'd like to use GLSL2 IR in gallium drivers directly
      without messing with TGSI that has no compiler infrastructure, but
      I can't. TGSI takes so much away (e.g. the ability to use GLSL2
      lowering passes and generate code directly from that IR) and gives
      nothing in return. GLSL doesn't have to be just a shading language
      in OpenGL, it can even be a very good, API-agnostic high-level
      language, something that Gallium lacks. And the GLSL2 compiler is
      self-contained anyway, so I don't see why Gallium drivers couldn't
      use it. Just some thoughts FWIW.<br>
      <br>
    </blockquote>
    I approve of this, on nv50 I want subroutines to be inlined at the
    moment, and since this can be done in GLSL IR already, no reason to
    implement it again.<br>
    <br>
    Reason:<br>
    We do have CALL and RET on nv50, but since I'm having an SSA IR and
    a TGSI TEMP can thus have different registers assigned to it, and
    since TGSI has no function declarations I don't really want to
    implement "real" functions atm.<br>
    <br>
    Unnecessary additional information:<br>
    Also, I'd probably need to introduce a stack pointer, or at least
    save register contents to local memory between functions, which is
    kind of slow (although at the point where a shader uses indirect
    TEMP access I'd no longer care).<br>
    <br>
    Best regards,<br>
    Christoph<br>
    <br>
    <blockquote
      cite="mid:AANLkTi=KquqhZ3aa+Vi+q1xFPEAySMgpbAQd0P+RCVF5@mail.gmail.com"
      type="cite">Best regards,<br>
      Marek<br>
      <br>
      <div class="gmail_quote">On Sun, Nov 14, 2010 at 3:48 PM, Marek
        Olšák <span dir="ltr">&lt;<a moz-do-not-send="true"
            href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>&gt;</span>
        wrote:<br>
        <blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt
          0.8ex; border-left: 1px solid rgb(204, 204, 204);
          padding-left: 1ex;">
          This fixes piglit/glsl-vs-main-return for the drivers which
          don't<br>
          support RET (i915g, r300g, r600g, svga).<br>
          <br>
          ir_to_mesa does not currently generate subroutines, but it's a
          matter of time<br>
          till it's added. It would then break all the drivers which
          don't implement<br>
          them, so this CAP makes sense.<br>
          <br>
          Signed-off-by: Marek Olšák &lt;<a moz-do-not-send="true"
            href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>&gt;<br>
          ---<br>
           src/gallium/auxiliary/tgsi/tgsi_exec.h |    2 ++<br>
           src/gallium/drivers/i915/i915_screen.c |    2 ++<br>
           src/gallium/drivers/i965/brw_screen.c  |    2 ++<br>
           src/gallium/drivers/nv50/nv50_screen.c |    2 ++<br>
           src/gallium/drivers/nvfx/nvfx_screen.c |    4 ++++<br>
           src/gallium/drivers/r300/r300_screen.c |    4 ++++<br>
           src/gallium/drivers/r600/r600_pipe.c   |    2 ++<br>
           src/gallium/drivers/svga/svga_screen.c |    4 ++++<br>
           src/gallium/include/pipe/p_defines.h   |    1 +<br>
           src/mesa/state_tracker/st_extensions.c |    4 ++--<br>
           10 files changed, 25 insertions(+), 2 deletions(-)<br>
          <br>
          diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h
          b/src/gallium/auxiliary/tgsi/tgsi_exec.h<br>
          index 7b07778..b5ebbfb 100644<br>
          --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h<br>
          +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h<br>
          @@ -388,6 +388,8 @@ tgsi_exec_get_shader_param(enum
          pipe_shader_cap param)<br>
             case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:<br>
             case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                return 1;<br>
          +   case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +      return 1;<br>
             default:<br>
                return 0;<br>
             }<br>
          diff --git a/src/gallium/drivers/i915/i915_screen.c
          b/src/gallium/drivers/i915/i915_screen.c<br>
          index 312847f..b9e5fc3 100644<br>
          --- a/src/gallium/drivers/i915/i915_screen.c<br>
          +++ b/src/gallium/drivers/i915/i915_screen.c<br>
          @@ -183,6 +183,8 @@ i915_get_shader_param(struct pipe_screen
          *screen, unsigned shader, enum pipe_sha<br>
                case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:<br>
                case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                   return 1;<br>
          +      case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +         return 0;<br>
                default:<br>
                   assert(0);<br>
                   return 0;<br>
          diff --git a/src/gallium/drivers/i965/brw_screen.c
          b/src/gallium/drivers/i965/brw_screen.c<br>
          index 57160eb..29486f5 100644<br>
          --- a/src/gallium/drivers/i965/brw_screen.c<br>
          +++ b/src/gallium/drivers/i965/brw_screen.c<br>
          @@ -240,6 +240,8 @@ brw_get_shader_param(struct pipe_screen
          *screen, unsigned shader, enum pipe_shad<br>
                case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:<br>
                case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                    return 1;<br>
          +      case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +          return 1;<br>
                default:<br>
                   assert(0);<br>
                   return 0;<br>
          diff --git a/src/gallium/drivers/nv50/nv50_screen.c
          b/src/gallium/drivers/nv50/nv50_screen.c<br>
          index 51eab3a..49522b7 100644<br>
          --- a/src/gallium/drivers/nv50/nv50_screen.c<br>
          +++ b/src/gallium/drivers/nv50/nv50_screen.c<br>
          @@ -176,6 +176,8 @@ nv50_screen_get_shader_param(struct
          pipe_screen *pscreen, unsigned shader,<br>
                 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:<br>
                 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                         return 1;<br>
          +       case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +               return 0;<br>
                 default:<br>
                         return 0;<br>
                 }<br>
          diff --git a/src/gallium/drivers/nvfx/nvfx_screen.c
          b/src/gallium/drivers/nvfx/nvfx_screen.c<br>
          index 8bf0907..33ed654 100644<br>
          --- a/src/gallium/drivers/nvfx/nvfx_screen.c<br>
          +++ b/src/gallium/drivers/nvfx/nvfx_screen.c<br>
          @@ -123,6 +123,8 @@ nvfx_screen_get_shader_param(struct
          pipe_screen *pscreen, unsigned shader, enum<br>
                         case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:<br>
                         case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                                 return 0;<br>
          +               case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +                       return screen-&gt;use_nv4x ? 1 : 0;<br>
                         default:<br>
                                 break;<br>
                         }<br>
          @@ -161,6 +163,8 @@ nvfx_screen_get_shader_param(struct
          pipe_screen *pscreen, unsigned shader, enum<br>
                                 return 0;<br>
                         case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                                 return 1;<br>
          +               case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +                       return 1;<br>
                         default:<br>
                                 break;<br>
                         }<br>
          diff --git a/src/gallium/drivers/r300/r300_screen.c
          b/src/gallium/drivers/r300/r300_screen.c<br>
          index 37563b5..b4b112e 100644<br>
          --- a/src/gallium/drivers/r300/r300_screen.c<br>
          +++ b/src/gallium/drivers/r300/r300_screen.c<br>
          @@ -212,6 +212,8 @@ static int r300_get_shader_param(struct
          pipe_screen *pscreen, unsigned shader, e<br>
                  case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:<br>
                  case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                      return 0;<br>
          +        case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +            return 0;<br>
                  }<br>
                  break;<br>
              case PIPE_SHADER_VERTEX:<br>
          @@ -245,6 +247,8 @@ static int r300_get_shader_param(struct
          pipe_screen *pscreen, unsigned shader, e<br>
                      return 0;<br>
                  case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                      return 1;<br>
          +        case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +            return 0;<br>
                  default:<br>
                      break;<br>
                  }<br>
          diff --git a/src/gallium/drivers/r600/r600_pipe.c
          b/src/gallium/drivers/r600/r600_pipe.c<br>
          index 2a113f0..f46fac0 100644<br>
          --- a/src/gallium/drivers/r600/r600_pipe.c<br>
          +++ b/src/gallium/drivers/r600/r600_pipe.c<br>
          @@ -375,6 +375,8 @@ static int r600_get_shader_param(struct
          pipe_screen* pscreen, unsigned shader, e<br>
                 case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:<br>
                 case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                         return 1;<br>
          +       case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +               return 0;<br>
                 default:<br>
                         return 0;<br>
                 }<br>
          diff --git a/src/gallium/drivers/svga/svga_screen.c
          b/src/gallium/drivers/svga/svga_screen.c<br>
          index af99c41..666b498 100644<br>
          --- a/src/gallium/drivers/svga/svga_screen.c<br>
          +++ b/src/gallium/drivers/svga/svga_screen.c<br>
          @@ -237,6 +237,8 @@ static int svga_get_shader_param(struct
          pipe_screen *screen, unsigned shader, en<br>
                case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:<br>
                case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                   return 0;<br>
          +      case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +         return 0;<br>
                }<br>
                break;<br>
             case PIPE_SHADER_VERTEX:<br>
          @@ -276,6 +278,8 @@ static int svga_get_shader_param(struct
          pipe_screen *screen, unsigned shader, en<br>
                   return 0;<br>
                case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:<br>
                   return 1;<br>
          +      case PIPE_SHADER_CAP_SUBROUTINES:<br>
          +         return 0;<br>
                default:<br>
                   break;<br>
                }<br>
          diff --git a/src/gallium/include/pipe/p_defines.h
          b/src/gallium/include/pipe/p_defines.h<br>
          index 6cca301..dacabed 100644<br>
          --- a/src/gallium/include/pipe/p_defines.h<br>
          +++ b/src/gallium/include/pipe/p_defines.h<br>
          @@ -489,6 +489,7 @@ enum pipe_shader_cap<br>
             PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR,<br>
             PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR,<br>
             PIPE_SHADER_CAP_INDIRECT_CONST_ADDR,<br>
          +   PIPE_SHADER_CAP_SUBROUTINES, /* BGNSUB, ENDSUB, CAL, RET
          */<br>
           };<br>
          <br>
           /**<br>
          diff --git a/src/mesa/state_tracker/st_extensions.c
          b/src/mesa/state_tracker/st_extensions.c<br>
          index 1327491..d4f0df8 100644<br>
          --- a/src/mesa/state_tracker/st_extensions.c<br>
          +++ b/src/mesa/state_tracker/st_extensions.c<br>
          @@ -169,9 +169,9 @@ void st_init_limits(struct st_context *st)<br>
          <br>
                /* TODO: make these more fine-grained if anyone needs it
          */<br>
                options-&gt;EmitNoIfs =
          !screen-&gt;get_shader_param(screen, i,
          PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);<br>
          -      options-&gt;EmitNoFunctions =
          !screen-&gt;get_shader_param(screen, i,
          PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);<br>
                options-&gt;EmitNoLoops =
          !screen-&gt;get_shader_param(screen, i,
          PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);<br>
          -      options-&gt;EmitNoMainReturn =
          !screen-&gt;get_shader_param(screen, i,
          PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);<br>
          +      options-&gt;EmitNoFunctions =
          !screen-&gt;get_shader_param(screen, i,
          PIPE_SHADER_CAP_SUBROUTINES);<br>
          +      options-&gt;EmitNoMainReturn =
          !screen-&gt;get_shader_param(screen, i,
          PIPE_SHADER_CAP_SUBROUTINES);<br>
          <br>
                options-&gt;EmitNoCont =
          !screen-&gt;get_shader_param(screen, i,
          PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED);<br>
          <font color="#888888"><br>
            --<br>
            1.7.0.4<br>
            <br>
          </font></blockquote>
      </div>
      <br>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
mesa-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a>
<a class="moz-txt-link-freetext" href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>