i965/fs: Add support for translating ir_triop_fma into MAD.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_program.c
index cd37e708ed80c2b41ae105a83199e6bde1e269b6..9a517be0b3443a544863cf89b933e5e80c14d57a 100644 (file)
@@ -62,6 +62,9 @@ static void brwBindProgram( struct gl_context *ctx,
    case GL_VERTEX_PROGRAM_ARB: 
       brw->state.dirty.brw |= BRW_NEW_VERTEX_PROGRAM;
       break;
+   case MESA_GEOMETRY_PROGRAM:
+      brw->state.dirty.brw |= BRW_NEW_GEOMETRY_PROGRAM;
+      break;
    case GL_FRAGMENT_PROGRAM_ARB:
       brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
       break;
@@ -78,7 +81,7 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
    case GL_VERTEX_PROGRAM_ARB: {
       struct brw_vertex_program *prog = CALLOC_STRUCT(brw_vertex_program);
       if (prog) {
-        prog->id = get_new_program_id(brw->intel.intelScreen);
+        prog->id = get_new_program_id(brw->intelScreen);
 
         return _mesa_init_vertex_program( ctx, &prog->program,
                                             target, id );
@@ -90,7 +93,7 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
    case GL_FRAGMENT_PROGRAM_ARB: {
       struct brw_fragment_program *prog = CALLOC_STRUCT(brw_fragment_program);
       if (prog) {
-        prog->id = get_new_program_id(brw->intel.intelScreen);
+        prog->id = get_new_program_id(brw->intelScreen);
 
         return _mesa_init_fragment_program( ctx, &prog->program,
                                             target, id );
@@ -99,8 +102,20 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
         return NULL;
    }
 
+   case MESA_GEOMETRY_PROGRAM: {
+      struct brw_geometry_program *prog = CALLOC_STRUCT(brw_geometry_program);
+      if (prog) {
+         prog->id = get_new_program_id(brw->intelScreen);
+
+         return _mesa_init_geometry_program(ctx, &prog->program, target, id);
+      } else {
+         return NULL;
+      }
+   }
+
    default:
-      return _mesa_new_program(ctx, target, id);
+      assert(!"Unsupported target in brwNewProgram()");
+      return NULL;
    }
 }
 
@@ -135,7 +150,7 @@ brwProgramStringNotify(struct gl_context *ctx,
 
       if (newFP == curFP)
         brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
-      newFP->id = get_new_program_id(brw->intel.intelScreen);
+      newFP->id = get_new_program_id(brw->intelScreen);
       break;
    }
    case GL_VERTEX_PROGRAM_ARB: {
@@ -149,7 +164,7 @@ brwProgramStringNotify(struct gl_context *ctx,
       if (newVP->program.IsPositionInvariant) {
         _mesa_insert_mvp_code(ctx, &newVP->program);
       }
-      newVP->id = get_new_program_id(brw->intel.intelScreen);
+      newVP->id = get_new_program_id(brw->intelScreen);
 
       /* Also tell tnl about it:
        */
@@ -205,7 +220,7 @@ brw_get_scratch_size(int size)
 }
 
 void
-brw_get_scratch_bo(struct intel_context *intel,
+brw_get_scratch_bo(struct brw_context *brw,
                   drm_intel_bo **scratch_bo, int size)
 {
    drm_intel_bo *old_bo = *scratch_bo;
@@ -216,7 +231,7 @@ brw_get_scratch_bo(struct intel_context *intel,
    }
 
    if (!old_bo) {
-      *scratch_bo = drm_intel_bo_alloc(intel->bufmgr, "scratch bo", size, 4096);
+      *scratch_bo = drm_intel_bo_alloc(brw->bufmgr, "scratch bo", size, 4096);
    }
 }
 
@@ -238,10 +253,8 @@ void brwInitFragProgFuncs( struct dd_function_table *functions )
 void
 brw_init_shader_time(struct brw_context *brw)
 {
-   struct intel_context *intel = &brw->intel;
-
    const int max_entries = 4096;
-   brw->shader_time.bo = drm_intel_bo_alloc(intel->bufmgr, "shader time",
+   brw->shader_time.bo = drm_intel_bo_alloc(brw->bufmgr, "shader time",
                                             max_entries * SHADER_TIME_STRIDE,
                                             4096);
    brw->shader_time.shader_programs = rzalloc_array(brw, struct gl_shader_program *,
@@ -489,7 +502,7 @@ brw_get_shader_time_index(struct brw_context *brw,
                           struct gl_program *prog,
                           enum shader_time_shader_type type)
 {
-   struct gl_context *ctx = &brw->intel.ctx;
+   struct gl_context *ctx = &brw->ctx;
 
    int shader_time_index = brw->shader_time.num_entries++;
    assert(shader_time_index < brw->shader_time.max_entries);