nv50_surface.c revision 883d8a0b449b53d83cc5970d2ce50df536aef55f
1857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs/* 2857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Copyright 2008 Ben Skeggs 3857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * 447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 5857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * copy of this software and associated documentation files (the "Software"), 6857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * to deal in the Software without restriction, including without limitation 7857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the 9857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Software is furnished to do so, subject to the following conditions: 10857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * 11857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * The above copyright notice and this permission notice shall be included in 12857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * all copies or substantial portions of the Software. 13857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * 14857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * SOFTWARE. 21857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs */ 2247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 2313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#include <stdint.h> 24f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 2547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "pipe/p_defines.h" 26f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 2728486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 28e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger#include "util/u_pack_color.h" 29e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller#include "util/u_format.h" 30883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák#include "util/u_surface.h" 3147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 32f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_context.h" 33f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_resource.h" 34f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 35f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_defs.xml.h" 36f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 3775ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller/* return TRUE for formats that can be converted among each other by NV50_2D */ 3875ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumillerstatic INLINE boolean 3975ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumillernv50_2d_format_faithful(enum pipe_format format) 4075ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller{ 41f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (format) { 42f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FORMAT_B8G8R8A8_UNORM: 43f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FORMAT_B8G8R8X8_UNORM: 44f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FORMAT_B8G8R8A8_SRGB: 45f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FORMAT_B8G8R8X8_SRGB: 46f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FORMAT_B5G6R5_UNORM: 47f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FORMAT_B5G5R5A1_UNORM: 48f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FORMAT_B10G10R10A2_UNORM: 49f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FORMAT_R8_UNORM: 50f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FORMAT_R32G32B32A32_FLOAT: 51f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case PIPE_FORMAT_R32G32B32_FLOAT: 52f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return TRUE; 53f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 54f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return FALSE; 55f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 5675ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller} 5775ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller 58583bbfb3aed3ded6ca060155c1ebbd4f39138a31Christoph Bumillerstatic INLINE uint8_t 59583bbfb3aed3ded6ca060155c1ebbd4f39138a31Christoph Bumillernv50_2d_format(enum pipe_format format) 6013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{ 61f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint8_t id = nv50_format_table[format].rt; 62f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 63f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* Hardware values for color formats range from 0xc0 to 0xff, 64f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller * but the 2D engine doesn't support all of them. 65f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 66f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if ((id >= 0xc0) && (0xff0843e080608409ULL & (1ULL << (id - 0xc0)))) 67f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return id; 68f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 69f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (util_format_get_blocksize(format)) { 70f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case 1: 71f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_SURFACE_FORMAT_R8_UNORM; 72f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case 2: 73f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_SURFACE_FORMAT_R16_UNORM; 74f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case 4: 75f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_SURFACE_FORMAT_A8R8G8B8_UNORM; 76f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 77f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return 0; 78f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 7913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs} 8013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 8113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsstatic int 82f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_2d_texture_set(struct nouveau_channel *chan, int dst, 83f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *mt, unsigned level, unsigned layer) 8413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{ 85f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *bo = mt->base.bo; 86f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t width, height, depth; 87f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t format; 88f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t mthd = dst ? NV50_2D_DST_FORMAT : NV50_2D_SRC_FORMAT; 89f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t flags = mt->base.domain | (dst ? NOUVEAU_BO_WR : NOUVEAU_BO_RD); 90f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t offset = mt->level[level].offset; 91f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 92f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller format = nv50_2d_format(mt->base.base.format); 93f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!format) { 94f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_ERR("invalid/unsupported surface format: %s\n", 95f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller util_format_name(mt->base.base.format)); 96f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return 1; 97f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 98f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 99f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller width = u_minify(mt->base.base.width0, level); 100f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller height = u_minify(mt->base.base.height0, level); 101f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 102f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller offset = mt->level[level].offset; 103f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!mt->layout_3d) { 104f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller offset += mt->layer_stride * layer; 105f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller depth = 1; 106f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller layer = 0; 107f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 108f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller depth = u_minify(mt->base.base.depth0, level); 109f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 110f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 111f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!(bo->tile_flags & NOUVEAU_BO_TILE_LAYOUT_MASK)) { 112f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D_(mthd), 2); 113f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, format); 114f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 115f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D_(mthd + 0x14), 5); 116f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mt->level[level].pitch); 117f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, width); 118f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, height); 119f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCh(chan, bo, offset, flags); 120f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, bo, offset, flags); 121f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 122f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D_(mthd), 5); 123f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, format); 124f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 125f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mt->level[level].tile_mode << 4); 126f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, depth); 127f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, layer); 128f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D_(mthd + 0x18), 4); 129f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, width); 130f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, height); 131f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCh(chan, bo, offset, flags); 132f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, bo, offset, flags); 133f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 134f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 13513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#if 0 136f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (dst) { 137f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D_(NV50_2D_CLIP_X), 4); 138f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 139f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 140f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, width); 141f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, height); 142f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 14313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#endif 144f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return 0; 14513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs} 14613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 147f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic int 148f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_2d_texture_do_copy(struct nouveau_channel *chan, 149f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *dst, unsigned dst_level, 150f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned dx, unsigned dy, unsigned dz, 151f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *src, unsigned src_level, 152f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned sx, unsigned sy, unsigned sz, 153f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned w, unsigned h) 15413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{ 155f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller int ret; 156f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 157f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret = MARK_RING(chan, 2 * 16 + 32, 4); 158f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ret) 159f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return ret; 160f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 161f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret = nv50_2d_texture_set(chan, 1, dst, dst_level, dz); 162f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ret) 163f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return ret; 164f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 165f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret = nv50_2d_texture_set(chan, 0, src, src_level, sz); 166f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ret) 167f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return ret; 168f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 169f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* 0/1 = CENTER/CORNER, 10/00 = POINT/BILINEAR */ 170f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(BLIT_CONTROL), 1); 171f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 172f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(BLIT_DST_X), 4); 173f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, dx); 174f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, dy); 175f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, w); 176f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, h); 177f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(BLIT_DU_DX_FRACT), 4); 178f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 179f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 180f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 181f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 182f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(BLIT_SRC_X_FRACT), 4); 183f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 184f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, sx); 185f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 186f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, sy); 187f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 188f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return 0; 18913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs} 19013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 191b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void 192f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_resource_copy_region(struct pipe_context *pipe, 193f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_resource *dst, unsigned dst_level, 194f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned dstx, unsigned dsty, unsigned dstz, 195f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_resource *src, unsigned src_level, 196f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_box *src_box) 197b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{ 198f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_screen *screen = nv50_context(pipe)->screen; 199f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller int ret; 200f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned dst_layer = dstz, src_layer = src_box->z; 201f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 202883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák /* Fallback for buffers. */ 203883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) { 204883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák util_resource_copy_region(pipe, dst, dst_level, dstx, dsty, dstz, 205883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák src, src_level, src_box); 206883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák return; 207883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák } 208883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák 209f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert((src->format == dst->format) || 210f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_2d_format_faithful(src->format) && 211f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_2d_format_faithful(dst->format))); 212f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 213f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; dst_layer < dstz + src_box->depth; ++dst_layer, ++src_layer) { 214f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret = nv50_2d_texture_do_copy(screen->base.channel, 215f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_miptree(dst), dst_level, 216f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller dstx, dsty, dst_layer, 217f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_miptree(src), src_level, 218f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller src_box->x, src_box->y, src_layer, 219f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller src_box->width, src_box->height); 220f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ret) 221f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return; 222f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 22347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 22447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 225b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void 226a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggernv50_clear_render_target(struct pipe_context *pipe, 227f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_surface *dst, 228f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const float *rgba, 229f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned dstx, unsigned dsty, 230f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned width, unsigned height) 231b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{ 232f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 233f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_screen *screen = nv50->screen; 234f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_channel *chan = screen->base.channel; 235f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *mt = nv50_miptree(dst->texture); 236f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_surface *sf = nv50_surface(dst); 237f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *bo = mt->base.bo; 238f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 239f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_COLOR(0)), 4); 240f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[0]); 241f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[1]); 242f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[2]); 243f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[3]); 244f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 245f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (MARK_RING(chan, 18, 2)) 246f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return; 247f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 248f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(RT_CONTROL), 1); 249f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 250f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(RT_ADDRESS_HIGH(0)), 5); 251f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCh(chan, bo, sf->offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 252f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, bo, sf->offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 253f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, nv50_format_table[dst->format].rt); 254f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mt->level[sf->base.u.tex.level].tile_mode << 4); 255f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 256f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(RT_HORIZ(0)), 2); 257f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, sf->width); 258f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, sf->height); 259f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(RT_ARRAY_MODE), 1); 260f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 261f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 262f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* NOTE: only works with D3D clear flag (5097/0x143c bit 4) */ 263f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 264f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(VIEWPORT_HORIZ(0)), 2); 265f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (width << 16) | dstx); 266f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (height << 16) | dsty); 267f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_BUFFERS), 1); 269f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0x3c); 270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 271f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAMEBUFFER; 2722ef1d759b34fb6e9795d70a7c7b6c6c274c64bf8Christoph Bumiller} 2732ef1d759b34fb6e9795d70a7c7b6c6c274c64bf8Christoph Bumiller 2742ef1d759b34fb6e9795d70a7c7b6c6c274c64bf8Christoph Bumillerstatic void 2752ef1d759b34fb6e9795d70a7c7b6c6c274c64bf8Christoph Bumillernv50_clear_depth_stencil(struct pipe_context *pipe, 276f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_surface *dst, 277f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned clear_flags, 278f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller double depth, 279f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned stencil, 280f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned dstx, unsigned dsty, 281f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned width, unsigned height) 282f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 283f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 284f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_screen *screen = nv50->screen; 285f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_channel *chan = screen->base.channel; 286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *mt = nv50_miptree(dst->texture); 287f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_surface *sf = nv50_surface(dst); 288f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *bo = mt->base.bo; 289f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t mode = 0; 290f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (clear_flags & PIPE_CLEAR_DEPTH) { 292f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_DEPTH), 1); 293f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, depth); 294f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller mode |= NV50_3D_CLEAR_BUFFERS_Z; 295f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 296f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 297f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (clear_flags & PIPE_CLEAR_STENCIL) { 298f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_STENCIL), 1); 299f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, stencil & 0xff); 300f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller mode |= NV50_3D_CLEAR_BUFFERS_S; 301f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 302f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 303f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (MARK_RING(chan, 17, 2)) 304f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return; 305f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 306f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(ZETA_ADDRESS_HIGH), 5); 307f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCh(chan, bo, sf->offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 308f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, bo, sf->offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 309f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, nv50_format_table[dst->format].rt); 310f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mt->level[sf->base.u.tex.level].tile_mode << 4); 311f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 312f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(ZETA_ENABLE), 1); 313f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 314f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(ZETA_HORIZ), 3); 315f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, sf->width); 316f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, sf->height); 317f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (1 << 16) | 1); 318f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 319f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(VIEWPORT_HORIZ(0)), 2); 320f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (width << 16) | dstx); 321f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (height << 16) | dsty); 322f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 323f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_BUFFERS), 1); 324f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mode); 325f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 326f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAMEBUFFER; 327f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 328f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 329f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillervoid 330f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_clear(struct pipe_context *pipe, unsigned buffers, 331f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const float *rgba, double depth, unsigned stencil) 3322ef1d759b34fb6e9795d70a7c7b6c6c274c64bf8Christoph Bumiller{ 333f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 334f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_channel *chan = nv50->screen->base.channel; 335f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_framebuffer_state *fb = &nv50->framebuffer; 336f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 337f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const unsigned dirty = nv50->dirty; 338f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t mode = 0; 339f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 340f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* don't need NEW_BLEND, COLOR_MASK doesn't affect CLEAR_BUFFERS */ 341f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty &= NV50_NEW_FRAMEBUFFER; 342f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!nv50_state_validate(nv50)) 343f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return; 344f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 345f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (buffers & PIPE_CLEAR_COLOR && fb->nr_cbufs) { 346f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_COLOR(0)), 4); 347f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[0]); 348f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[1]); 349f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[2]); 350f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[3]); 351f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller mode = 352f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_CLEAR_BUFFERS_R | NV50_3D_CLEAR_BUFFERS_G | 353f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_CLEAR_BUFFERS_B | NV50_3D_CLEAR_BUFFERS_A; 354f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 355f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 356f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (buffers & PIPE_CLEAR_DEPTH) { 357f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_DEPTH), 1); 358f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, fui(depth)); 359f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller mode |= NV50_3D_CLEAR_BUFFERS_Z; 360f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 361f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 362f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (buffers & PIPE_CLEAR_STENCIL) { 363f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_STENCIL), 1); 364f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, stencil & 0xff); 365f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller mode |= NV50_3D_CLEAR_BUFFERS_S; 366f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 367f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 368f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_BUFFERS), 1); 369f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mode); 370f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 371f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 1; i < fb->nr_cbufs; i++) { 372f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_BUFFERS), 1); 373f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (i << 6) | 0x3c); 374f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 375f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 376f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty = dirty & ~NV50_NEW_FRAMEBUFFER; 377b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs} 37847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 37947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid 38047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_surface_functions(struct nv50_context *nv50) 38147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 3821ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct pipe_context *pipe = &nv50->base.pipe; 3831ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 3841ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->resource_copy_region = nv50_resource_copy_region; 3851ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->clear_render_target = nv50_clear_render_target; 3861ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->clear_depth_stencil = nv50_clear_depth_stencil; 38747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 38865ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs 38965ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs 390