svga->state.hw_draw.num_vbuffers = 0;
memset(svga->state.hw_draw.vbuffers, 0,
sizeof(svga->state.hw_draw.vbuffers));
+ svga->state.hw_draw.const0_buffer = NULL;
+ svga->state.hw_draw.const0_handle = NULL;
/* Create a no-operation blend state which we will bind whenever the
* requested blend state is impossible (e.g. due to having an integer
svga->curr.nr_fbs = 0;
+ /* Unmap the 0th/default constant buffer. The u_upload_unmap() function
+ * will call pipe_context::transfer_flush_region() to indicate the
+ * region of the buffer which was modified (and needs to be uploaded).
+ */
+ if (svga->state.hw_draw.const0_handle) {
+ assert(svga->state.hw_draw.const0_buffer);
+ u_upload_unmap(svga->const0_upload);
+ pipe_resource_reference(&svga->state.hw_draw.const0_buffer, NULL);
+ svga->state.hw_draw.const0_handle = NULL;
+ }
+
/* Ensure that texture dma uploads are processed
* before submitting commands.
*/
/** Bitmask of enabled constant buffers */
unsigned enabled_constbufs[PIPE_SHADER_TYPES];
+ /**
+ * These are used to reduce the number of times we call u_upload_unmap()
+ * while updating the zero-th/default VGPU10 constant buffer.
+ */
+ struct pipe_resource *const0_buffer;
+ struct svga_winsys_surface *const0_handle;
+
/** VGPU10 HW state (used to prevent emitting redundant state) */
SVGA3dDepthStencilStateId depth_stencil_id;
unsigned stencil_ref;
assert(extra_offset + extra_size <= new_buf_size);
memcpy((char *) dst_map + extra_offset, extras, extra_size);
}
- u_upload_unmap(svga->const0_upload);
- /* Issue the SetSingleConstantBuffer command */
- dst_handle = svga_buffer_handle(svga, dst_buffer);
- if (!dst_handle) {
- pipe_resource_reference(&dst_buffer, NULL);
- return PIPE_ERROR_OUT_OF_MEMORY;
+ /* Get winsys handle for the constant buffer */
+ if (svga->state.hw_draw.const0_buffer == dst_buffer &&
+ svga->state.hw_draw.const0_handle) {
+ /* re-reference already mapped buffer */
+ dst_handle = svga->state.hw_draw.const0_handle;
+ }
+ else {
+ /* we must unmap the buffer before getting the winsys handle */
+ u_upload_unmap(svga->const0_upload);
+
+ dst_handle = svga_buffer_handle(svga, dst_buffer);
+ if (!dst_handle) {
+ pipe_resource_reference(&dst_buffer, NULL);
+ return PIPE_ERROR_OUT_OF_MEMORY;
+ }
+
+ /* save the buffer / handle for next time */
+ pipe_resource_reference(&svga->state.hw_draw.const0_buffer, dst_buffer);
+ svga->state.hw_draw.const0_handle = dst_handle;
}
+ /* Issue the SetSingleConstantBuffer command */
assert(new_buf_size % 16 == 0);
ret = SVGA3D_vgpu10_SetSingleConstantBuffer(svga->swc,
0, /* index */