12e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs/* 22e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * Copyright 2007 Nouveau Project 32e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * 42e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 52e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * copy of this software and associated documentation files (the "Software"), 62e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * to deal in the Software without restriction, including without limitation 72e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 82e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the 92e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * Software is furnished to do so, subject to the following conditions: 102e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * 112e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * The above copyright notice and this permission notice shall be included in 122e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * all copies or substantial portions of the Software. 132e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * 142e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 152e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 162e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 172e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 182e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 192e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 202e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs * SOFTWARE. 212e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs */ 222e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 232e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#ifndef __NOUVEAU_LOCAL_H__ 242e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define __NOUVEAU_LOCAL_H__ 252e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 262e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline uint32_t 272e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_AVAIL(struct nouveau_pushbuf *push) 282e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 292e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs return push->end - push->cur; 302e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 312e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 322e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline int 332e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_SPACE(struct nouveau_pushbuf *push, uint32_t size) 342e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 352e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs if (PUSH_AVAIL(push) < size) 362e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs return nouveau_pushbuf_space(push, size, 0, 0) == 0; 372e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs return 1; 382e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 392e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 402e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 412e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_DATA(struct nouveau_pushbuf *push, uint32_t data) 422e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 432e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs *push->cur++ = data; 442e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 452e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 462e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 472e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_DATAf(struct nouveau_pushbuf *push, float v) 482e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 492e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs union { float f; uint32_t i; } d = { .f = v }; 502e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA(push, d.i); 512e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 522e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 532e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 542e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_DATAb(struct nouveau_pushbuf *push, GLboolean x) 552e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 562e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA(push, x ? 1 : 0); 572e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 582e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 592e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 602e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_DATAm(struct nouveau_pushbuf *push, float m[16]) 612e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 622e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs int i, j; 632e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 642e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs for (i = 0; i < 4; i++) 652e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs for (j = 0; j < 4; j++) 662e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATAf(push, m[4*j + i]); 672e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 682e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 692e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 702e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_DATAp(struct nouveau_pushbuf *push, const void *data, uint32_t size) 712e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 722e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs memcpy(push->cur, data, size * 4); 732e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs push->cur += size; 742e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 752e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 762e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 772e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_RELOC(struct nouveau_pushbuf *push, struct nouveau_bo *bo, uint32_t offset, 782e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs uint32_t flags, uint32_t vor, uint32_t tor) 792e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 802e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_pushbuf_reloc(push, bo, offset, flags, vor, tor); 812e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 822e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 832e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 842e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_KICK(struct nouveau_pushbuf *push) 852e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 862e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_pushbuf_kick(push, push->channel); 872e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 882e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 892e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic struct nouveau_bufctx * 902e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsBUFCTX(struct nouveau_pushbuf *push) 912e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 922e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs return push->user_priv; 932e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 942e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 952e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 962e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_RESET(struct nouveau_pushbuf *push, int bin) 972e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 982e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_bufctx_reset(BUFCTX(push), bin); 992e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 1002e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1012e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 1022e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_MTHDl(struct nouveau_pushbuf *push, int subc, int mthd, int bin, 1032e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs struct nouveau_bo *bo, uint32_t offset, uint32_t access) 1042e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 1052e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_bufctx_mthd(BUFCTX(push), bin, (1 << 18) | (subc << 13) | mthd, 1062e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs bo, offset, access | NOUVEAU_BO_LOW, 0, 0); 1072e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA(push, bo->offset + offset); 1082e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 1092e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1102e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 1112e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_MTHDs(struct nouveau_pushbuf *push, int subc, int mthd, int bin, 1122e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs struct nouveau_bo *bo, uint32_t data, uint32_t access, 1132e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs uint32_t vor, uint32_t tor) 1142e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 1152e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_bufctx_mthd(BUFCTX(push), bin, (1 << 18) | (subc << 13) | mthd, 1162e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs bo, data, access | NOUVEAU_BO_OR, vor, tor); 1172e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1182e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs if (bo->flags & NOUVEAU_BO_VRAM) 1192e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA(push, data | vor); 1202e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs else 1212e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA(push, data | tor); 1222e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 1232e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1242e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 1252e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsPUSH_MTHD(struct nouveau_pushbuf *push, int subc, int mthd, int bin, 1262e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs struct nouveau_bo *bo, uint32_t data, uint32_t access, 1272e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs uint32_t vor, uint32_t tor) 1282e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 1292e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs nouveau_bufctx_mthd(BUFCTX(push), bin, (1 << 18) | (subc << 13) | mthd, 1302e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs bo, data, access | NOUVEAU_BO_OR, vor, tor); 1312e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1322e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs if (access & NOUVEAU_BO_LOW) 1332e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs data += bo->offset; 1342e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1352e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs if (access & NOUVEAU_BO_OR) { 1362e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs if (bo->flags & NOUVEAU_BO_VRAM) 1372e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs data |= vor; 1382e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs else 1392e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs data |= tor; 1402e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs } 1412e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1422e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA(push, data); 1432e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 1442e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1452e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 1462e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsBEGIN_NV04(struct nouveau_pushbuf *push, int subc, int mthd, int size) 1472e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 1482e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_SPACE(push, size + 1); 1492e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, 0x00000000 | (size << 18) | (subc << 13) | mthd); 1502e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 1512e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1522e47d01c9e5325906cf3bb979279599991c6328eBen Skeggsstatic inline void 1532e47d01c9e5325906cf3bb979279599991c6328eBen SkeggsBEGIN_NI04(struct nouveau_pushbuf *push, int subc, int mthd, int size) 1542e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs{ 1552e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_SPACE(push, size + 1); 1562e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs PUSH_DATA (push, 0x40000000 | (size << 18) | (subc << 13) | mthd); 1572e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs} 1582e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1592e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs/* subchannel assignment */ 1602e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define SUBC_M2MF(mthd) 0, (mthd) 1612e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV03_M2MF(mthd) SUBC_M2MF(NV04_M2MF_##mthd) 1622e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define SUBC_NVSW(mthd) 1, (mthd) 1632e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define SUBC_SF2D(mthd) 2, (mthd) 1642e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV04_SF2D(mthd) SUBC_SF2D(NV04_CONTEXT_SURFACES_2D_##mthd) 1652e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV10_SF2D(mthd) SUBC_SF2D(NV10_CONTEXT_SURFACES_2D_##mthd) 1662e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define SUBC_PATT(mthd) 3, (mthd) 1672e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV01_PATT(mthd) SUBC_PATT(NV04_IMAGE_PATTERN_##mthd) 1682e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV01_ROP(mthd) SUBC_PATT(NV03_CONTEXT_ROP_##mthd) 1692e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define SUBC_GDI(mthd) 4, (mthd) 1702e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV04_GDI(mthd) SUBC_GDI(NV04_GDI_RECTANGLE_TEXT_##mthd) 1712e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define SUBC_SIFM(mthd) 5, (mthd) 1722e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV03_SIFM(mthd) SUBC_SIFM(NV03_SCALED_IMAGE_FROM_MEMORY_##mthd) 1732e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV05_SIFM(mthd) SUBC_SIFM(NV05_SCALED_IMAGE_FROM_MEMORY_##mthd) 1742e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define SUBC_SURF(mthd) 6, (mthd) 1752e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV04_SSWZ(mthd) SUBC_SURF(NV04_SWIZZLED_SURFACE_##mthd) 1762e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV04_SF3D(mthd) SUBC_SURF(NV04_CONTEXT_SURFACES_3D_##mthd) 1772e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define SUBC_3D(mthd) 7, (mthd) 1782e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV04_TTRI(mthd) SUBC_3D(NV04_TEXTURED_TRIANGLE_##mthd) 1792e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV04_MTRI(mthd) SUBC_3D(NV04_MULTITEX_TRIANGLE_##mthd) 1802e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV10_3D(mthd) SUBC_3D(NV10_3D_##mthd) 1812e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV11_3D(mthd) SUBC_3D(NV11_3D_##mthd) 1822e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV17_3D(mthd) SUBC_3D(NV17_3D_##mthd) 1832e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV20_3D(mthd) SUBC_3D(NV20_3D_##mthd) 1842e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV25_3D(mthd) SUBC_3D(NV25_3D_##mthd) 1852e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1862e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV01_SUBC(subc, mthd) SUBC_##subc((NV01_SUBCHAN_##mthd)) 1872e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV11_SUBC(subc, mthd) SUBC_##subc((NV11_SUBCHAN_##mthd)) 1882e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1892e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#define NV04_GRAPH(subc, mthd) SUBC_##subc((NV04_GRAPH_##mthd)) 1902e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs 1912e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs#endif 192