u_blitter: add a msaa parameter to util_blitter_clear
[mesa.git] / src / gallium / drivers / svga / svga_pipe_streamout.c
index 3f443c44eee42d83c5f31d57b116a79ea6e7befc..0c6c034751cac810b600515edfdce7d6fbed4d88 100644 (file)
@@ -92,7 +92,8 @@ svga_create_stream_output(struct svga_context *svga,
    for (i = 0; i < info->num_outputs; i++) {
       unsigned reg_idx = info->output[i].register_index;
       unsigned buf_idx = info->output[i].output_buffer;
-      const unsigned sem_name = shader->info.output_semantic_name[reg_idx];
+      const enum tgsi_semantic sem_name =
+         shader->info.output_semantic_name[reg_idx];
 
       assert(buf_idx <= PIPE_MAX_SO_BUFFERS);
 
@@ -157,7 +158,6 @@ enum pipe_error
 svga_set_stream_output(struct svga_context *svga,
                        struct svga_stream_output *streamout)
 {
-   enum pipe_error ret = PIPE_OK;
    unsigned id = streamout ? streamout->id : SVGA3D_INVALID_ID;
 
    if (!svga_have_vgpu10(svga)) {
@@ -168,17 +168,15 @@ svga_set_stream_output(struct svga_context *svga,
             streamout, id);
 
    if (svga->current_so != streamout) {
-      /* Save current SO state */
-      svga->current_so = streamout;
-
-      ret = SVGA3D_vgpu10_SetStreamOutput(svga->swc, id);
+      enum pipe_error ret = SVGA3D_vgpu10_SetStreamOutput(svga->swc, id);
       if (ret != PIPE_OK) {
-         svga_context_flush(svga, NULL);
-         ret = SVGA3D_vgpu10_SetStreamOutput(svga->swc, id);
+         return ret;
       }
+
+      svga->current_so = streamout;
    }
 
-   return ret;
+   return PIPE_OK;
 }
 
 void
@@ -276,13 +274,14 @@ svga_set_stream_output_targets(struct pipe_context *pipe,
    for (i = 0; i < num_targets; i++) {
       struct svga_stream_output_target *sot
          = svga_stream_output_target(targets[i]);
-      struct svga_buffer *sbuf = svga_buffer(sot->base.buffer);
       unsigned size;
 
-      assert(sbuf->key.flags & SVGA3D_SURFACE_BIND_STREAM_OUTPUT);
-      (void) sbuf;
+      svga->so_surfaces[i] = svga_buffer_handle(svga, sot->base.buffer,
+                                                PIPE_BIND_STREAM_OUTPUT);
+
+      assert(svga_buffer(sot->base.buffer)->key.flags
+             & SVGA3D_SURFACE_BIND_STREAM_OUTPUT);
 
-      svga->so_surfaces[i] = svga_buffer_handle(svga, sot->base.buffer);
       svga->so_targets[i] = &sot->base;
       soBindings[i].offset = sot->base.buffer_offset;
 
@@ -311,6 +310,25 @@ svga_set_stream_output_targets(struct pipe_context *pipe,
    svga->num_so_targets = num_targets;
 }
 
+/**
+ * Rebind stream output target surfaces
+ */
+enum pipe_error
+svga_rebind_stream_output_targets(struct svga_context *svga)
+{
+   struct svga_winsys_context *swc = svga->swc;
+   enum pipe_error ret;
+   unsigned i;
+
+   for (i = 0; i < svga->num_so_targets; i++) {
+      ret = swc->resource_rebind(swc, svga->so_surfaces[i], NULL, SVGA_RELOC_WRITE);
+      if (ret != PIPE_OK)
+         return ret;
+   }
+
+   return PIPE_OK;
+}
+
 void
 svga_init_stream_output_functions(struct svga_context *svga)
 {