16abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse/* 26abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 36abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * 46abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * Permission is hereby granted, free of charge, to any person obtaining a 56abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * copy of this software and associated documentation files (the "Software"), 66abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * to deal in the Software without restriction, including without limitation 76abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * on the rights to use, copy, modify, merge, publish, distribute, sub 86abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * license, and/or sell copies of the Software, and to permit persons to whom 96abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * the Software is furnished to do so, subject to the following conditions: 106abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * 116abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * The above copyright notice and this permission notice (including the next 126abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * paragraph) shall be included in all copies or substantial portions of the 136abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * Software. 146abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * 156abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 166abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 176abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 186abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 196abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 206abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 216abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse * USE OR OTHER DEALINGS IN THE SOFTWARE. 226abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse */ 23330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák#include "r600_pipe.h" 248fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_surface.h" 258fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_blitter.h" 268fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch#include "util/u_format.h" 276abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 28c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlieenum r600_blitter_op /* bitmask */ 29c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie{ 308ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák R600_SAVE_FRAGMENT_STATE = 1, 318ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák R600_SAVE_TEXTURES = 2, 328ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák R600_SAVE_FRAMEBUFFER = 4, 338ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák R600_DISABLE_RENDER_COND = 8, 346f243ec25d88589747c7a595903e201b90a4d767Marek Olšák 358ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák R600_CLEAR = R600_SAVE_FRAGMENT_STATE, 366f243ec25d88589747c7a595903e201b90a4d767Marek Olšák 378ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák R600_CLEAR_SURFACE = R600_SAVE_FRAGMENT_STATE | R600_SAVE_FRAMEBUFFER, 386f243ec25d88589747c7a595903e201b90a4d767Marek Olšák 398ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák R600_COPY_BUFFER = R600_DISABLE_RENDER_COND, 408ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák 418ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák R600_COPY_TEXTURE = R600_SAVE_FRAGMENT_STATE | R600_SAVE_FRAMEBUFFER | R600_SAVE_TEXTURES | 426f243ec25d88589747c7a595903e201b90a4d767Marek Olšák R600_DISABLE_RENDER_COND, 436f243ec25d88589747c7a595903e201b90a4d767Marek Olšák 448ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák R600_DECOMPRESS = R600_SAVE_FRAGMENT_STATE | R600_SAVE_FRAMEBUFFER | R600_DISABLE_RENDER_COND, 450f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 460f86915c5322b096b7154b6c84e21288074b775dMarek Olšák R600_COLOR_RESOLVE = R600_SAVE_FRAGMENT_STATE | R600_SAVE_FRAMEBUFFER | R600_DISABLE_RENDER_COND 47c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie}; 48c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie 49c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airliestatic void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op) 506abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse{ 51e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 526abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 5309ec30f02830b3cbf9d6ac04d9497634dca86846Marek Olšák r600_suspend_nontimer_queries(rctx); 54c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie 55aa8a2224a3df111a1613f0baefebc00883e1b70bMarek Olšák util_blitter_save_vertex_buffers(rctx->blitter, 56585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák util_last_bit(rctx->vertex_buffer_state.enabled_mask), 57585baac652ffa172fb3fbbdd4c7559d03b7c27efMarek Olšák rctx->vertex_buffer_state.vb); 588ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák util_blitter_save_vertex_elements(rctx->blitter, rctx->vertex_elements); 598ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák util_blitter_save_vertex_shader(rctx->blitter, rctx->vs_shader); 60e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák util_blitter_save_so_targets(rctx->blitter, rctx->num_so_targets, 61e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák (struct pipe_stream_output_target**)rctx->so_targets); 628ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák util_blitter_save_rasterizer(rctx->blitter, rctx->states[R600_PIPE_STATE_RASTERIZER]); 638ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák 648ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák if (op & R600_SAVE_FRAGMENT_STATE) { 658ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák if (rctx->states[R600_PIPE_STATE_VIEWPORT]) { 668ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák util_blitter_save_viewport(rctx->blitter, &rctx->viewport); 678ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák } 688ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák util_blitter_save_fragment_shader(rctx->blitter, rctx->ps_shader); 698ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák util_blitter_save_blend(rctx->blitter, rctx->states[R600_PIPE_STATE_BLEND]); 708ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák util_blitter_save_depth_stencil_alpha(rctx->blitter, rctx->states[R600_PIPE_STATE_DSA]); 718ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák if (rctx->states[R600_PIPE_STATE_STENCIL_REF]) { 728ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák util_blitter_save_stencil_ref(rctx->blitter, &rctx->stencil_ref); 738ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák } 74a01791add08fbcb5386e0e9209ba21ed58fbdc42Marek Olšák util_blitter_save_sample_mask(rctx->blitter, rctx->sample_mask.sample_mask); 758ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák } 766abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 776f243ec25d88589747c7a595903e201b90a4d767Marek Olšák if (op & R600_SAVE_FRAMEBUFFER) 78c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie util_blitter_save_framebuffer(rctx->blitter, &rctx->framebuffer); 79c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie 806f243ec25d88589747c7a595903e201b90a4d767Marek Olšák if (op & R600_SAVE_TEXTURES) { 81c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie util_blitter_save_fragment_sampler_states( 82c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie rctx->blitter, rctx->ps_samplers.n_samplers, 83c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie (void**)rctx->ps_samplers.samplers); 84c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie 85c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie util_blitter_save_fragment_sampler_views( 865d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák rctx->blitter, util_last_bit(rctx->ps_samplers.views.enabled_mask), 875d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák (struct pipe_sampler_view**)rctx->ps_samplers.views.views); 88c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie } 89c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie 906f243ec25d88589747c7a595903e201b90a4d767Marek Olšák if ((op & R600_DISABLE_RENDER_COND) && rctx->current_render_cond) { 916f243ec25d88589747c7a595903e201b90a4d767Marek Olšák rctx->saved_render_cond = rctx->current_render_cond; 926f243ec25d88589747c7a595903e201b90a4d767Marek Olšák rctx->saved_render_cond_mode = rctx->current_render_cond_mode; 936f243ec25d88589747c7a595903e201b90a4d767Marek Olšák rctx->context.render_condition(&rctx->context, NULL, 0); 946f243ec25d88589747c7a595903e201b90a4d767Marek Olšák } 956f243ec25d88589747c7a595903e201b90a4d767Marek Olšák 96c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie} 97c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie 98c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airliestatic void r600_blitter_end(struct pipe_context *ctx) 99c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie{ 100e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 1016f243ec25d88589747c7a595903e201b90a4d767Marek Olšák if (rctx->saved_render_cond) { 1026f243ec25d88589747c7a595903e201b90a4d767Marek Olšák rctx->context.render_condition(&rctx->context, 1036f243ec25d88589747c7a595903e201b90a4d767Marek Olšák rctx->saved_render_cond, 1046f243ec25d88589747c7a595903e201b90a4d767Marek Olšák rctx->saved_render_cond_mode); 1056f243ec25d88589747c7a595903e201b90a4d767Marek Olšák rctx->saved_render_cond = NULL; 1066f243ec25d88589747c7a595903e201b90a4d767Marek Olšák } 10709ec30f02830b3cbf9d6ac04d9497634dca86846Marek Olšák r600_resume_nontimer_queries(rctx); 1086abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse} 1096abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 110dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšákstatic unsigned u_max_layer(struct pipe_resource *r, unsigned level) 111840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák{ 112840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák switch (r->target) { 113840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák case PIPE_TEXTURE_CUBE: 114dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák return 6 - 1; 115840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák case PIPE_TEXTURE_3D: 116dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák return u_minify(r->depth0, level) - 1; 117840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák case PIPE_TEXTURE_1D_ARRAY: 118840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák case PIPE_TEXTURE_2D_ARRAY: 119dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák return r->array_size - 1; 120840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák default: 121dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák return 0; 122840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák } 123840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák} 124840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák 12594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšákstatic unsigned u_max_sample(struct pipe_resource *r) 12694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák{ 12794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák return r->nr_samples ? r->nr_samples - 1 : 0; 12894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák} 12994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 13048edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšákvoid r600_blit_decompress_depth(struct pipe_context *ctx, 131951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *texture, 132951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *staging, 133dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák unsigned first_level, unsigned last_level, 13494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák unsigned first_layer, unsigned last_layer, 13594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák unsigned first_sample, unsigned last_sample) 1366abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse{ 137e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 13894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák unsigned layer, level, sample, checked_last_layer, max_layer, max_sample; 139951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *flushed_depth_texture = staging ? 14037708479608af877986b76302a9c92611d1e23d0Vadim Girlin staging : texture->flushed_depth_texture; 141e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák const struct util_format_description *desc = 142e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák util_format_description(texture->resource.b.b.format); 14394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák float depth; 14438b54158b68479e1f97c8452ba0d67f50dce7582Henri Verbeet 14548edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák if (!staging && !texture->dirty_level_mask) 146b13b7b86b2e1165b24a2df20cb67f9f3baa17b13Dave Airlie return; 14738b54158b68479e1f97c8452ba0d67f50dce7582Henri Verbeet 1482f6eb3afb725112b2a0b110493f5062f80a78a3fMarek Olšák max_sample = u_max_sample(&texture->resource.b.b); 1492f6eb3afb725112b2a0b110493f5062f80a78a3fMarek Olšák 1502f6eb3afb725112b2a0b110493f5062f80a78a3fMarek Olšák /* XXX Decompressing MSAA depth textures is broken on R6xx. 1512f6eb3afb725112b2a0b110493f5062f80a78a3fMarek Olšák * There is also a hardlock if CMASK and FMASK are not present. 1522f6eb3afb725112b2a0b110493f5062f80a78a3fMarek Olšák * Just skip this until we find out how to fix it. */ 1532f6eb3afb725112b2a0b110493f5062f80a78a3fMarek Olšák if (rctx->chip_class == R600 && max_sample > 0) { 1542f6eb3afb725112b2a0b110493f5062f80a78a3fMarek Olšák texture->dirty_level_mask = 0; 1552f6eb3afb725112b2a0b110493f5062f80a78a3fMarek Olšák return; 1562f6eb3afb725112b2a0b110493f5062f80a78a3fMarek Olšák } 1572f6eb3afb725112b2a0b110493f5062f80a78a3fMarek Olšák 1586abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse if (rctx->family == CHIP_RV610 || rctx->family == CHIP_RV630 || 159c61b97d50425236f001dbc54f098318f921fe916Dave Airlie rctx->family == CHIP_RV620 || rctx->family == CHIP_RV635) 1606abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse depth = 0.0f; 16194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák else 16294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák depth = 1.0f; 1636abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 164e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák /* Enable decompression in DB_RENDER_CONTROL */ 165e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák rctx->db_misc_state.flush_depthstencil_through_cb = true; 166e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák rctx->db_misc_state.copy_depth = util_format_has_depth(desc); 167e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák rctx->db_misc_state.copy_stencil = util_format_has_stencil(desc); 16894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák rctx->db_misc_state.copy_sample = first_sample; 169e2f623f1d6da9bc987582ff68d0471061ae44030Marek Olšák r600_atom_dirty(rctx, &rctx->db_misc_state.atom); 170df79eb59566f20a7fa8e11d87b63b81ec35eaf25Marek Olšák 17194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 172dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák for (level = first_level; level <= last_level; level++) { 17348edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák if (!staging && !(texture->dirty_level_mask & (1 << level))) 174dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák continue; 175dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák 176dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák /* The smaller the mipmap level, the less layers there are 177dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák * as far as 3D textures are concerned. */ 178dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák max_layer = u_max_layer(&texture->resource.b.b, level); 179dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák checked_last_layer = last_layer < max_layer ? last_layer : max_layer; 1806abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 181dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák for (layer = first_layer; layer <= checked_last_layer; layer++) { 18294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák for (sample = first_sample; sample <= last_sample; sample++) { 18394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák struct pipe_surface *zsurf, *cbsurf, surf_tmpl; 18494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 18594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák if (sample != rctx->db_misc_state.copy_sample) { 18694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák rctx->db_misc_state.copy_sample = sample; 18794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák r600_atom_dirty(rctx, &rctx->db_misc_state.atom); 18894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák } 18994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 190773ff5705f3b2d88fb7094b8d2e051bb684c2323Marek Olšák surf_tmpl.format = texture->resource.b.b.format; 19194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák surf_tmpl.u.tex.level = level; 19294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák surf_tmpl.u.tex.first_layer = layer; 19394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák surf_tmpl.u.tex.last_layer = layer; 19494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák surf_tmpl.usage = PIPE_BIND_DEPTH_STENCIL; 19594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 19694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák zsurf = ctx->create_surface(ctx, &texture->resource.b.b, &surf_tmpl); 19794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 198773ff5705f3b2d88fb7094b8d2e051bb684c2323Marek Olšák surf_tmpl.format = flushed_depth_texture->resource.b.b.format; 19994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák surf_tmpl.u.tex.level = level; 20094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák surf_tmpl.u.tex.first_layer = layer; 20194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák surf_tmpl.u.tex.last_layer = layer; 20294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák surf_tmpl.usage = PIPE_BIND_RENDER_TARGET; 20394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák cbsurf = ctx->create_surface(ctx, 20494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák &flushed_depth_texture->resource.b.b, &surf_tmpl); 20594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 20694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák r600_blitter_begin(ctx, R600_DECOMPRESS); 20794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák util_blitter_custom_depth_stencil(rctx->blitter, zsurf, cbsurf, 1 << sample, 20894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák rctx->custom_dsa_flush, depth); 20994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák r600_blitter_end(ctx); 21094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 21194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák pipe_surface_reference(&zsurf, NULL); 21294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák pipe_surface_reference(&cbsurf, NULL); 21394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák } 214840ad139aff401829552d0e3ba77f8abcb5862bdMarek Olšák } 215b13b7b86b2e1165b24a2df20cb67f9f3baa17b13Dave Airlie 21694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák /* The texture will always be dirty if some layers or samples aren't flushed. 21794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák * I don't think this case occurs often though. */ 21894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák if (!staging && 21994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák first_layer == 0 && last_layer == max_layer && 22094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák first_sample == 0 && last_sample == max_sample) { 22148edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák texture->dirty_level_mask &= ~(1 << level); 222dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák } 223dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák } 224df79eb59566f20a7fa8e11d87b63b81ec35eaf25Marek Olšák 225e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse /* reenable compression in DB_RENDER_CONTROL */ 226e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse rctx->db_misc_state.flush_depthstencil_through_cb = false; 227e634651024d6507cf325999494a3e2630f3072c8Jerome Glisse r600_atom_dirty(rctx, &rctx->db_misc_state.atom); 2286abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse} 2296abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 23048edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšákvoid r600_decompress_depth_textures(struct r600_context *rctx, 2315d8d4252f2f6632fc455dcf1079c95495ef445acMarek Olšák struct r600_samplerview_state *textures) 23238b54158b68479e1f97c8452ba0d67f50dce7582Henri Verbeet{ 2335a17d8318ec2c20bf86275044dc8f715105a88e7Marek Olšák unsigned i; 23448edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák unsigned depth_texture_mask = textures->compressed_depthtex_mask; 23538b54158b68479e1f97c8452ba0d67f50dce7582Henri Verbeet 23680755ff56317446a8c89e611edc1fdf320d6779bMarek Olšák while (depth_texture_mask) { 237dee58f94af833906863b0ff2955b20f3ab407e63Marek Olšák struct pipe_sampler_view *view; 238951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *tex; 23938b54158b68479e1f97c8452ba0d67f50dce7582Henri Verbeet 24080755ff56317446a8c89e611edc1fdf320d6779bMarek Olšák i = u_bit_scan(&depth_texture_mask); 24180755ff56317446a8c89e611edc1fdf320d6779bMarek Olšák 2425a17d8318ec2c20bf86275044dc8f715105a88e7Marek Olšák view = &textures->views[i]->base; 24380755ff56317446a8c89e611edc1fdf320d6779bMarek Olšák assert(view); 24438b54158b68479e1f97c8452ba0d67f50dce7582Henri Verbeet 245951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák tex = (struct r600_texture *)view->texture; 24680755ff56317446a8c89e611edc1fdf320d6779bMarek Olšák assert(tex->is_depth && !tex->is_flushing_texture); 247812c314e5161d2b5f91c86ba45b79d4b34046beeDave Airlie 24848edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák r600_blit_decompress_depth(&rctx->context, tex, NULL, 24994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák view->u.tex.first_level, view->u.tex.last_level, 25094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 0, u_max_layer(&tex->resource.b.b, view->u.tex.first_level), 25194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 0, u_max_sample(&tex->resource.b.b)); 25294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák } 25394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák} 25494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 255a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšákstatic void r600_blit_decompress_color(struct pipe_context *ctx, 256a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct r600_texture *rtex, 257a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned first_level, unsigned last_level, 258a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned first_layer, unsigned last_layer) 259a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák{ 260a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 261a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned layer, level, checked_last_layer, max_layer; 262a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 26364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák assert(rctx->chip_class != CAYMAN); 26464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák 265a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák if (!rtex->dirty_level_mask) 266a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák return; 267a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 268a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák for (level = first_level; level <= last_level; level++) { 269a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák if (!(rtex->dirty_level_mask & (1 << level))) 270a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák continue; 271a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 272a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák /* The smaller the mipmap level, the less layers there are 273a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák * as far as 3D textures are concerned. */ 274a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák max_layer = u_max_layer(&rtex->resource.b.b, level); 275a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák checked_last_layer = last_layer < max_layer ? last_layer : max_layer; 276a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 277a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák for (layer = first_layer; layer <= checked_last_layer; layer++) { 278a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct pipe_surface *cbsurf, surf_tmpl; 279a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 280a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák surf_tmpl.format = rtex->resource.b.b.format; 281a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák surf_tmpl.u.tex.level = level; 282a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák surf_tmpl.u.tex.first_layer = layer; 283a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák surf_tmpl.u.tex.last_layer = layer; 284a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák surf_tmpl.usage = PIPE_BIND_RENDER_TARGET; 285a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák cbsurf = ctx->create_surface(ctx, &rtex->resource.b.b, &surf_tmpl); 286a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 287a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák r600_blitter_begin(ctx, R600_DECOMPRESS); 288a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák util_blitter_custom_color(rctx->blitter, cbsurf, 289a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák rctx->custom_blend_decompress); 290a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák r600_blitter_end(ctx); 291a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 292a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák pipe_surface_reference(&cbsurf, NULL); 293a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák } 294a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 295a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák /* The texture will always be dirty if some layers or samples aren't flushed. 296a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák * I don't think this case occurs often though. */ 297a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák if (first_layer == 0 && last_layer == max_layer) { 298a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák rtex->dirty_level_mask &= ~(1 << level); 299a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák } 300a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák } 301a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák} 302a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 303a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšákvoid r600_decompress_color_textures(struct r600_context *rctx, 304a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct r600_samplerview_state *textures) 305a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák{ 306a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned i; 307a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák unsigned mask = textures->compressed_colortex_mask; 308a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 30964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák /* Cayman cannot decompress an MSAA colorbuffer, 31064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák * but it can read it compressed, so skip this. */ 31164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák assert(rctx->chip_class != CAYMAN); 31264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák if (rctx->chip_class == CAYMAN) { 31364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák return; 31464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák } 31564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák 316a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák while (mask) { 317a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct pipe_sampler_view *view; 318a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák struct r600_texture *tex; 319a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 320a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák i = u_bit_scan(&mask); 321a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 322a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák view = &textures->views[i]->base; 323a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák assert(view); 324a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 325a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák tex = (struct r600_texture *)view->texture; 326a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák assert(tex->cmask_size && tex->fmask_size); 327a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 328a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák r600_blit_decompress_color(&rctx->context, tex, 329a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák view->u.tex.first_level, view->u.tex.last_level, 330a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 0, u_max_layer(&tex->resource.b.b, view->u.tex.first_level)); 331a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák } 332a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák} 333a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 33494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšákstatic void r600_copy_first_sample(struct pipe_context *ctx, 33594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák const struct pipe_resolve_info *info) 33694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák{ 33794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 338951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rsrc = (struct r600_texture*)info->src.res; 33994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák struct pipe_surface *dst_view, dst_templ; 34094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák struct pipe_sampler_view src_templ, *src_view; 34194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák struct pipe_box box; 34294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 34394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák if (rsrc->is_depth && !rsrc->is_flushing_texture) { 34494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák if (!r600_init_flushed_depth_texture(ctx, info->src.res, NULL)) 34594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák return; /* error */ 34694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 34794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák /* Decompress the first sample only. */ 34848edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák r600_blit_decompress_depth(ctx, rsrc, NULL, 34994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 0, 0, 35094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák info->src.layer, info->src.layer, 35194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 0, 0); 35294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák } 35364db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák if (rctx->chip_class != CAYMAN && rsrc->fmask_size && rsrc->cmask_size) { 354a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák r600_blit_decompress_color(ctx, rsrc, 355a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák 0, 0, 356a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák info->src.layer, info->src.layer); 357a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák } 35894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 35994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák /* this is correct for upside-down blits too */ 36094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák u_box_2d(info->src.x0, 36194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák info->src.y0, 36294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák info->src.x1 - info->src.x0, 36394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák info->src.y1 - info->src.y0, &box); 36494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 36594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák /* Initialize the surface. */ 36694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák util_blitter_default_dst_texture(&dst_templ, info->dst.res, 36794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák info->dst.level, info->dst.layer, &box); 36894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák dst_view = ctx->create_surface(ctx, info->dst.res, &dst_templ); 36994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 37094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák /* Initialize the sampler view. */ 37194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák util_blitter_default_src_texture(&src_templ, info->src.res, 0); 37294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák src_view = ctx->create_sampler_view(ctx, info->src.res, &src_templ); 37394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 37494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák /* Copy the first sample into dst. */ 37594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák r600_blitter_begin(ctx, R600_COPY_TEXTURE); 37694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák util_blitter_copy_texture_view(rctx->blitter, dst_view, ~0, info->dst.x0, 37794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák info->dst.y0, src_view, 0, &box, 37894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák info->src.res->width0, info->src.res->height0, 37994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák info->mask); 38094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák r600_blitter_end(ctx); 38194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 38294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák pipe_surface_reference(&dst_view, NULL); 38394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák pipe_sampler_view_reference(&src_view, NULL); 38494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák} 38594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 3860f86915c5322b096b7154b6c84e21288074b775dMarek Olšákstatic boolean is_simple_resolve(const struct pipe_resolve_info *info) 3870f86915c5322b096b7154b6c84e21288074b775dMarek Olšák{ 3880f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned dst_width = u_minify(info->dst.res->width0, info->dst.level); 3890f86915c5322b096b7154b6c84e21288074b775dMarek Olšák unsigned dst_height = u_minify(info->dst.res->height0, info->dst.level); 3900ac90296a092f846647812318913b0e492775f31Marek Olšák struct r600_texture *dst = (struct r600_texture*)info->dst.res; 3910ac90296a092f846647812318913b0e492775f31Marek Olšák unsigned dst_tile_mode = dst->surface.level[info->dst.level].mode; 3920f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 3930f86915c5322b096b7154b6c84e21288074b775dMarek Olšák return info->dst.res->format == info->src.res->format && 3940f86915c5322b096b7154b6c84e21288074b775dMarek Olšák dst_width == info->src.res->width0 && 3950f86915c5322b096b7154b6c84e21288074b775dMarek Olšák dst_height == info->src.res->height0 && 3960f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->dst.x0 == 0 && 3970f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->dst.y0 == 0 && 3980f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->dst.x1 == dst_width && 3990f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->dst.y1 == dst_height && 4000f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->src.x0 == 0 && 4010f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->src.y0 == 0 && 4020f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->src.x1 == dst_width && 4030ac90296a092f846647812318913b0e492775f31Marek Olšák info->src.y1 == dst_height && 4040ac90296a092f846647812318913b0e492775f31Marek Olšák /* Dst must be tiled. If it's not, we have to use a temporary 4050ac90296a092f846647812318913b0e492775f31Marek Olšák * resource which is tiled. */ 4060ac90296a092f846647812318913b0e492775f31Marek Olšák dst_tile_mode >= RADEON_SURF_MODE_1D; 4070f86915c5322b096b7154b6c84e21288074b775dMarek Olšák} 4080f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 4090f86915c5322b096b7154b6c84e21288074b775dMarek Olšákstatic void r600_color_resolve(struct pipe_context *ctx, 4100f86915c5322b096b7154b6c84e21288074b775dMarek Olšák const struct pipe_resolve_info *info) 4110f86915c5322b096b7154b6c84e21288074b775dMarek Olšák{ 4120f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 4130f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_screen *screen = ctx->screen; 4140f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_resource *tmp, templ; 4150f86915c5322b096b7154b6c84e21288074b775dMarek Olšák struct pipe_box box; 41664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák unsigned sample_mask = 41764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák rctx->chip_class == CAYMAN ? ~0 : ((1ull << MAX2(1, info->src.res->nr_samples)) - 1); 4180f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 4190f86915c5322b096b7154b6c84e21288074b775dMarek Olšák assert((info->mask & PIPE_MASK_RGBA) == PIPE_MASK_RGBA); 4200f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 4210f86915c5322b096b7154b6c84e21288074b775dMarek Olšák if (is_simple_resolve(info)) { 4220f86915c5322b096b7154b6c84e21288074b775dMarek Olšák r600_blitter_begin(ctx, R600_COLOR_RESOLVE); 423e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák util_blitter_custom_resolve_color(rctx->blitter, 4240f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->dst.res, info->dst.level, info->dst.layer, 4250f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->src.res, info->src.layer, 42664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák sample_mask, rctx->custom_blend_resolve); 4270f86915c5322b096b7154b6c84e21288074b775dMarek Olšák r600_blitter_end(ctx); 4280f86915c5322b096b7154b6c84e21288074b775dMarek Olšák return; 4290f86915c5322b096b7154b6c84e21288074b775dMarek Olšák } 4300f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 4310f86915c5322b096b7154b6c84e21288074b775dMarek Olšák /* resolve into a temporary texture, then blit */ 4320f86915c5322b096b7154b6c84e21288074b775dMarek Olšák templ.target = PIPE_TEXTURE_2D; 4330f86915c5322b096b7154b6c84e21288074b775dMarek Olšák templ.format = info->src.res->format; 4340f86915c5322b096b7154b6c84e21288074b775dMarek Olšák templ.width0 = info->src.res->width0; 4350f86915c5322b096b7154b6c84e21288074b775dMarek Olšák templ.height0 = info->src.res->height0; 4360f86915c5322b096b7154b6c84e21288074b775dMarek Olšák templ.depth0 = 1; 4370f86915c5322b096b7154b6c84e21288074b775dMarek Olšák templ.array_size = 1; 4380f86915c5322b096b7154b6c84e21288074b775dMarek Olšák templ.last_level = 0; 4390f86915c5322b096b7154b6c84e21288074b775dMarek Olšák templ.nr_samples = 0; 4400f86915c5322b096b7154b6c84e21288074b775dMarek Olšák templ.usage = PIPE_USAGE_STATIC; 4410f86915c5322b096b7154b6c84e21288074b775dMarek Olšák templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW; 4420ac90296a092f846647812318913b0e492775f31Marek Olšák templ.flags = R600_RESOURCE_FLAG_FORCE_TILING; /* dst must not have a linear layout */ 4430f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 4440f86915c5322b096b7154b6c84e21288074b775dMarek Olšák tmp = screen->resource_create(screen, &templ); 4450f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 4460f86915c5322b096b7154b6c84e21288074b775dMarek Olšák /* XXX use scissor, so that only the needed part of the resource is resolved */ 4470f86915c5322b096b7154b6c84e21288074b775dMarek Olšák r600_blitter_begin(ctx, R600_COLOR_RESOLVE); 448e0cc61bd91f5ef84bacaf5e7c6cda9eeefed478dMarek Olšák util_blitter_custom_resolve_color(rctx->blitter, 4490f86915c5322b096b7154b6c84e21288074b775dMarek Olšák tmp, 0, 0, 4500f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->src.res, info->src.layer, 45164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák sample_mask, rctx->custom_blend_resolve); 4520f86915c5322b096b7154b6c84e21288074b775dMarek Olšák r600_blitter_end(ctx); 4530f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 4540f86915c5322b096b7154b6c84e21288074b775dMarek Olšák /* this is correct for upside-down blits too */ 4550f86915c5322b096b7154b6c84e21288074b775dMarek Olšák u_box_2d(info->src.x0, 4560f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->src.y0, 4570f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->src.x1 - info->src.x0, 4580f86915c5322b096b7154b6c84e21288074b775dMarek Olšák info->src.y1 - info->src.y0, &box); 4590f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 4600f86915c5322b096b7154b6c84e21288074b775dMarek Olšák r600_blitter_begin(ctx, R600_COPY_TEXTURE); 4610f86915c5322b096b7154b6c84e21288074b775dMarek Olšák util_blitter_copy_texture(rctx->blitter, info->dst.res, info->dst.level, 4620f86915c5322b096b7154b6c84e21288074b775dMarek Olšák ~0, info->dst.x0, info->dst.y0, info->dst.layer, 4630f86915c5322b096b7154b6c84e21288074b775dMarek Olšák tmp, 0, 0, &box); 4640f86915c5322b096b7154b6c84e21288074b775dMarek Olšák r600_blitter_end(ctx); 4650f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 4660f86915c5322b096b7154b6c84e21288074b775dMarek Olšák pipe_resource_reference(&tmp, NULL); 4670f86915c5322b096b7154b6c84e21288074b775dMarek Olšák} 4680f86915c5322b096b7154b6c84e21288074b775dMarek Olšák 46994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšákstatic void r600_resource_resolve(struct pipe_context *ctx, 47094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák const struct pipe_resolve_info *info) 47194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák{ 47294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák /* make sure we're doing a resolve operation */ 47394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák assert(info->src.res->nr_samples > 1); 47494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák assert(info->dst.res->nr_samples <= 1); 47594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 47694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák /* limitations of multisample resources */ 47794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák assert(info->src.res->last_level == 0); 47894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák assert(info->src.res->target == PIPE_TEXTURE_2D || 47994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák info->src.res->target == PIPE_TEXTURE_2D_ARRAY); 48094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 48194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák /* check if the resolve box is valid */ 48294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák assert(info->dst.x0 < info->dst.x1); 48394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák assert(info->dst.y0 < info->dst.y1); 48494b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 48594b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák /* scaled resolve isn't allowed */ 48694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák assert(abs(info->dst.x0 - info->dst.x1) == 48794b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák abs(info->src.x0 - info->src.x1)); 48894b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák assert(abs(info->dst.y0 - info->dst.y1) == 48994b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák abs(info->src.y0 - info->src.y1)); 49094b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 49194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák if ((info->mask & PIPE_MASK_ZS) || 49294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák util_format_is_pure_integer(info->src.res->format)) { 49394b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák r600_copy_first_sample(ctx, info); 4940f86915c5322b096b7154b6c84e21288074b775dMarek Olšák } else { 4950f86915c5322b096b7154b6c84e21288074b775dMarek Olšák r600_color_resolve(ctx, info); 49638b54158b68479e1f97c8452ba0d67f50dce7582Henri Verbeet } 4975a17d8318ec2c20bf86275044dc8f715105a88e7Marek Olšák} 4985a17d8318ec2c20bf86275044dc8f715105a88e7Marek Olšák 4996abd7771c6ab2c733b20835e211060dd18fd847dJerome Glissestatic void r600_clear(struct pipe_context *ctx, unsigned buffers, 5006dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 5016dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie double depth, unsigned stencil) 5026abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse{ 503e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 5046abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse struct pipe_framebuffer_state *fb = &rctx->framebuffer; 505c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 506c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie r600_blitter_begin(ctx, R600_CLEAR); 5076abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse util_blitter_clear(rctx->blitter, fb->width, fb->height, 5084e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie fb->nr_cbufs, buffers, fb->nr_cbufs ? fb->cbufs[0]->format : PIPE_FORMAT_NONE, 5094e28e6f6c777841b9ffe7a7ad1e865e2595f70f9Dave Airlie color, depth, stencil); 510c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie r600_blitter_end(ctx); 5116abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse} 5126abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 5136abd7771c6ab2c733b20835e211060dd18fd847dJerome Glissestatic void r600_clear_render_target(struct pipe_context *ctx, 5146abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse struct pipe_surface *dst, 5156dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie const union pipe_color_union *color, 5166abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse unsigned dstx, unsigned dsty, 5176abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse unsigned width, unsigned height) 5186abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse{ 519e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 5206abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 521c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie r600_blitter_begin(ctx, R600_CLEAR_SURFACE); 5226dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie util_blitter_clear_render_target(rctx->blitter, dst, color, 5236abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse dstx, dsty, width, height); 524c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie r600_blitter_end(ctx); 5256abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse} 5266abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 5276abd7771c6ab2c733b20835e211060dd18fd847dJerome Glissestatic void r600_clear_depth_stencil(struct pipe_context *ctx, 5286abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse struct pipe_surface *dst, 5296abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse unsigned clear_flags, 5306abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse double depth, 5316abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse unsigned stencil, 5326abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse unsigned dstx, unsigned dsty, 5336abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse unsigned width, unsigned height) 5346abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse{ 535e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 5366abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 537c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie r600_blitter_begin(ctx, R600_CLEAR_SURFACE); 5386abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse util_blitter_clear_depth_stencil(rctx->blitter, dst, clear_flags, depth, stencil, 5396abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse dstx, dsty, width, height); 540c8d4108fbee679735a1cc3f405d848d01bfb23f6Dave Airlie r600_blitter_end(ctx); 5416abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse} 5426abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 54399c65bac341f808279a8a847158ace4f058aa72eMarek Olšákvoid r600_copy_buffer(struct pipe_context *ctx, struct 54499c65bac341f808279a8a847158ace4f058aa72eMarek Olšák pipe_resource *dst, unsigned dstx, 54599c65bac341f808279a8a847158ace4f058aa72eMarek Olšák struct pipe_resource *src, const struct pipe_box *src_box) 5468ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák{ 5478ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák struct r600_context *rctx = (struct r600_context*)ctx; 5488ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák 5498ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák if (rctx->screen->has_streamout && 5508ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák /* Require dword alignment. */ 5518ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák dstx % 4 == 0 && src_box->x % 4 == 0 && src_box->width % 4 == 0) { 5528ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák r600_blitter_begin(ctx, R600_COPY_BUFFER); 5538ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák util_blitter_copy_buffer(rctx->blitter, dst, dstx, src, src_box->x, src_box->width); 5548ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák r600_blitter_end(ctx); 5558ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák } else { 5568ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák util_resource_copy_region(ctx, dst, 0, dstx, 0, 0, src, 0, src_box); 5578ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák } 5588ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák} 5598ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák 5608e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airliestruct texture_orig_info { 5618e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie unsigned format; 5628e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie unsigned width0; 5638e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie unsigned height0; 564c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse unsigned npix_x; 565c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse unsigned npix_y; 566c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse unsigned npix0_x; 567c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse unsigned npix0_y; 5688e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie}; 5698e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 570c9bca01819ef0fa3c64a28e26bd63953cf7f1364Dave Airliestatic void r600_compressed_to_blittable(struct pipe_resource *tex, 5718e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie unsigned level, 5728e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie struct texture_orig_info *orig) 5738e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie{ 574951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex = (struct r600_texture*)tex; 575773ff5705f3b2d88fb7094b8d2e051bb684c2323Marek Olšák unsigned pixsize = util_format_get_blocksize(rtex->resource.b.b.format); 5768e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie int new_format; 5778e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie int new_height, new_width; 5788e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 5798e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie orig->format = tex->format; 5808e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie orig->width0 = tex->width0; 5818e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie orig->height0 = tex->height0; 582c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse orig->npix0_x = rtex->surface.level[0].npix_x; 583c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse orig->npix0_y = rtex->surface.level[0].npix_y; 584c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse orig->npix_x = rtex->surface.level[level].npix_x; 585c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse orig->npix_y = rtex->surface.level[level].npix_y; 5868e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 5878e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie if (pixsize == 8) 58895fd5e5aba2e21ab20cb971506a81c0049b5a694Dave Airlie new_format = PIPE_FORMAT_R16G16B16A16_UINT; /* 64-bit block */ 5898e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie else 59095fd5e5aba2e21ab20cb971506a81c0049b5a694Dave Airlie new_format = PIPE_FORMAT_R32G32B32A32_UINT; /* 128-bit block */ 5918e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 5928e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie new_width = util_format_get_nblocksx(tex->format, orig->width0); 5938e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie new_height = util_format_get_nblocksy(tex->format, orig->height0); 5948e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 5958e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie tex->width0 = new_width; 5968e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie tex->height0 = new_height; 5978e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie tex->format = new_format; 598c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rtex->surface.level[0].npix_x = util_format_get_nblocksx(orig->format, orig->npix0_x); 599c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rtex->surface.level[0].npix_y = util_format_get_nblocksy(orig->format, orig->npix0_y); 600c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rtex->surface.level[level].npix_x = util_format_get_nblocksx(orig->format, orig->npix_x); 601c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rtex->surface.level[level].npix_y = util_format_get_nblocksy(orig->format, orig->npix_y); 6028e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie} 6038e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 604795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšákstatic void r600_subsampled_2x1_32bpp_to_blittable(struct pipe_resource *tex, 605795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák unsigned level, 606795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák struct texture_orig_info *orig) 607795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák{ 608795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák struct r600_texture *rtex = (struct r600_texture*)tex; 609795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák 610795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák orig->format = tex->format; 611795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák orig->width0 = tex->width0; 612795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák orig->height0 = tex->height0; 613795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák orig->npix0_x = rtex->surface.level[0].npix_x; 614795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák orig->npix0_y = rtex->surface.level[0].npix_y; 615795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák orig->npix_x = rtex->surface.level[level].npix_x; 616795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák orig->npix_y = rtex->surface.level[level].npix_y; 617795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák 618795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák tex->width0 = util_format_get_nblocksx(orig->format, orig->width0); 619795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák tex->format = PIPE_FORMAT_R8G8B8A8_UINT; 620795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák rtex->surface.level[0].npix_x = util_format_get_nblocksx(orig->format, orig->npix0_x); 621795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák rtex->surface.level[level].npix_x = util_format_get_nblocksx(orig->format, orig->npix_x); 622795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák} 623795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák 6247c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšákstatic void r600_change_format(struct pipe_resource *tex, 6257c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák unsigned level, 6267c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák struct texture_orig_info *orig, 6277c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák enum pipe_format format) 6287c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák{ 629951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex = (struct r600_texture*)tex; 6307c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák 6317c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák orig->format = tex->format; 6327c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák orig->width0 = tex->width0; 6337c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák orig->height0 = tex->height0; 6347c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák orig->npix0_x = rtex->surface.level[0].npix_x; 6357c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák orig->npix0_y = rtex->surface.level[0].npix_y; 6367c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák orig->npix_x = rtex->surface.level[level].npix_x; 6377c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák orig->npix_y = rtex->surface.level[level].npix_y; 6387c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák 6397c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák tex->format = format; 6407c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák} 6417c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák 6427c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšákstatic void r600_reset_blittable_to_orig(struct pipe_resource *tex, 6437c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák unsigned level, 6447c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák struct texture_orig_info *orig) 6458e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie{ 646951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rtex = (struct r600_texture*)tex; 647c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse 6488e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie tex->format = orig->format; 6498e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie tex->width0 = orig->width0; 6508e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie tex->height0 = orig->height0; 651c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rtex->surface.level[0].npix_x = orig->npix0_x; 652c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rtex->surface.level[0].npix_y = orig->npix0_y; 653c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rtex->surface.level[level].npix_x = orig->npix_x; 654c0c979eebc076b95cc8d18a013ce2968fe6311adJerome Glisse rtex->surface.level[level].npix_y = orig->npix_y; 6558e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie} 6568e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 657795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšákstatic bool util_format_is_subsampled_2x1_32bpp(enum pipe_format format) 658795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák{ 659795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák const struct util_format_description *desc = util_format_description(format); 660795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák 661795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák return desc->layout == UTIL_FORMAT_LAYOUT_SUBSAMPLED && 662795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák desc->block.width == 2 && 663795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák desc->block.height == 1 && 664795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák desc->block.bits == 32; 665795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák} 666795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák 6676abd7771c6ab2c733b20835e211060dd18fd847dJerome Glissestatic void r600_resource_copy_region(struct pipe_context *ctx, 6686abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse struct pipe_resource *dst, 6694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned dst_level, 6706abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse unsigned dstx, unsigned dsty, unsigned dstz, 6716abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse struct pipe_resource *src, 6724c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger unsigned src_level, 6734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger const struct pipe_box *src_box) 6746abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse{ 675c1e8c845ea9c6f843cc5bba5974668c007799bbcMarek Olšák struct r600_context *rctx = (struct r600_context *)ctx; 676951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák struct r600_texture *rsrc = (struct r600_texture*)src; 6778e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie struct texture_orig_info orig_info[2]; 6788623c68aec95e0883308051068b3496a85e8b9eaMarek Olšák struct pipe_box sbox; 6797c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák const struct pipe_box *psbox = src_box; 6808e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie boolean restore_orig[2]; 681870af19d70bf985a253f1ea8398fb7ec8704cf9cMarek Olšák unsigned last_sample, i; 6824b49fcbb9a26680e9a4ef441668e0dd817529d47Dave Airlie 6832175634e73f9c5ccaf565f0dc15520610b1eb7ffMarek Olšák memset(orig_info, 0, sizeof(orig_info)); 6842175634e73f9c5ccaf565f0dc15520610b1eb7ffMarek Olšák 6858ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák /* Handle buffers first. */ 686883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) { 6878ac9801669c68c33d9dd35a57baf985a4be49effMarek Olšák r600_copy_buffer(ctx, dst, dstx, src, src_box); 688883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák return; 689883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák } 690883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák 691870af19d70bf985a253f1ea8398fb7ec8704cf9cMarek Olšák assert(u_max_sample(dst) == u_max_sample(src)); 692870af19d70bf985a253f1ea8398fb7ec8704cf9cMarek Olšák last_sample = u_max_sample(dst); 693870af19d70bf985a253f1ea8398fb7ec8704cf9cMarek Olšák 694b242adbe5cfa165b252064a1ea36f802d8251ef1Marek Olšák /* This must be done before entering u_blitter to avoid recursion. */ 695b242adbe5cfa165b252064a1ea36f802d8251ef1Marek Olšák if (rsrc->is_depth && !rsrc->is_flushing_texture) { 696b242adbe5cfa165b252064a1ea36f802d8251ef1Marek Olšák if (!r600_init_flushed_depth_texture(ctx, src, NULL)) 697b242adbe5cfa165b252064a1ea36f802d8251ef1Marek Olšák return; /* error */ 698b242adbe5cfa165b252064a1ea36f802d8251ef1Marek Olšák 69948edfe0505ee79d35f770f53b9c9b7ca3c69fd2bMarek Olšák r600_blit_decompress_depth(ctx, rsrc, NULL, 700b242adbe5cfa165b252064a1ea36f802d8251ef1Marek Olšák src_level, src_level, 70194b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák src_box->z, src_box->z + src_box->depth - 1, 70294b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák 0, u_max_sample(src)); 703b242adbe5cfa165b252064a1ea36f802d8251ef1Marek Olšák } 70464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák if (rctx->chip_class != CAYMAN && rsrc->fmask_size && rsrc->cmask_size) { 705a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák r600_blit_decompress_color(ctx, rsrc, src_level, src_level, 706a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák src_box->z, src_box->z + src_box->depth - 1); 707a3d9d7ec79d6f7205fab2324e47d8ea185431de0Marek Olšák } 7084b49fcbb9a26680e9a4ef441668e0dd817529d47Dave Airlie 7098e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie restore_orig[0] = restore_orig[1] = FALSE; 7108e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 7117c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák if (util_format_is_compressed(src->format) && 7127c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák util_format_is_compressed(dst->format)) { 713c9bca01819ef0fa3c64a28e26bd63953cf7f1364Dave Airlie r600_compressed_to_blittable(src, src_level, &orig_info[0]); 7148e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie restore_orig[0] = TRUE; 715a916d4279a2c8daac832f77b84aff66f33b590a3Vadim Girlin sbox.x = util_format_get_nblocksx(orig_info[0].format, src_box->x); 716a916d4279a2c8daac832f77b84aff66f33b590a3Vadim Girlin sbox.y = util_format_get_nblocksy(orig_info[0].format, src_box->y); 717a916d4279a2c8daac832f77b84aff66f33b590a3Vadim Girlin sbox.z = src_box->z; 718a916d4279a2c8daac832f77b84aff66f33b590a3Vadim Girlin sbox.width = util_format_get_nblocksx(orig_info[0].format, src_box->width); 719a916d4279a2c8daac832f77b84aff66f33b590a3Vadim Girlin sbox.height = util_format_get_nblocksy(orig_info[0].format, src_box->height); 720a916d4279a2c8daac832f77b84aff66f33b590a3Vadim Girlin sbox.depth = src_box->depth; 721795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák psbox = &sbox; 7228e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 723c9bca01819ef0fa3c64a28e26bd63953cf7f1364Dave Airlie r600_compressed_to_blittable(dst, dst_level, &orig_info[1]); 7248e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie restore_orig[1] = TRUE; 7250863eaf91cbbfb39f9b91b0d1217090a18e10082Dave Airlie /* translate the dst box as well */ 7260863eaf91cbbfb39f9b91b0d1217090a18e10082Dave Airlie dstx = util_format_get_nblocksx(orig_info[1].format, dstx); 727f53436d821a5173075b2a4a8db8cd23d9669f6e2Dave Airlie dsty = util_format_get_nblocksy(orig_info[1].format, dsty); 7287c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák } else if (!util_blitter_is_copy_supported(rctx->blitter, dst, src, 7297c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák PIPE_MASK_RGBAZS)) { 730795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák if (util_format_is_subsampled_2x1_32bpp(src->format) && 731795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák util_format_is_subsampled_2x1_32bpp(dst->format)) { 732795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák r600_subsampled_2x1_32bpp_to_blittable(src, src_level, &orig_info[0]); 733795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák r600_subsampled_2x1_32bpp_to_blittable(dst, dst_level, &orig_info[1]); 734795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák 735795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák sbox = *src_box; 736795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák sbox.x = util_format_get_nblocksx(orig_info[0].format, src_box->x); 737795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák sbox.width = util_format_get_nblocksx(orig_info[0].format, src_box->width); 738795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák psbox = &sbox; 739795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák 740795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák dstx = util_format_get_nblocksx(orig_info[1].format, dstx); 741795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák } else { 742795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák unsigned blocksize = util_format_get_blocksize(src->format); 743795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák 744795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák switch (blocksize) { 745795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák case 1: 746795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák r600_change_format(src, src_level, &orig_info[0], 747795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák PIPE_FORMAT_R8_UNORM); 748795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák r600_change_format(dst, dst_level, &orig_info[1], 749795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák PIPE_FORMAT_R8_UNORM); 750795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák break; 751795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák case 4: 752795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák r600_change_format(src, src_level, &orig_info[0], 753795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák PIPE_FORMAT_R8G8B8A8_UNORM); 754795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák r600_change_format(dst, dst_level, &orig_info[1], 755795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák PIPE_FORMAT_R8G8B8A8_UNORM); 756795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák break; 757795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák default: 758795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák fprintf(stderr, "Unhandled format %s with blocksize %u\n", 759795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák util_format_short_name(src->format), blocksize); 760795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák assert(0); 761795834432b11418d82db9a5580c916b3bee1a8f2Marek Olšák } 7627c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák } 7637c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák restore_orig[0] = TRUE; 7647c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák restore_orig[1] = TRUE; 7658e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie } 7668e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 76764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák /* XXX Properly implement multisample textures on Cayman. In the meantime, 76864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák * copy only the first sample (which is the only one that doesn't return garbage). */ 76964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák if (rctx->chip_class == CAYMAN) { 770870af19d70bf985a253f1ea8398fb7ec8704cf9cMarek Olšák r600_blitter_begin(ctx, R600_COPY_TEXTURE); 77164db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák util_blitter_copy_texture(rctx->blitter, dst, dst_level, ~0, dstx, dsty, dstz, 77264db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák src, src_level, 0, psbox); 773870af19d70bf985a253f1ea8398fb7ec8704cf9cMarek Olšák r600_blitter_end(ctx); 77464db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák } else { 77564db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák for (i = 0; i <= last_sample; i++) { 77664db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák r600_blitter_begin(ctx, R600_COPY_TEXTURE); 77764db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák util_blitter_copy_texture(rctx->blitter, dst, dst_level, 1 << i, dstx, dsty, dstz, 77864db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák src, src_level, i, psbox); 77964db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák r600_blitter_end(ctx); 78064db3cc6ad2d52dec46119e5b80030393cb60bf4Marek Olšák } 781870af19d70bf985a253f1ea8398fb7ec8704cf9cMarek Olšák } 7824b49fcbb9a26680e9a4ef441668e0dd817529d47Dave Airlie 7838e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie if (restore_orig[0]) 7847c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák r600_reset_blittable_to_orig(src, src_level, &orig_info[0]); 7858e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie 7868e0437914bb786d0b05be8f95e4ff37bf5a19f44Dave Airlie if (restore_orig[1]) 7877c371f46958910dd2ca9487c89af1b72bbfdada9Marek Olšák r600_reset_blittable_to_orig(dst, dst_level, &orig_info[1]); 7886abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse} 7896abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse 790e4340c1908a6a3b09e1a15d5195f6da7d00494d0Marek Olšákvoid r600_init_blit_functions(struct r600_context *rctx) 7916abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse{ 7926abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse rctx->context.clear = r600_clear; 7936abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse rctx->context.clear_render_target = r600_clear_render_target; 7946abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse rctx->context.clear_depth_stencil = r600_clear_depth_stencil; 7956abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse rctx->context.resource_copy_region = r600_resource_copy_region; 79694b634eca0e2bd32d4b5bd92d06d510eae8a5625Marek Olšák rctx->context.resource_resolve = r600_resource_resolve; 7976abd7771c6ab2c733b20835e211060dd18fd847dJerome Glisse} 798