virgl: Store the virgl_hw_res for copy transfers
[mesa.git] / src / gallium / drivers / virgl / virgl_streamout.c
index c449010e40e9f1563b6f787bfbfb7d2746d6ad83..edd5bc58f88292045e7b4f357938f719def8a915 100644 (file)
  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
-#include "util/u_memory.h"
 #include "util/u_inlines.h"
+#include "util/u_memory.h"
 #include "virgl_context.h"
 #include "virgl_encode.h"
+#include "virgl_protocol.h"
 #include "virgl_resource.h"
 
 static struct pipe_stream_output_target *virgl_create_so_target(
@@ -47,7 +48,12 @@ static struct pipe_stream_output_target *virgl_create_so_target(
    t->base.buffer_offset = buffer_offset;
    t->base.buffer_size = buffer_size;
    t->handle = handle;
-   res->clean = FALSE;
+
+   res->bind_history |= PIPE_BIND_STREAM_OUTPUT;
+   util_range_add(&res->valid_buffer_range, buffer_offset,
+                  buffer_offset + buffer_size);
+   virgl_resource_dirty(res, 0);
+
    virgl_encoder_create_so_target(vctx, handle, res, buffer_offset, buffer_size);
    return &t->base;
 }
@@ -71,7 +77,16 @@ static void virgl_set_so_targets(struct pipe_context *ctx,
    struct virgl_context *vctx = virgl_context(ctx);
    int i;
    for (i = 0; i < num_targets; i++) {
-      pipe_resource_reference(&vctx->so_targets[i].base.buffer, targets[i]->buffer);
+      if (targets[i]) {
+         struct virgl_winsys *vws = virgl_screen(vctx->base.screen)->vws;
+         struct virgl_resource *res = virgl_resource(targets[i]->buffer);
+
+         pipe_resource_reference(&vctx->so_targets[i].base.buffer, targets[i]->buffer);
+
+         vws->emit_res(vws, vctx->cbuf, res->hw_res, FALSE);
+      } else {
+         pipe_resource_reference(&vctx->so_targets[i].base.buffer, NULL);
+      }
    }
    for (i = num_targets; i < vctx->num_so_targets; i++)
       pipe_resource_reference(&vctx->so_targets[i].base.buffer, NULL);