16b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell/**************************************************************************
26b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell *
36b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
46b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * All Rights Reserved.
56b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell *
66b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
76b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * copy of this software and associated documentation files (the
86b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * "Software"), to deal in the Software without restriction, including
96b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
106b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
116b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
126b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * the following conditions:
136b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell *
146b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * The above copyright notice and this permission notice (including the
156b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
166b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * of the Software.
176b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell *
186b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
196b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
206b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
216b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
226b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
236b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
246b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
256b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell *
266b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell **************************************************************************/
276b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
28ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h"
294a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
306b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell#include "i915_reg.h"
316b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell#include "i915_context.h"
324a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell#include "i915_debug.h"
334a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
342e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
352e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug(struct debug_stream *stream, const char *name, GLuint len)
366b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell{
374a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint i;
384a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
394a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
404a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (len == 0) {
41298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("Error - zero length packet (0x%08x)\n", stream->ptr[0]);
424a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      assert(0);
432e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
446b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell   }
456b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
464a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (stream->print_addresses)
47298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("%08x:  ", stream->offset);
486b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
496b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
50298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
514a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   for (i = 0; i < len; i++)
52298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t0x%08x\n",  ptr[i]);
53298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\n");
546b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
554a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   stream->offset += len * sizeof(GLuint);
564a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
572e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
584a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
596b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
604a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
614a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwellstatic const char *get_prim_name( GLuint val )
626b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell{
634a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   switch (val & PRIM3D_MASK) {
644a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_TRILIST: return "TRILIST"; break;
654a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_TRISTRIP: return "TRISTRIP"; break;
664a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_TRISTRIP_RVRSE: return "TRISTRIP_RVRSE"; break;
674a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_TRIFAN: return "TRIFAN"; break;
684a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_POLY: return "POLY"; break;
694a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_LINELIST: return "LINELIST"; break;
704a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_LINESTRIP: return "LINESTRIP"; break;
714a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_RECTLIST: return "RECTLIST"; break;
724a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_POINTLIST: return "POINTLIST"; break;
734a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_DIB: return "DIB"; break;
744a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_CLEAR_RECT: return "CLEAR_RECT"; break;
754a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case PRIM3D_ZONE_INIT: return "ZONE_INIT"; break;
764a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   default: return "????"; break;
776b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell   }
786b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell}
796b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
802e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
812e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_prim(struct debug_stream *stream, const char *name,
822e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	   bool dump_floats, GLuint len)
836b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell{
844a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
854a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   const char *prim = get_prim_name( ptr[0] );
864a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint i;
874a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
884a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
894a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
90298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s %s (%d dwords):\n", name, prim, len);
91298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  ptr[0]);
924a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   for (i = 1; i < len; i++) {
934a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      if (dump_floats)
94298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	 printf("\t0x%08x // %f\n",  ptr[i], *(GLfloat *)&ptr[i]);
954a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      else
96298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	 printf("\t0x%08x\n",  ptr[i]);
974a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
984a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
994a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
100298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\n");
1014a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1024a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   stream->offset += len * sizeof(GLuint);
1034a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1042e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
1056b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell}
1064a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1076b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
1084a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1094a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1102e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
1112e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_program(struct debug_stream *stream, const char *name, GLuint len)
1126b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell{
1134a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
1144a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1154a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (len == 0) {
116298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("Error - zero length packet (0x%08x)\n", stream->ptr[0]);
1174a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      assert(0);
1182e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
1194a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
1204a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1214a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (stream->print_addresses)
122298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("%08x:  ", stream->offset);
1234a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
124298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
1254a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   i915_disassemble_program( ptr, len );
1264a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1274a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   stream->offset += len * sizeof(GLuint);
1282e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
1296b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell}
1306b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
1314a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1322e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
1332e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_chain(struct debug_stream *stream, const char *name, GLuint len)
1346b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell{
1354a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
1364a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint old_offset = stream->offset + len * sizeof(GLuint);
1374a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint i;
1384a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
139298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
1404a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   for (i = 0; i < len; i++)
141298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t0x%08x\n",  ptr[i]);
1426b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
1434a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   stream->offset = ptr[1] & ~0x3;
1444a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1454a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (stream->offset < old_offset)
146298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\n... skipping backwards from 0x%x --> 0x%x ...\n\n",
1474a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell		   old_offset, stream->offset );
1484a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   else
149298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\n... skipping from 0x%x --> 0x%x ...\n\n",
1504a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell		   old_offset, stream->offset );
1516b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
1524a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1532e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
1544a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
1556b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
1566b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
1572e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
1582e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_variable_length_prim(struct debug_stream *stream)
1596b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell{
1604a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
1614a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   const char *prim = get_prim_name( ptr[0] );
1624a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint i, len;
1636b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
1644a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLushort *idx = (GLushort *)(ptr+1);
1654a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   for (i = 0; idx[i] != 0xffff; i++)
1664a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      ;
1674a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1684a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   len = 1+(i+2)/2;
1694a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
170298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("3DPRIM, %s variable length %d indicies (%d dwords):\n", prim, i, len);
1714a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   for (i = 0; i < len; i++)
172298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t0x%08x\n",  ptr[i]);
173298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\n");
1744a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
1754a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   stream->offset += len * sizeof(GLuint);
1762e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
1774a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell}
1786b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
1796b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
180c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell#define BITS( dw, hi, lo, ... )				\
181c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwelldo {							\
18287ccb9504dfda502746c3a00eb607f1837dd265dGuillaume Melquiond   unsigned himask = 0xffffffffU >> (31 - (hi));		\
183298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t\t ");				\
184298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf(__VA_ARGS__);			\
185298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf(": 0x%x\n", ((dw) & himask) >> (lo));	\
186c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell} while (0)
187c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
188c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell#define MBZ( dw, hi, lo) do {							\
189c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   unsigned x = (dw) >> (lo);				\
190c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   unsigned lomask = (1 << (lo)) - 1;			\
191c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   unsigned himask;					\
192c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   himask = (1UL << (hi)) - 1;				\
193c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   assert ((x & himask & ~lomask) == 0);	\
194c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell} while (0)
195c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
196c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell#define FLAG( dw, bit, ... )			\
197c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwelldo {							\
198c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   if (((dw) >> (bit)) & 1) {				\
199298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t\t ");				\
200298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf(__VA_ARGS__);			\
201298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\n");				\
202c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }							\
203c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell} while (0)
204c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
2052e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
2062e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_load_immediate(struct debug_stream *stream, const char *name, GLuint len)
2074a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell{
2084a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
2094a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint bits = (ptr[0] >> 4) & 0xff;
210c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   GLuint j = 0;
2114a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
212298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords, flags: %x):\n", name, len, bits);
213298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  ptr[j++]);
2144a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
215c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   if (bits & (1<<0)) {
216298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t  LIS0: 0x%08x\n", ptr[j]);
217298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t vb address: 0x%08x\n", (ptr[j] & ~0x3));
218c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 0, 0, "vb invalidate disable");
219c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
220c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
221c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   if (bits & (1<<1)) {
222298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t  LIS1: 0x%08x\n", ptr[j]);
223c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 29, 24, "vb dword width");
224c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 21, 16, "vb dword pitch");
225c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 15, 0, "vb max index");
226c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
227c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
228c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   if (bits & (1<<2)) {
229c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      int i;
230298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t  LIS2: 0x%08x\n", ptr[j]);
231c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      for (i = 0; i < 8; i++) {
232c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 unsigned tc = (ptr[j] >> (i * 4)) & 0xf;
2336ea55d35254b7769c65f064170d8965c0bf34a27Keith Whitwell	 if (tc != 0xf)
234c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	    BITS(tc, 3, 0, "tex coord %d", i);
2354a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      }
236c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
237c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
238c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   if (bits & (1<<3)) {
239298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t  LIS3: 0x%08x\n", ptr[j]);
240c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
241c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
242c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   if (bits & (1<<4)) {
243298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t  LIS4: 0x%08x\n", ptr[j]);
244c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 31, 23, "point width");
245c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 22, 19, "line width");
246c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 18, "alpha flatshade");
247c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 17, "fog flatshade");
248c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 16, "spec flatshade");
249c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 15, "rgb flatshade");
250c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 14, 13, "cull mode");
251c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 12, "vfmt: point width");
252c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 11, "vfmt: specular/fog");
253c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 10, "vfmt: rgba");
254c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 9, "vfmt: depth offset");
255c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 8, 6, "vfmt: position (2==xyzw)");
256c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 5, "force dflt diffuse");
257c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 4, "force dflt specular");
258c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 3, "local depth offset enable");
259c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 2, "vfmt: fp32 fog coord");
260c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 1, "sprite point");
261c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 0, "antialiasing");
262c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
263c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
264c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   if (bits & (1<<5)) {
265298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t  LIS5: 0x%08x\n", ptr[j]);
266c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 31, 28, "rgba write disables");
267c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 27,     "force dflt point width");
268c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 26,     "last pixel enable");
269c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 25,     "global z offset enable");
270c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 24,     "fog enable");
271c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 23, 16, "stencil ref");
272c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 15, 13, "stencil test");
273c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 12, 10, "stencil fail op");
274c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 9, 7,   "stencil pass z fail op");
275c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 6, 4,   "stencil pass z pass op");
276c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 3,      "stencil write enable");
277c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 2,      "stencil test enable");
278c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 1,      "color dither enable");
279c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 0,      "logiop enable");
280c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
2816b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell   }
282c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   if (bits & (1<<6)) {
283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t  LIS6: 0x%08x\n", ptr[j]);
284c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 31,      "alpha test enable");
285c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 30, 28,  "alpha func");
286c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 27, 20,  "alpha ref");
287c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 19,      "depth test enable");
288c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 18, 16,  "depth func");
289c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 15,      "blend enable");
290c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 14, 12,  "blend func");
291c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 11, 8,   "blend src factor");
292c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 7,  4,   "blend dst factor");
293c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 3,       "depth write enable");
294c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 2,       "color write enable");
295c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 1,  0,   "provoking vertex");
296c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
297c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
298c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
2996b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
300298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\n");
3014a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3024a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   assert(j == len);
3034a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3044a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   stream->offset += len * sizeof(GLuint);
3054a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3062e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
3076b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell}
3084a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3096b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
3106b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
3112e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
3122e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_load_indirect(struct debug_stream *stream, const char *name, GLuint len)
3136b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell{
3144a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
3154a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint bits = (ptr[0] >> 8) & 0x3f;
3164a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint i, j = 0;
3174a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
318298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
319298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  ptr[j++]);
3204a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3214a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   for (i = 0; i < 6; i++) {
3224a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      if (bits & (1<<i)) {
3234a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 switch (1<<(8+i)) {
3244a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case LI0_STATE_STATIC_INDIRECT:
325298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("        STATIC: 0x%08x | %x\n", ptr[j]&~3, ptr[j]&3); j++;
326298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("                0x%08x\n", ptr[j++]);
3274a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    break;
3284a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case LI0_STATE_DYNAMIC_INDIRECT:
329298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("       DYNAMIC: 0x%08x | %x\n", ptr[j]&~3, ptr[j]&3); j++;
3304a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    break;
3314a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case LI0_STATE_SAMPLER:
332298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("       SAMPLER: 0x%08x | %x\n", ptr[j]&~3, ptr[j]&3); j++;
333298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("                0x%08x\n", ptr[j++]);
3344a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    break;
3354a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case LI0_STATE_MAP:
336298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("           MAP: 0x%08x | %x\n", ptr[j]&~3, ptr[j]&3); j++;
337298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("                0x%08x\n", ptr[j++]);
3384a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    break;
3394a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case LI0_STATE_PROGRAM:
340298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("       PROGRAM: 0x%08x | %x\n", ptr[j]&~3, ptr[j]&3); j++;
341298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("                0x%08x\n", ptr[j++]);
3424a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    break;
3434a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case LI0_STATE_CONSTANTS:
344298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("     CONSTANTS: 0x%08x | %x\n", ptr[j]&~3, ptr[j]&3); j++;
345298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	    printf("                0x%08x\n", ptr[j++]);
3464a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    break;
3474a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 default:
3484a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    assert(0);
3494a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    break;
3504a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 }
3514a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      }
3524a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
3534a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3544a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   if (bits == 0) {
355298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t  DUMMY: 0x%08x\n", ptr[j++]);
3564a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
3574a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
358298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\n");
3596b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
3606b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
3614a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   assert(j == len);
3626b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
3634a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   stream->offset += len * sizeof(GLuint);
3644a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
3652e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
3666b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell}
367c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
368c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwellstatic void BR13( struct debug_stream *stream,
369c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell		  GLuint val )
370c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
371298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  val);
372c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   FLAG(val, 30, "clipping enable");
373c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BITS(val, 25, 24, "color depth (3==32bpp)");
374c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BITS(val, 23, 16, "raster op");
375c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BITS(val, 15, 0,  "dest pitch");
376c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
377c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
378c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
379950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzerstatic void BR2223( struct debug_stream *stream,
380950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer		    GLuint val22, GLuint val23 )
381c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
382950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   union { GLuint val; short field[2]; } BR22, BR23;
383c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
384950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   BR22.val = val22;
385950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   BR23.val = val23;
386950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer
387298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  val22);
388950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   BITS(val22, 31, 16, "dest y1");
389950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   BITS(val22, 15, 0,  "dest x1");
390950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer
391298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  val23);
392950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   BITS(val23, 31, 16, "dest y2");
393950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   BITS(val23, 15, 0,  "dest x2");
394950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer
395950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   /* The blit engine may produce unexpected results when these aren't met */
396950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   assert(BR22.field[0] < BR23.field[0]);
397950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   assert(BR22.field[1] < BR23.field[1]);
398c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
399c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
400c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwellstatic void BR09( struct debug_stream *stream,
401c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell		  GLuint val )
402c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
403298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x -- dest address\n",  val);
404c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
405c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
406c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwellstatic void BR26( struct debug_stream *stream,
407c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell		  GLuint val )
408c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
409298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  val);
410c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BITS(val, 31, 16, "src y1");
411c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BITS(val, 15, 0,  "src x1");
412c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
413c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
414c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwellstatic void BR11( struct debug_stream *stream,
415c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell		  GLuint val )
416c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
417298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  val);
418c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BITS(val, 15, 0,  "src pitch");
419c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
420c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
421c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwellstatic void BR12( struct debug_stream *stream,
422c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell		  GLuint val )
423c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
424298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x -- src address\n",  val);
425c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
426c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
427c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwellstatic void BR16( struct debug_stream *stream,
428c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell		  GLuint val )
429c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
430298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x -- color\n",  val);
431c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
432c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
4332e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
4342e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_copy_blit(struct debug_stream *stream, const char *name, GLuint len)
435c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
436c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
437c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   int j = 0;
438c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
439298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
440298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  ptr[j++]);
441c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
442c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BR13(stream, ptr[j++]);
443950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   BR2223(stream, ptr[j], ptr[j+1]);
444950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   j += 2;
445c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BR09(stream, ptr[j++]);
446c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BR26(stream, ptr[j++]);
447c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BR11(stream, ptr[j++]);
448c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BR12(stream, ptr[j++]);
449c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
450c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   stream->offset += len * sizeof(GLuint);
451c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   assert(j == len);
4522e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
453c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
454c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
4552e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
4562e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_color_blit(struct debug_stream *stream, const char *name, GLuint len)
457c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
458c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
459c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   int j = 0;
460c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
461298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
462298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  ptr[j++]);
463c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
464c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BR13(stream, ptr[j++]);
465950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   BR2223(stream, ptr[j], ptr[j+1]);
466950fff0f9a330c50a627ced2e8cff2fb4689bee0Michel Dänzer   j += 2;
467c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BR09(stream, ptr[j++]);
468c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BR16(stream, ptr[j++]);
469c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
470c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   stream->offset += len * sizeof(GLuint);
471c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   assert(j == len);
4722e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
473c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
474c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
4752e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
4762e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_modes4(struct debug_stream *stream, const char *name, GLuint len)
477c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
478c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
479c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   int j = 0;
480c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
481298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
482298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  ptr[j]);
483c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BITS(ptr[j], 21, 18, "logicop func");
484c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   FLAG(ptr[j], 17, "stencil test mask modify-enable");
485c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   FLAG(ptr[j], 16, "stencil write mask modify-enable");
486c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BITS(ptr[j], 15, 8, "stencil test mask");
487c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   BITS(ptr[j], 7, 0,  "stencil write mask");
488c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   j++;
489c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
490c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   stream->offset += len * sizeof(GLuint);
491c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   assert(j == len);
4922e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
493c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
494c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
4952e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
4962e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_map_state(struct debug_stream *stream, const char *name, GLuint len)
497c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
498c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
499c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   int j = 0;
500c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
501298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
502298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  ptr[j++]);
503c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
504c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   {
505298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t0x%08x\n",  ptr[j]);
506c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 15, 0,   "map mask");
507c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
508c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
509c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
510c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   while (j < len) {
511c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      {
512298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	 printf("\t  TMn.0: 0x%08x\n", ptr[j]);
513298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	 printf("\t map address: 0x%08x\n", (ptr[j] & ~0x3));
514c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 1, "vertical line stride");
515c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 0, "vertical line stride offset");
516c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 j++;
517c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      }
518c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
519c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      {
520298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	 printf("\t  TMn.1: 0x%08x\n", ptr[j]);
521c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 31, 21, "height");
522c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 20, 10, "width");
523c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 9, 7, "surface format");
524c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 6, 3, "texel format");
525c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 2, "use fence regs");
526c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 1, "tiled surface");
527c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 0, "tile walk ymajor");
528c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 j++;
529c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      }
530c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      {
531298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	 printf("\t  TMn.2: 0x%08x\n", ptr[j]);
532c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 31, 21, "dword pitch");
533c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 20, 15, "cube face enables");
534c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 14, 9, "max lod");
535c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 8,     "mip layout right");
536c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 7, 0, "depth");
537c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 j++;
538c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      }
539c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
540c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
541c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   stream->offset += len * sizeof(GLuint);
542c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   assert(j == len);
5432e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
544c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
545c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
5462e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
5472e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_sampler_state(struct debug_stream *stream, const char *name, GLuint len)
548c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
549c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
550c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   int j = 0;
551c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
552298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
553298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  ptr[j++]);
554c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
555c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   {
556298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t0x%08x\n",  ptr[j]);
557c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 15, 0,   "sampler mask");
558c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
559c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
560c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
561c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   while (j < len) {
562c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      {
563298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	 printf("\t  TSn.0: 0x%08x\n", ptr[j]);
564c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 31, "reverse gamma");
565c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 30, "planar to packed");
566c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 29, "yuv->rgb");
567c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 28, 27, "chromakey index");
568c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 26, 22, "base mip level");
569c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 21, 20, "mip mode filter");
570c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 19, 17, "mag mode filter");
571c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 16, 14, "min mode filter");
572c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 13, 5,  "lod bias (s4.4)");
573c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 4,      "shadow enable");
574c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 3,      "max-aniso-4");
575c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 2, 0,   "shadow func");
576c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 j++;
577c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      }
578c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
579c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      {
580298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	 printf("\t  TSn.1: 0x%08x\n", ptr[j]);
581c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 31, 24, "min lod");
582c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 MBZ( ptr[j], 23, 18 );
583c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 17,     "kill pixel enable");
584c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 16,     "keyed tex filter mode");
585c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 15,     "chromakey enable");
586c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 14, 12, "tcx wrap mode");
587c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 11, 9,  "tcy wrap mode");
588c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 8,  6,  "tcz wrap mode");
589c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 5,      "normalized coords");
590c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 BITS(ptr[j], 4,  1,  "map (surface) index");
591c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 FLAG(ptr[j], 0,      "EAST deinterlacer enable");
592c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 j++;
593c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      }
594c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      {
595298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	 printf("\t  TSn.2: 0x%08x  (default color)\n", ptr[j]);
596c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 j++;
597c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      }
598c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
599c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
600c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   stream->offset += len * sizeof(GLuint);
601c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   assert(j == len);
6022e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
603c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
604c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
6052e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
6062e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_dest_vars(struct debug_stream *stream, const char *name, GLuint len)
607c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
608c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
609c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   int j = 0;
610c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
611298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
612298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  ptr[j++]);
613c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
614c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   {
615298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t0x%08x\n",  ptr[j]);
616c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 31,     "early classic ztest");
617c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 30,     "opengl tex default color");
618c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 29,     "bypass iz");
619c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 28,     "lod preclamp");
620c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 27, 26, "dither pattern");
621c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 25,     "linear gamma blend");
622c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 24,     "debug dither");
623c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 23, 20, "dstorg x");
624c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 19, 16, "dstorg y");
625c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      MBZ (ptr[j], 15, 15 );
626c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 14, 12, "422 write select");
627c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 11, 8,  "cbuf format");
628c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 3, 2,   "zbuf format");
629c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 1,      "vert line stride");
630c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 1,      "vert line stride offset");
631c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
632c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
633c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
634c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   stream->offset += len * sizeof(GLuint);
635c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   assert(j == len);
6362e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
637c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
638c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
6392e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
6402e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkedebug_buf_info(struct debug_stream *stream, const char *name, GLuint len)
641c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell{
642c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
643c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   int j = 0;
644c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
645298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("%s (%d dwords):\n", name, len);
646298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x\n",  ptr[j++]);
647c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
648c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   {
649298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("\t0x%08x\n",  ptr[j]);
650c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 28, 28, "aux buffer id");
651c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 27, 24, "buffer id (7=depth, 3=back)");
652c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 23,     "use fence regs");
653c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 22,     "tiled surface");
654c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      FLAG(ptr[j], 21,     "tile walk ymajor");
655c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      MBZ (ptr[j], 20, 14);
656c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      BITS(ptr[j], 13, 2,  "dword pitch");
657c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      MBZ (ptr[j], 2,  0);
658c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell      j++;
659c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   }
660c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
661298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\t0x%08x -- buffer base address\n",  ptr[j++]);
662c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell
663c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   stream->offset += len * sizeof(GLuint);
664c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell   assert(j == len);
6652e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
666c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell}
6676b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
6682e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
6692e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei915_debug_packet(struct debug_stream *stream)
6706b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell{
6714a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint *ptr = (GLuint *)(stream->ptr + stream->offset);
6724a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint cmd = *ptr;
6734a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
6744a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   switch (((cmd >> 29) & 0x7)) {
6754a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case 0x0:
6764a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      switch ((cmd >> 23) & 0x3f) {
6774a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x0:
6784a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "MI_NOOP", 1);
6794a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x3:
6804a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "MI_WAIT_FOR_EVENT", 1);
6814a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x4:
6824a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "MI_FLUSH", 1);
6834a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0xA:
6844a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 debug(stream, "MI_BATCH_BUFFER_END", 1);
6852e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	 return false;
6864a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x22:
6874a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "MI_LOAD_REGISTER_IMM", 3);
6884a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x31:
6894a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug_chain(stream, "MI_BATCH_BUFFER_START", 2);
6904a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      default:
6914a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 break;
6924a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      }
6934a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      break;
6944a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case 0x1:
6954a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      break;
6964a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case 0x2:
6974a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      switch ((cmd >> 22) & 0xff) {
6984a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x50:
699c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 return debug_color_blit(stream, "XY_COLOR_BLT", (cmd & 0xff) + 2);
7004a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x53:
701c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 return debug_copy_blit(stream, "XY_SRC_COPY_BLT", (cmd & 0xff) + 2);
7024a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      default:
7034a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "blit command", (cmd & 0xff) + 2);
7044a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      }
7054a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      break;
7064a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   case 0x3:
7074a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      switch ((cmd >> 24) & 0x1f) {
7084a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x6:
7094a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "3DSTATE_ANTI_ALIASING", 1);
7104a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x7:
7114a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "3DSTATE_RASTERIZATION_RULES", 1);
7124a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x8:
7134a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "3DSTATE_BACKFACE_STENCIL_OPS", 2);
7144a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x9:
7154a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "3DSTATE_BACKFACE_STENCIL_MASKS", 1);
7164a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0xb:
7174a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "3DSTATE_INDEPENDENT_ALPHA_BLEND", 1);
7184a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0xc:
7194a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "3DSTATE_MODES5", 1);
7204a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0xd:
721c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	 return debug_modes4(stream, "3DSTATE_MODES4", 1);
7224a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x15:
7234a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "3DSTATE_FOG_COLOR", 1);
7244a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x16:
7254a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "3DSTATE_COORD_SET_BINDINGS", 1);
7264a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x1c:
7274a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 /* 3DState16NP */
7284a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 switch((cmd >> 19) & 0x1f) {
7294a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x10:
7304a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_SCISSOR_ENABLE", 1);
7314a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x11:
7324a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_DEPTH_SUBRECTANGLE_DISABLE", 1);
7334a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 default:
7344a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    break;
7354a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 }
7364a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 break;
7374a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x1d:
7384a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 /* 3DStateMW */
7394a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 switch ((cmd >> 16) & 0xff) {
7404a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x0:
741c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	    return debug_map_state(stream, "3DSTATE_MAP_STATE", (cmd & 0x1f) + 2);
7424a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x1:
743c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	    return debug_sampler_state(stream, "3DSTATE_SAMPLER_STATE", (cmd & 0x1f) + 2);
7444a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x4:
7454a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug_load_immediate(stream, "3DSTATE_LOAD_STATE_IMMEDIATE", (cmd & 0xf) + 2);
7464a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x5:
7474a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug_program(stream, "3DSTATE_PIXEL_SHADER_PROGRAM", (cmd & 0x1ff) + 2);
7484a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x6:
7494a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_PIXEL_SHADER_CONSTANTS", (cmd & 0xff) + 2);
7504a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x7:
7514a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug_load_indirect(stream, "3DSTATE_LOAD_INDIRECT", (cmd & 0xff) + 2);
7524a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x80:
7534a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_DRAWING_RECTANGLE", (cmd & 0xffff) + 2);
7544a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x81:
7554a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_SCISSOR_RECTANGLE", (cmd & 0xffff) + 2);
7564a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x83:
7574a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_SPAN_STIPPLE", (cmd & 0xffff) + 2);
7584a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x85:
759c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	    return debug_dest_vars(stream, "3DSTATE_DEST_BUFFER_VARS", (cmd & 0xffff) + 2);
7604a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x88:
7614a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_CONSTANT_BLEND_COLOR", (cmd & 0xffff) + 2);
7624a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x89:
7634a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_FOG_MODE", (cmd & 0xffff) + 2);
7644a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x8e:
765c60113cd41ac84f8737005ca1d7a1114e3725ae5Keith Whitwell	    return debug_buf_info(stream, "3DSTATE_BUFFER_INFO", (cmd & 0xffff) + 2);
7664a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x97:
7674a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_DEPTH_OFFSET_SCALE", (cmd & 0xffff) + 2);
7684a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x98:
7694a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_DEFAULT_Z", (cmd & 0xffff) + 2);
7704a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x99:
7714a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_DEFAULT_DIFFUSE", (cmd & 0xffff) + 2);
7724a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x9a:
7734a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_DEFAULT_SPECULAR", (cmd & 0xffff) + 2);
7744a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 case 0x9c:
7754a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "3DSTATE_CLEAR_PARAMETERS", (cmd & 0xffff) + 2);
7764a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 default:
7774a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    assert(0);
7784a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return 0;
7794a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 }
7804a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 break;
7814a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x1e:
7824a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 if (cmd & (1 << 23))
7834a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "???", (cmd & 0xffff) + 1);
7844a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 else
7854a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug(stream, "", 1);
7864a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 break;
7874a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      case 0x1f:
7884a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 if ((cmd & (1 << 23)) == 0)
7894a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug_prim(stream, "3DPRIM (inline)", 1, (cmd & 0x1ffff) + 2);
7904a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 else if (cmd & (1 << 17))
7914a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 {
7924a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    if ((cmd & 0xffff) == 0)
7934a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	       return debug_variable_length_prim(stream);
7944a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    else
7954a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	       return debug_prim(stream, "3DPRIM (indexed)", 0, (((cmd & 0xffff) + 1) / 2) + 1);
7964a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 }
7974a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 else
7984a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	    return debug_prim(stream, "3DPRIM  (indirect sequential)", 0, 2);
7994a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 break;
8004a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      default:
8014a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 return debug(stream, "", 0);
8024a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      }
803cb1dcb55f9884431a5e2b90e9208b42558a95611Vinson Lee      break;
8044a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   default:
8054a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      assert(0);
8064a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      return 0;
8074a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   }
8084a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
8094a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   assert(0);
8104a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   return 0;
8116b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell}
8126b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
8136b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
8144a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
8156b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwellvoid
8164a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwelli915_dump_batchbuffer( GLuint *start,
8174a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell		       GLuint *end )
8186b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell{
8194a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   struct debug_stream stream;
8204a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   GLuint bytes = (end - start) * 4;
8212e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   bool done = false;
8226b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
823298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("\n\nBATCH: (%d)\n", bytes / 4);
8246b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
8254a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   stream.offset = 0;
8264a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   stream.ptr = (char *)start;
8274a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   stream.print_addresses = 0;
8286b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
8294a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   while (!done &&
8304a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	  stream.offset < bytes &&
8314a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	  stream.offset >= 0)
8324a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell   {
8334a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      if (!i915_debug_packet( &stream ))
8344a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	 break;
8356b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
8364a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell      assert(stream.offset <= bytes &&
8374a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell	     stream.offset >= 0);
8386b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell   }
8396b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell
840298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("END-BATCH\n\n\n");
8416b9e31f3eb3dbe20cbc8493b963bbc6530e392c6Keith Whitwell}
8424a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
8434a789e408dbba7891f1436b2f42e7c0824e5ba7aKeith Whitwell
844