i965g: more files compiling
authorKeith Whitwell <keithw@vmware.com>
Sun, 1 Nov 2009 13:11:56 +0000 (13:11 +0000)
committerKeith Whitwell <keithw@vmware.com>
Sun, 1 Nov 2009 13:11:56 +0000 (13:11 +0000)
src/gallium/drivers/i965/Makefile
src/gallium/drivers/i965/brw_batchbuffer.c
src/gallium/drivers/i965/brw_bo.c [deleted file]
src/gallium/drivers/i965/brw_context.h
src/gallium/drivers/i965/brw_pipe_blend.c
src/gallium/drivers/i965/brw_pipe_flush.c
src/gallium/drivers/i965/brw_pipe_shader.c

index 896cb234a63334c16adf4548bd4b31c804fb4fe2..ae37d2d7022caf5ebdfa2123778c316297eaa13f 100644 (file)
@@ -29,6 +29,8 @@ C_SOURCES = \
        brw_pipe_depth.c \
        brw_pipe_fb.c \
        brw_pipe_query.c \
+       brw_pipe_shader.c \
+       brw_pipe_flush.c \
        brw_sf.c \
        brw_sf_emit.c \
        brw_sf_state.c \
@@ -56,10 +58,7 @@ C_SOURCES = \
        brw_wm_surface_state.c \
        brw_screen_surface.c \
        brw_screen_texture.c \
-       brw_bo.c \
        brw_batchbuffer.c \
-       brw_pipe_shader.c \
-       brw_pipe_flush.c \
        intel_tex_layout.c 
 
 include ../../Makefile.template
