r600g: remove unused r600_reg::flush_mask
[mesa.git] / src / gallium / drivers / r600 / r600_texture.c
index 50a96b4d4da9e51d8a0263610b45f8115143690f..47b440d70274db871e013416729dd3300025d7dc 100644 (file)
@@ -350,6 +350,9 @@ static void r600_texture_destroy(struct pipe_screen *screen,
        if (rtex->flushed_depth_texture)
                pipe_resource_reference((struct pipe_resource **)&rtex->flushed_depth_texture, NULL);
 
+       if (rtex->stencil)
+               pipe_resource_reference((struct pipe_resource **)&rtex->stencil, NULL);
+
        pb_reference(&resource->buf, NULL);
        FREE(rtex);
 }
@@ -466,11 +469,13 @@ r600_texture_create_object(struct pipe_screen *screen,
        } else if (buf) {
                resource->buf = buf;
                resource->cs_buf = rscreen->ws->buffer_get_cs_handle(buf);
+               resource->domains = RADEON_DOMAIN_GTT | RADEON_DOMAIN_VRAM;
        }
 
        if (rtex->stencil) {
-               rtex->stencil->resource.buf = rtex->resource.buf;
+               pb_reference(&rtex->stencil->resource.buf, rtex->resource.buf);
                rtex->stencil->resource.cs_buf = rtex->resource.cs_buf;
+               rtex->stencil->resource.domains = rtex->resource.domains;
        }
        return rtex;
 }
@@ -625,6 +630,10 @@ struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx,
        int r;
        boolean use_staging_texture = FALSE;
 
+       if (usage & PIPE_TRANSFER_MAP_PERMANENTLY) {
+          return NULL;
+       }
+
        /* We cannot map a tiled texture directly because the data is
         * in a different order, therefore we do detiling using a blit.
         *
@@ -750,7 +759,7 @@ void r600_texture_transfer_destroy(struct pipe_context *ctx,
 void* r600_texture_transfer_map(struct pipe_context *ctx,
                                struct pipe_transfer* transfer)
 {
-       struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
+       struct r600_context *rctx = (struct r600_context *)ctx;
        struct r600_transfer *rtransfer = (struct r600_transfer*)transfer;
        struct pb_buffer *buf;
        enum pipe_format format = transfer->resource->format;
@@ -772,7 +781,7 @@ void* r600_texture_transfer_map(struct pipe_context *ctx,
                        transfer->box.x / util_format_get_blockwidth(format) * util_format_get_blocksize(format);
        }
 
-       if (!(map = rctx->ws->buffer_map(buf, rctx->ctx.cs, transfer->usage))) {
+       if (!(map = rctx->ws->buffer_map(buf, rctx->cs, transfer->usage))) {
                return NULL;
        }
 
@@ -783,7 +792,7 @@ void r600_texture_transfer_unmap(struct pipe_context *ctx,
                                 struct pipe_transfer* transfer)
 {
        struct r600_transfer *rtransfer = (struct r600_transfer*)transfer;
-       struct r600_pipe_context *rctx = (struct r600_pipe_context*)ctx;
+       struct r600_context *rctx = (struct r600_context*)ctx;
        struct pb_buffer *buf;
 
        if (rtransfer->staging_texture) {
@@ -800,7 +809,7 @@ void r600_texture_transfer_unmap(struct pipe_context *ctx,
        rctx->ws->buffer_unmap(buf);
 }
 
-void r600_init_surface_functions(struct r600_pipe_context *r600)
+void r600_init_surface_functions(struct r600_context *r600)
 {
        r600->context.create_surface = r600_create_surface;
        r600->context.surface_destroy = r600_surface_destroy;
@@ -860,6 +869,7 @@ uint32_t r600_translate_texformat(struct pipe_screen *screen,
        const struct util_format_description *desc;
        boolean uniform = TRUE;
        static int r600_enable_s3tc = -1;
+       bool is_srgb_valid = FALSE;
 
        int i;
        const uint32_t sign_bit[4] = {
@@ -971,14 +981,17 @@ uint32_t r600_translate_texformat(struct pipe_screen *screen,
                case PIPE_FORMAT_DXT1_SRGB:
                case PIPE_FORMAT_DXT1_SRGBA:
                        result = FMT_BC1;
+                       is_srgb_valid = TRUE;
                        goto out_word4;
                case PIPE_FORMAT_DXT3_RGBA:
                case PIPE_FORMAT_DXT3_SRGBA:
                        result = FMT_BC2;
+                       is_srgb_valid = TRUE;
                        goto out_word4;
                case PIPE_FORMAT_DXT5_RGBA:
                case PIPE_FORMAT_DXT5_SRGBA:
                        result = FMT_BC3;
+                       is_srgb_valid = TRUE;
                        goto out_word4;
                default:
                        goto out_unknown;
@@ -1009,6 +1022,9 @@ uint32_t r600_translate_texformat(struct pipe_screen *screen,
 
        /* Non-uniform formats. */
        if (!uniform) {
+               if (desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB &&
+                   desc->channel[0].pure_integer)
+                       word4 |= S_038010_NUM_FORMAT_ALL(V_038010_SQ_NUM_FORMAT_INT);
                switch(desc->nr_channels) {
                case 3:
                        if (desc->channel[0].size == 5 &&
@@ -1083,6 +1099,7 @@ uint32_t r600_translate_texformat(struct pipe_screen *screen,
                                goto out_word4;
                        case 4:
                                result = FMT_8_8_8_8;
+                               is_srgb_valid = TRUE;
                                goto out_word4;
                        }
                        goto out_unknown;
@@ -1146,6 +1163,9 @@ uint32_t r600_translate_texformat(struct pipe_screen *screen,
        }
 
 out_word4:
+
+       if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB && !is_srgb_valid)
+               return ~0;
        if (word4_p)
                *word4_p = word4;
        if (yuv_format_p)