nv50_surface.c revision b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1
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 37e54354e8853c3521e71e5b94984722f18b7638e4Christoph Bumiller#define NV50_ENG2D_SUPPORTED_FORMATS 0xff0843e080608409ULL 38e54354e8853c3521e71e5b94984722f18b7638e4Christoph Bumiller 3975ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller/* return TRUE for formats that can be converted among each other by NV50_2D */ 4075ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumillerstatic INLINE boolean 4175ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumillernv50_2d_format_faithful(enum pipe_format format) 4275ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller{ 43e54354e8853c3521e71e5b94984722f18b7638e4Christoph Bumiller uint8_t id = nv50_format_table[format].rt; 44e54354e8853c3521e71e5b94984722f18b7638e4Christoph Bumiller 45e54354e8853c3521e71e5b94984722f18b7638e4Christoph Bumiller return (id >= 0xc0) && 46e54354e8853c3521e71e5b94984722f18b7638e4Christoph Bumiller (NV50_ENG2D_SUPPORTED_FORMATS & (1ULL << (id - 0xc0))); 4775ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller} 4875ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller 49583bbfb3aed3ded6ca060155c1ebbd4f39138a31Christoph Bumillerstatic INLINE uint8_t 50583bbfb3aed3ded6ca060155c1ebbd4f39138a31Christoph Bumillernv50_2d_format(enum pipe_format format) 5113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{ 52f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint8_t id = nv50_format_table[format].rt; 53f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 54f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* Hardware values for color formats range from 0xc0 to 0xff, 55f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller * but the 2D engine doesn't support all of them. 56f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */ 57e54354e8853c3521e71e5b94984722f18b7638e4Christoph Bumiller if ((id >= 0xc0) && (NV50_ENG2D_SUPPORTED_FORMATS & (1ULL << (id - 0xc0)))) 58f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return id; 59f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 60f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller switch (util_format_get_blocksize(format)) { 61f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case 1: 62f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_SURFACE_FORMAT_R8_UNORM; 63f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case 2: 64f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_SURFACE_FORMAT_R16_UNORM; 65f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller case 4: 66f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return NV50_SURFACE_FORMAT_A8R8G8B8_UNORM; 67f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller default: 68f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return 0; 69f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 7013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs} 7113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 7213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsstatic int 73f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_2d_texture_set(struct nouveau_channel *chan, int dst, 74f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *mt, unsigned level, unsigned layer) 7513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{ 76f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *bo = mt->base.bo; 77f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t width, height, depth; 78f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t format; 79f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t mthd = dst ? NV50_2D_DST_FORMAT : NV50_2D_SRC_FORMAT; 80f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t flags = mt->base.domain | (dst ? NOUVEAU_BO_WR : NOUVEAU_BO_RD); 81f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t offset = mt->level[level].offset; 82f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 83f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller format = nv50_2d_format(mt->base.base.format); 84f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!format) { 85f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NOUVEAU_ERR("invalid/unsupported surface format: %s\n", 86f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller util_format_name(mt->base.base.format)); 87f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return 1; 88f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 89f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 90b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller width = u_minify(mt->base.base.width0, level) << mt->ms_x; 91b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller height = u_minify(mt->base.base.height0, level) << mt->ms_y; 92f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 93f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller offset = mt->level[level].offset; 94f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!mt->layout_3d) { 95f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller offset += mt->layer_stride * layer; 96f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller depth = 1; 97f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller layer = 0; 98f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 99f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller depth = u_minify(mt->base.base.depth0, level); 100f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 101f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 102f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!(bo->tile_flags & NOUVEAU_BO_TILE_LAYOUT_MASK)) { 103f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D_(mthd), 2); 104f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, format); 105f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 106f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D_(mthd + 0x14), 5); 107f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mt->level[level].pitch); 108f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, width); 109f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, height); 110f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCh(chan, bo, offset, flags); 111f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, bo, offset, flags); 112f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } else { 113f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D_(mthd), 5); 114f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, format); 115f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 116f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mt->level[level].tile_mode << 4); 117f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, depth); 118f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, layer); 119f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D_(mthd + 0x18), 4); 120f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, width); 121f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, height); 122f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCh(chan, bo, offset, flags); 123f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, bo, offset, flags); 124f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 125f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 12613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#if 0 127f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (dst) { 128f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D_(NV50_2D_CLIP_X), 4); 129f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 130f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 131f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, width); 132f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, height); 133f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 13413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#endif 135f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return 0; 13613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs} 13713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 138f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic int 139f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_2d_texture_do_copy(struct nouveau_channel *chan, 140f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *dst, unsigned dst_level, 141f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned dx, unsigned dy, unsigned dz, 142f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *src, unsigned src_level, 143f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned sx, unsigned sy, unsigned sz, 144f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned w, unsigned h) 14513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{ 146b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller static const uint32_t duvdxy[5] = 147b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller { 148b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 0x40000000, 0x80000000, 0x00000001, 0x00000002, 0x00000004 149b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller }; 150b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 151f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller int ret; 152b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller uint32_t ctrl; 153f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 154f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret = MARK_RING(chan, 2 * 16 + 32, 4); 155f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ret) 156f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return ret; 157f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 158f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret = nv50_2d_texture_set(chan, 1, dst, dst_level, dz); 159f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ret) 160f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return ret; 161f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 162f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret = nv50_2d_texture_set(chan, 0, src, src_level, sz); 163f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ret) 164f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return ret; 165f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 166b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller /* NOTE: 2D engine doesn't work for MS8 */ 167b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller if (src->ms_x) 168b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller ctrl = 0x11; 169b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 170b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller /* 0/1 = CENTER/CORNER, 00/10 = POINT/BILINEAR */ 171f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(BLIT_CONTROL), 1); 172b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, ctrl); 173f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(BLIT_DST_X), 4); 174b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, dx << dst->ms_x); 175b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, dy << dst->ms_y); 176b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, w << dst->ms_x); 177b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, h << dst->ms_y); 178f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(BLIT_DU_DX_FRACT), 4); 179b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, duvdxy[2 + ((int)src->ms_x - (int)dst->ms_x)] & 0xf0000000); 180b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, duvdxy[2 + ((int)src->ms_x - (int)dst->ms_x)] & 0x0000000f); 181b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, duvdxy[2 + ((int)src->ms_y - (int)dst->ms_y)] & 0xf0000000); 182b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, duvdxy[2 + ((int)src->ms_y - (int)dst->ms_y)] & 0x0000000f); 183f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_2D(BLIT_SRC_X_FRACT), 4); 184f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 185b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, sx << src->ms_x); 186f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 187b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller OUT_RING (chan, sy << src->ms_y); 188f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 189f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return 0; 19013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs} 19113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 192b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void 193f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_resource_copy_region(struct pipe_context *pipe, 194f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_resource *dst, unsigned dst_level, 195f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned dstx, unsigned dsty, unsigned dstz, 196f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_resource *src, unsigned src_level, 197f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const struct pipe_box *src_box) 198b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{ 199f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_screen *screen = nv50_context(pipe)->screen; 200f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller int ret; 201f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned dst_layer = dstz, src_layer = src_box->z; 202f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 203883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák /* Fallback for buffers. */ 204883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) { 205883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák util_resource_copy_region(pipe, dst, dst_level, dstx, dsty, dstz, 206883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák src, src_level, src_box); 207883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák return; 208883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák } 209883d8a0b449b53d83cc5970d2ce50df536aef55fMarek Olšák 210b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller nv04_resource(dst)->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING; 211b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 212b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller if (src->format == dst->format && src->nr_samples == dst->nr_samples) { 213b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller struct nv50_m2mf_rect drect, srect; 214b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller unsigned i; 215b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller unsigned nx = util_format_get_nblocksx(src->format, src_box->width); 216b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller unsigned ny = util_format_get_nblocksy(src->format, src_box->height); 217b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 218b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller nv50_m2mf_rect_setup(&drect, dst, dst_level, dstx, dsty, dstz); 219b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller nv50_m2mf_rect_setup(&srect, src, src_level, 220b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller src_box->x, src_box->y, src_box->z); 221b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 222b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller for (i = 0; i < src_box->depth; ++i) { 223b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller nv50_m2mf_transfer_rect(&screen->base.base, &drect, &srect, nx, ny); 224b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 225b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller if (nv50_miptree(dst)->layout_3d) 226b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller drect.z++; 227b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller else 228b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller drect.base += nv50_miptree(dst)->layer_stride; 229b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 230b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller if (nv50_miptree(src)->layout_3d) 231b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller srect.z++; 232b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller else 233b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller srect.base += nv50_miptree(src)->layer_stride; 234b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller } 235b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller return; 236b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller } 237b2dcf880e8bcd61be59602f5a2d18c77a5fc60c1Christoph Bumiller 238f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller assert((src->format == dst->format) || 239f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller (nv50_2d_format_faithful(src->format) && 240f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_2d_format_faithful(dst->format))); 241f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 242f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (; dst_layer < dstz + src_box->depth; ++dst_layer, ++src_layer) { 243f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller ret = nv50_2d_texture_do_copy(screen->base.channel, 244f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_miptree(dst), dst_level, 245f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller dstx, dsty, dst_layer, 246f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50_miptree(src), src_level, 247f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller src_box->x, src_box->y, src_layer, 248f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller src_box->width, src_box->height); 249f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (ret) 250f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return; 251f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 25247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 25347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 254b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void 255a6e5c6c000df8655de3b41d5809547bb41c88c23Roland Scheideggernv50_clear_render_target(struct pipe_context *pipe, 256f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_surface *dst, 257f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const float *rgba, 258f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned dstx, unsigned dsty, 259f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned width, unsigned height) 260b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{ 261f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 262f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_screen *screen = nv50->screen; 263f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_channel *chan = screen->base.channel; 264f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *mt = nv50_miptree(dst->texture); 265f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_surface *sf = nv50_surface(dst); 266f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *bo = mt->base.bo; 267f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_COLOR(0)), 4); 269f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[0]); 270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[1]); 271f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[2]); 272f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[3]); 273f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 274f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (MARK_RING(chan, 18, 2)) 275f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return; 276f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 277f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(RT_CONTROL), 1); 278f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 279f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(RT_ADDRESS_HIGH(0)), 5); 280f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCh(chan, bo, sf->offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 281f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, bo, sf->offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 282f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, nv50_format_table[dst->format].rt); 283f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mt->level[sf->base.u.tex.level].tile_mode << 4); 284f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 285f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(RT_HORIZ(0)), 2); 286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, sf->width); 287f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, sf->height); 288f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(RT_ARRAY_MODE), 1); 289f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 290f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* NOTE: only works with D3D clear flag (5097/0x143c bit 4) */ 292f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 293f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(VIEWPORT_HORIZ(0)), 2); 294f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (width << 16) | dstx); 295f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (height << 16) | dsty); 296f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 297f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_BUFFERS), 1); 298f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0x3c); 299f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 300f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAMEBUFFER; 3012ef1d759b34fb6e9795d70a7c7b6c6c274c64bf8Christoph Bumiller} 3022ef1d759b34fb6e9795d70a7c7b6c6c274c64bf8Christoph Bumiller 3032ef1d759b34fb6e9795d70a7c7b6c6c274c64bf8Christoph Bumillerstatic void 3042ef1d759b34fb6e9795d70a7c7b6c6c274c64bf8Christoph Bumillernv50_clear_depth_stencil(struct pipe_context *pipe, 305f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_surface *dst, 306f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned clear_flags, 307f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller double depth, 308f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned stencil, 309f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned dstx, unsigned dsty, 310f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned width, unsigned height) 311f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{ 312f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 313f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_screen *screen = nv50->screen; 314f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_channel *chan = screen->base.channel; 315f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_miptree *mt = nv50_miptree(dst->texture); 316f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_surface *sf = nv50_surface(dst); 317f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_bo *bo = mt->base.bo; 318f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t mode = 0; 319f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 320f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (clear_flags & PIPE_CLEAR_DEPTH) { 321f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_DEPTH), 1); 322f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, depth); 323f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller mode |= NV50_3D_CLEAR_BUFFERS_Z; 324f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 325f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 326f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (clear_flags & PIPE_CLEAR_STENCIL) { 327f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_STENCIL), 1); 328f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, stencil & 0xff); 329f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller mode |= NV50_3D_CLEAR_BUFFERS_S; 330f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 331f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 332f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (MARK_RING(chan, 17, 2)) 333f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return; 334f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 335f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(ZETA_ADDRESS_HIGH), 5); 336f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCh(chan, bo, sf->offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 337f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RELOCl(chan, bo, sf->offset, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); 338f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, nv50_format_table[dst->format].rt); 339f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mt->level[sf->base.u.tex.level].tile_mode << 4); 340f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 0); 341f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(ZETA_ENABLE), 1); 342f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, 1); 343f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(ZETA_HORIZ), 3); 344f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, sf->width); 345f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, sf->height); 346f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (1 << 16) | 1); 347f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 348f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(VIEWPORT_HORIZ(0)), 2); 349f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (width << 16) | dstx); 350f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (height << 16) | dsty); 351f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 352f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_BUFFERS), 1); 353f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mode); 354f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 355f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty |= NV50_NEW_FRAMEBUFFER; 356f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller} 357f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 358f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillervoid 359f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_clear(struct pipe_context *pipe, unsigned buffers, 360f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const float *rgba, double depth, unsigned stencil) 3612ef1d759b34fb6e9795d70a7c7b6c6c274c64bf8Christoph Bumiller{ 362f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nv50_context *nv50 = nv50_context(pipe); 363f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct nouveau_channel *chan = nv50->screen->base.channel; 364f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller struct pipe_framebuffer_state *fb = &nv50->framebuffer; 365f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller unsigned i; 366f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller const unsigned dirty = nv50->dirty; 367f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller uint32_t mode = 0; 368f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 369f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller /* don't need NEW_BLEND, COLOR_MASK doesn't affect CLEAR_BUFFERS */ 370f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty &= NV50_NEW_FRAMEBUFFER; 371f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (!nv50_state_validate(nv50)) 372f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller return; 373f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 374f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (buffers & PIPE_CLEAR_COLOR && fb->nr_cbufs) { 375f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_COLOR(0)), 4); 376f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[0]); 377f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[1]); 378f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[2]); 379f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RINGf (chan, rgba[3]); 380f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller mode = 381f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_CLEAR_BUFFERS_R | NV50_3D_CLEAR_BUFFERS_G | 382f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller NV50_3D_CLEAR_BUFFERS_B | NV50_3D_CLEAR_BUFFERS_A; 383f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 384f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 385f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (buffers & PIPE_CLEAR_DEPTH) { 386f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_DEPTH), 1); 387f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, fui(depth)); 388f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller mode |= NV50_3D_CLEAR_BUFFERS_Z; 389f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 390f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 391f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller if (buffers & PIPE_CLEAR_STENCIL) { 392f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_STENCIL), 1); 393f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, stencil & 0xff); 394f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller mode |= NV50_3D_CLEAR_BUFFERS_S; 395f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 396f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 397f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_BUFFERS), 1); 398f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, mode); 399f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 400f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller for (i = 1; i < fb->nr_cbufs; i++) { 401f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller BEGIN_RING(chan, RING_3D(CLEAR_BUFFERS), 1); 402f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller OUT_RING (chan, (i << 6) | 0x3c); 403f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller } 404f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller 405f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller nv50->dirty = dirty & ~NV50_NEW_FRAMEBUFFER; 406b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs} 40747b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 40847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid 40947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_surface_functions(struct nv50_context *nv50) 41047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 4111ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct pipe_context *pipe = &nv50->base.pipe; 4121ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 4131ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->resource_copy_region = nv50_resource_copy_region; 4141ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->clear_render_target = nv50_clear_render_target; 4151ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs pipe->clear_depth_stencil = nv50_clear_depth_stencil; 41647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 41765ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs 41865ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs 419