radeonsi: pass llvm type directly to buffer_load()
[mesa.git] / src / gallium / drivers / virgl / virgl_resource.c
index 758dd6b3e4b803aeaa6a9aed16f2148101f042dd..db5e7dd61af2d87eba7561ff44c7147f53c4c4c6 100644 (file)
@@ -21,8 +21,9 @@
  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 #include "util/u_inlines.h"
-#include "virgl_resource.h"
 #include "virgl_context.h"
+#include "virgl_resource.h"
+#include "virgl_screen.h"
 
 bool virgl_res_needs_flush_wait(struct virgl_context *vctx,
                                 struct virgl_resource *res,
@@ -54,7 +55,7 @@ bool virgl_res_needs_readback(struct virgl_context *vctx,
 static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen,
                                                    const struct pipe_resource *templ)
 {
-    struct virgl_screen *vs = (struct virgl_screen *)screen;
+    struct virgl_screen *vs = virgl_screen(screen);
     if (templ->target == PIPE_BUFFER)
         return virgl_buffer_create(vs, templ);
     else
@@ -63,9 +64,10 @@ static struct pipe_resource *virgl_resource_create(struct pipe_screen *screen,
 
 static struct pipe_resource *virgl_resource_from_handle(struct pipe_screen *screen,
                                                         const struct pipe_resource *templ,
-                                                        struct winsys_handle *whandle)
+                                                        struct winsys_handle *whandle,
+                                                        unsigned usage)
 {
-    struct virgl_screen *vs = (struct virgl_screen *)screen;
+    struct virgl_screen *vs = virgl_screen(screen);
     if (templ->target == PIPE_BUFFER)
         return NULL;
     else
@@ -80,10 +82,27 @@ void virgl_init_screen_resource_functions(struct pipe_screen *screen)
     screen->resource_destroy = u_resource_destroy_vtbl;
 }
 
+static void virgl_buffer_subdata(struct pipe_context *pipe,
+                                 struct pipe_resource *resource,
+                                 unsigned usage, unsigned offset,
+                                 unsigned size, const void *data)
+{
+   struct pipe_box box;
+
+   if (offset == 0 && size == resource->width0)
+      usage |= PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE;
+   else
+      usage |= PIPE_TRANSFER_DISCARD_RANGE;
+
+   u_box_1d(offset, size, &box);
+   virgl_transfer_inline_write(pipe, resource, 0, usage, &box, data, 0, 0);
+}
+
 void virgl_init_context_resource_functions(struct pipe_context *ctx)
 {
     ctx->transfer_map = u_transfer_map_vtbl;
     ctx->transfer_flush_region = u_transfer_flush_region_vtbl;
     ctx->transfer_unmap = u_transfer_unmap_vtbl;
-    ctx->transfer_inline_write = u_transfer_inline_write_vtbl;
+    ctx->buffer_subdata = virgl_buffer_subdata;
+    ctx->texture_subdata = u_default_texture_subdata;
 }