st/mesa: unbind constant buffer when not in use
authorKeith Whitwell <keithw@vmware.com>
Tue, 2 Nov 2010 16:29:10 +0000 (16:29 +0000)
committerKeith Whitwell <keithw@vmware.com>
Tue, 2 Nov 2010 16:57:24 +0000 (16:57 +0000)
Important as more constant buffers per shader start to get used.

Fix up r600 (tested) and nv50 (untested) to cope with this.  Drivers
previously didn't see unbinds of constant buffers often or ever, so
this isn't always dealt with cleanly.

For r600 just return and keep the reference.  Will try to do better in
a followup change.

src/gallium/drivers/nv50/nv50_shader_state.c
src/gallium/drivers/r600/r600_state.c
src/mesa/state_tracker/st_atom_constbuf.c

index 6c41e8f4561fec99d371d771ee09495b9d3f1be4..306aa81d9859cd71a07a2279c0eb384a6453ed4b 100644 (file)
@@ -39,6 +39,9 @@ nv50_transfer_constbuf(struct nv50_context *nv50,
    uint32_t *map;
    unsigned count, start;
 
+   if (buf == NULL)
+      return;
+
    map = pipe_buffer_map(pipe, buf, PIPE_TRANSFER_READ, &transfer);
    if (!map)
       return;
index b3e0d4932178341e0c479f3225c33a03f75205a6..ccd74210b785a8f399c3c5cbd487e37be8dc28ee 100644 (file)
@@ -1018,6 +1018,13 @@ static void r600_set_constant_buffer(struct pipe_context *ctx, uint shader, uint
        struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
        struct r600_resource *rbuffer = (struct r600_resource*)buffer;
 
+       /* Note that the state tracker can unbind constant buffers by
+        * passing NULL here.
+        */
+       if (buffer == NULL) {
+               return;
+       }
+
        switch (shader) {
        case PIPE_SHADER_VERTEX:
                rctx->vs_const_buffer.nregs = 0;
index 6f9d71e845b2909ba6b36bc9e76e4414812da1ae..8d1dc792bc84fb525b3e07963eedcfd49fbee3e0 100644 (file)
@@ -90,8 +90,11 @@ void st_upload_constants( struct st_context *st,
 
       st->pipe->set_constant_buffer(st->pipe, shader_type, 0, *cbuf);
    }
-   else {
+   else if (*cbuf) {
       st->constants.tracked_state[shader_type].dirty.mesa = 0x0;
+
+      pipe_resource_reference(cbuf, NULL);
+      st->pipe->set_constant_buffer(st->pipe, shader_type, 0, NULL);
    }
 }