virgl/vtest: deprecate protocol version 1
authorGurchetan Singh <gurchetansingh@chromium.org>
Fri, 14 Dec 2018 23:12:48 +0000 (15:12 -0800)
committerGert Wollny <gw.fossdev@gmail.com>
Wed, 27 Feb 2019 11:02:29 +0000 (11:02 +0000)
This is a partial revert of 9d81cd ("virgl: Pass resource size and
transfer offsets").

The adjustments made in the client code means there's various
mismatches when transfering data.

Let's fallback to protocol version 0 and deprecate protocol
version 1.  We can still use the protocol version 1 slots for
a shared memory transfer mechanism later.

Fixes:
  dEQP-GLES31.functional.copy_image.mixed.viewclass_128_bits_mixed.*_renderbuffer

Reviewed-By: Gert Wollny <gert.wollny@collabora.com>
src/gallium/winsys/virgl/vtest/virgl_vtest_socket.c
src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.c
src/gallium/winsys/virgl/vtest/virgl_vtest_winsys.h
src/gallium/winsys/virgl/vtest/vtest_protocol.h

index 00a197a0069bac832128895a4b013d04b4474622..410cfa2cc046a235322dfd1fbb41d45b3e34f513 100644 (file)
@@ -173,6 +173,11 @@ int virgl_vtest_connect(struct virgl_vtest_winsys *vws)
    vws->sock_fd = sock;
    virgl_vtest_send_init(vws);
    vws->protocol_version = virgl_vtest_negotiate_version(vws);
+
+   /* Version 1 is deprecated. */
+   if (vws->protocol_version == 1)
+      vws->protocol_version = 0;
+
    return 0;
 }
 
