1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     VA Linux Systems Inc., Fremont, California.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgAll Rights Reserved.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPermission is hereby granted, free of charge, to any person obtaining
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orga copy of this software and associated documentation files (the
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org"Software"), to deal in the Software without restriction, including
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwithout limitation the rights to use, copy, modify, merge, publish,
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdistribute, sublicense, and/or sell copies of the Software, and to
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpermit persons to whom the Software is furnished to do so, subject to
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgthe following conditions:
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe above copyright notice and this permission notice (including the
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnext paragraph) shall be included in all copies or substantial
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgportions of the Software.
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org**************************************************************************/
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   Kevin E. Martin <martin@valinux.com>
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   Gareth Hughes <gareth@valinux.com>
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef __RADEON_IOCTL_H__
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define __RADEON_IOCTL_H__
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/simple_list.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_bo_gem.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_cs_gem.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonEmitVertexAOS( r100ContextPtr rmesa,
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint vertex_size,
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 struct radeon_bo *bo,
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint offset );
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonEmitVbufPrim( r100ContextPtr rmesa,
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint vertex_format,
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint primitive,
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint vertex_nr );
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonFlushElts( struct gl_context *ctx );
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern GLushort *radeonAllocEltsOpenEnded( r100ContextPtr rmesa,
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   GLuint vertex_format,
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   GLuint primitive,
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   GLuint min_nr );
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonEmitAOS( r100ContextPtr rmesa,
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLuint n,
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLuint offset );
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonEmitBlit( r100ContextPtr rmesa,
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLuint color_fmt,
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLuint src_pitch,
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLuint src_offset,
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLuint dst_pitch,
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLuint dst_offset,
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLint srcx, GLint srcy,
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLint dstx, GLint dsty,
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    GLuint w, GLuint h );
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonEmitWait( r100ContextPtr rmesa, GLuint flags );
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonFlushCmdBuf( r100ContextPtr rmesa, const char * );
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonFlush( struct gl_context *ctx );
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonFinish( struct gl_context *ctx );
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonInitIoctlFuncs( struct gl_context *ctx );
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonGetAllParams( r100ContextPtr rmesa );
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void radeonSetUpAtomList( r100ContextPtr rmesa );
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* ================================================================
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper macros:
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Close off the last primitive, if it exists.
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RADEON_NEWPRIM( rmesa )			\
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {						\
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( rmesa->radeon.dma.flush )			\
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.dma.flush( rmesa->radeon.glCtx );	\
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Can accomodate several state changes and primitive changes without
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * actually firing the buffer.
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RADEON_STATECHANGE( rmesa, ATOM )			\
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {								\
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RADEON_NEWPRIM( rmesa );					\
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.ATOM.dirty = GL_TRUE;				\
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.hw.is_dirty = GL_TRUE;				\
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RADEON_DB_STATE( ATOM )				\
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy( rmesa->hw.ATOM.lastcmd, rmesa->hw.ATOM.cmd,	\
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   rmesa->hw.ATOM.cmd_size * 4)
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int RADEON_DB_STATECHANGE(r100ContextPtr rmesa,
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					struct radeon_state_atom *atom )
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (memcmp(atom->cmd, atom->lastcmd, atom->cmd_size*4)) {
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *tmp;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      RADEON_NEWPRIM( rmesa );
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      atom->dirty = GL_TRUE;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.hw.is_dirty = GL_TRUE;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tmp = atom->cmd;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      atom->cmd = atom->lastcmd;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      atom->lastcmd = tmp;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Command lengths.  Note that any time you ensure ELTS_BUFSZ or VBUF_BUFSZ
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are available, you will also be adding an rmesa->state.max_state_size because
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * r200EmitState is called from within r200EmitVbufPrim and r200FlushElts.
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if RADEON_OLD_PACKETS
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AOS_BUFSZ(nr)	((3 + ((nr / 2) * 3) + ((nr & 1) * 2))+nr*2)
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_AOS_BUFSZ	(0)
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELTS_BUFSZ(nr)	(24 + nr * 2)
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VBUF_BUFSZ	(8)
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AOS_BUFSZ(nr)	((3 + ((nr / 2) * 3) + ((nr & 1) * 2) + nr*2))
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_AOS_BUFSZ	(5)
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELTS_BUFSZ(nr)	(16 + nr * 2)
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VBUF_BUFSZ	(4)
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SCISSOR_BUFSZ	(8)
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INDEX_BUFSZ	(7)
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline uint32_t cmdpacket3(int cmd_type)
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  drm_radeon_cmd_header_t cmd;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  cmd.i = 0;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  cmd.header.cmd_type = cmd_type;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return (uint32_t)cmd.i;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define OUT_BATCH_PACKET3(packet, num_extra) do {	      \
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    OUT_BATCH(CP_PACKET2);				      \
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    OUT_BATCH(CP_PACKET3((packet), (num_extra)));	      \
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  } while(0)
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define OUT_BATCH_PACKET3_CLIP(packet, num_extra) do {	      \
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    OUT_BATCH(CP_PACKET2);				      \
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    OUT_BATCH(CP_PACKET3((packet), (num_extra)));	      \
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  } while(0)
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* __RADEON_IOCTL_H__ */
172