nv50_surface.c revision e5b82c8222ef29c162d51a7ca9f553d85a63be22
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#define __NOUVEAU_PUSH_H__ 2413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#include <stdint.h> 2513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#include "nouveau/nouveau_pushbuf.h" 2647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "nv50_context.h" 27287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "nv50_resource.h" 2847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs#include "pipe/p_defines.h" 2928486880ca3ec39419ccee0cb1a3bedc9ef7117cJosé Fonseca#include "util/u_inlines.h" 30e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger#include "util/u_pack_color.h" 31f302fca5eb63e4bca8af5b35c585451486143e6aBen Skeggs 32f302fca5eb63e4bca8af5b35c585451486143e6aBen Skeggs#include "util/u_tile.h" 33e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller#include "util/u_format.h" 3447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 3575ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller/* return TRUE for formats that can be converted among each other by NV50_2D */ 3675ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumillerstatic INLINE boolean 3775ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumillernv50_2d_format_faithful(enum pipe_format format) 3875ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller{ 3975ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller switch (format) { 4075ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_B8G8R8A8_UNORM: 4175ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_B8G8R8X8_UNORM: 4275ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_B8G8R8A8_SRGB: 4375ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_B8G8R8X8_SRGB: 4475ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_B5G6R5_UNORM: 4575ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_B5G5R5A1_UNORM: 4675ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_B10G10R10A2_UNORM: 4775ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_R8_UNORM: 4875ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_R32G32B32A32_FLOAT: 4975ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_R32G32B32_FLOAT: 5075ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller return TRUE; 5175ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller default: 5275ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller return FALSE; 5375ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller } 5475ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller} 5575ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller 5613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsstatic INLINE int 5713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsnv50_format(enum pipe_format format) 5813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{ 5913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs switch (format) { 60c9f1db0a03b6d89f8b1113785aa961e6c9a398efJosé Fonseca case PIPE_FORMAT_B8G8R8A8_UNORM: 61987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM; 62c9f1db0a03b6d89f8b1113785aa961e6c9a398efJosé Fonseca case PIPE_FORMAT_B8G8R8X8_UNORM: 63987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller return NV50_2D_DST_FORMAT_X8R8G8B8_UNORM; 64e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_B8G8R8A8_SRGB: 65e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller return NV50_2D_DST_FORMAT_A8R8G8B8_SRGB; 66e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_B8G8R8X8_SRGB: 67e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller return NV50_2D_DST_FORMAT_X8R8G8B8_SRGB; 68c9f1db0a03b6d89f8b1113785aa961e6c9a398efJosé Fonseca case PIPE_FORMAT_B5G6R5_UNORM: 69987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller return NV50_2D_DST_FORMAT_R5G6B5_UNORM; 70e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_B5G5R5A1_UNORM: 71e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller return NV50_2D_DST_FORMAT_A1R5G5B5_UNORM; 7275ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_B10G10R10A2_UNORM: 7375ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller return NV50_2D_DST_FORMAT_A2R10G10B10_UNORM; 7413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs case PIPE_FORMAT_A8_UNORM: 75e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_I8_UNORM: 76e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_L8_UNORM: 7775ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller case PIPE_FORMAT_R8_UNORM: 78987c59c486500780a9315d2a850e6121319f4e93Christoph Bumiller return NV50_2D_DST_FORMAT_R8_UNORM; 79e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_R32G32B32A32_FLOAT: 80e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller return NV50_2D_DST_FORMAT_R32G32B32A32_FLOAT; 81e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_R32G32B32_FLOAT: 82e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller return NV50_2D_DST_FORMAT_R32G32B32X32_FLOAT; 83e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_Z32_FLOAT: 84e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller return NV50_2D_DST_FORMAT_R32_FLOAT; 85e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller 86e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller /* only because we require src format == dst format: */ 87e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_R16G16_SNORM: 88e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_R16G16_UNORM: 896fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 906fb364a1717858d8201b2caf234076ce5d4832acRoland Scheidegger case PIPE_FORMAT_Z24_UNORM_S8_USCALED: 91e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller return NV50_2D_DST_FORMAT_A8R8G8B8_UNORM; 92e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_L8A8_UNORM: 93e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller case PIPE_FORMAT_B4G4R4A4_UNORM: 94e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller return NV50_2D_DST_FORMAT_R16_UNORM; 95e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller 9613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs default: 9713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs return -1; 9813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs } 9913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs} 10013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 10113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsstatic int 10213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsnv50_surface_set(struct nv50_screen *screen, struct pipe_surface *ps, int dst) 10313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{ 10463a3a3762c8e1a67666d36b35fdb0ada8e4b7d08Ben Skeggs struct nv50_miptree *mt = nv50_miptree(ps->texture); 10580e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = screen->eng2d->channel; 10613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs struct nouveau_grobj *eng2d = screen->eng2d; 10702f32454487f2caba00931590254260d871ae795Ben Skeggs struct nouveau_bo *bo = nv50_miptree(ps->texture)->base.bo; 10813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs int format, mthd = dst ? NV50_2D_DST_FORMAT : NV50_2D_SRC_FORMAT; 10913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs int flags = NOUVEAU_BO_VRAM | (dst ? NOUVEAU_BO_WR : NOUVEAU_BO_RD); 110534f1e8f022ea7408c2ad49013e8f2446aa16364Ben Skeggs 11113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs format = nv50_format(ps->format); 112e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller if (format < 0) { 113e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller NOUVEAU_ERR("invalid/unsupported surface format: %s\n", 114e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller util_format_name(ps->format)); 11513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs return 1; 116e548babb1fc9230054674deb5e332f55319e5b91Christoph Bumiller } 11718882f4d30afcc849dca33ff93dbcd5ca45664b8Marcin Kościelnicki 11840ed44991851a526f0e2cafd5dab6149cb7a3342Ben Skeggs if (!bo->tile_flags) { 11941b52aa3362665e08bdc2f75cc9bfdc4debc6eb0Maarten Maathuis MARK_RING (chan, 9, 2); /* flush on lack of space or relocs */ 12013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs BEGIN_RING(chan, eng2d, mthd, 2); 12113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, format); 12213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 1); 12313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs BEGIN_RING(chan, eng2d, mthd + 0x14, 5); 12418882f4d30afcc849dca33ff93dbcd5ca45664b8Marcin Kościelnicki OUT_RING (chan, mt->level[ps->level].pitch); 12513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, ps->width); 12613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, ps->height); 12713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RELOCh(chan, bo, ps->offset, flags); 12813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RELOCl(chan, bo, ps->offset, flags); 12913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs } else { 13041b52aa3362665e08bdc2f75cc9bfdc4debc6eb0Maarten Maathuis MARK_RING (chan, 11, 2); /* flush on lack of space or relocs */ 13113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs BEGIN_RING(chan, eng2d, mthd, 5); 13213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, format); 13313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 0); 13418882f4d30afcc849dca33ff93dbcd5ca45664b8Marcin Kościelnicki OUT_RING (chan, mt->level[ps->level].tile_mode << 4); 13513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 1); 13613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 0); 13713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs BEGIN_RING(chan, eng2d, mthd + 0x18, 4); 13813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, ps->width); 13913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, ps->height); 14013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RELOCh(chan, bo, ps->offset, flags); 14113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RELOCl(chan, bo, ps->offset, flags); 14213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs } 14313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 14413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#if 0 14513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs if (dst) { 14613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs BEGIN_RING(chan, eng2d, NV50_2D_CLIP_X, 4); 14713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 0); 14813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 0); 14913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, surf->width); 15013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, surf->height); 15113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs } 15213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs#endif 15313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 15413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs return 0; 15513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs} 15613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 15732cd1a0345eaf1f4da8a60a4ac2145ff51383d59Younes Mantonint 15813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggsnv50_surface_do_copy(struct nv50_screen *screen, struct pipe_surface *dst, 15913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs int dx, int dy, struct pipe_surface *src, int sx, int sy, 16013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs int w, int h) 16113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs{ 16280e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = screen->eng2d->channel; 16313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs struct nouveau_grobj *eng2d = screen->eng2d; 16413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs int ret; 16513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 16613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs WAIT_RING (chan, 32); 16713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 16813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs ret = nv50_surface_set(screen, dst, 1); 16913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs if (ret) 17013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs return ret; 17113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 17213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs ret = nv50_surface_set(screen, src, 0); 17313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs if (ret) 17413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs return ret; 17513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 17613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs BEGIN_RING(chan, eng2d, 0x088c, 1); 17713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 0); 17813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs BEGIN_RING(chan, eng2d, NV50_2D_BLIT_DST_X, 4); 17913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, dx); 18013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, dy); 18113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, w); 18213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, h); 18313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs BEGIN_RING(chan, eng2d, 0x08c0, 4); 18413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 0); 18513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 1); 18613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 0); 18713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 1); 18813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs BEGIN_RING(chan, eng2d, 0x08d0, 4); 18913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 0); 19013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, sx); 19113393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, 0); 19213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, sy); 19313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 19413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs return 0; 19513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs} 19613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 197b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void 198f500f3a72c6be61ff9b8e1166f734e408d00adedJakob Bornecrantznv50_surface_copy(struct pipe_context *pipe, 199b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger struct pipe_resource *dest, struct pipe_subresource subdst, 200b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger unsigned destx, unsigned desty, unsigned destz, 201b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger struct pipe_resource *src, struct pipe_subresource subsrc, 202b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger unsigned srcx, unsigned srcy, unsigned srcz, 20326add9288c88108e3485ffc57c51ea9bdc0ee719Ben Skeggs unsigned width, unsigned height) 204b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{ 205caf40d5d145185d6a4c3ce8ff7c30ec93c040abdMaarten Maathuis struct nv50_context *nv50 = nv50_context(pipe); 20613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs struct nv50_screen *screen = nv50->screen; 207b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger struct pipe_surface *ps_dst, *ps_src; 20813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 20975ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller assert((src->format == dest->format) || 21075ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller (nv50_2d_format_faithful(src->format) && 21175ee309ca9f467ba80a88b07735fb2d654a8c433Christoph Bumiller nv50_2d_format_faithful(dest->format))); 212b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs 213b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger ps_src = nv50_miptree_surface_new(pipe->screen, dest, subsrc.face, 214b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger subsrc.level, srcz, 0 /* bind flags */); 215b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger ps_dst = nv50_miptree_surface_new(pipe->screen, dest, subdst.face, 216b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger subdst.level, destz, 0 /* bindflags */); 217b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger 218b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger nv50_surface_do_copy(screen, ps_dst, destx, desty, ps_src, srcx, 219b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger srcy, width, height); 220b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger 221b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger nv50_miptree_surface_del(ps_src); 222b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger nv50_miptree_surface_del(ps_dst); 22347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 22447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 225e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger/* XXX this should probably look more along the lines of nv50_clear */ 226b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void 227e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheideggernv50_clearRT(struct pipe_context *pipe, 228e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger struct pipe_surface *dst, 229e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger const float *rgba, 230e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger unsigned dstx, unsigned dsty, 231e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger unsigned width, unsigned height) 232b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{ 233caf40d5d145185d6a4c3ce8ff7c30ec93c040abdMaarten Maathuis struct nv50_context *nv50 = nv50_context(pipe); 23413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs struct nv50_screen *screen = nv50->screen; 23580e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs struct nouveau_channel *chan = screen->eng2d->channel; 23613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs struct nouveau_grobj *eng2d = screen->eng2d; 23713393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs int format, ret; 238e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger union util_color uc; 239e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger util_pack_color(rgba, dst->format, &uc); 24013393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 241e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger format = nv50_format(dst->format); 24213393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs if (format < 0) 24313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs return; 24413393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 24513393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs WAIT_RING (chan, 32); 24613393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs 247e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger ret = nv50_surface_set(screen, dst, 1); 24813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs if (ret) 24913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs return; 250b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs 251c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki BEGIN_RING(chan, eng2d, NV50_2D_DRAW_SHAPE, 3); 252c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki OUT_RING (chan, NV50_2D_DRAW_SHAPE_RECTANGLES); 25313393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, format); 254e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger OUT_RING (chan, uc.ui); 255c84cc09d41a83caa96eca84c73284024d8d63024Marcin Kościelnicki BEGIN_RING(chan, eng2d, NV50_2D_DRAW_POINT32_X(0), 4); 256e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger OUT_RING (chan, dstx); 257e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger OUT_RING (chan, dsty); 25813393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, width); 25913393736dbab1087589f8dd788bc412d16b431d1Ben Skeggs OUT_RING (chan, height); 260b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger 261b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs} 26247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs 26347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsvoid 26447b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggsnv50_init_surface_functions(struct nv50_context *nv50) 26547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{ 266b59b23a51dc17da59ccff0b3f8a73009056746e5Roland Scheidegger nv50->pipe.resource_copy_region = nv50_surface_copy; 267e5b82c8222ef29c162d51a7ca9f553d85a63be22Roland Scheidegger nv50->pipe.clearRT = nv50_clearRT; 26847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs} 26965ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs 27065ad8176ca91b5ed2a01b1b3ee145cfdce369419Ben Skeggs 271