15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (C) Intel Corp.  2006.  All Rights Reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) develop this 3D driver.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Permission is hereby granted, free of charge, to any person obtaining
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a copy of this software and associated documentation files (the
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Software"), to deal in the Software without restriction, including
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) without limitation the rights to use, copy, modify, merge, publish,
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) distribute, sublicense, and/or sell copies of the Software, and to
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permit persons to whom the Software is furnished to do so, subject to
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) the following conditions:
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) The above copyright notice and this permission notice (including the
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) next paragraph) shall be included in all copies or substantial
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) portions of the Software.
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **********************************************************************/
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /*
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  * Authors:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *   Keith Whitwell <keith@tungstengraphics.com>
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "main/imports.h"
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "main/enums.h"
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "main/shaderobj.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "program/prog_parameter.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "program/program.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "program/programopt.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tnl/tnl.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "glsl/ralloc.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "brw_context.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "brw_wm.h"
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static void brwBindProgram( struct gl_context *ctx,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    GLenum target,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			    struct gl_program *prog )
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct brw_context *brw = brw_context(ctx);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch (target) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case GL_VERTEX_PROGRAM_ARB:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      brw->state.dirty.brw |= BRW_NEW_VERTEX_PROGRAM;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case GL_FRAGMENT_PROGRAM_ARB:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct gl_program *brwNewProgram( struct gl_context *ctx,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)				      GLenum target,
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)				      GLuint id )
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles){
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   struct brw_context *brw = brw_context(ctx);
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   switch (target) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   case GL_VERTEX_PROGRAM_ARB: {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct brw_vertex_program *prog = CALLOC_STRUCT(brw_vertex_program);
698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      if (prog) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 prog->id = brw->program_id++;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)	 return _mesa_init_vertex_program( ctx, &prog->program,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)					     target, id );
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      else
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 return NULL;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   case GL_FRAGMENT_PROGRAM_ARB: {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      struct brw_fragment_program *prog = CALLOC_STRUCT(brw_fragment_program);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (prog) {
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 prog->id = brw->program_id++;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 return _mesa_init_fragment_program( ctx, &prog->program,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					     target, id );
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 return NULL;
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   default:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return _mesa_new_program(ctx, target, id);
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void brwDeleteProgram( struct gl_context *ctx,
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)			      struct gl_program *prog )
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   _mesa_delete_program( ctx, prog );
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static GLboolean
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)brwIsProgramNative(struct gl_context *ctx,
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)		   GLenum target,
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)		   struct gl_program *prog)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   return true;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)shader_error(struct gl_context *ctx, struct gl_program *prog, const char *msg)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   struct gl_shader_program *shader;
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   shader = _mesa_lookup_shader_program(ctx, prog->Id);
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   if (shader) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ralloc_strcat(&shader->InfoLog, msg);
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      shader->LinkStatus = false;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   }
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static GLboolean
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)brwProgramStringNotify(struct gl_context *ctx,
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)		       GLenum target,
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)		       struct gl_program *prog)
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   struct brw_context *brw = brw_context(ctx);
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   int i;
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   if (target == GL_FRAGMENT_PROGRAM_ARB) {
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct brw_fragment_program *newFP = brw_fragment_program(fprog);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const struct brw_fragment_program *curFP =
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         brw_fragment_program_const(brw->fragment_program);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct gl_shader_program *shader_program;
1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      if (newFP == curFP)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newFP->id = brw->program_id++;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Don't reject fragment shaders for their Mesa IR state when we're
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       * using the new FS backend.
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       */
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      shader_program = _mesa_lookup_shader_program(ctx, prog->Id);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (shader_program
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  && shader_program->_LinkedShaders[MESA_SHADER_FRAGMENT]) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 return true;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)   else if (target == GL_VERTEX_PROGRAM_ARB) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct gl_vertex_program *vprog = (struct gl_vertex_program *) prog;
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      struct brw_vertex_program *newVP = brw_vertex_program(vprog);
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const struct brw_vertex_program *curVP =
1560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)         brw_vertex_program_const(brw->vertex_program);
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (newVP == curVP)
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)	 brw->state.dirty.brw |= BRW_NEW_VERTEX_PROGRAM;
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      if (newVP->program.IsPositionInvariant) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 _mesa_insert_mvp_code(ctx, &newVP->program);
1620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newVP->id = brw->program_id++;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Also tell tnl about it:
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       */
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      _tnl_program_string(ctx, target, prog);
1688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)   }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Reject programs with subroutines, which are totally broken at the moment
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * (all program flows return when any program flow returns, and
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    * the VS also hangs if a function call calls a function.
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    *
1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    * See piglit glsl-{vs,fs}-functions-[23] tests.
1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    */
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (i = 0; i < prog->NumInstructions; i++) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct prog_instruction *inst = prog->Instructions + i;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int r;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (prog->Instructions[i].Opcode == OPCODE_CAL) {
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)	 shader_error(ctx, prog,
1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		      "i965 driver doesn't yet support uninlined function "
1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		      "calls.  Move to using a single return statement at "
1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		      "the end of the function to work around it.\n");
1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	 return false;
1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      }
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      if (prog->Instructions[i].Opcode == OPCODE_RET) {
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)	 shader_error(ctx, prog,
1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		      "i965 driver doesn't yet support \"return\" "
1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)		      "from main().\n");
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)	 return false;
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (r = 0; r < _mesa_num_inst_src_regs(inst->Opcode); r++) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 if (prog->Instructions[i].SrcReg[r].RelAddr &&
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     prog->Instructions[i].SrcReg[r].File == PROGRAM_INPUT) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    shader_error(ctx, prog,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 "Variable indexing of shader inputs unsupported\n");
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    return false;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	 }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (target == GL_FRAGMENT_PROGRAM_ARB &&
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  prog->Instructions[i].DstReg.RelAddr &&
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)	  prog->Instructions[i].DstReg.File == PROGRAM_OUTPUT) {
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)	 shader_error(ctx, prog,
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)		      "Variable indexing of FS outputs unsupported\n");
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)	 return false;
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (target == GL_FRAGMENT_PROGRAM_ARB) {
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)	 if ((prog->Instructions[i].DstReg.RelAddr &&
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      prog->Instructions[i].DstReg.File == PROGRAM_TEMPORARY) ||
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (prog->Instructions[i].SrcReg[0].RelAddr &&
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      prog->Instructions[i].SrcReg[0].File == PROGRAM_TEMPORARY) ||
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (prog->Instructions[i].SrcReg[1].RelAddr &&
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      prog->Instructions[i].SrcReg[1].File == PROGRAM_TEMPORARY) ||
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	     (prog->Instructions[i].SrcReg[2].RelAddr &&
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	      prog->Instructions[i].SrcReg[2].File == PROGRAM_TEMPORARY)) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	    shader_error(ctx, prog,
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)			 "Variable indexing of variable arrays in the FS "
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)			 "unsupported\n");
2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)	    return false;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	 }
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   }
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   return true;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/* Per-thread scratch space is a power-of-two multiple of 1KB. */
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)int
2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)brw_get_scratch_size(int size)
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   int i;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   for (i = 1024; i < size; i *= 2)
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ;
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)   return i;
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)brw_get_scratch_bo(struct intel_context *intel,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   drm_intel_bo **scratch_bo, int size)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   drm_intel_bo *old_bo = *scratch_bo;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   if (old_bo && old_bo->size < size) {
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      drm_intel_bo_unreference(old_bo);
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      old_bo = NULL;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!old_bo) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *scratch_bo = drm_intel_bo_alloc(intel->bufmgr, "scratch bo", size, 4096);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void brwInitFragProgFuncs( struct dd_function_table *functions )
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   assert(functions->ProgramStringNotify == _tnl_program_string);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   functions->BindProgram = brwBindProgram;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   functions->NewProgram = brwNewProgram;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   functions->DeleteProgram = brwDeleteProgram;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   functions->IsProgramNative = brwIsProgramNative;
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   functions->ProgramStringNotify = brwProgramStringNotify;
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   functions->NewShader = brw_new_shader;
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)   functions->NewShaderProgram = brw_new_shader_program;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   functions->LinkShader = brw_link_shader;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)