index 45fbd59273a1f1e65e6280c26a37b023e80a4604..1cffc0ab39013e1bc8e1c75cfd8fbcb5f8251fd9 100644 (file)
@@ -109,12 +109,13 @@ _brw_batchbuffer_flush(struct brw_batchbuffer *batch, const char *file,
       debug_printf("%s:%d: Batchbuffer flush with %db used\n", file, line,
              used);
 
-   /* Emit a flush if the bufmgr doesn't do it for us. */
-   if (intel->always_flush_cache || !intel->ttm) {
+#if 0
+   if (intel->always_flush_cache || 1) {
       *(GLuint *) (batch->ptr) = ((CMD_MI_FLUSH << 16) | BRW_FLUSH_STATE_CACHE);
       batch->ptr += 4;
       used = batch->ptr - batch->map;
    }
+#endif
 
    /* Round batchbuffer usage to 2 DWORDs. */
 
@@ -137,16 +138,25 @@ _brw_batchbuffer_flush(struct brw_batchbuffer *batch, const char *file,
    batch->sws->bo_exec(batch->buf, used, NULL, 0, 0 );
       
    if (BRW_DEBUG & DEBUG_BATCH) {
-      dri_bo_map(batch->buf, GL_FALSE);
-      intel_decode(batch->buf->virtual, used / 4, batch->buf->offset,
-                  brw->brw_screen->pci_id);
-      dri_bo_unmap(batch->buf);
+      void *ptr = batch->sws->bo_map(batch->buf, GL_FALSE);
+
+      intel_decode(ptr,
+                  used / 4, 
+                  batch->buf->offset,
+                  batch->chipset);
+
+      batch->sws->bo_unmap(batch->buf);
    }
 
    if (BRW_DEBUG & DEBUG_SYNC) {
+      /* Abuse map/unmap to achieve wait-for-fence.
+       *
+       * XXX: hide this inside the winsys and export a fence
+       * interface.
+       */
       debug_printf("waiting for idle\n");
-      dri_bo_map(batch->buf, GL_TRUE);
-      dri_bo_unmap(batch->buf);
+      batch->sws->bo_map(batch->buf, GL_TRUE);
+      batch->sws->bo_unmap(batch->buf);
    }
 
    /* Reset the buffer:
@@ -155,9 +165,10 @@ _brw_batchbuffer_flush(struct brw_batchbuffer *batch, const char *file,
 }
 
 
-/*  This is the only way buffers get added to the validate list.
+/* The OUT_RELOC() macro ends up here, generating a relocation within
+ * the batch buffer.
  */
-GLboolean
+enum pipe_error
 brw_batchbuffer_emit_reloc(struct brw_batchbuffer *batch,
                              struct brw_winsys_buffer *buffer,
                              uint32_t read_domains, uint32_t write_domain,
@@ -165,9 +176,12 @@ brw_batchbuffer_emit_reloc(struct brw_batchbuffer *batch,
 {
    int ret;
 
-   if (batch->ptr - batch->map > batch->buf->size)
-      debug_printf ("bad relocation ptr %p map %p offset %d size %d\n",
-                   batch->ptr, batch->map, batch->ptr - batch->map, batch->buf->size);
+   if (batch->ptr - batch->map > batch->buf->size) {
+      debug_printf("bad relocation ptr %p map %p offset %d size %d\n",
+                  batch->ptr, batch->map, batch->ptr - batch->map, batch->buf->size);
+
+      return PIPE_ERROR_OUT_OF_MEMORY;
+   }
 
    ret = batch->sws->bo_emit_reloc(batch->buf,
                                   read_domains,
@@ -175,6 +189,8 @@ brw_batchbuffer_emit_reloc(struct brw_batchbuffer *batch,
                                   delta, 
                                   batch->ptr - batch->map,
                                   buffer);
+   if (ret != 0)
+      return ret;
 
    /*
     * Using the old buffer offset, write in what the right data would be, in case
@@ -182,17 +198,23 @@ brw_batchbuffer_emit_reloc(struct brw_batchbuffer *batch,
     * in the kernel
     */
    brw_batchbuffer_emit_dword (batch, buffer->offset + delta);
-
-   return GL_TRUE;
+   return 0;
 }
 
-void
+enum pipe_error
 brw_batchbuffer_data(struct brw_batchbuffer *batch,
                        const void *data, GLuint bytes,
                       enum cliprect_mode cliprect_mode)
 {
+   enum pipe_error ret;
+
    assert((bytes & 3) == 0);
-   brw_batchbuffer_require_space(batch, bytes);
+
+   ret = brw_batchbuffer_require_space(batch, bytes);
+   if (ret)
+      return ret;
+
    __memcpy(batch->ptr, data, bytes);
    batch->ptr += bytes;
+   return 0;
 }
diff --git a/src/gallium/drivers/i965/brw_bo.c b/src/gallium/drivers/i965/brw_bo.c
deleted file mode 100644 (file)
index e7a4dac..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-void brw_buffer_subdata()
-{
-      if (intel->intelScreen->kernel_exec_fencing) {
-        drm_intel_gem_bo_map_gtt(bo);
-        memcpy((char *)bo->virtual + offset, index_buffer->ptr, ib_size);
-        drm_intel_gem_bo_unmap_gtt(bo);
-      } else {
-        dri_bo_subdata(bo, offset, ib_size, index_buffer->ptr);
-      }
-}
index 471855ab63c7607d3edb64b1249c64a69c427543..3e9315c41f02e98cdeeea8fe3cb79020c7447db0 100644 (file)
@@ -169,6 +169,7 @@ struct brw_fragment_shader {
    struct tgsi_shader_info info;
 
    unsigned iz_lookup;
+   //unsigned wm_lookup;
    
    boolean  uses_depth:1;
    boolean  has_flow_control:1;
index d3bb882b1aa6e7b841e405cd1a39cf88c8fa0397..cc9ee2e8dbc5500e52b9bc003d09edbb0775ab44 100644 (file)
@@ -130,6 +130,11 @@ static void *brw_create_blend_state( struct pipe_context *pipe,
         (blend->cc6.dest_blend_factor != blend->cc5.ia_dest_blend_factor ||
          blend->cc6.src_blend_factor != blend->cc5.ia_src_blend_factor ||
          blend->cc6.blend_function != blend->cc5.ia_blend_function);
+
+      /* Per-surface blend enables, currently just follow global
+       * state:
+       */
+      blend->ss0.color_blend = 1;
    }
 
    blend->cc5.dither_enable = templ->dither;
@@ -137,6 +142,13 @@ static void *brw_create_blend_state( struct pipe_context *pipe,
    if (BRW_DEBUG & DEBUG_STATS)
       blend->cc5.statistics_enable = 1;
 
+   /* Per-surface color mask -- just follow global state:
+    */
+   blend->ss0.writedisable_red   = (templ->colormask & PIPE_MASK_R) ? 1 : 0;
+   blend->ss0.writedisable_green = (templ->colormask & PIPE_MASK_G) ? 1 : 0;
+   blend->ss0.writedisable_blue  = (templ->colormask & PIPE_MASK_B) ? 1 : 0;
+   blend->ss0.writedisable_alpha = (templ->colormask & PIPE_MASK_A) ? 1 : 0;
+
    return (void *)blend;
 }
 
index fb4a784de9d5280ec507173d4c2bdde8f348c064..1b43428760d14f8551d409f1232323be3438192e 100644 (file)
@@ -1,11 +1,15 @@
 
+#include "util/u_upload_mgr.h"
+
+#include "brw_context.h"
+
+
 /**
  * called from brw_batchbuffer_flush and children before sending a
  * batchbuffer off.
  */
-static void brw_finish_batch(struct intel_context *intel)
+static void brw_finish_batch(struct brw_context *brw)
 {
-   struct brw_context *brw = brw_context(&intel->ctx);
    brw_emit_query_end(brw);
 }
 
@@ -15,9 +19,6 @@ static void brw_finish_batch(struct intel_context *intel)
  */
 static void brw_new_batch( struct brw_context *brw )
 {
-   /* Check that we didn't just wrap our batchbuffer at a bad time. */
-   assert(!brw->no_batch_wrap);
-
    brw->curbe.need_new_bo = GL_TRUE;
 
    /* Mark all context state as needing to be re-emitted.
@@ -33,17 +34,9 @@ static void brw_new_batch( struct brw_context *brw )
    /* Move to the end of the current upload buffer so that we'll force choosing
     * a new buffer next time.
     */
-   if (brw->vb.upload.bo != NULL) {
-      brw->sws->bo_unreference(brw->vb.upload.bo);
-      brw->vb.upload.bo = NULL;
-      brw->vb.upload.offset = 0;
-   }
-}
-
+   u_upload_flush( brw->vb.upload_vertex );
+   u_upload_flush( brw->vb.upload_index );
 
-static void brw_note_fence( struct brw_context *brw, GLuint fence )
-{
-   brw_context(&intel->ctx)->state.dirty.brw |= BRW_NEW_FENCE;
 }
 
 /* called from intelWaitForIdle() and intelFlush()
@@ -52,7 +45,7 @@ static void brw_note_fence( struct brw_context *brw, GLuint fence )
  */
 static GLuint brw_flush_cmd( void )
 {
-   return ((CMD_MI_FLUSH << 16) | BRW_FLUSH_STATE_CACHE);
+   return ((MI_FLUSH << 16) | BRW_FLUSH_STATE_CACHE);
 }
 
 
index 6e37eac634344484df0e0e1a0445def0a9990463..2422f77f345f3532b367993ef17aff1350f69861 100644 (file)
   * Authors:
   *   Keith Whitwell <keith@tungstengraphics.com>
   */
+
+#include "util/u_memory.h"
   
+#include "tgsi/tgsi_parse.h"
+#include "tgsi/tgsi_scan.h"
+
 #include "brw_context.h"
 #include "brw_util.h"
 #include "brw_wm.h"
 
 
 /**
- * Determine if the given fragment program uses GLSL features such
- * as flow conditionals, loops, subroutines.
- * Some GLSL shaders may use these features, others might not.
+ * Determine if the given shader uses complex features such as flow
+ * conditionals, loops, subroutines.
  */
 GLboolean brw_wm_has_flow_control(const struct brw_fragment_shader *fp)
 {
-    return (fp->info.insn_count[TGSI_OPCODE_ARL] > 0 ||
-           fp->info.insn_count[TGSI_OPCODE_IF] > 0 ||
-           fp->info.insn_count[TGSI_OPCODE_ENDIF] > 0 || /* redundant - IF */
-           fp->info.insn_count[TGSI_OPCODE_CAL] > 0 ||
-           fp->info.insn_count[TGSI_OPCODE_BRK] > 0 ||   /* redundant - BGNLOOP */
-           fp->info.insn_count[TGSI_OPCODE_RET] > 0 ||   /* redundant - CAL */
-           fp->info.insn_count[TGSI_OPCODE_BGNLOOP] > 0);
+    return (fp->info.opcode_count[TGSI_OPCODE_ARL] > 0 ||
+           fp->info.opcode_count[TGSI_OPCODE_IF] > 0 ||
+           fp->info.opcode_count[TGSI_OPCODE_ENDIF] > 0 || /* redundant - IF */
+           fp->info.opcode_count[TGSI_OPCODE_CAL] > 0 ||
+           fp->info.opcode_count[TGSI_OPCODE_BRK] > 0 ||   /* redundant - BGNLOOP */
+           fp->info.opcode_count[TGSI_OPCODE_RET] > 0 ||   /* redundant - CAL */
+           fp->info.opcode_count[TGSI_OPCODE_BGNLOOP] > 0);
 }
 
 
 
-static void brwBindProgram( struct brw_context *brw,
-                           GLenum target, 
-                           struct gl_program *prog )
+static void brw_bind_fs_state( struct pipe_context *pipe, void *prog )
 {
-   struct brw_context *brw = brw_context(ctx);
-
-   switch (target) {
-   case GL_VERTEX_PROGRAM_ARB: 
-      brw->state.dirty.brw |= BRW_NEW_VERTEX_PROGRAM;
-      break;
-   case GL_FRAGMENT_PROGRAM_ARB:
-      brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
-      break;
-   }
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->curr.fragment_shader = (struct brw_fragment_shader *)prog;
+   brw->state.dirty.mesa |= PIPE_NEW_FRAGMENT_SHADER;
 }
 
-static struct gl_program *brwNewProgram( structg brw_context *brw,
-                                     GLenum target, 
-                                     GLuint id )
+static void brw_bind_vs_state( struct pipe_context *pipe, void *prog )
 {
-   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 = brw->program_id++;
-
-        return _mesa_init_vertex_program( ctx, &prog->program,
-                                            target, id );
-      }
-      else
-        return NULL;
-   }
-
-   case GL_FRAGMENT_PROGRAM_ARB: {
-      struct brw_fragment_program *prog = CALLOC_STRUCT(brw_fragment_program);
-      if (prog) {
-        prog->id = brw->program_id++;
-
-        return _mesa_init_fragment_program( ctx, &prog->program,
-                                            target, id );
-      }
-      else
-        return NULL;
-   }
-
-   default:
-      return _mesa_new_program(ctx, target, id);
-   }
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->curr.vertex_shader = (struct brw_vertex_shader *)prog;
+   brw->state.dirty.mesa |= PIPE_NEW_VERTEX_SHADER;
 }
 
-static void brwDeleteProgram( struct brw_context *brw,
-                             struct gl_program *prog )
+
+
+static void *brw_create_fs_state( struct pipe_context *pipe,
+                                 const struct pipe_shader_state *shader )
 {
-   if (prog->Target == GL_FRAGMENT_PROGRAM_ARB) {
-      struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog;
-      struct brw_fragment_program *brw_fprog = brw_fragment_program(fprog);
-      brw->sws->bo_unreference(brw_fprog->const_buffer);
-   }
+   struct brw_context *brw = brw_context(pipe);
+   struct brw_fragment_shader *fs;
+   int i;
+
+   fs = CALLOC_STRUCT(brw_fragment_shader);
+   if (fs == NULL)
+      return NULL;
+
+   /* Duplicate tokens, scan shader
+    */
+   fs->id = brw->program_id++;
+   fs->has_flow_control = brw_wm_has_flow_control(fs);
+
+   fs->tokens = tgsi_dup_tokens(shader->tokens);
+   if (fs->tokens == NULL)
+      goto fail;
+
+   tgsi_scan_shader(fs->tokens, &fs->info);
+
+   for (i = 0; i < fs->info.num_inputs; i++)
+      if (fs->info.input_semantic_name[i] == TGSI_SEMANTIC_POSITION)
+        fs->uses_depth = 1;
+
+   if (fs->info.uses_kill)
+      fs->iz_lookup |= IZ_PS_KILL_ALPHATEST_BIT;
+
+   if (fs->info.writes_z)
+      fs->iz_lookup |= IZ_PS_COMPUTES_DEPTH_BIT;
+
+   return (void *)fs;
 
-   _mesa_delete_program( ctx, prog );
+fail:
+   FREE(fs);
+   return NULL;
 }
 
 
-static GLboolean brwIsProgramNative( struct brw_context *brw,
-                                    GLenum target, 
-                                    struct gl_program *prog )
+static void *brw_create_vs_state( struct pipe_context *pipe,
+                                 const struct pipe_shader_state *shader )
 {
-   return GL_TRUE;
+   struct brw_context *brw = brw_context(pipe);
+
+   struct brw_vertex_shader *vs = CALLOC_STRUCT(brw_vertex_shader);
+   if (vs == NULL)
+      return NULL;
+
+   /* Duplicate tokens, scan shader
+    */
+   vs->id = brw->program_id++;
+   //vs->has_flow_control = brw_wm_has_flow_control(vs);
+
+   /* Tell the draw module about this shader:
+    */
+   
+   /* Done:
+    */
+   return (void *)vs;
 }
 
-static void brwProgramStringNotify( struct brw_context *brw,
-                                   GLenum target,
-                                   struct gl_program *prog )
+
+static void brw_delete_fs_state( struct pipe_context *pipe, void *prog )
 {
-   struct brw_context *brw = brw_context(ctx);
-
-   if (target == GL_FRAGMENT_PROGRAM_ARB) {
-      struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog;
-      struct brw_fragment_program *newFP = brw_fragment_program(fprog);
-      const struct brw_fragment_program *curFP =
-         brw_fragment_program_const(brw->fragment_program);
-
-      if (fprog->FogOption) {
-         _mesa_append_fog_code(ctx, fprog);
-         fprog->FogOption = GL_NONE;
-      }
-
-      if (newFP == curFP)
-        brw->state.dirty.brw |= BRW_NEW_FRAGMENT_PROGRAM;
-      newFP->id = brw->program_id++;      
-      newFP->has_flow_control = brw_wm_has_flow_control(fprog);
-   }
-   else if (target == GL_VERTEX_PROGRAM_ARB) {
-      struct gl_vertex_program *vprog = (struct gl_vertex_program *) prog;
-      struct brw_vertex_program *newVP = brw_vertex_program(vprog);
-      const struct brw_vertex_program *curVP =
-         brw_vertex_program_const(brw->vertex_program);
-
-      if (newVP == curVP)
-        brw->state.dirty.brw |= BRW_NEW_VERTEX_PROGRAM;
-      if (newVP->program.IsPositionInvariant) {
-        _mesa_insert_mvp_code(ctx, &newVP->program);
-      }
-      newVP->id = brw->program_id++;      
-
-      /* Also tell tnl about it:
-       */
-      _tnl_program_string(ctx, target, prog);
-   }
+   struct brw_context *brw = brw_context(pipe);
+   struct brw_fragment_shader *fs = (struct brw_fragment_shader *)prog;
+
+   brw->sws->bo_unreference(fs->const_buffer);
+   FREE( (void *)fs->tokens );
+   FREE( fs );
 }
 
-void brwInitFragProgFuncs( struct dd_function_table *functions )
+
+static void brw_delete_vs_state( struct pipe_context *pipe, void *prog )
 {
-   assert(functions->ProgramStringNotify == _tnl_program_string); 
+   struct brw_fragment_shader *vs = (struct brw_fragment_shader *)prog;
 
-   functions->BindProgram = brwBindProgram;
-   functions->NewProgram = brwNewProgram;
-   functions->DeleteProgram = brwDeleteProgram;
-   functions->IsProgramNative = brwIsProgramNative;
-   functions->ProgramStringNotify = brwProgramStringNotify;
+   /* Delete draw shader
+    */
+   FREE( (void *)vs->tokens );
+   FREE( vs );
 }
 
+
+
+
+
+void brw_pipe_shader_init( struct brw_context *brw )
+{
+   brw->base.create_vs_state = brw_create_vs_state;
+   brw->base.bind_vs_state = brw_bind_vs_state;
+   brw->base.delete_vs_state = brw_delete_vs_state;
+
+   brw->base.create_fs_state = brw_create_fs_state;
+   brw->base.bind_fs_state = brw_bind_fs_state;
+   brw->base.delete_fs_state = brw_delete_fs_state;
+}
+
+void brw_pipe_shader_cleanup( struct brw_context *brw )
+{
+}