@@ -270,7 +275,7 @@ int virgl_vtest_send_resource_create(struct virgl_vtest_winsys *vws,
 {
    uint32_t res_create_buf[VCMD_RES_CREATE_SIZE], vtest_hdr[VTEST_HDR_SIZE];
 
-   if (vws->protocol_version >= 1)
+   if (vws->protocol_version >= 2)
       return virgl_vtest_send_resource_create2(vws, handle, target, format,
                                                bind, width, height, depth,
                                                array_size, last_level,
@@ -400,7 +405,7 @@ int virgl_vtest_send_transfer_get(struct virgl_vtest_winsys *vws,
                                   uint32_t data_size,
                                   uint32_t offset)
 {
-   if (vws->protocol_version < 1)
+   if (vws->protocol_version < 2)
       return virgl_vtest_send_transfer_cmd(vws, VCMD_TRANSFER_GET, handle,
                                            level, stride, layer_stride, box,
                                            data_size);
@@ -417,7 +422,7 @@ int virgl_vtest_send_transfer_put(struct virgl_vtest_winsys *vws,
                                   uint32_t data_size,
                                   uint32_t offset)
 {
-   if (vws->protocol_version < 1)
+   if (vws->protocol_version < 2)
       return virgl_vtest_send_transfer_cmd(vws, VCMD_TRANSFER_PUT, handle,
                                            level, stride, layer_stride, box,
                                            data_size);
@@ -438,27 +443,20 @@ int virgl_vtest_recv_transfer_get_data(struct virgl_vtest_winsys *vws,
                                        uint32_t data_size,
                                        uint32_t stride,
                                        const struct pipe_box *box,
-                                       uint32_t format, uint32_t res_stride)
+                                       uint32_t format)
 {
-   char *ptr = data;
-   uint32_t bytes_to_read = data_size;
-   char dump[1024];
-
-   /* Copy the date from the IOV to the target resource respecting
-    * the different strides */
-   for (int y = 0 ; y < box->height && bytes_to_read > 0; ++y) {
-      uint32_t btr = MIN2(res_stride, bytes_to_read);
-      virgl_block_read(vws->sock_fd, ptr, btr);
+   void *line;
+   void *ptr = data;
+   int hblocks = util_format_get_nblocksy(format, box->height);
+
+   line = malloc(stride);
+   while (hblocks) {
+      virgl_block_read(vws->sock_fd, line, stride);
+      memcpy(ptr, line, util_format_get_stride(format, box->width));
       ptr += stride;
-      bytes_to_read -= btr;
-   }
-
-   /* It seems that there may be extra bytes that need to be read */
-   while (bytes_to_read > 0 && bytes_to_read < data_size) {
-      uint32_t btr = MIN2(sizeof(dump), bytes_to_read);
-      virgl_block_read(vws->sock_fd, dump, btr);
-      bytes_to_read -= btr;
+      hblocks--;
    }
+   free(line);
    return 0;
 }
 
index 479a98fe499a66b36217b1289f029436e6663855..bc65ef3d22a28e082096e10eea236b0053684e31 100644 (file)
@@ -79,16 +79,6 @@ virgl_vtest_transfer_put(struct virgl_winsys *vws,
    size = vtest_get_transfer_size(res, box, stride, layer_stride, level,
                                   &valid_stride);
 
-   /* The size calculated above is the full box size, but if this box origin
-    * is not zero we may have to correct the transfer size to not read past the
-    * end of the resource. The correct adjustment depends on various factors
-    * that are not documented, so instead of going though all the hops to get
-    * the size right up-front, we just make sure we don't read past the end.
-    * FIXME: figure out what it takes to actually get this right.
-    */
-   if (size + buf_offset > res->size)
-      size = res->size - buf_offset;
-
    virgl_vtest_send_transfer_put(vtws, res->res_handle,
                                  level, stride, layer_stride,
                                  box, size, buf_offset);
@@ -112,21 +102,14 @@ virgl_vtest_transfer_get(struct virgl_winsys *vws,
 
    size = vtest_get_transfer_size(res, box, stride, layer_stride, level,
                                   &valid_stride);
-   /* Don't ask for more pixels than available (see above) */
-   if (size + buf_offset > res->size)
-      size = res->size - buf_offset;
-
    virgl_vtest_send_transfer_get(vtws, res->res_handle,
                                  level, stride, layer_stride,
                                  box, size, buf_offset);
 
    ptr = virgl_vtest_resource_map(vws, res);
 
-   /* This functions seems to be using a specific transfer resource that
-    * has exactly the box size and hence its src stride is equal to the target
-    * stride */
    virgl_vtest_recv_transfer_get_data(vtws, ptr + buf_offset, size,
-                                      valid_stride, box, res->format, valid_stride);
+                                      valid_stride, box, res->format);
 
    virgl_vtest_resource_unmap(vws, res);
    return 0;
@@ -644,8 +627,7 @@ static void virgl_vtest_flush_frontbuffer(struct virgl_winsys *vws,
     * a hardware imposed stride that is different from the IOV stride used to
     * get the data. */
    virgl_vtest_recv_transfer_get_data(vtws, map + offset, size, valid_stride,
-                                      &box, res->format,
-                                      vtws->protocol_version == 0 ? valid_stride : util_format_get_stride(res->format, res->width));
+                                      &box, res->format);
 
    vtws->sws->displaytarget_unmap(vtws->sws, res->dt);
 
index e51582032a36dbe9ec35e2a065d295c36a84b734..012aa1c98b153e915520a3ff33b60773693e1066 100644 (file)
@@ -153,7 +153,7 @@ int virgl_vtest_recv_transfer_get_data(struct virgl_vtest_winsys *vws,
                                        uint32_t data_size,
                                        uint32_t stride,
                                        const struct pipe_box *box,
-                                       uint32_t format, uint32_t res_width);
+                                       uint32_t format);
 
 int virgl_vtest_busy_wait(struct virgl_vtest_winsys *vws, int handle,
                           int flags);
index c299c31418d19a5e1ba770c15679fe5149eea16f..9b39020c0ae632a9f0a66cf0cf7f81b64b28f0d7 100644 (file)
@@ -24,7 +24,7 @@
 #define VTEST_PROTOCOL
 
 #define VTEST_DEFAULT_SOCKET_NAME "/tmp/.virgl_test"
-#define VTEST_PROTOCOL_VERSION 1
+#define VTEST_PROTOCOL_VERSION 0
 
 /* 32-bit length field */
 /* 32-bit cmd field */