Merge commit 'origin/7.8'
[mesa.git] / src / mesa / drivers / dri / i965 / brw_curbe.c
index a1a6c53d0e0de8a39f7cf2fe2c65ad37458958e1..4e78b08cfed3ec6b9b49b9b4731b6d8143f78f01 100644 (file)
@@ -114,13 +114,13 @@ static void calculate_curbe_offsets( struct brw_context *brw )
       brw->curbe.total_size = reg;
 
       if (0)
-        _mesa_printf("curbe wm %d+%d clip %d+%d vs %d+%d\n",
-                     brw->curbe.wm_start,
-                     brw->curbe.wm_size,
-                     brw->curbe.clip_start,
-                     brw->curbe.clip_size,
-                     brw->curbe.vs_start,
-                     brw->curbe.vs_size );
+        printf("curbe wm %d+%d clip %d+%d vs %d+%d\n",
+               brw->curbe.wm_start,
+               brw->curbe.wm_size,
+               brw->curbe.clip_start,
+               brw->curbe.clip_size,
+               brw->curbe.vs_start,
+               brw->curbe.vs_size );
 
       brw->state.dirty.brw |= BRW_NEW_CURBE_OFFSETS;
    }
@@ -130,7 +130,7 @@ static void calculate_curbe_offsets( struct brw_context *brw )
 const struct brw_tracked_state brw_curbe_offsets = {
    .dirty = {
       .mesa = _NEW_TRANSFORM,
-      .brw  = BRW_NEW_VERTEX_PROGRAM,
+      .brw  = BRW_NEW_VERTEX_PROGRAM | BRW_NEW_CONTEXT,
       .cache = CACHE_NEW_WM_PROG
    },
    .prepare = calculate_curbe_offsets
@@ -198,7 +198,7 @@ static void prepare_constant_buffer(struct brw_context *brw)
       return;
    }
 
-   buf = (GLfloat *) _mesa_calloc(bufsz);
+   buf = (GLfloat *) calloc(1, bufsz);
 
    /* fragment shader constants */
    if (brw->curbe.wm_size) {
@@ -248,27 +248,44 @@ static void prepare_constant_buffer(struct brw_context *brw)
       GLuint offset = brw->curbe.vs_start * 16;
       GLuint nr = brw->vs.prog_data->nr_params / 4;
 
+      if (brw->vertex_program->IsNVProgram)
+        _mesa_load_tracked_matrices(ctx);
+
+      /* Updates the ParamaterValues[i] pointers for all parameters of the
+       * basic type of PROGRAM_STATE_VAR.
+       */
       _mesa_load_state_parameters(ctx, vp->program.Base.Parameters); 
 
-      /* XXX just use a memcpy here */
-      for (i = 0; i < nr; i++) {
-         const GLfloat *value = vp->program.Base.Parameters->ParameterValues[i];
-        buf[offset + i * 4 + 0] = value[0];
-        buf[offset + i * 4 + 1] = value[1];
-        buf[offset + i * 4 + 2] = value[2];
-        buf[offset + i * 4 + 3] = value[3];
+      if (vp->use_const_buffer) {
+        /* Load the subset of push constants that will get used when
+         * we also have a pull constant buffer.
+         */
+        for (i = 0; i < vp->program.Base.Parameters->NumParameters; i++) {
+           if (brw->vs.constant_map[i] != -1) {
+              assert(brw->vs.constant_map[i] <= nr);
+              memcpy(buf + offset + brw->vs.constant_map[i] * 4,
+                     vp->program.Base.Parameters->ParameterValues[i],
+                     4 * sizeof(float));
+           }
+        }
+      } else {
+        for (i = 0; i < nr; i++) {
+           memcpy(buf + offset + i * 4,
+                  vp->program.Base.Parameters->ParameterValues[i],
+                  4 * sizeof(float));
+        }
       }
    }
 
    if (0) {
       for (i = 0; i < sz*16; i+=4) 
-        _mesa_printf("curbe %d.%d: %f %f %f %f\n", i/8, i&4,
-                     buf[i+0], buf[i+1], buf[i+2], buf[i+3]);
+        printf("curbe %d.%d: %f %f %f %f\n", i/8, i&4,
+               buf[i+0], buf[i+1], buf[i+2], buf[i+3]);
 
-      _mesa_printf("last_buf %p buf %p sz %d/%d cmp %d\n",
-                  brw->curbe.last_buf, buf,
-                  bufsz, brw->curbe.last_bufsz,
-                  brw->curbe.last_buf ? memcmp(buf, brw->curbe.last_buf, bufsz) : -1);
+      printf("last_buf %p buf %p sz %d/%d cmp %d\n",
+            brw->curbe.last_buf, buf,
+            bufsz, brw->curbe.last_bufsz,
+            brw->curbe.last_buf ? memcmp(buf, brw->curbe.last_buf, bufsz) : -1);
    }
 
    if (brw->curbe.curbe_bo != NULL &&
@@ -276,20 +293,20 @@ static void prepare_constant_buffer(struct brw_context *brw)
        bufsz == brw->curbe.last_bufsz &&
        memcmp(buf, brw->curbe.last_buf, bufsz) == 0) {
       /* constants have not changed */
-      _mesa_free(buf);
+      free(buf);
    } 
    else {
       /* constants have changed */
       if (brw->curbe.last_buf)
-        _mesa_free(brw->curbe.last_buf);
+        free(brw->curbe.last_buf);
 
       brw->curbe.last_buf = buf;
       brw->curbe.last_bufsz = bufsz;
 
       if (brw->curbe.curbe_bo != NULL &&
-         (brw->curbe.need_new_bo ||
-          brw->curbe.curbe_next_offset + bufsz > brw->curbe.curbe_bo->size))
+         brw->curbe.curbe_next_offset + bufsz > brw->curbe.curbe_bo->size)
       {
+        drm_intel_gem_bo_unmap_gtt(brw->curbe.curbe_bo);
         dri_bo_unreference(brw->curbe.curbe_bo);
         brw->curbe.curbe_bo = NULL;
       }
@@ -301,6 +318,7 @@ static void prepare_constant_buffer(struct brw_context *brw)
         brw->curbe.curbe_bo = dri_bo_alloc(brw->intel.bufmgr, "CURBE",
                                            4096, 1 << 6);
         brw->curbe.curbe_next_offset = 0;
+        drm_intel_gem_bo_map_gtt(brw->curbe.curbe_bo);
       }
 
       brw->curbe.curbe_offset = brw->curbe.curbe_next_offset;
@@ -309,7 +327,9 @@ static void prepare_constant_buffer(struct brw_context *brw)
 
       /* Copy data to the buffer:
        */
-      dri_bo_subdata(brw->curbe.curbe_bo, brw->curbe.curbe_offset, bufsz, buf);
+      memcpy(brw->curbe.curbe_bo->virtual + brw->curbe.curbe_offset,
+            buf,
+            bufsz);
    }
 
    brw_add_validated_bo(brw, brw->curbe.curbe_bo);
@@ -334,7 +354,7 @@ static void emit_constant_buffer(struct brw_context *brw)
    struct intel_context *intel = &brw->intel;
    GLuint sz = brw->curbe.total_size;
 
-   BEGIN_BATCH(2, IGNORE_CLIPRECTS);
+   BEGIN_BATCH(2);
    if (sz == 0) {
       OUT_BATCH((CMD_CONST_BUFFER << 16) | (2 - 2));
       OUT_BATCH(0);