nv50/ir/nir: make use of SYSTEM_VALUE_MAX when iterating read sysvals
[mesa.git] / src / gallium / drivers / virgl / virgl_texture.c
index f0a2465021c0cfcef2a3ba91c37bcdfc281829b0..19ae6ff1d3aeafe7c3db192499eb8bf31f19ce33 100644 (file)
@@ -126,6 +126,7 @@ static void *texture_transfer_map_plain(struct pipe_context *ctx,
    struct virgl_winsys *vws = virgl_screen(ctx->screen)->vws;
    struct virgl_resource *vtex = virgl_resource(resource);
    struct virgl_transfer *trans;
+   bool flush, readback;
 
    trans = virgl_resource_create_transfer(&vctx->transfer_pool, resource,
                                           &vtex->metadata, level, usage, box);
@@ -133,24 +134,26 @@ static void *texture_transfer_map_plain(struct pipe_context *ctx,
 
    assert(resource->nr_samples <= 1);
 
-   if (virgl_res_needs_flush(vctx, trans))
+   flush = virgl_res_needs_flush(vctx, trans);
+   if (flush)
       ctx->flush(ctx, NULL, 0);
 
-   if (virgl_res_needs_readback(vctx, vtex, usage, level)) {
+   readback = virgl_res_needs_readback(vctx, vtex, usage, level);
+   if (readback)
       vws->transfer_get(vws, vtex->hw_res, box, trans->base.stride,
                         trans->l_stride, trans->offset, level);
 
+   if (readback || flush)
       vws->resource_wait(vws, vtex->hw_res);
-   }
 
-   void *ptr = vws->resource_map(vws, vtex->hw_res);
-   if (!ptr) {
+   trans->hw_res_map = vws->resource_map(vws, vtex->hw_res);
+   if (!trans->hw_res_map) {
       virgl_resource_destroy_transfer(&vctx->transfer_pool, trans);
       return NULL;
    }
 
    *transfer = &trans->base;
-   return ptr + trans->offset;
+   return trans->hw_res_map + trans->offset;
 }
 
 static void *texture_transfer_map_resolve(struct pipe_context *ctx,