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