Merge commit 'origin/7.8'
[mesa.git] / src / mesa / drivers / dri / i965 / brw_curbe.c
index 190310afbb034f1e3002f44dffa392900785a8c3..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;
    }
@@ -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) {
@@ -256,25 +256,36 @@ static void prepare_constant_buffer(struct brw_context *brw)
        */
       _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 &&
@@ -282,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;
       }
@@ -307,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;
@@ -315,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);