Example #1
0
static GLboolean
brwProgramStringNotify(struct gl_context *ctx,
		       GLenum target,
		       struct gl_program *prog)
{
   assert(target == GL_VERTEX_PROGRAM_ARB || !prog->arb.IsPositionInvariant);

   struct brw_context *brw = brw_context(ctx);
   const struct brw_compiler *compiler = brw->screen->compiler;

   switch (target) {
   case GL_FRAGMENT_PROGRAM_ARB: {
      struct brw_program *newFP = brw_program(prog);
      const struct brw_program *curFP =
         brw_program_const(brw->fragment_program);

      if (newFP == curFP)
	 brw->ctx.NewDriverState |= BRW_NEW_FRAGMENT_PROGRAM;
      newFP->id = get_new_program_id(brw->screen);

      prog->nir = brw_create_nir(brw, NULL, prog, MESA_SHADER_FRAGMENT, true);

      brw_fs_precompile(ctx, prog);
      break;
   }
   case GL_VERTEX_PROGRAM_ARB: {
      struct brw_program *newVP = brw_program(prog);
      const struct brw_program *curVP =
         brw_program_const(brw->vertex_program);

      if (newVP == curVP)
	 brw->ctx.NewDriverState |= BRW_NEW_VERTEX_PROGRAM;
      if (newVP->program.arb.IsPositionInvariant) {
	 _mesa_insert_mvp_code(ctx, &newVP->program);
      }
      newVP->id = get_new_program_id(brw->screen);

      /* Also tell tnl about it:
       */
      _tnl_program_string(ctx, target, prog);

      prog->nir = brw_create_nir(brw, NULL, prog, MESA_SHADER_VERTEX,
                                 compiler->scalar_stage[MESA_SHADER_VERTEX]);

      brw_vs_precompile(ctx, prog);
      break;
   }
   default:
      /*
       * driver->ProgramStringNotify is only called for ARB programs, fixed
       * function vertex programs, and ir_to_mesa (which isn't used by the
       * i965 back-end).  Therefore, even after geometry shaders are added,
       * this function should only ever be called with a target of
       * GL_VERTEX_PROGRAM_ARB or GL_FRAGMENT_PROGRAM_ARB.
       */
      unreachable("Unexpected target in brwProgramStringNotify");
   }

   return true;
}
static struct gl_program *brwNewProgram( struct gl_context *ctx,
				      GLenum target,
				      GLuint id )
{
   struct brw_context *brw = brw_context(ctx);

   switch (target) {
   case GL_VERTEX_PROGRAM_ARB: {
      struct brw_vertex_program *prog = CALLOC_STRUCT(brw_vertex_program);
      if (prog) {
	 prog->id = get_new_program_id(brw->intelScreen);

	 return _mesa_init_gl_program(&prog->program.Base, target, id);
      }
      else
	 return NULL;
   }

   case GL_FRAGMENT_PROGRAM_ARB: {
      struct brw_fragment_program *prog = CALLOC_STRUCT(brw_fragment_program);
      if (prog) {
	 prog->id = get_new_program_id(brw->intelScreen);

	 return _mesa_init_gl_program(&prog->program.Base, target, id);
      }
      else
	 return NULL;
   }

   case GL_GEOMETRY_PROGRAM_NV: {
      struct brw_geometry_program *prog = CALLOC_STRUCT(brw_geometry_program);
      if (prog) {
         prog->id = get_new_program_id(brw->intelScreen);

         return _mesa_init_gl_program(&prog->program.Base, target, id);
      } else {
         return NULL;
      }
   }

   case GL_COMPUTE_PROGRAM_NV: {
      struct brw_compute_program *prog = CALLOC_STRUCT(brw_compute_program);
      if (prog) {
         prog->id = get_new_program_id(brw->intelScreen);

         return _mesa_init_gl_program(&prog->program.Base, target, id);
      } else {
         return NULL;
      }
   }

   default:
      unreachable("Unsupported target in brwNewProgram()");
   }
}
Example #3
0
static struct gl_program *brwNewProgram( struct gl_context *ctx,
				      GLenum target,
				      GLuint id )
{
   struct brw_context *brw = brw_context(ctx);

   switch (target) {
   case GL_VERTEX_PROGRAM_ARB:
   case GL_TESS_CONTROL_PROGRAM_NV:
   case GL_TESS_EVALUATION_PROGRAM_NV:
   case GL_GEOMETRY_PROGRAM_NV:
   case GL_COMPUTE_PROGRAM_NV: {
      struct brw_program *prog = rzalloc(NULL, struct brw_program);
      if (prog) {
	 prog->id = get_new_program_id(brw->screen);

	 return _mesa_init_gl_program(&prog->program, target, id);
      }
      else
	 return NULL;
   }

   case GL_FRAGMENT_PROGRAM_ARB: {
      struct brw_program *prog;
      if (brw->gen < 6) {
         struct gen4_fragment_program *g4_prog =
            rzalloc(NULL, struct gen4_fragment_program);
         prog = &g4_prog->base;
      } else {
         prog = rzalloc(NULL, struct brw_program);
      }

      if (prog) {
	 prog->id = get_new_program_id(brw->screen);

	 return _mesa_init_gl_program(&prog->program, target, id);
      }
      else
	 return NULL;
   }

   default:
      unreachable("Unsupported target in brwNewProgram()");
   }