radeonsi: emit TA_BC_BASE_ADDR_HI for border color on CIK
[mesa.git] / src / gallium / drivers / i915 / i915_resource_texture.c
index e60b5b435cc2b7170835d556d2bb5dc2f8e8b464..3d6179495d28aac1adc9b8ad4e73cdeb7ecb2c12 100644 (file)
@@ -705,23 +705,27 @@ i915_texture_destroy(struct pipe_screen *screen,
       iws->buffer_destroy(iws, tex->buffer);
 
    for (i = 0; i < Elements(tex->image_offset); i++)
-      if (tex->image_offset[i])
-         FREE(tex->image_offset[i]);
+      FREE(tex->image_offset[i]);
 
    FREE(tex);
 }
 
-static struct pipe_transfer *
-i915_texture_get_transfer(struct pipe_context *pipe,
+static void *
+i915_texture_transfer_map(struct pipe_context *pipe,
                           struct pipe_resource *resource,
                           unsigned level,
                           unsigned usage,
-                          const struct pipe_box *box)
+                          const struct pipe_box *box,
+                          struct pipe_transfer **ptransfer)
 {
    struct i915_context *i915 = i915_context(pipe);
    struct i915_texture *tex = i915_texture(resource);
    struct i915_transfer *transfer = util_slab_alloc(&i915->texture_transfer_pool);
    boolean use_staging_texture = FALSE;
+   struct i915_winsys *iws = i915_screen(pipe->screen)->iws;
+   enum pipe_format format = resource->format;
+   unsigned offset;
+   char *map;
 
    if (transfer == NULL)
       return NULL;
@@ -734,7 +738,6 @@ i915_texture_get_transfer(struct pipe_context *pipe,
    transfer->staging_texture = NULL;
    /* XXX: handle depth textures everyhwere*/
    transfer->b.layer_stride = 0;
-   transfer->b.data = NULL;
 
    /* if we use staging transfers, only support textures we can render to,
     * because we need that for u_blitter */
@@ -755,67 +758,32 @@ i915_texture_get_transfer(struct pipe_context *pipe,
       transfer->staging_texture = i915_texture_create(pipe->screen, resource, TRUE);
    }
 
-   return (struct pipe_transfer*)transfer;
-}
-
-static void
-i915_transfer_destroy(struct pipe_context *pipe,
-                      struct pipe_transfer *transfer)
-{
-   struct i915_context *i915 = i915_context(pipe);
-   struct i915_transfer *itransfer = (struct i915_transfer*)transfer;
-
-   if ((itransfer->staging_texture) &&
-       (transfer->usage & PIPE_TRANSFER_WRITE)) {
-      struct pipe_box sbox;
-
-      u_box_origin_2d(itransfer->b.box.width, itransfer->b.box.height, &sbox);
-      pipe->resource_copy_region(pipe, itransfer->b.resource, itransfer->b.level,
-                                   itransfer->b.box.x, itransfer->b.box.y, itransfer->b.box.z,
-                                   itransfer->staging_texture,
-                                   0, &sbox);
-      pipe->flush(pipe, NULL);
-      pipe_resource_reference(&itransfer->staging_texture, NULL);
-   }
-
-   util_slab_free(&i915->texture_transfer_pool, itransfer);
-}
-
-static void *
-i915_texture_transfer_map(struct pipe_context *pipe,
-                          struct pipe_transfer *transfer)
-{
-   struct i915_transfer *itransfer = (struct i915_transfer*)transfer;
-   struct pipe_resource *resource = itransfer->b.resource;
-   struct i915_texture *tex = NULL;
-   struct i915_winsys *iws = i915_screen(pipe->screen)->iws;
-   struct pipe_box *box = &itransfer->b.box;
-   enum pipe_format format = resource->format;
-   unsigned offset;
-   char *map;
-
    if (resource->target != PIPE_TEXTURE_3D &&
        resource->target != PIPE_TEXTURE_CUBE)
       assert(box->z == 0);
 
-   if (itransfer->staging_texture) {
-      tex = i915_texture(itransfer->staging_texture);
+   if (transfer->staging_texture) {
+      tex = i915_texture(transfer->staging_texture);
    } else {
       /* TODO this is a sledgehammer */
       tex = i915_texture(resource);
-      pipe->flush(pipe, NULL);
+      pipe->flush(pipe, NULL, 0);
    }
 
-   offset = i915_texture_offset(tex, itransfer->b.level, box->z);
+   offset = i915_texture_offset(tex, transfer->b.level, box->z);
 
    map = iws->buffer_map(iws, tex->buffer,
-                         (itransfer->b.usage & PIPE_TRANSFER_WRITE) ? TRUE : FALSE);
+                         (transfer->b.usage & PIPE_TRANSFER_WRITE) ? TRUE : FALSE);
    if (map == NULL) {
+      pipe_resource_reference(&transfer->staging_texture, NULL);
+      FREE(transfer);
       return NULL;
    }
 
+   *ptransfer = &transfer->b;
+
    return map + offset +
-      box->y / util_format_get_blockheight(format) * itransfer->b.stride +
+      box->y / util_format_get_blockheight(format) * transfer->b.stride +
       box->x / util_format_get_blockwidth(format) * util_format_get_blocksize(format);
 }
 
@@ -823,6 +791,7 @@ static void
 i915_texture_transfer_unmap(struct pipe_context *pipe,
                            struct pipe_transfer *transfer)
 {
+   struct i915_context *i915 = i915_context(pipe);
    struct i915_transfer *itransfer = (struct i915_transfer*)transfer;
    struct i915_texture *tex = i915_texture(itransfer->b.resource);
    struct i915_winsys *iws = i915_screen(tex->b.b.screen)->iws;
@@ -831,8 +800,24 @@ i915_texture_transfer_unmap(struct pipe_context *pipe,
       tex = i915_texture(itransfer->staging_texture);
 
    iws->buffer_unmap(iws, tex->buffer);
+
+   if ((itransfer->staging_texture) &&
+       (transfer->usage & PIPE_TRANSFER_WRITE)) {
+      struct pipe_box sbox;
+
+      u_box_origin_2d(itransfer->b.box.width, itransfer->b.box.height, &sbox);
+      pipe->resource_copy_region(pipe, itransfer->b.resource, itransfer->b.level,
+                                   itransfer->b.box.x, itransfer->b.box.y, itransfer->b.box.z,
+                                   itransfer->staging_texture,
+                                   0, &sbox);
+      pipe->flush(pipe, NULL, 0);
+      pipe_resource_reference(&itransfer->staging_texture, NULL);
+   }
+
+   util_slab_free(&i915->texture_transfer_pool, itransfer);
 }
 
+#if 0
 static void i915_transfer_inline_write( struct pipe_context *pipe,
                                  struct pipe_resource *resource,
                                  unsigned level,
@@ -847,7 +832,7 @@ static void i915_transfer_inline_write( struct pipe_context *pipe,
    const uint8_t *src_data = data;
    unsigned i;
 
-   transfer = pipe->get_transfer(pipe,
+   transfer = pipe->transfer_get(pipe,
                                  resource,
                                  level,
                                  usage,
@@ -919,24 +904,19 @@ out:
    if (itransfer)
       pipe_transfer_destroy(pipe, &itransfer->b);
 }
-
-
+#endif
 
 struct u_resource_vtbl i915_texture_vtbl =
 {
    i915_texture_get_handle,          /* get_handle */
    i915_texture_destroy,             /* resource_destroy */
-   i915_texture_get_transfer,        /* get_transfer */
-   i915_transfer_destroy,            /* transfer_destroy */
    i915_texture_transfer_map,        /* transfer_map */
    u_default_transfer_flush_region,   /* transfer_flush_region */
    i915_texture_transfer_unmap,              /* transfer_unmap */
-   i915_transfer_inline_write         /* transfer_inline_write */
+   u_default_transfer_inline_write    /* transfer_inline_write */
 };
 
 
-
-
 struct pipe_resource *
 i915_texture_create(struct pipe_screen *screen,
                     const struct pipe_resource *template,