1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/********************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008-2009 VMware, Inc. All rights reserved. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * obtaining a copy of this software and associated documentation 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * files (the "Software"), to deal in the Software without 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * restriction, including without limitation the rights to use, copy, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modify, merge, publish, distribute, sublicense, and/or sell copies 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software, and to permit persons to whom the Software is 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * included in all copies or substantial portions of the Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************/ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_cmd.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "os/os_thread.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_format.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_screen.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_context.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_resource_texture.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_surface.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_debug.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_texture_copy_handle(struct svga_context *svga, 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_winsys_surface *src_handle, 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_x, unsigned src_y, unsigned src_z, 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_level, unsigned src_face, 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_winsys_surface *dst_handle, 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_x, unsigned dst_y, unsigned dst_z, 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_level, unsigned dst_face, 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height, unsigned depth) 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_surface dst, src; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_error ret; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA3dCopyBox box, *boxes; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(svga); 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.handle = src_handle; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.real_level = src_level; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.real_face = src_face; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.real_zslice = 0; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.handle = dst_handle; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.real_level = dst_level; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.real_face = dst_face; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.real_zslice = 0; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.x = dst_x; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.y = dst_y; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.z = dst_z; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.w = width; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.h = height; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.d = depth; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.srcx = src_x; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.srcy = src_y; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.srcz = src_z; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA_DBG(DEBUG_VIEWS, "mipcopy src: %p %u (%ux%ux%u), dst: %p %u (%ux%ux%u)\n", 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_handle, src_level, src_x, src_y, src_z, 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_handle, dst_level, dst_x, dst_y, dst_z); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = SVGA3D_BeginSurfaceCopy(svga->swc, 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &src.base, 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dst.base, 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &boxes, 1); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret != PIPE_OK) { 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org svga_context_flush(svga, NULL); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = SVGA3D_BeginSurfaceCopy(svga->swc, 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &src.base, 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dst.base, 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &boxes, 1); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ret == PIPE_OK); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *boxes = box; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA_FIFOCommitAll(svga->swc); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct svga_winsys_surface * 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_texture_view_surface(struct svga_context *svga, 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_texture *tex, 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA3dSurfaceFlags flags, 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA3dSurfaceFormat format, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned start_mip, 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_mip, 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int face_pick, 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int zslice_pick, 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_host_surface_cache_key *key) /* OUT */ 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_screen *ss = svga_screen(svga->pipe.screen); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_winsys_surface *handle; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t i, j; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned z_offset = 0; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA_DBG(DEBUG_PERF, 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "svga: Create surface view: face %d zslice %d mips %d..%d\n", 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org face_pick, zslice_pick, start_mip, start_mip+num_mip-1); 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->flags = flags; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->format = format; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->numMipLevels = num_mip; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->size.width = u_minify(tex->b.b.width0, start_mip); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->size.height = u_minify(tex->b.b.height0, start_mip); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->size.depth = zslice_pick < 0 ? u_minify(tex->b.b.depth0, start_mip) : 1; 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->cachable = 1; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(key->size.depth == 1); 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex->b.b.target == PIPE_TEXTURE_CUBE && face_pick < 0) { 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->flags |= SVGA3D_SURFACE_CUBEMAP; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->numFaces = 6; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->numFaces = 1; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (key->format == SVGA3D_FORMAT_INVALID) { 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->cachable = 0; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA_DBG(DEBUG_DMA, "surface_create for texture view\n"); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle = svga_screen_surface_create(ss, key); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!handle) { 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org key->cachable = 0; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA_DBG(DEBUG_DMA, " --> got sid %p (texture view)\n", handle); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (face_pick < 0) 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org face_pick = 0; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (zslice_pick >= 0) 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z_offset = zslice_pick; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < key->numMipLevels; i++) { 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < key->numFaces; j++) { 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tex->defined[j + face_pick][i + start_mip]) { 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned depth = (zslice_pick < 0 ? 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_minify(tex->b.b.depth0, i + start_mip) : 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org svga_texture_copy_handle(svga, 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->handle, 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, z_offset, 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i + start_mip, 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org j + face_pick, 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle, 0, 0, 0, i, j, 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_minify(tex->b.b.width0, i + start_mip), 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_minify(tex->b.b.height0, i + start_mip), 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return handle; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_surface * 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_create_surface(struct pipe_context *pipe, 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *pt, 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_surface *surf_tmpl) 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_context *svga = svga_context(pipe); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_texture *tex = svga_texture(pt); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = pipe->screen; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_screen *ss = svga_screen(screen); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_surface *s; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned face, zslice; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX surfaces should only be used for rendering purposes nowadays */ 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean render = (surf_tmpl->usage & (PIPE_BIND_RENDER_TARGET | 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_BIND_DEPTH_STENCIL)) ? TRUE : FALSE; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean view = FALSE; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA3dSurfaceFlags flags; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA3dSurfaceFormat format; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = CALLOC_STRUCT(svga_surface); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!s) 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pt->target == PIPE_TEXTURE_CUBE) { 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org face = surf_tmpl->u.tex.first_layer; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zslice = 0; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org face = 0; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zslice = surf_tmpl->u.tex.first_layer; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_reference_init(&s->base.reference, 1); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&s->base.texture, pt); 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->base.context = pipe; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->base.format = surf_tmpl->format; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->base.width = u_minify(pt->width0, surf_tmpl->u.tex.level); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->base.height = u_minify(pt->height0, surf_tmpl->u.tex.level); 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->base.usage = surf_tmpl->usage; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->base.u.tex.level = surf_tmpl->u.tex.level; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->base.u.tex.first_layer = surf_tmpl->u.tex.first_layer; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->base.u.tex.last_layer = surf_tmpl->u.tex.last_layer; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!render) { 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags = SVGA3D_SURFACE_HINT_TEXTURE; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surf_tmpl->usage & PIPE_BIND_RENDER_TARGET) { 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags = SVGA3D_SURFACE_HINT_RENDERTARGET; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surf_tmpl->usage & PIPE_BIND_DEPTH_STENCIL) { 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flags = SVGA3D_SURFACE_HINT_DEPTHSTENCIL; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = svga_translate_format(ss, surf_tmpl->format, surf_tmpl->usage); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(format != SVGA3D_FORMAT_INVALID); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (svga_screen(screen)->debug.force_surface_view) 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view = TRUE; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Currently only used for compressed textures */ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (render && 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format != svga_translate_format(ss, surf_tmpl->format, surf_tmpl->usage)) { 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view = TRUE; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surf_tmpl->u.tex.level != 0 && 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org svga_screen(screen)->debug.force_level_surface_view) 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view = TRUE; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pt->target == PIPE_TEXTURE_3D) 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view = TRUE; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (svga_screen(screen)->debug.no_surface_view) 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org view = FALSE; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (view) { 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA_DBG(DEBUG_VIEWS, "svga: Surface view: yes %p, level %u face %u z %u, %p\n", 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pt, surf_tmpl->u.tex.level, face, zslice, s); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->handle = svga_texture_view_surface(svga, tex, flags, format, 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org surf_tmpl->u.tex.level, 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, face, zslice, &s->key); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->real_face = 0; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->real_level = 0; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->real_zslice = 0; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA_DBG(DEBUG_VIEWS, "svga: Surface view: no %p, level %u, face %u, z %u, %p\n", 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pt, surf_tmpl->u.tex.level, face, zslice, s); 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&s->key, 0, sizeof s->key); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->handle = tex->handle; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->real_face = face; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->real_zslice = zslice; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->real_level = surf_tmpl->u.tex.level; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &s->base; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_surface_destroy(struct pipe_context *pipe, 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *surf) 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_surface *s = svga_surface(surf); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_texture *t = svga_texture(surf->texture); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_screen *ss = svga_screen(surf->texture->screen); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s->handle != t->handle) { 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA_DBG(DEBUG_DMA, "unref sid %p (tex surface)\n", s->handle); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org svga_screen_surface_destroy(ss, &s->key, &s->handle); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&surf->texture, NULL); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(surf); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_mark_surface_dirty(struct pipe_surface *surf) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_surface *s = svga_surface(surf); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!s->dirty) { 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_texture *tex = svga_texture(surf->texture); 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->dirty = TRUE; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s->handle == tex->handle) { 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* hmm so 3d textures always have all their slices marked ? */ 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surf->texture->target == PIPE_TEXTURE_CUBE) 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->defined[surf->u.tex.first_layer][surf->u.tex.level] = TRUE; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->defined[0][surf->u.tex.level] = TRUE; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this will happen later in svga_propagate_surface */ 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Increment the view_age and texture age for this surface's slice 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * so that any sampler views into the texture are re-validated too. 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->view_age[surf->u.tex.first_layer] = ++(tex->age); 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_mark_surfaces_dirty(struct svga_context *svga) 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (svga->curr.framebuffer.cbufs[i]) 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org svga_mark_surface_dirty(svga->curr.framebuffer.cbufs[i]); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (svga->curr.framebuffer.zsbuf) 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org svga_mark_surface_dirty(svga->curr.framebuffer.zsbuf); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Progagate any changes from surfaces to texture. 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pipe is optional context to inline the blit command in. 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_propagate_surface(struct svga_context *svga, struct pipe_surface *surf) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_surface *s = svga_surface(surf); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_texture *tex = svga_texture(surf->texture); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_screen *ss = svga_screen(surf->texture->screen); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned zslice, face; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!s->dirty) 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (surf->texture->target == PIPE_TEXTURE_CUBE) { 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zslice = 0; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org face = surf->u.tex.first_layer; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zslice = surf->u.tex.first_layer; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org face = 0; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->dirty = FALSE; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ss->texture_timestamp++; 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->view_age[surf->u.tex.level] = ++(tex->age); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s->handle != tex->handle) { 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SVGA_DBG(DEBUG_VIEWS, 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "svga: Surface propagate: tex %p, level %u, from %p\n", 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex, surf->u.tex.level, surf); 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org svga_texture_copy_handle(svga, 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->handle, 0, 0, 0, s->real_level, s->real_face, 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->handle, 0, 0, zslice, surf->u.tex.level, face, 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_minify(tex->b.b.width0, surf->u.tex.level), 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_minify(tex->b.b.height0, surf->u.tex.level), 1); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->defined[face][surf->u.tex.level] = TRUE; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if we should call svga_propagate_surface on the surface. 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_surface_needs_propagation(const struct pipe_surface *surf) 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct svga_surface *s = svga_surface_const(surf); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct svga_texture *tex = svga_texture(surf->texture); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return s->dirty && s->handle != tex->handle; 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_init_surface_functions(struct svga_context *svga) 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org svga->pipe.create_surface = svga_create_surface; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org svga->pipe.surface_destroy = svga_surface_destroy; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 408