1428d7b3dSmrg/* 2428d7b3dSmrg * Copyright © 2007-2011 Intel Corporation 3428d7b3dSmrg * 4428d7b3dSmrg * Permission is hereby granted, free of charge, to any person obtaining a 5428d7b3dSmrg * copy of this software and associated documentation files (the "Software"), 6428d7b3dSmrg * to deal in the Software without restriction, including without limitation 7428d7b3dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8428d7b3dSmrg * and/or sell copies of the Software, and to permit persons to whom the 9428d7b3dSmrg * Software is furnished to do so, subject to the following conditions: 10428d7b3dSmrg * 11428d7b3dSmrg * The above copyright notice and this permission notice (including the next 12428d7b3dSmrg * paragraph) shall be included in all copies or substantial portions of the 13428d7b3dSmrg * Software. 14428d7b3dSmrg * 15428d7b3dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16428d7b3dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17428d7b3dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18428d7b3dSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19428d7b3dSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20428d7b3dSmrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21428d7b3dSmrg * SOFTWARE. 22428d7b3dSmrg * 23428d7b3dSmrg * Authors: 24428d7b3dSmrg * Eric Anholt <eric@anholt.net> 25428d7b3dSmrg * Chris Wilson <chris@chris-wilson.co.uk> 26428d7b3dSmrg * 27428d7b3dSmrg */ 28428d7b3dSmrg 29428d7b3dSmrg#ifdef HAVE_CONFIG_H 30428d7b3dSmrg#include "config.h" 31428d7b3dSmrg#endif 32428d7b3dSmrg 33428d7b3dSmrg#include <sys/mman.h> 34428d7b3dSmrg#include <assert.h> 35428d7b3dSmrg 36428d7b3dSmrg#include "sna.h" 37428d7b3dSmrg#include "sna_reg.h" 38428d7b3dSmrg 39428d7b3dSmrg#include "gen3_render.h" 40428d7b3dSmrg 41428d7b3dSmrg#include "kgem_debug.h" 42428d7b3dSmrg 43428d7b3dSmrgenum type { 44428d7b3dSmrg T_FLOAT32, 45428d7b3dSmrg T_FLOAT16, 46428d7b3dSmrg}; 47428d7b3dSmrg 48428d7b3dSmrgstatic struct state { 49428d7b3dSmrg struct vertex_buffer { 50428d7b3dSmrg int handle; 51428d7b3dSmrg void *base; 52428d7b3dSmrg const char *ptr; 53428d7b3dSmrg int pitch; 54428d7b3dSmrg 55428d7b3dSmrg struct kgem_bo *current; 56428d7b3dSmrg } vb; 57428d7b3dSmrg struct vertex_elements { 58428d7b3dSmrg int offset; 59428d7b3dSmrg bool valid; 60428d7b3dSmrg enum type type; 61428d7b3dSmrg int size; 62428d7b3dSmrg uint8_t swizzle[4]; 63428d7b3dSmrg } ve[33]; 64428d7b3dSmrg int num_ve; 65428d7b3dSmrg} state; 66428d7b3dSmrg 67428d7b3dSmrgstatic float int_as_float(int i) 68428d7b3dSmrg{ 69428d7b3dSmrg union { 70428d7b3dSmrg float f; 71428d7b3dSmrg int i; 72428d7b3dSmrg } x; 73428d7b3dSmrg x.i = i; 74428d7b3dSmrg return x.f; 75428d7b3dSmrg} 76428d7b3dSmrg 77428d7b3dSmrgstatic void gen3_update_vertex_buffer_addr(struct kgem *kgem, 78428d7b3dSmrg uint32_t offset) 79428d7b3dSmrg{ 80428d7b3dSmrg uint32_t handle; 81428d7b3dSmrg struct kgem_bo *bo = NULL; 82428d7b3dSmrg void *base, *ptr; 83428d7b3dSmrg int i; 84428d7b3dSmrg 85428d7b3dSmrg offset *= sizeof(uint32_t); 86428d7b3dSmrg 87428d7b3dSmrg for (i = 0; i < kgem->nreloc; i++) 88428d7b3dSmrg if (kgem->reloc[i].offset == offset) 89428d7b3dSmrg break; 90428d7b3dSmrg assert(i < kgem->nreloc); 91428d7b3dSmrg handle = kgem->reloc[i].target_handle; 92428d7b3dSmrg 93428d7b3dSmrg if (handle == 0) { 94428d7b3dSmrg base = kgem->batch; 95428d7b3dSmrg } else { 96428d7b3dSmrg list_for_each_entry(bo, &kgem->next_request->buffers, request) 97428d7b3dSmrg if (bo->handle == handle) 98428d7b3dSmrg break; 99428d7b3dSmrg assert(&bo->request != &kgem->next_request->buffers); 100428d7b3dSmrg base = kgem_bo_map__debug(kgem, bo); 101428d7b3dSmrg } 102428d7b3dSmrg ptr = (char *)base + kgem->reloc[i].delta; 103428d7b3dSmrg 104428d7b3dSmrg state.vb.current = bo; 105428d7b3dSmrg state.vb.base = base; 106428d7b3dSmrg state.vb.ptr = ptr; 107428d7b3dSmrg} 108428d7b3dSmrg 109428d7b3dSmrgstatic void gen3_update_vertex_buffer_pitch(struct kgem *kgem, 110428d7b3dSmrg uint32_t offset) 111428d7b3dSmrg{ 112428d7b3dSmrg state.vb.pitch = kgem->batch[offset] >> 16 & 0x3f; 113428d7b3dSmrg state.vb.pitch *= sizeof(uint32_t); 114428d7b3dSmrg} 115428d7b3dSmrg 116428d7b3dSmrgstatic void gen3_update_vertex_elements(struct kgem *kgem, uint32_t data) 117428d7b3dSmrg{ 118428d7b3dSmrg state.ve[1].valid = 1; 119428d7b3dSmrg 120428d7b3dSmrg switch ((data >> 6) & 7) { 121428d7b3dSmrg case 1: 122428d7b3dSmrg state.ve[1].type = T_FLOAT32; 123428d7b3dSmrg state.ve[1].size = 3; 124428d7b3dSmrg state.ve[1].swizzle[0] = 1; 125428d7b3dSmrg state.ve[1].swizzle[1] = 1; 126428d7b3dSmrg state.ve[1].swizzle[2] = 1; 127428d7b3dSmrg state.ve[1].swizzle[3] = 3; 128428d7b3dSmrg break; 129428d7b3dSmrg case 2: 130428d7b3dSmrg state.ve[1].type = T_FLOAT32; 131428d7b3dSmrg state.ve[1].size = 4; 132428d7b3dSmrg state.ve[1].swizzle[0] = 1; 133428d7b3dSmrg state.ve[1].swizzle[1] = 1; 134428d7b3dSmrg state.ve[1].swizzle[2] = 1; 135428d7b3dSmrg state.ve[1].swizzle[3] = 1; 136428d7b3dSmrg break; 137428d7b3dSmrg case 3: 138428d7b3dSmrg state.ve[1].type = T_FLOAT32; 139428d7b3dSmrg state.ve[1].size = 2; 140428d7b3dSmrg state.ve[1].swizzle[0] = 1; 141428d7b3dSmrg state.ve[1].swizzle[1] = 1; 142428d7b3dSmrg state.ve[1].swizzle[2] = 2; 143428d7b3dSmrg state.ve[1].swizzle[3] = 3; 144428d7b3dSmrg break; 145428d7b3dSmrg case 4: 146428d7b3dSmrg state.ve[1].type = T_FLOAT32; 147428d7b3dSmrg state.ve[1].size = 3; 148428d7b3dSmrg state.ve[1].swizzle[0] = 1; 149428d7b3dSmrg state.ve[1].swizzle[1] = 1; 150428d7b3dSmrg state.ve[1].swizzle[2] = 3; 151428d7b3dSmrg state.ve[1].swizzle[3] = 1; 152428d7b3dSmrg break; 153428d7b3dSmrg } 154428d7b3dSmrg 155428d7b3dSmrg state.ve[2].valid = 0; 156428d7b3dSmrg state.ve[3].valid = 0; 157428d7b3dSmrg} 158428d7b3dSmrg 159428d7b3dSmrgstatic void gen3_update_vertex_texcoords(struct kgem *kgem, uint32_t data) 160428d7b3dSmrg{ 161428d7b3dSmrg int id; 162428d7b3dSmrg for (id = 0; id < 8; id++) { 163428d7b3dSmrg uint32_t fmt = (data >> (id*4)) & 0xf; 164428d7b3dSmrg int width; 165428d7b3dSmrg 166428d7b3dSmrg state.ve[id+4].valid = fmt != 0xf; 167428d7b3dSmrg 168428d7b3dSmrg width = 0; 169428d7b3dSmrg switch (fmt) { 170428d7b3dSmrg case 0: 171428d7b3dSmrg state.ve[id+4].type = T_FLOAT32; 172428d7b3dSmrg width = state.ve[id+4].size = 2; 173428d7b3dSmrg break; 174428d7b3dSmrg case 1: 175428d7b3dSmrg state.ve[id+4].type = T_FLOAT32; 176428d7b3dSmrg width = state.ve[id+4].size = 3; 177428d7b3dSmrg break; 178428d7b3dSmrg case 2: 179428d7b3dSmrg state.ve[id+4].type = T_FLOAT32; 180428d7b3dSmrg width = state.ve[id+4].size = 4; 181428d7b3dSmrg break; 182428d7b3dSmrg case 3: 183428d7b3dSmrg state.ve[id+4].type = T_FLOAT32; 184428d7b3dSmrg width = state.ve[id+4].size = 1; 185428d7b3dSmrg break; 186428d7b3dSmrg case 4: 187428d7b3dSmrg state.ve[id+4].type = T_FLOAT16; 188428d7b3dSmrg width = state.ve[id+4].size = 2; 189428d7b3dSmrg break; 190428d7b3dSmrg case 5: 191428d7b3dSmrg state.ve[id+4].type = T_FLOAT16; 192428d7b3dSmrg width = state.ve[id+4].size = 4; 193428d7b3dSmrg break; 194428d7b3dSmrg } 195428d7b3dSmrg 196428d7b3dSmrg state.ve[id+4].swizzle[0] = width > 0 ? 1 : 2; 197428d7b3dSmrg state.ve[id+4].swizzle[1] = width > 1 ? 1 : 2; 198428d7b3dSmrg state.ve[id+4].swizzle[2] = width > 2 ? 1 : 2; 199428d7b3dSmrg state.ve[id+4].swizzle[3] = width > 3 ? 1 : 2; 200428d7b3dSmrg } 201428d7b3dSmrg} 202428d7b3dSmrg 203428d7b3dSmrgstatic void gen3_update_vertex_elements_offsets(struct kgem *kgem) 204428d7b3dSmrg{ 205428d7b3dSmrg int i, offset; 206428d7b3dSmrg 207428d7b3dSmrg for (i = offset = 0; i < ARRAY_SIZE(state.ve); i++) { 208428d7b3dSmrg if (!state.ve[i].valid) 209428d7b3dSmrg continue; 210428d7b3dSmrg 211428d7b3dSmrg state.ve[i].offset = offset; 212428d7b3dSmrg offset += 4 * state.ve[i].size; 213428d7b3dSmrg state.num_ve = i; 214428d7b3dSmrg } 215428d7b3dSmrg} 216428d7b3dSmrg 217428d7b3dSmrgstatic void vertices_float32_out(const struct vertex_elements *ve, const float *f, int max) 218428d7b3dSmrg{ 219428d7b3dSmrg int c; 220428d7b3dSmrg 221428d7b3dSmrg ErrorF("("); 222428d7b3dSmrg for (c = 0; c < max; c++) { 223428d7b3dSmrg switch (ve->swizzle[c]) { 224428d7b3dSmrg case 0: ErrorF("#"); break; 225428d7b3dSmrg case 1: ErrorF("%f", f[c]); break; 226428d7b3dSmrg case 2: ErrorF("0.0"); break; 227428d7b3dSmrg case 3: ErrorF("1.0"); break; 228428d7b3dSmrg case 4: ErrorF("0x1"); break; 229428d7b3dSmrg case 5: break; 230428d7b3dSmrg default: ErrorF("?"); 231428d7b3dSmrg } 232428d7b3dSmrg if (c < max-1) 233428d7b3dSmrg ErrorF(", "); 234428d7b3dSmrg } 235428d7b3dSmrg ErrorF(")"); 236428d7b3dSmrg} 237428d7b3dSmrg 238428d7b3dSmrgstatic void ve_out(const struct vertex_elements *ve, const void *ptr) 239428d7b3dSmrg{ 240428d7b3dSmrg switch (ve->type) { 241428d7b3dSmrg case T_FLOAT32: 242428d7b3dSmrg vertices_float32_out(ve, ptr, ve->size); 243428d7b3dSmrg break; 244428d7b3dSmrg case T_FLOAT16: 245428d7b3dSmrg //vertices_float16_out(ve, ptr, ve->size); 246428d7b3dSmrg break; 247428d7b3dSmrg } 248428d7b3dSmrg} 249428d7b3dSmrg 250428d7b3dSmrgstatic void indirect_vertex_out(struct kgem *kgem, uint32_t v) 251428d7b3dSmrg{ 252428d7b3dSmrg const struct vertex_buffer *vb = &state.vb; 253428d7b3dSmrg int i = 1; 254428d7b3dSmrg 255428d7b3dSmrg do { 256428d7b3dSmrg const struct vertex_elements *ve = &state.ve[i]; 257428d7b3dSmrg const void *ptr = vb->ptr + v * vb->pitch + ve->offset; 258428d7b3dSmrg 259428d7b3dSmrg if (!ve->valid) 260428d7b3dSmrg continue; 261428d7b3dSmrg 262428d7b3dSmrg ve_out(ve, ptr); 263428d7b3dSmrg 264428d7b3dSmrg while (++i <= state.num_ve && !state.ve[i].valid) 265428d7b3dSmrg ; 266428d7b3dSmrg 267428d7b3dSmrg if (i <= state.num_ve) 268428d7b3dSmrg ErrorF(", "); 269428d7b3dSmrg } while (i <= state.num_ve); 270428d7b3dSmrg} 271428d7b3dSmrg 272428d7b3dSmrgstatic int inline_vertex_out(struct kgem *kgem, void *base) 273428d7b3dSmrg{ 274428d7b3dSmrg const struct vertex_buffer *vb = &state.vb; 275428d7b3dSmrg int i = 1; 276428d7b3dSmrg 277428d7b3dSmrg do { 278428d7b3dSmrg const struct vertex_elements *ve = &state.ve[i]; 279428d7b3dSmrg const void *ptr = (char *)base + ve->offset; 280428d7b3dSmrg 281428d7b3dSmrg if (!ve->valid) 282428d7b3dSmrg continue; 283428d7b3dSmrg 284428d7b3dSmrg ve_out(ve, ptr); 285428d7b3dSmrg 286428d7b3dSmrg while (++i <= state.num_ve && !state.ve[i].valid) 287428d7b3dSmrg ; 288428d7b3dSmrg 289428d7b3dSmrg if (i <= state.num_ve) 290428d7b3dSmrg ErrorF(", "); 291428d7b3dSmrg } while (i <= state.num_ve); 292428d7b3dSmrg 293428d7b3dSmrg return vb->pitch; 294428d7b3dSmrg} 295428d7b3dSmrg 296428d7b3dSmrgstatic int 297428d7b3dSmrggen3_decode_3d_1c(struct kgem *kgem, uint32_t offset) 298428d7b3dSmrg{ 299428d7b3dSmrg uint32_t *data = kgem->batch + offset; 300428d7b3dSmrg uint32_t opcode; 301428d7b3dSmrg 302428d7b3dSmrg opcode = (data[0] & 0x00f80000) >> 19; 303428d7b3dSmrg 304428d7b3dSmrg switch (opcode) { 305428d7b3dSmrg case 0x11: 306428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_DEPTH_SUBRECTANGLE_DISABLE\n"); 307428d7b3dSmrg return 1; 308428d7b3dSmrg case 0x10: 309428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_SCISSOR_ENABLE %s\n", 310428d7b3dSmrg data[0]&1?"enabled":"disabled"); 311428d7b3dSmrg return 1; 312428d7b3dSmrg case 0x01: 313428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_MAP_COORD_SET_I830\n"); 314428d7b3dSmrg return 1; 315428d7b3dSmrg case 0x0a: 316428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_MAP_CUBE_I830\n"); 317428d7b3dSmrg return 1; 318428d7b3dSmrg case 0x05: 319428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_MAP_TEX_STREAM_I830\n"); 320428d7b3dSmrg return 1; 321428d7b3dSmrg } 322428d7b3dSmrg 323428d7b3dSmrg kgem_debug_print(data, offset, 0, "3D UNKNOWN: 3d_1c opcode = 0x%x\n", 324428d7b3dSmrg opcode); 325428d7b3dSmrg assert(0); 326428d7b3dSmrg return 1; 327428d7b3dSmrg} 328428d7b3dSmrg 329428d7b3dSmrg/** Sets the string dstname to describe the destination of the PS instruction */ 330428d7b3dSmrgstatic void 331428d7b3dSmrggen3_get_instruction_dst(uint32_t *data, int i, char *dstname, int do_mask) 332428d7b3dSmrg{ 333428d7b3dSmrg uint32_t a0 = data[i]; 334428d7b3dSmrg int dst_nr = (a0 >> 14) & 0xf; 335428d7b3dSmrg char dstmask[8]; 336428d7b3dSmrg const char *sat; 337428d7b3dSmrg 338428d7b3dSmrg if (do_mask) { 339428d7b3dSmrg if (((a0 >> 10) & 0xf) == 0xf) { 340428d7b3dSmrg dstmask[0] = 0; 341428d7b3dSmrg } else { 342428d7b3dSmrg int dstmask_index = 0; 343428d7b3dSmrg 344428d7b3dSmrg dstmask[dstmask_index++] = '.'; 345428d7b3dSmrg if (a0 & (1 << 10)) 346428d7b3dSmrg dstmask[dstmask_index++] = 'x'; 347428d7b3dSmrg if (a0 & (1 << 11)) 348428d7b3dSmrg dstmask[dstmask_index++] = 'y'; 349428d7b3dSmrg if (a0 & (1 << 12)) 350428d7b3dSmrg dstmask[dstmask_index++] = 'z'; 351428d7b3dSmrg if (a0 & (1 << 13)) 352428d7b3dSmrg dstmask[dstmask_index++] = 'w'; 353428d7b3dSmrg dstmask[dstmask_index++] = 0; 354428d7b3dSmrg } 355428d7b3dSmrg 356428d7b3dSmrg if (a0 & (1 << 22)) 357428d7b3dSmrg sat = ".sat"; 358428d7b3dSmrg else 359428d7b3dSmrg sat = ""; 360428d7b3dSmrg } else { 361428d7b3dSmrg dstmask[0] = 0; 362428d7b3dSmrg sat = ""; 363428d7b3dSmrg } 364428d7b3dSmrg 365428d7b3dSmrg switch ((a0 >> 19) & 0x7) { 366428d7b3dSmrg case 0: 367428d7b3dSmrg assert(dst_nr <= 15); 368428d7b3dSmrg sprintf(dstname, "R%d%s%s", dst_nr, dstmask, sat); 369428d7b3dSmrg break; 370428d7b3dSmrg case 4: 371428d7b3dSmrg assert(dst_nr == 0); 372428d7b3dSmrg sprintf(dstname, "oC%s%s", dstmask, sat); 373428d7b3dSmrg break; 374428d7b3dSmrg case 5: 375428d7b3dSmrg assert(dst_nr == 0); 376428d7b3dSmrg sprintf(dstname, "oD%s%s", dstmask, sat); 377428d7b3dSmrg break; 378428d7b3dSmrg case 6: 379428d7b3dSmrg assert(dst_nr <= 3); 380428d7b3dSmrg sprintf(dstname, "U%d%s%s", dst_nr, dstmask, sat); 381428d7b3dSmrg break; 382428d7b3dSmrg default: 383428d7b3dSmrg sprintf(dstname, "RESERVED"); 384428d7b3dSmrg break; 385428d7b3dSmrg } 386428d7b3dSmrg} 387428d7b3dSmrg 388428d7b3dSmrgstatic const char * 389428d7b3dSmrggen3_get_channel_swizzle(uint32_t select) 390428d7b3dSmrg{ 391428d7b3dSmrg switch (select & 0x7) { 392428d7b3dSmrg case 0: 393428d7b3dSmrg return (select & 8) ? "-x" : "x"; 394428d7b3dSmrg case 1: 395428d7b3dSmrg return (select & 8) ? "-y" : "y"; 396428d7b3dSmrg case 2: 397428d7b3dSmrg return (select & 8) ? "-z" : "z"; 398428d7b3dSmrg case 3: 399428d7b3dSmrg return (select & 8) ? "-w" : "w"; 400428d7b3dSmrg case 4: 401428d7b3dSmrg return (select & 8) ? "-0" : "0"; 402428d7b3dSmrg case 5: 403428d7b3dSmrg return (select & 8) ? "-1" : "1"; 404428d7b3dSmrg default: 405428d7b3dSmrg return (select & 8) ? "-bad" : "bad"; 406428d7b3dSmrg } 407428d7b3dSmrg} 408428d7b3dSmrg 409428d7b3dSmrgstatic void 410428d7b3dSmrggen3_get_instruction_src_name(uint32_t src_type, uint32_t src_nr, char *name) 411428d7b3dSmrg{ 412428d7b3dSmrg switch (src_type) { 413428d7b3dSmrg case 0: 414428d7b3dSmrg sprintf(name, "R%d", src_nr); 415428d7b3dSmrg assert(src_nr <= 15); 416428d7b3dSmrg break; 417428d7b3dSmrg case 1: 418428d7b3dSmrg if (src_nr < 8) 419428d7b3dSmrg sprintf(name, "T%d", src_nr); 420428d7b3dSmrg else if (src_nr == 8) 421428d7b3dSmrg sprintf(name, "DIFFUSE"); 422428d7b3dSmrg else if (src_nr == 9) 423428d7b3dSmrg sprintf(name, "SPECULAR"); 424428d7b3dSmrg else if (src_nr == 10) 425428d7b3dSmrg sprintf(name, "FOG"); 426428d7b3dSmrg else { 427428d7b3dSmrg assert(0); 428428d7b3dSmrg sprintf(name, "RESERVED"); 429428d7b3dSmrg } 430428d7b3dSmrg break; 431428d7b3dSmrg case 2: 432428d7b3dSmrg sprintf(name, "C%d", src_nr); 433428d7b3dSmrg assert(src_nr <= 31); 434428d7b3dSmrg break; 435428d7b3dSmrg case 4: 436428d7b3dSmrg sprintf(name, "oC"); 437428d7b3dSmrg assert(src_nr == 0); 438428d7b3dSmrg break; 439428d7b3dSmrg case 5: 440428d7b3dSmrg sprintf(name, "oD"); 441428d7b3dSmrg assert(src_nr == 0); 442428d7b3dSmrg break; 443428d7b3dSmrg case 6: 444428d7b3dSmrg sprintf(name, "U%d", src_nr); 445428d7b3dSmrg assert(src_nr <= 3); 446428d7b3dSmrg break; 447428d7b3dSmrg default: 448428d7b3dSmrg sprintf(name, "RESERVED"); 449428d7b3dSmrg assert(0); 450428d7b3dSmrg break; 451428d7b3dSmrg } 452428d7b3dSmrg} 453428d7b3dSmrg 454428d7b3dSmrgstatic void 455428d7b3dSmrggen3_get_instruction_src0(uint32_t *data, int i, char *srcname) 456428d7b3dSmrg{ 457428d7b3dSmrg uint32_t a0 = data[i]; 458428d7b3dSmrg uint32_t a1 = data[i + 1]; 459428d7b3dSmrg int src_nr = (a0 >> 2) & 0x1f; 460428d7b3dSmrg const char *swizzle_x = gen3_get_channel_swizzle((a1 >> 28) & 0xf); 461428d7b3dSmrg const char *swizzle_y = gen3_get_channel_swizzle((a1 >> 24) & 0xf); 462428d7b3dSmrg const char *swizzle_z = gen3_get_channel_swizzle((a1 >> 20) & 0xf); 463428d7b3dSmrg const char *swizzle_w = gen3_get_channel_swizzle((a1 >> 16) & 0xf); 464428d7b3dSmrg char swizzle[100]; 465428d7b3dSmrg 466428d7b3dSmrg gen3_get_instruction_src_name((a0 >> 7) & 0x7, src_nr, srcname); 467428d7b3dSmrg sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z, swizzle_w); 468428d7b3dSmrg if (strcmp(swizzle, ".xyzw") != 0) 469428d7b3dSmrg strcat(srcname, swizzle); 470428d7b3dSmrg} 471428d7b3dSmrg 472428d7b3dSmrgstatic void 473428d7b3dSmrggen3_get_instruction_src1(uint32_t *data, int i, char *srcname) 474428d7b3dSmrg{ 475428d7b3dSmrg uint32_t a1 = data[i + 1]; 476428d7b3dSmrg uint32_t a2 = data[i + 2]; 477428d7b3dSmrg int src_nr = (a1 >> 8) & 0x1f; 478428d7b3dSmrg const char *swizzle_x = gen3_get_channel_swizzle((a1 >> 4) & 0xf); 479428d7b3dSmrg const char *swizzle_y = gen3_get_channel_swizzle((a1 >> 0) & 0xf); 480428d7b3dSmrg const char *swizzle_z = gen3_get_channel_swizzle((a2 >> 28) & 0xf); 481428d7b3dSmrg const char *swizzle_w = gen3_get_channel_swizzle((a2 >> 24) & 0xf); 482428d7b3dSmrg char swizzle[100]; 483428d7b3dSmrg 484428d7b3dSmrg gen3_get_instruction_src_name((a1 >> 13) & 0x7, src_nr, srcname); 485428d7b3dSmrg sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z, swizzle_w); 486428d7b3dSmrg if (strcmp(swizzle, ".xyzw") != 0) 487428d7b3dSmrg strcat(srcname, swizzle); 488428d7b3dSmrg} 489428d7b3dSmrg 490428d7b3dSmrgstatic void 491428d7b3dSmrggen3_get_instruction_src2(uint32_t *data, int i, char *srcname) 492428d7b3dSmrg{ 493428d7b3dSmrg uint32_t a2 = data[i + 2]; 494428d7b3dSmrg int src_nr = (a2 >> 16) & 0x1f; 495428d7b3dSmrg const char *swizzle_x = gen3_get_channel_swizzle((a2 >> 12) & 0xf); 496428d7b3dSmrg const char *swizzle_y = gen3_get_channel_swizzle((a2 >> 8) & 0xf); 497428d7b3dSmrg const char *swizzle_z = gen3_get_channel_swizzle((a2 >> 4) & 0xf); 498428d7b3dSmrg const char *swizzle_w = gen3_get_channel_swizzle((a2 >> 0) & 0xf); 499428d7b3dSmrg char swizzle[100]; 500428d7b3dSmrg 501428d7b3dSmrg gen3_get_instruction_src_name((a2 >> 21) & 0x7, src_nr, srcname); 502428d7b3dSmrg sprintf(swizzle, ".%s%s%s%s", swizzle_x, swizzle_y, swizzle_z, swizzle_w); 503428d7b3dSmrg if (strcmp(swizzle, ".xyzw") != 0) 504428d7b3dSmrg strcat(srcname, swizzle); 505428d7b3dSmrg} 506428d7b3dSmrg 507428d7b3dSmrgstatic void 508428d7b3dSmrggen3_get_instruction_addr(uint32_t src_type, uint32_t src_nr, char *name) 509428d7b3dSmrg{ 510428d7b3dSmrg switch (src_type) { 511428d7b3dSmrg case 0: 512428d7b3dSmrg sprintf(name, "R%d", src_nr); 513428d7b3dSmrg assert(src_nr <= 15); 514428d7b3dSmrg break; 515428d7b3dSmrg case 1: 516428d7b3dSmrg if (src_nr < 8) 517428d7b3dSmrg sprintf(name, "T%d", src_nr); 518428d7b3dSmrg else if (src_nr == 8) 519428d7b3dSmrg sprintf(name, "DIFFUSE"); 520428d7b3dSmrg else if (src_nr == 9) 521428d7b3dSmrg sprintf(name, "SPECULAR"); 522428d7b3dSmrg else if (src_nr == 10) 523428d7b3dSmrg sprintf(name, "FOG"); 524428d7b3dSmrg else { 525428d7b3dSmrg assert(0); 526428d7b3dSmrg sprintf(name, "RESERVED"); 527428d7b3dSmrg } 528428d7b3dSmrg break; 529428d7b3dSmrg case 4: 530428d7b3dSmrg sprintf(name, "oC"); 531428d7b3dSmrg assert(src_nr == 0); 532428d7b3dSmrg break; 533428d7b3dSmrg case 5: 534428d7b3dSmrg sprintf(name, "oD"); 535428d7b3dSmrg assert(src_nr == 0); 536428d7b3dSmrg break; 537428d7b3dSmrg default: 538428d7b3dSmrg assert(0); 539428d7b3dSmrg sprintf(name, "RESERVED"); 540428d7b3dSmrg break; 541428d7b3dSmrg } 542428d7b3dSmrg} 543428d7b3dSmrg 544428d7b3dSmrgstatic void 545428d7b3dSmrggen3_decode_alu1(uint32_t *data, uint32_t offset, 546428d7b3dSmrg int i, char *instr_prefix, const char *op_name) 547428d7b3dSmrg{ 548428d7b3dSmrg char dst[100], src0[100]; 549428d7b3dSmrg 550428d7b3dSmrg gen3_get_instruction_dst(data, i, dst, 1); 551428d7b3dSmrg gen3_get_instruction_src0(data, i, src0); 552428d7b3dSmrg 553428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: %s %s, %s\n", instr_prefix, 554428d7b3dSmrg op_name, dst, src0); 555428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 556428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 557428d7b3dSmrg} 558428d7b3dSmrg 559428d7b3dSmrgstatic void 560428d7b3dSmrggen3_decode_alu2(uint32_t *data, uint32_t offset, 561428d7b3dSmrg int i, char *instr_prefix, const char *op_name) 562428d7b3dSmrg{ 563428d7b3dSmrg char dst[100], src0[100], src1[100]; 564428d7b3dSmrg 565428d7b3dSmrg gen3_get_instruction_dst(data, i, dst, 1); 566428d7b3dSmrg gen3_get_instruction_src0(data, i, src0); 567428d7b3dSmrg gen3_get_instruction_src1(data, i, src1); 568428d7b3dSmrg 569428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: %s %s, %s, %s\n", instr_prefix, 570428d7b3dSmrg op_name, dst, src0, src1); 571428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 572428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 573428d7b3dSmrg} 574428d7b3dSmrg 575428d7b3dSmrgstatic void 576428d7b3dSmrggen3_decode_alu3(uint32_t *data, uint32_t offset, 577428d7b3dSmrg int i, char *instr_prefix, const char *op_name) 578428d7b3dSmrg{ 579428d7b3dSmrg char dst[100], src0[100], src1[100], src2[100]; 580428d7b3dSmrg 581428d7b3dSmrg gen3_get_instruction_dst(data, i, dst, 1); 582428d7b3dSmrg gen3_get_instruction_src0(data, i, src0); 583428d7b3dSmrg gen3_get_instruction_src1(data, i, src1); 584428d7b3dSmrg gen3_get_instruction_src2(data, i, src2); 585428d7b3dSmrg 586428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: %s %s, %s, %s, %s\n", instr_prefix, 587428d7b3dSmrg op_name, dst, src0, src1, src2); 588428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 589428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 590428d7b3dSmrg} 591428d7b3dSmrg 592428d7b3dSmrgstatic void 593428d7b3dSmrggen3_decode_tex(uint32_t *data, uint32_t offset, int i, char *instr_prefix, 594428d7b3dSmrg const char *tex_name) 595428d7b3dSmrg{ 596428d7b3dSmrg uint32_t t0 = data[i]; 597428d7b3dSmrg uint32_t t1 = data[i + 1]; 598428d7b3dSmrg char dst_name[100]; 599428d7b3dSmrg char addr_name[100]; 600428d7b3dSmrg int sampler_nr; 601428d7b3dSmrg 602428d7b3dSmrg gen3_get_instruction_dst(data, i, dst_name, 0); 603428d7b3dSmrg gen3_get_instruction_addr((t1 >> 24) & 0x7, 604428d7b3dSmrg (t1 >> 17) & 0xf, 605428d7b3dSmrg addr_name); 606428d7b3dSmrg sampler_nr = t0 & 0xf; 607428d7b3dSmrg 608428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: %s %s, S%d, %s\n", instr_prefix, 609428d7b3dSmrg tex_name, dst_name, sampler_nr, addr_name); 610428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 611428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 612428d7b3dSmrg} 613428d7b3dSmrg 614428d7b3dSmrgstatic void 615428d7b3dSmrggen3_decode_dcl(uint32_t *data, uint32_t offset, int i, char *instr_prefix) 616428d7b3dSmrg{ 617428d7b3dSmrg uint32_t d0 = data[i]; 618428d7b3dSmrg const char *sampletype; 619428d7b3dSmrg int dcl_nr = (d0 >> 14) & 0xf; 620428d7b3dSmrg const char *dcl_x = d0 & (1 << 10) ? "x" : ""; 621428d7b3dSmrg const char *dcl_y = d0 & (1 << 11) ? "y" : ""; 622428d7b3dSmrg const char *dcl_z = d0 & (1 << 12) ? "z" : ""; 623428d7b3dSmrg const char *dcl_w = d0 & (1 << 13) ? "w" : ""; 624428d7b3dSmrg char dcl_mask[10]; 625428d7b3dSmrg 626428d7b3dSmrg switch ((d0 >> 19) & 0x3) { 627428d7b3dSmrg case 1: 628428d7b3dSmrg sprintf(dcl_mask, ".%s%s%s%s", dcl_x, dcl_y, dcl_z, dcl_w); 629428d7b3dSmrg assert (strcmp(dcl_mask, ".")); 630428d7b3dSmrg 631428d7b3dSmrg assert(dcl_nr <= 10); 632428d7b3dSmrg if (dcl_nr < 8) { 633428d7b3dSmrg if (strcmp(dcl_mask, ".x") != 0 && 634428d7b3dSmrg strcmp(dcl_mask, ".xy") != 0 && 635428d7b3dSmrg strcmp(dcl_mask, ".xz") != 0 && 636428d7b3dSmrg strcmp(dcl_mask, ".w") != 0 && 637428d7b3dSmrg strcmp(dcl_mask, ".xyzw") != 0) { 638428d7b3dSmrg assert(0); 639428d7b3dSmrg } 640428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: DCL T%d%s\n", instr_prefix, 641428d7b3dSmrg dcl_nr, dcl_mask); 642428d7b3dSmrg } else { 643428d7b3dSmrg if (strcmp(dcl_mask, ".xz") == 0) 644428d7b3dSmrg assert(0); 645428d7b3dSmrg else if (strcmp(dcl_mask, ".xw") == 0) 646428d7b3dSmrg assert(0); 647428d7b3dSmrg else if (strcmp(dcl_mask, ".xzw") == 0) 648428d7b3dSmrg assert(0); 649428d7b3dSmrg 650428d7b3dSmrg if (dcl_nr == 8) { 651428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: DCL DIFFUSE%s\n", instr_prefix, 652428d7b3dSmrg dcl_mask); 653428d7b3dSmrg } else if (dcl_nr == 9) { 654428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: DCL SPECULAR%s\n", instr_prefix, 655428d7b3dSmrg dcl_mask); 656428d7b3dSmrg } else if (dcl_nr == 10) { 657428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: DCL FOG%s\n", instr_prefix, 658428d7b3dSmrg dcl_mask); 659428d7b3dSmrg } 660428d7b3dSmrg } 661428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 662428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 663428d7b3dSmrg break; 664428d7b3dSmrg case 3: 665428d7b3dSmrg switch ((d0 >> 22) & 0x3) { 666428d7b3dSmrg case 0: 667428d7b3dSmrg sampletype = "2D"; 668428d7b3dSmrg break; 669428d7b3dSmrg case 1: 670428d7b3dSmrg sampletype = "CUBE"; 671428d7b3dSmrg break; 672428d7b3dSmrg case 2: 673428d7b3dSmrg sampletype = "3D"; 674428d7b3dSmrg break; 675428d7b3dSmrg default: 676428d7b3dSmrg sampletype = "RESERVED"; 677428d7b3dSmrg break; 678428d7b3dSmrg } 679428d7b3dSmrg assert(dcl_nr <= 15); 680428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: DCL S%d %s\n", instr_prefix, 681428d7b3dSmrg dcl_nr, sampletype); 682428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 683428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 684428d7b3dSmrg break; 685428d7b3dSmrg default: 686428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: DCL RESERVED%d\n", instr_prefix, dcl_nr); 687428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 688428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 689428d7b3dSmrg } 690428d7b3dSmrg} 691428d7b3dSmrg 692428d7b3dSmrgstatic void 693428d7b3dSmrggen3_decode_instruction(uint32_t *data, uint32_t offset, 694428d7b3dSmrg int i, char *instr_prefix) 695428d7b3dSmrg{ 696428d7b3dSmrg switch ((data[i] >> 24) & 0x1f) { 697428d7b3dSmrg case 0x0: 698428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: NOP\n", instr_prefix); 699428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 700428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 701428d7b3dSmrg break; 702428d7b3dSmrg case 0x01: 703428d7b3dSmrg gen3_decode_alu2(data, offset, i, instr_prefix, "ADD"); 704428d7b3dSmrg break; 705428d7b3dSmrg case 0x02: 706428d7b3dSmrg gen3_decode_alu1(data, offset, i, instr_prefix, "MOV"); 707428d7b3dSmrg break; 708428d7b3dSmrg case 0x03: 709428d7b3dSmrg gen3_decode_alu2(data, offset, i, instr_prefix, "MUL"); 710428d7b3dSmrg break; 711428d7b3dSmrg case 0x04: 712428d7b3dSmrg gen3_decode_alu3(data, offset, i, instr_prefix, "MAD"); 713428d7b3dSmrg break; 714428d7b3dSmrg case 0x05: 715428d7b3dSmrg gen3_decode_alu3(data, offset, i, instr_prefix, "DP2ADD"); 716428d7b3dSmrg break; 717428d7b3dSmrg case 0x06: 718428d7b3dSmrg gen3_decode_alu2(data, offset, i, instr_prefix, "DP3"); 719428d7b3dSmrg break; 720428d7b3dSmrg case 0x07: 721428d7b3dSmrg gen3_decode_alu2(data, offset, i, instr_prefix, "DP4"); 722428d7b3dSmrg break; 723428d7b3dSmrg case 0x08: 724428d7b3dSmrg gen3_decode_alu1(data, offset, i, instr_prefix, "FRC"); 725428d7b3dSmrg break; 726428d7b3dSmrg case 0x09: 727428d7b3dSmrg gen3_decode_alu1(data, offset, i, instr_prefix, "RCP"); 728428d7b3dSmrg break; 729428d7b3dSmrg case 0x0a: 730428d7b3dSmrg gen3_decode_alu1(data, offset, i, instr_prefix, "RSQ"); 731428d7b3dSmrg break; 732428d7b3dSmrg case 0x0b: 733428d7b3dSmrg gen3_decode_alu1(data, offset, i, instr_prefix, "EXP"); 734428d7b3dSmrg break; 735428d7b3dSmrg case 0x0c: 736428d7b3dSmrg gen3_decode_alu1(data, offset, i, instr_prefix, "LOG"); 737428d7b3dSmrg break; 738428d7b3dSmrg case 0x0d: 739428d7b3dSmrg gen3_decode_alu2(data, offset, i, instr_prefix, "CMP"); 740428d7b3dSmrg break; 741428d7b3dSmrg case 0x0e: 742428d7b3dSmrg gen3_decode_alu2(data, offset, i, instr_prefix, "MIN"); 743428d7b3dSmrg break; 744428d7b3dSmrg case 0x0f: 745428d7b3dSmrg gen3_decode_alu2(data, offset, i, instr_prefix, "MAX"); 746428d7b3dSmrg break; 747428d7b3dSmrg case 0x10: 748428d7b3dSmrg gen3_decode_alu1(data, offset, i, instr_prefix, "FLR"); 749428d7b3dSmrg break; 750428d7b3dSmrg case 0x11: 751428d7b3dSmrg gen3_decode_alu1(data, offset, i, instr_prefix, "MOD"); 752428d7b3dSmrg break; 753428d7b3dSmrg case 0x12: 754428d7b3dSmrg gen3_decode_alu1(data, offset, i, instr_prefix, "TRC"); 755428d7b3dSmrg break; 756428d7b3dSmrg case 0x13: 757428d7b3dSmrg gen3_decode_alu2(data, offset, i, instr_prefix, "SGE"); 758428d7b3dSmrg break; 759428d7b3dSmrg case 0x14: 760428d7b3dSmrg gen3_decode_alu2(data, offset, i, instr_prefix, "SLT"); 761428d7b3dSmrg break; 762428d7b3dSmrg case 0x15: 763428d7b3dSmrg gen3_decode_tex(data, offset, i, instr_prefix, "TEXLD"); 764428d7b3dSmrg break; 765428d7b3dSmrg case 0x16: 766428d7b3dSmrg gen3_decode_tex(data, offset, i, instr_prefix, "TEXLDP"); 767428d7b3dSmrg break; 768428d7b3dSmrg case 0x17: 769428d7b3dSmrg gen3_decode_tex(data, offset, i, instr_prefix, "TEXLDB"); 770428d7b3dSmrg break; 771428d7b3dSmrg case 0x19: 772428d7b3dSmrg gen3_decode_dcl(data, offset, i, instr_prefix); 773428d7b3dSmrg break; 774428d7b3dSmrg default: 775428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s: unknown\n", instr_prefix); 776428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 777428d7b3dSmrg kgem_debug_print(data, offset, i++, "%s\n", instr_prefix); 778428d7b3dSmrg break; 779428d7b3dSmrg } 780428d7b3dSmrg} 781428d7b3dSmrg 782428d7b3dSmrgstatic const char * 783428d7b3dSmrggen3_decode_compare_func(uint32_t op) 784428d7b3dSmrg{ 785428d7b3dSmrg switch (op&0x7) { 786428d7b3dSmrg case 0: return "always"; 787428d7b3dSmrg case 1: return "never"; 788428d7b3dSmrg case 2: return "less"; 789428d7b3dSmrg case 3: return "equal"; 790428d7b3dSmrg case 4: return "lequal"; 791428d7b3dSmrg case 5: return "greater"; 792428d7b3dSmrg case 6: return "notequal"; 793428d7b3dSmrg case 7: return "gequal"; 794428d7b3dSmrg } 795428d7b3dSmrg return ""; 796428d7b3dSmrg} 797428d7b3dSmrg 798428d7b3dSmrgstatic const char * 799428d7b3dSmrggen3_decode_stencil_op(uint32_t op) 800428d7b3dSmrg{ 801428d7b3dSmrg switch (op&0x7) { 802428d7b3dSmrg case 0: return "keep"; 803428d7b3dSmrg case 1: return "zero"; 804428d7b3dSmrg case 2: return "replace"; 805428d7b3dSmrg case 3: return "incr_sat"; 806428d7b3dSmrg case 4: return "decr_sat"; 807428d7b3dSmrg case 5: return "greater"; 808428d7b3dSmrg case 6: return "incr"; 809428d7b3dSmrg case 7: return "decr"; 810428d7b3dSmrg } 811428d7b3dSmrg return ""; 812428d7b3dSmrg} 813428d7b3dSmrg 814428d7b3dSmrg#if 0 815428d7b3dSmrg/* part of MODES_4 */ 816428d7b3dSmrgstatic const char * 817428d7b3dSmrggen3_decode_logic_op(uint32_t op) 818428d7b3dSmrg{ 819428d7b3dSmrg switch (op&0xf) { 820428d7b3dSmrg case 0: return "clear"; 821428d7b3dSmrg case 1: return "nor"; 822428d7b3dSmrg case 2: return "and_inv"; 823428d7b3dSmrg case 3: return "copy_inv"; 824428d7b3dSmrg case 4: return "and_rvrse"; 825428d7b3dSmrg case 5: return "inv"; 826428d7b3dSmrg case 6: return "xor"; 827428d7b3dSmrg case 7: return "nand"; 828428d7b3dSmrg case 8: return "and"; 829428d7b3dSmrg case 9: return "equiv"; 830428d7b3dSmrg case 10: return "noop"; 831428d7b3dSmrg case 11: return "or_inv"; 832428d7b3dSmrg case 12: return "copy"; 833428d7b3dSmrg case 13: return "or_rvrse"; 834428d7b3dSmrg case 14: return "or"; 835428d7b3dSmrg case 15: return "set"; 836428d7b3dSmrg } 837428d7b3dSmrg return ""; 838428d7b3dSmrg} 839428d7b3dSmrg#endif 840428d7b3dSmrg 841428d7b3dSmrgstatic const char * 842428d7b3dSmrggen3_decode_blend_fact(uint32_t op) 843428d7b3dSmrg{ 844428d7b3dSmrg switch (op&0xf) { 845428d7b3dSmrg case 1: return "zero"; 846428d7b3dSmrg case 2: return "one"; 847428d7b3dSmrg case 3: return "src_colr"; 848428d7b3dSmrg case 4: return "inv_src_colr"; 849428d7b3dSmrg case 5: return "src_alpha"; 850428d7b3dSmrg case 6: return "inv_src_alpha"; 851428d7b3dSmrg case 7: return "dst_alpha"; 852428d7b3dSmrg case 8: return "inv_dst_alpha"; 853428d7b3dSmrg case 9: return "dst_colr"; 854428d7b3dSmrg case 10: return "inv_dst_colr"; 855428d7b3dSmrg case 11: return "src_alpha_sat"; 856428d7b3dSmrg case 12: return "cnst_colr"; 857428d7b3dSmrg case 13: return "inv_cnst_colr"; 858428d7b3dSmrg case 14: return "cnst_alpha"; 859428d7b3dSmrg case 15: return "inv_const_alpha"; 860428d7b3dSmrg } 861428d7b3dSmrg return ""; 862428d7b3dSmrg} 863428d7b3dSmrg 864428d7b3dSmrgstatic const char * 865428d7b3dSmrgdecode_tex_coord_mode(uint32_t mode) 866428d7b3dSmrg{ 867428d7b3dSmrg switch (mode&0x7) { 868428d7b3dSmrg case 0: return "wrap"; 869428d7b3dSmrg case 1: return "mirror"; 870428d7b3dSmrg case 2: return "clamp_edge"; 871428d7b3dSmrg case 3: return "cube"; 872428d7b3dSmrg case 4: return "clamp_border"; 873428d7b3dSmrg case 5: return "mirror_once"; 874428d7b3dSmrg } 875428d7b3dSmrg return ""; 876428d7b3dSmrg} 877428d7b3dSmrg 878428d7b3dSmrgstatic const char * 879428d7b3dSmrggen3_decode_sample_filter(uint32_t mode) 880428d7b3dSmrg{ 881428d7b3dSmrg switch (mode&0x7) { 882428d7b3dSmrg case 0: return "nearest"; 883428d7b3dSmrg case 1: return "linear"; 884428d7b3dSmrg case 2: return "anisotropic"; 885428d7b3dSmrg case 3: return "4x4_1"; 886428d7b3dSmrg case 4: return "4x4_2"; 887428d7b3dSmrg case 5: return "4x4_flat"; 888428d7b3dSmrg case 6: return "6x5_mono"; 889428d7b3dSmrg } 890428d7b3dSmrg return ""; 891428d7b3dSmrg} 892428d7b3dSmrg 893428d7b3dSmrgstatic int 894428d7b3dSmrggen3_decode_load_state_immediate_1(struct kgem *kgem, uint32_t offset) 895428d7b3dSmrg{ 896428d7b3dSmrg const uint32_t *data = kgem->batch + offset; 897428d7b3dSmrg int len, i, word; 898428d7b3dSmrg 899428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_LOAD_STATE_IMMEDIATE_1\n"); 900428d7b3dSmrg len = (data[0] & 0x0000000f) + 2; 901428d7b3dSmrg i = 1; 902428d7b3dSmrg for (word = 0; word <= 8; word++) { 903428d7b3dSmrg if (data[0] & (1 << (4 + word))) { 904428d7b3dSmrg switch (word) { 905428d7b3dSmrg case 0: 906428d7b3dSmrg kgem_debug_print(data, offset, i, "S0: vbo offset: 0x%08x%s\n", 907428d7b3dSmrg data[i]&(~1),data[i]&1?", auto cache invalidate disabled":""); 908428d7b3dSmrg gen3_update_vertex_buffer_addr(kgem, offset + i); 909428d7b3dSmrg break; 910428d7b3dSmrg case 1: 911428d7b3dSmrg kgem_debug_print(data, offset, i, "S1: vertex width: %i, vertex pitch: %i\n", 912428d7b3dSmrg (data[i]>>24)&0x3f,(data[i]>>16)&0x3f); 913428d7b3dSmrg gen3_update_vertex_buffer_pitch(kgem, offset + i); 914428d7b3dSmrg break; 915428d7b3dSmrg case 2: 916428d7b3dSmrg { 917428d7b3dSmrg char buf[200]; 918428d7b3dSmrg int len = 0; 919428d7b3dSmrg int tex_num; 920428d7b3dSmrg for (tex_num = 0; tex_num < 8; tex_num++) { 921428d7b3dSmrg switch((data[i]>>tex_num*4)&0xf) { 922428d7b3dSmrg case 0: len += sprintf(buf + len, "%i=2D ", tex_num); break; 923428d7b3dSmrg case 1: len += sprintf(buf + len, "%i=3D ", tex_num); break; 924428d7b3dSmrg case 2: len += sprintf(buf + len, "%i=4D ", tex_num); break; 925428d7b3dSmrg case 3: len += sprintf(buf + len, "%i=1D ", tex_num); break; 926428d7b3dSmrg case 4: len += sprintf(buf + len, "%i=2D_16 ", tex_num); break; 927428d7b3dSmrg case 5: len += sprintf(buf + len, "%i=4D_16 ", tex_num); break; 928428d7b3dSmrg case 0xf: len += sprintf(buf + len, "%i=NP ", tex_num); break; 929428d7b3dSmrg } 930428d7b3dSmrg } 931428d7b3dSmrg kgem_debug_print(data, offset, i, "S2: texcoord formats: %s\n", buf); 932428d7b3dSmrg gen3_update_vertex_texcoords(kgem, data[i]); 933428d7b3dSmrg } 934428d7b3dSmrg 935428d7b3dSmrg break; 936428d7b3dSmrg case 3: 937428d7b3dSmrg kgem_debug_print(data, offset, i, "S3: not documented\n"); 938428d7b3dSmrg break; 939428d7b3dSmrg case 4: 940428d7b3dSmrg { 941428d7b3dSmrg const char *cullmode = ""; 942428d7b3dSmrg const char *vfmt_xyzw = ""; 943428d7b3dSmrg switch((data[i]>>13)&0x3) { 944428d7b3dSmrg case 0: cullmode = "both"; break; 945428d7b3dSmrg case 1: cullmode = "none"; break; 946428d7b3dSmrg case 2: cullmode = "cw"; break; 947428d7b3dSmrg case 3: cullmode = "ccw"; break; 948428d7b3dSmrg } 949428d7b3dSmrg switch(data[i] & (7<<6 | 1<<2)) { 950428d7b3dSmrg case 1<<6: vfmt_xyzw = "XYZ,"; break; 951428d7b3dSmrg case 2<<6: vfmt_xyzw = "XYZW,"; break; 952428d7b3dSmrg case 3<<6: vfmt_xyzw = "XY,"; break; 953428d7b3dSmrg case 4<<6: vfmt_xyzw = "XYW,"; break; 954428d7b3dSmrg case 1<<6 | 1<<2: vfmt_xyzw = "XYZF,"; break; 955428d7b3dSmrg case 2<<6 | 1<<2: vfmt_xyzw = "XYZWF,"; break; 956428d7b3dSmrg case 3<<6 | 1<<2: vfmt_xyzw = "XYF,"; break; 957428d7b3dSmrg case 4<<6 | 1<<2: vfmt_xyzw = "XYWF,"; break; 958428d7b3dSmrg } 959428d7b3dSmrg kgem_debug_print(data, offset, i, "S4: point_width=%i, line_width=%.1f," 960428d7b3dSmrg "%s%s%s%s%s cullmode=%s, vfmt=%s%s%s%s%s%s%s%s " 961428d7b3dSmrg "%s%s%s\n", 962428d7b3dSmrg (data[i]>>23)&0x1ff, 963428d7b3dSmrg ((data[i]>>19)&0xf) / 2.0, 964428d7b3dSmrg data[i]&(0xf<<15)?" flatshade=":"", 965428d7b3dSmrg data[i]&(1<<18)?"Alpha,":"", 966428d7b3dSmrg data[i]&(1<<17)?"Fog,":"", 967428d7b3dSmrg data[i]&(1<<16)?"Specular,":"", 968428d7b3dSmrg data[i]&(1<<15)?"Color,":"", 969428d7b3dSmrg cullmode, 970428d7b3dSmrg data[i]&(1<<12)?"PointWidth,":"", 971428d7b3dSmrg data[i]&(1<<11)?"SpecFog,":"", 972428d7b3dSmrg data[i]&(1<<10)?"Color,":"", 973428d7b3dSmrg data[i]&(1<<9)?"DepthOfs,":"", 974428d7b3dSmrg vfmt_xyzw, 975428d7b3dSmrg data[i]&(1<<9)?"FogParam,":"", 976428d7b3dSmrg data[i]&(1<<5)?"force default diffuse, ":"", 977428d7b3dSmrg data[i]&(1<<4)?"force default specular, ":"", 978428d7b3dSmrg data[i]&(1<<3)?"local depth ofs enable, ":"", 979428d7b3dSmrg data[i]&(1<<1)?"point sprite enable, ":"", 980428d7b3dSmrg data[i]&(1<<0)?"line AA enable, ":""); 981428d7b3dSmrg gen3_update_vertex_elements(kgem, data[i]); 982428d7b3dSmrg break; 983428d7b3dSmrg } 984428d7b3dSmrg case 5: 985428d7b3dSmrg { 986428d7b3dSmrg kgem_debug_print(data, offset, i, "S5:%s%s%s%s%s" 987428d7b3dSmrg "%s%s%s%s stencil_ref=0x%x, stencil_test=%s, " 988428d7b3dSmrg "stencil_fail=%s, stencil_pass_z_fail=%s, " 989428d7b3dSmrg "stencil_pass_z_pass=%s, %s%s%s%s\n", 990428d7b3dSmrg data[i]&(0xf<<28)?" write_disable=":"", 991428d7b3dSmrg data[i]&(1<<31)?"Alpha,":"", 992428d7b3dSmrg data[i]&(1<<30)?"Red,":"", 993428d7b3dSmrg data[i]&(1<<29)?"Green,":"", 994428d7b3dSmrg data[i]&(1<<28)?"Blue,":"", 995428d7b3dSmrg data[i]&(1<<27)?" force default point size,":"", 996428d7b3dSmrg data[i]&(1<<26)?" last pixel enable,":"", 997428d7b3dSmrg data[i]&(1<<25)?" global depth ofs enable,":"", 998428d7b3dSmrg data[i]&(1<<24)?" fog enable,":"", 999428d7b3dSmrg (data[i]>>16)&0xff, 1000428d7b3dSmrg gen3_decode_compare_func(data[i]>>13), 1001428d7b3dSmrg gen3_decode_stencil_op(data[i]>>10), 1002428d7b3dSmrg gen3_decode_stencil_op(data[i]>>7), 1003428d7b3dSmrg gen3_decode_stencil_op(data[i]>>4), 1004428d7b3dSmrg data[i]&(1<<3)?"stencil write enable, ":"", 1005428d7b3dSmrg data[i]&(1<<2)?"stencil test enable, ":"", 1006428d7b3dSmrg data[i]&(1<<1)?"color dither enable, ":"", 1007428d7b3dSmrg data[i]&(1<<0)?"logicop enable, ":""); 1008428d7b3dSmrg } 1009428d7b3dSmrg break; 1010428d7b3dSmrg case 6: 1011428d7b3dSmrg kgem_debug_print(data, offset, i, "S6: %salpha_test=%s, alpha_ref=0x%x, " 1012428d7b3dSmrg "depth_test=%s, %ssrc_blnd_fct=%s, dst_blnd_fct=%s, " 1013428d7b3dSmrg "%s%stristrip_provoking_vertex=%i\n", 1014428d7b3dSmrg data[i]&(1<<31)?"alpha test enable, ":"", 1015428d7b3dSmrg gen3_decode_compare_func(data[i]>>28), 1016428d7b3dSmrg data[i]&(0xff<<20), 1017428d7b3dSmrg gen3_decode_compare_func(data[i]>>16), 1018428d7b3dSmrg data[i]&(1<<15)?"cbuf blend enable, ":"", 1019428d7b3dSmrg gen3_decode_blend_fact(data[i]>>8), 1020428d7b3dSmrg gen3_decode_blend_fact(data[i]>>4), 1021428d7b3dSmrg data[i]&(1<<3)?"depth write enable, ":"", 1022428d7b3dSmrg data[i]&(1<<2)?"cbuf write enable, ":"", 1023428d7b3dSmrg data[i]&(0x3)); 1024428d7b3dSmrg break; 1025428d7b3dSmrg case 7: 1026428d7b3dSmrg kgem_debug_print(data, offset, i, "S7: depth offset constant: 0x%08x\n", data[i]); 1027428d7b3dSmrg break; 1028428d7b3dSmrg } 1029428d7b3dSmrg i++; 1030428d7b3dSmrg } 1031428d7b3dSmrg } 1032428d7b3dSmrg 1033428d7b3dSmrg assert(len == i); 1034428d7b3dSmrg return len; 1035428d7b3dSmrg} 1036428d7b3dSmrg 1037428d7b3dSmrgstatic int 1038428d7b3dSmrggen3_decode_3d_1d(struct kgem *kgem, uint32_t offset) 1039428d7b3dSmrg{ 1040428d7b3dSmrg uint32_t *data = kgem->batch + offset; 1041428d7b3dSmrg unsigned int len, i, c, idx, word, map, sampler, instr; 1042428d7b3dSmrg const char *format, *zformat, *type; 1043428d7b3dSmrg uint32_t opcode; 1044428d7b3dSmrg static const struct { 1045428d7b3dSmrg uint32_t opcode; 1046428d7b3dSmrg int min_len; 1047428d7b3dSmrg int max_len; 1048428d7b3dSmrg const char *name; 1049428d7b3dSmrg } opcodes_3d_1d[] = { 1050428d7b3dSmrg { 0x86, 4, 4, "3DSTATE_CHROMA_KEY" }, 1051428d7b3dSmrg { 0x88, 2, 2, "3DSTATE_CONSTANT_BLEND_COLOR" }, 1052428d7b3dSmrg { 0x99, 2, 2, "3DSTATE_DEFAULT_DIFFUSE" }, 1053428d7b3dSmrg { 0x9a, 2, 2, "3DSTATE_DEFAULT_SPECULAR" }, 1054428d7b3dSmrg { 0x98, 2, 2, "3DSTATE_DEFAULT_Z" }, 1055428d7b3dSmrg { 0x97, 2, 2, "3DSTATE_DEPTH_OFFSET_SCALE" }, 1056428d7b3dSmrg { 0x9d, 65, 65, "3DSTATE_FILTER_COEFFICIENTS_4X4" }, 1057428d7b3dSmrg { 0x9e, 4, 4, "3DSTATE_MONO_FILTER" }, 1058428d7b3dSmrg { 0x89, 4, 4, "3DSTATE_FOG_MODE" }, 1059428d7b3dSmrg { 0x8f, 2, 16, "3DSTATE_MAP_PALLETE_LOAD_32" }, 1060428d7b3dSmrg { 0x83, 2, 2, "3DSTATE_SPAN_STIPPLE" }, 1061428d7b3dSmrg }, *opcode_3d_1d; 1062428d7b3dSmrg 1063428d7b3dSmrg opcode = (data[0] & 0x00ff0000) >> 16; 1064428d7b3dSmrg 1065428d7b3dSmrg switch (opcode) { 1066428d7b3dSmrg case 0x07: 1067428d7b3dSmrg /* This instruction is unusual. A 0 length means just 1 DWORD instead of 1068428d7b3dSmrg * 2. The 0 length is specified in one place to be unsupported, but 1069428d7b3dSmrg * stated to be required in another, and 0 length LOAD_INDIRECTs appear 1070428d7b3dSmrg * to cause no harm at least. 1071428d7b3dSmrg */ 1072428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_LOAD_INDIRECT\n"); 1073428d7b3dSmrg len = (data[0] & 0x000000ff) + 1; 1074428d7b3dSmrg i = 1; 1075428d7b3dSmrg if (data[0] & (0x01 << 8)) { 1076428d7b3dSmrg kgem_debug_print(data, offset, i++, "SIS.0\n"); 1077428d7b3dSmrg kgem_debug_print(data, offset, i++, "SIS.1\n"); 1078428d7b3dSmrg } 1079428d7b3dSmrg if (data[0] & (0x02 << 8)) { 1080428d7b3dSmrg kgem_debug_print(data, offset, i++, "DIS.0\n"); 1081428d7b3dSmrg } 1082428d7b3dSmrg if (data[0] & (0x04 << 8)) { 1083428d7b3dSmrg kgem_debug_print(data, offset, i++, "SSB.0\n"); 1084428d7b3dSmrg kgem_debug_print(data, offset, i++, "SSB.1\n"); 1085428d7b3dSmrg } 1086428d7b3dSmrg if (data[0] & (0x08 << 8)) { 1087428d7b3dSmrg kgem_debug_print(data, offset, i++, "MSB.0\n"); 1088428d7b3dSmrg kgem_debug_print(data, offset, i++, "MSB.1\n"); 1089428d7b3dSmrg } 1090428d7b3dSmrg if (data[0] & (0x10 << 8)) { 1091428d7b3dSmrg kgem_debug_print(data, offset, i++, "PSP.0\n"); 1092428d7b3dSmrg kgem_debug_print(data, offset, i++, "PSP.1\n"); 1093428d7b3dSmrg } 1094428d7b3dSmrg if (data[0] & (0x20 << 8)) { 1095428d7b3dSmrg kgem_debug_print(data, offset, i++, "PSC.0\n"); 1096428d7b3dSmrg kgem_debug_print(data, offset, i++, "PSC.1\n"); 1097428d7b3dSmrg } 1098428d7b3dSmrg assert(len == i); 1099428d7b3dSmrg return len; 1100428d7b3dSmrg case 0x04: 1101428d7b3dSmrg return gen3_decode_load_state_immediate_1(kgem, offset); 1102428d7b3dSmrg case 0x03: 1103428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_LOAD_STATE_IMMEDIATE_2\n"); 1104428d7b3dSmrg len = (data[0] & 0x0000000f) + 2; 1105428d7b3dSmrg i = 1; 1106428d7b3dSmrg for (word = 6; word <= 14; word++) { 1107428d7b3dSmrg if (data[0] & (1 << word)) { 1108428d7b3dSmrg if (word == 6) 1109428d7b3dSmrg kgem_debug_print(data, offset, i++, "TBCF\n"); 1110428d7b3dSmrg else if (word >= 7 && word <= 10) { 1111428d7b3dSmrg kgem_debug_print(data, offset, i++, "TB%dC\n", word - 7); 1112428d7b3dSmrg kgem_debug_print(data, offset, i++, "TB%dA\n", word - 7); 1113428d7b3dSmrg } else if (word >= 11 && word <= 14) { 1114428d7b3dSmrg kgem_debug_print(data, offset, i, "TM%dS0: offset=0x%08x, %s\n", 1115428d7b3dSmrg word - 11, 1116428d7b3dSmrg data[i]&0xfffffffe, 1117428d7b3dSmrg data[i]&1?"use fence":""); 1118428d7b3dSmrg i++; 1119428d7b3dSmrg kgem_debug_print(data, offset, i, "TM%dS1: height=%i, width=%i, %s\n", 1120428d7b3dSmrg word - 11, 1121428d7b3dSmrg data[i]>>21, (data[i]>>10)&0x3ff, 1122428d7b3dSmrg data[i]&2?(data[i]&1?"y-tiled":"x-tiled"):""); 1123428d7b3dSmrg i++; 1124428d7b3dSmrg kgem_debug_print(data, offset, i, "TM%dS2: pitch=%i, \n", 1125428d7b3dSmrg word - 11, 1126428d7b3dSmrg ((data[i]>>21) + 1)*4); 1127428d7b3dSmrg i++; 1128428d7b3dSmrg kgem_debug_print(data, offset, i++, "TM%dS3\n", word - 11); 1129428d7b3dSmrg kgem_debug_print(data, offset, i++, "TM%dS4: dflt color\n", word - 11); 1130428d7b3dSmrg } 1131428d7b3dSmrg } 1132428d7b3dSmrg } 1133428d7b3dSmrg assert(len == i); 1134428d7b3dSmrg return len; 1135428d7b3dSmrg case 0x00: 1136428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_MAP_STATE\n"); 1137428d7b3dSmrg len = (data[0] & 0x0000003f) + 2; 1138428d7b3dSmrg kgem_debug_print(data, offset, 1, "mask\n"); 1139428d7b3dSmrg 1140428d7b3dSmrg i = 2; 1141428d7b3dSmrg for (map = 0; map <= 15; map++) { 1142428d7b3dSmrg if (data[1] & (1 << map)) { 1143428d7b3dSmrg int width, height, pitch, dword; 1144428d7b3dSmrg struct drm_i915_gem_relocation_entry *reloc; 1145428d7b3dSmrg const char *tiling; 1146428d7b3dSmrg 1147428d7b3dSmrg reloc = kgem_debug_get_reloc_entry(kgem, &data[i] - kgem->batch); 1148428d7b3dSmrg assert(reloc->target_handle); 1149428d7b3dSmrg 1150428d7b3dSmrg dword = data[i]; 1151428d7b3dSmrg kgem_debug_print(data, offset, i++, "map %d MS2 %s%s%s, handle=%d\n", map, 1152428d7b3dSmrg dword&(1<<31)?"untrusted surface, ":"", 1153428d7b3dSmrg dword&(1<<1)?"vertical line stride enable, ":"", 1154428d7b3dSmrg dword&(1<<0)?"vertical ofs enable, ":"", 1155428d7b3dSmrg reloc->target_handle); 1156428d7b3dSmrg 1157428d7b3dSmrg dword = data[i]; 1158428d7b3dSmrg width = ((dword >> 10) & ((1 << 11) - 1))+1; 1159428d7b3dSmrg height = ((dword >> 21) & ((1 << 11) - 1))+1; 1160428d7b3dSmrg 1161428d7b3dSmrg tiling = "none"; 1162428d7b3dSmrg if (dword & (1 << 2)) 1163428d7b3dSmrg tiling = "fenced"; 1164428d7b3dSmrg else if (dword & (1 << 1)) 1165428d7b3dSmrg tiling = dword & (1 << 0) ? "Y" : "X"; 1166428d7b3dSmrg type = " BAD"; 1167428d7b3dSmrg format = " (invalid)"; 1168428d7b3dSmrg switch ((dword>>7) & 0x7) { 1169428d7b3dSmrg case 1: 1170428d7b3dSmrg type = "8"; 1171428d7b3dSmrg switch ((dword>>3) & 0xf) { 1172428d7b3dSmrg case 0: format = "I"; break; 1173428d7b3dSmrg case 1: format = "L"; break; 1174428d7b3dSmrg case 4: format = "A"; break; 1175428d7b3dSmrg case 5: format = " mono"; break; 1176428d7b3dSmrg } 1177428d7b3dSmrg break; 1178428d7b3dSmrg case 2: 1179428d7b3dSmrg type = "16"; 1180428d7b3dSmrg switch ((dword>>3) & 0xf) { 1181428d7b3dSmrg case 0: format = " rgb565"; break; 1182428d7b3dSmrg case 1: format = " argb1555"; break; 1183428d7b3dSmrg case 2: format = " argb4444"; break; 1184428d7b3dSmrg case 3: format = " ay88"; break; 1185428d7b3dSmrg case 5: format = " 88dvdu"; break; 1186428d7b3dSmrg case 6: format = " bump655"; break; 1187428d7b3dSmrg case 7: format = "I"; break; 1188428d7b3dSmrg case 8: format = "L"; break; 1189428d7b3dSmrg case 9: format = "A"; break; 1190428d7b3dSmrg } 1191428d7b3dSmrg break; 1192428d7b3dSmrg case 3: 1193428d7b3dSmrg type = "32"; 1194428d7b3dSmrg switch ((dword>>3) & 0xf) { 1195428d7b3dSmrg case 0: format = " argb8888"; break; 1196428d7b3dSmrg case 1: format = " abgr8888"; break; 1197428d7b3dSmrg case 2: format = " xrgb8888"; break; 1198428d7b3dSmrg case 3: format = " xbgr8888"; break; 1199428d7b3dSmrg case 4: format = " qwvu8888"; break; 1200428d7b3dSmrg case 5: format = " axvu8888"; break; 1201428d7b3dSmrg case 6: format = " lxvu8888"; break; 1202428d7b3dSmrg case 7: format = " xlvu8888"; break; 1203428d7b3dSmrg case 8: format = " argb2101010"; break; 1204428d7b3dSmrg case 9: format = " abgr2101010"; break; 1205428d7b3dSmrg case 10: format = " awvu2101010"; break; 1206428d7b3dSmrg case 11: format = " gr1616"; break; 1207428d7b3dSmrg case 12: format = " vu1616"; break; 1208428d7b3dSmrg case 13: format = " xI824"; break; 1209428d7b3dSmrg case 14: format = " xA824"; break; 1210428d7b3dSmrg case 15: format = " xL824"; break; 1211428d7b3dSmrg } 1212428d7b3dSmrg break; 1213428d7b3dSmrg case 5: 1214428d7b3dSmrg type = "422"; 1215428d7b3dSmrg switch ((dword>>3) & 0xf) { 1216428d7b3dSmrg case 0: format = " yuv_swapy"; break; 1217428d7b3dSmrg case 1: format = " yuv"; break; 1218428d7b3dSmrg case 2: format = " yuv_swapuv"; break; 1219428d7b3dSmrg case 3: format = " yuv_swapuvy"; break; 1220428d7b3dSmrg } 1221428d7b3dSmrg break; 1222428d7b3dSmrg case 6: 1223428d7b3dSmrg type = "compressed"; 1224428d7b3dSmrg switch ((dword>>3) & 0x7) { 1225428d7b3dSmrg case 0: format = " dxt1"; break; 1226428d7b3dSmrg case 1: format = " dxt2_3"; break; 1227428d7b3dSmrg case 2: format = " dxt4_5"; break; 1228428d7b3dSmrg case 3: format = " fxt1"; break; 1229428d7b3dSmrg case 4: format = " dxt1_rb"; break; 1230428d7b3dSmrg } 1231428d7b3dSmrg break; 1232428d7b3dSmrg case 7: 1233428d7b3dSmrg type = "4b indexed"; 1234428d7b3dSmrg switch ((dword>>3) & 0xf) { 1235428d7b3dSmrg case 7: format = " argb8888"; break; 1236428d7b3dSmrg } 1237428d7b3dSmrg break; 1238428d7b3dSmrg default: 1239428d7b3dSmrg format = "BAD"; 1240428d7b3dSmrg break; 1241428d7b3dSmrg } 1242428d7b3dSmrg dword = data[i]; 1243428d7b3dSmrg kgem_debug_print(data, offset, i++, "map %d MS3 [width=%d, height=%d, format=%s%s, tiling=%s%s]\n", 1244428d7b3dSmrg map, width, height, type, format, tiling, 1245428d7b3dSmrg dword&(1<<9)?" palette select":""); 1246428d7b3dSmrg 1247428d7b3dSmrg dword = data[i]; 1248428d7b3dSmrg pitch = 4*(((dword >> 21) & ((1 << 11) - 1))+1); 1249428d7b3dSmrg kgem_debug_print(data, offset, i++, "map %d MS4 [pitch=%d, max_lod=%i, vol_depth=%i, cube_face_ena=%x, %s]\n", 1250428d7b3dSmrg map, pitch, 1251428d7b3dSmrg (dword>>9)&0x3f, dword&0xff, (dword>>15)&0x3f, 1252428d7b3dSmrg dword&(1<<8)?"miplayout legacy":"miplayout right"); 1253428d7b3dSmrg } 1254428d7b3dSmrg } 1255428d7b3dSmrg assert(len == i); 1256428d7b3dSmrg return len; 1257428d7b3dSmrg case 0x06: 1258428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_PIXEL_SHADER_CONSTANTS\n"); 1259428d7b3dSmrg len = (data[0] & 0x000000ff) + 2; 1260428d7b3dSmrg 1261428d7b3dSmrg i = 2; 1262428d7b3dSmrg for (c = 0; c <= 31; c++) { 1263428d7b3dSmrg if (data[1] & (1 << c)) { 1264428d7b3dSmrg kgem_debug_print(data, offset, i, "C%d.X = %f\n", 1265428d7b3dSmrg c, int_as_float(data[i])); 1266428d7b3dSmrg i++; 1267428d7b3dSmrg kgem_debug_print(data, offset, i, "C%d.Y = %f\n", 1268428d7b3dSmrg c, int_as_float(data[i])); 1269428d7b3dSmrg i++; 1270428d7b3dSmrg kgem_debug_print(data, offset, i, "C%d.Z = %f\n", 1271428d7b3dSmrg c, int_as_float(data[i])); 1272428d7b3dSmrg i++; 1273428d7b3dSmrg kgem_debug_print(data, offset, i, "C%d.W = %f\n", 1274428d7b3dSmrg c, int_as_float(data[i])); 1275428d7b3dSmrg i++; 1276428d7b3dSmrg } 1277428d7b3dSmrg } 1278428d7b3dSmrg assert(len == i); 1279428d7b3dSmrg return len; 1280428d7b3dSmrg case 0x05: 1281428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_PIXEL_SHADER_PROGRAM\n"); 1282428d7b3dSmrg len = (data[0] & 0x000000ff) + 2; 1283428d7b3dSmrg assert(((len-1) % 3) == 0); 1284428d7b3dSmrg assert(len <= 370); 1285428d7b3dSmrg i = 1; 1286428d7b3dSmrg for (instr = 0; instr < (len - 1) / 3; instr++) { 1287428d7b3dSmrg char instr_prefix[10]; 1288428d7b3dSmrg 1289428d7b3dSmrg sprintf(instr_prefix, "PS%03d", instr); 1290428d7b3dSmrg gen3_decode_instruction(data, offset, i, instr_prefix); 1291428d7b3dSmrg i += 3; 1292428d7b3dSmrg } 1293428d7b3dSmrg return len; 1294428d7b3dSmrg case 0x01: 1295428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_SAMPLER_STATE\n"); 1296428d7b3dSmrg kgem_debug_print(data, offset, 1, "mask\n"); 1297428d7b3dSmrg len = (data[0] & 0x0000003f) + 2; 1298428d7b3dSmrg i = 2; 1299428d7b3dSmrg for (sampler = 0; sampler <= 15; sampler++) { 1300428d7b3dSmrg if (data[1] & (1 << sampler)) { 1301428d7b3dSmrg uint32_t dword; 1302428d7b3dSmrg const char *mip_filter = ""; 1303428d7b3dSmrg dword = data[i]; 1304428d7b3dSmrg switch ((dword>>20)&0x3) { 1305428d7b3dSmrg case 0: mip_filter = "none"; break; 1306428d7b3dSmrg case 1: mip_filter = "nearest"; break; 1307428d7b3dSmrg case 3: mip_filter = "linear"; break; 1308428d7b3dSmrg } 1309428d7b3dSmrg kgem_debug_print(data, offset, i++, "sampler %d SS2:%s%s%s " 1310428d7b3dSmrg "base_mip_level=%i, mip_filter=%s, mag_filter=%s, min_filter=%s " 1311428d7b3dSmrg "lod_bias=%.2f,%s max_aniso=%i, shadow_func=%s\n", sampler, 1312428d7b3dSmrg dword&(1<<31)?" reverse gamma,":"", 1313428d7b3dSmrg dword&(1<<30)?" packed2planar,":"", 1314428d7b3dSmrg dword&(1<<29)?" colorspace conversion,":"", 1315428d7b3dSmrg (dword>>22)&0x1f, 1316428d7b3dSmrg mip_filter, 1317428d7b3dSmrg gen3_decode_sample_filter(dword>>17), 1318428d7b3dSmrg gen3_decode_sample_filter(dword>>14), 1319428d7b3dSmrg ((dword>>5)&0x1ff)/(0x10*1.0), 1320428d7b3dSmrg dword&(1<<4)?" shadow,":"", 1321428d7b3dSmrg dword&(1<<3)?4:2, 1322428d7b3dSmrg gen3_decode_compare_func(dword)); 1323428d7b3dSmrg dword = data[i]; 1324428d7b3dSmrg kgem_debug_print(data, offset, i++, "sampler %d SS3: min_lod=%.2f,%s " 1325428d7b3dSmrg "tcmode_x=%s, tcmode_y=%s, tcmode_z=%s,%s texmap_idx=%i,%s\n", 1326428d7b3dSmrg sampler, ((dword>>24)&0xff)/(0x10*1.0), 1327428d7b3dSmrg dword&(1<<17)?" kill pixel enable,":"", 1328428d7b3dSmrg decode_tex_coord_mode(dword>>12), 1329428d7b3dSmrg decode_tex_coord_mode(dword>>9), 1330428d7b3dSmrg decode_tex_coord_mode(dword>>6), 1331428d7b3dSmrg dword&(1<<5)?" normalized coords,":"", 1332428d7b3dSmrg (dword>>1)&0xf, 1333428d7b3dSmrg dword&(1<<0)?" deinterlacer,":""); 1334428d7b3dSmrg kgem_debug_print(data, offset, i++, "sampler %d SS4: border color\n", 1335428d7b3dSmrg sampler); 1336428d7b3dSmrg } 1337428d7b3dSmrg } 1338428d7b3dSmrg assert(len == i); 1339428d7b3dSmrg return len; 1340428d7b3dSmrg case 0x85: 1341428d7b3dSmrg len = (data[0] & 0x0000000f) + 2; 1342428d7b3dSmrg assert(len == 2); 1343428d7b3dSmrg 1344428d7b3dSmrg kgem_debug_print(data, offset, 0, 1345428d7b3dSmrg "3DSTATE_DEST_BUFFER_VARIABLES\n"); 1346428d7b3dSmrg 1347428d7b3dSmrg switch ((data[1] >> 8) & 0xf) { 1348428d7b3dSmrg case 0x0: format = "g8"; break; 1349428d7b3dSmrg case 0x1: format = "x1r5g5b5"; break; 1350428d7b3dSmrg case 0x2: format = "r5g6b5"; break; 1351428d7b3dSmrg case 0x3: format = "a8r8g8b8"; break; 1352428d7b3dSmrg case 0x4: format = "ycrcb_swapy"; break; 1353428d7b3dSmrg case 0x5: format = "ycrcb_normal"; break; 1354428d7b3dSmrg case 0x6: format = "ycrcb_swapuv"; break; 1355428d7b3dSmrg case 0x7: format = "ycrcb_swapuvy"; break; 1356428d7b3dSmrg case 0x8: format = "a4r4g4b4"; break; 1357428d7b3dSmrg case 0x9: format = "a1r5g5b5"; break; 1358428d7b3dSmrg case 0xa: format = "a2r10g10b10"; break; 1359428d7b3dSmrg default: format = "BAD"; break; 1360428d7b3dSmrg } 1361428d7b3dSmrg switch ((data[1] >> 2) & 0x3) { 1362428d7b3dSmrg case 0x0: zformat = "u16"; break; 1363428d7b3dSmrg case 0x1: zformat = "f16"; break; 1364428d7b3dSmrg case 0x2: zformat = "u24x8"; break; 1365428d7b3dSmrg default: zformat = "BAD"; break; 1366428d7b3dSmrg } 1367428d7b3dSmrg kgem_debug_print(data, offset, 1, "%s format, %s depth format, early Z %sabled\n", 1368428d7b3dSmrg format, zformat, 1369428d7b3dSmrg (data[1] & (1 << 31)) ? "en" : "dis"); 1370428d7b3dSmrg return len; 1371428d7b3dSmrg 1372428d7b3dSmrg case 0x8e: 1373428d7b3dSmrg { 1374428d7b3dSmrg const char *name, *tiling; 1375428d7b3dSmrg 1376428d7b3dSmrg len = (data[0] & 0x0000000f) + 2; 1377428d7b3dSmrg assert(len == 3); 1378428d7b3dSmrg 1379428d7b3dSmrg switch((data[1] >> 24) & 0x7) { 1380428d7b3dSmrg case 0x3: name = "color"; break; 1381428d7b3dSmrg case 0x7: name = "depth"; break; 1382428d7b3dSmrg default: name = "unknown"; break; 1383428d7b3dSmrg } 1384428d7b3dSmrg 1385428d7b3dSmrg tiling = "none"; 1386428d7b3dSmrg if (data[1] & (1 << 23)) 1387428d7b3dSmrg tiling = "fenced"; 1388428d7b3dSmrg else if (data[1] & (1 << 22)) 1389428d7b3dSmrg tiling = data[1] & (1 << 21) ? "Y" : "X"; 1390428d7b3dSmrg 1391428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DSTATE_BUFFER_INFO\n"); 1392428d7b3dSmrg kgem_debug_print(data, offset, 1, "%s, tiling = %s, pitch=%d\n", name, tiling, data[1]&0xffff); 1393428d7b3dSmrg 1394428d7b3dSmrg kgem_debug_print(data, offset, 2, "address\n"); 1395428d7b3dSmrg return len; 1396428d7b3dSmrg } 1397428d7b3dSmrg case 0x81: 1398428d7b3dSmrg len = (data[0] & 0x0000000f) + 2; 1399428d7b3dSmrg assert(len == 3); 1400428d7b3dSmrg 1401428d7b3dSmrg kgem_debug_print(data, offset, 0, 1402428d7b3dSmrg "3DSTATE_SCISSOR_RECTANGLE\n"); 1403428d7b3dSmrg kgem_debug_print(data, offset, 1, "(%d,%d)\n", 1404428d7b3dSmrg data[1] & 0xffff, data[1] >> 16); 1405428d7b3dSmrg kgem_debug_print(data, offset, 2, "(%d,%d)\n", 1406428d7b3dSmrg data[2] & 0xffff, data[2] >> 16); 1407428d7b3dSmrg 1408428d7b3dSmrg return len; 1409428d7b3dSmrg case 0x80: 1410428d7b3dSmrg len = (data[0] & 0x0000000f) + 2; 1411428d7b3dSmrg assert(len == 5); 1412428d7b3dSmrg 1413428d7b3dSmrg kgem_debug_print(data, offset, 0, 1414428d7b3dSmrg "3DSTATE_DRAWING_RECTANGLE\n"); 1415428d7b3dSmrg kgem_debug_print(data, offset, 1, "%s\n", 1416428d7b3dSmrg data[1]&(1<<30)?"depth ofs disabled ":""); 1417428d7b3dSmrg kgem_debug_print(data, offset, 2, "(%d,%d)\n", 1418428d7b3dSmrg data[2] & 0xffff, data[2] >> 16); 1419428d7b3dSmrg kgem_debug_print(data, offset, 3, "(%d,%d)\n", 1420428d7b3dSmrg data[3] & 0xffff, data[3] >> 16); 1421428d7b3dSmrg kgem_debug_print(data, offset, 4, "(%d,%d)\n", 1422428d7b3dSmrg (int16_t)(data[4] & 0xffff), 1423428d7b3dSmrg (int16_t)(data[4] >> 16)); 1424428d7b3dSmrg 1425428d7b3dSmrg return len; 1426428d7b3dSmrg case 0x9c: 1427428d7b3dSmrg len = (data[0] & 0x0000000f) + 2; 1428428d7b3dSmrg assert(len == 7); 1429428d7b3dSmrg 1430428d7b3dSmrg kgem_debug_print(data, offset, 0, 1431428d7b3dSmrg "3DSTATE_CLEAR_PARAMETERS\n"); 1432428d7b3dSmrg kgem_debug_print(data, offset, 1, "prim_type=%s, clear=%s%s%s\n", 1433428d7b3dSmrg data[1]&(1<<16)?"CLEAR_RECT":"ZONE_INIT", 1434428d7b3dSmrg data[1]&(1<<2)?"color,":"", 1435428d7b3dSmrg data[1]&(1<<1)?"depth,":"", 1436428d7b3dSmrg data[1]&(1<<0)?"stencil,":""); 1437428d7b3dSmrg kgem_debug_print(data, offset, 2, "clear color\n"); 1438428d7b3dSmrg kgem_debug_print(data, offset, 3, "clear depth/stencil\n"); 1439428d7b3dSmrg kgem_debug_print(data, offset, 4, "color value (rgba8888)\n"); 1440428d7b3dSmrg kgem_debug_print(data, offset, 5, "depth value %f\n", 1441428d7b3dSmrg int_as_float(data[5])); 1442428d7b3dSmrg kgem_debug_print(data, offset, 6, "clear stencil\n"); 1443428d7b3dSmrg return len; 1444428d7b3dSmrg } 1445428d7b3dSmrg 1446428d7b3dSmrg for (idx = 0; idx < ARRAY_SIZE(opcodes_3d_1d); idx++) { 1447428d7b3dSmrg opcode_3d_1d = &opcodes_3d_1d[idx]; 1448428d7b3dSmrg if (((data[0] & 0x00ff0000) >> 16) == opcode_3d_1d->opcode) { 1449428d7b3dSmrg len = (data[0] & 0xf) + 2; 1450428d7b3dSmrg kgem_debug_print(data, offset, 0, "%s\n", opcode_3d_1d->name); 1451428d7b3dSmrg for (i = 1; i < len; i++) 1452428d7b3dSmrg kgem_debug_print(data, offset, i, "dword %d\n", i); 1453428d7b3dSmrg 1454428d7b3dSmrg return len; 1455428d7b3dSmrg } 1456428d7b3dSmrg } 1457428d7b3dSmrg 1458428d7b3dSmrg kgem_debug_print(data, offset, 0, "3D UNKNOWN: 3d_1d opcode = 0x%x\n", opcode); 1459428d7b3dSmrg assert(0); 1460428d7b3dSmrg return 1; 1461428d7b3dSmrg} 1462428d7b3dSmrg 1463428d7b3dSmrg#define VERTEX_OUT(fmt, ...) do { \ 1464428d7b3dSmrg kgem_debug_print(data, offset, i, " V%d."fmt"\n", vertex, __VA_ARGS__); \ 1465428d7b3dSmrg i++; \ 1466428d7b3dSmrg} while (0) 1467428d7b3dSmrg 1468428d7b3dSmrgstatic int 1469428d7b3dSmrggen3_decode_3d_primitive(struct kgem *kgem, uint32_t offset) 1470428d7b3dSmrg{ 1471428d7b3dSmrg uint32_t *data = kgem->batch + offset; 1472428d7b3dSmrg char immediate = (data[0] & (1 << 23)) == 0; 1473428d7b3dSmrg unsigned int len, i, ret; 1474428d7b3dSmrg const char *primtype; 1475428d7b3dSmrg unsigned int vertex = 0; 1476428d7b3dSmrg 1477428d7b3dSmrg switch ((data[0] >> 18) & 0xf) { 1478428d7b3dSmrg case 0x0: primtype = "TRILIST"; break; 1479428d7b3dSmrg case 0x1: primtype = "TRISTRIP"; break; 1480428d7b3dSmrg case 0x2: primtype = "TRISTRIP_REVERSE"; break; 1481428d7b3dSmrg case 0x3: primtype = "TRIFAN"; break; 1482428d7b3dSmrg case 0x4: primtype = "POLYGON"; break; 1483428d7b3dSmrg case 0x5: primtype = "LINELIST"; break; 1484428d7b3dSmrg case 0x6: primtype = "LINESTRIP"; break; 1485428d7b3dSmrg case 0x7: primtype = "RECTLIST"; break; 1486428d7b3dSmrg case 0x8: primtype = "POINTLIST"; break; 1487428d7b3dSmrg case 0x9: primtype = "DIB"; break; 1488428d7b3dSmrg case 0xa: primtype = "CLEAR_RECT"; assert(0); break; 1489428d7b3dSmrg default: primtype = "unknown"; break; 1490428d7b3dSmrg } 1491428d7b3dSmrg 1492428d7b3dSmrg gen3_update_vertex_elements_offsets(kgem); 1493428d7b3dSmrg 1494428d7b3dSmrg /* XXX: 3DPRIM_DIB not supported */ 1495428d7b3dSmrg if (immediate) { 1496428d7b3dSmrg len = (data[0] & 0x0003ffff) + 2; 1497428d7b3dSmrg kgem_debug_print(data, offset, 0, "3DPRIMITIVE inline %s\n", primtype); 1498428d7b3dSmrg for (i = 1; i < len; ) { 1499428d7b3dSmrg ErrorF(" [%d]: ", vertex); 1500428d7b3dSmrg i += inline_vertex_out(kgem, data + i) / sizeof(uint32_t); 1501428d7b3dSmrg ErrorF("\n"); 1502428d7b3dSmrg vertex++; 1503428d7b3dSmrg } 1504428d7b3dSmrg 1505428d7b3dSmrg ret = len; 1506428d7b3dSmrg } else { 1507428d7b3dSmrg /* indirect vertices */ 1508428d7b3dSmrg len = data[0] & 0x0000ffff; /* index count */ 1509428d7b3dSmrg if (data[0] & (1 << 17)) { 1510428d7b3dSmrg /* random vertex access */ 1511428d7b3dSmrg kgem_debug_print(data, offset, 0, 1512428d7b3dSmrg "3DPRIMITIVE random indirect %s (%d)\n", primtype, len); 1513428d7b3dSmrg assert(0); 1514428d7b3dSmrg if (len == 0) { 1515428d7b3dSmrg /* vertex indices continue until 0xffff is found */ 1516428d7b3dSmrg } else { 1517428d7b3dSmrg /* fixed size vertex index buffer */ 1518428d7b3dSmrg } 1519428d7b3dSmrg ret = (len + 1) / 2 + 1; 1520428d7b3dSmrg goto out; 1521428d7b3dSmrg } else { 1522428d7b3dSmrg /* sequential vertex access */ 1523428d7b3dSmrg vertex = data[1] & 0xffff; 1524428d7b3dSmrg kgem_debug_print(data, offset, 0, 1525428d7b3dSmrg "3DPRIMITIVE sequential indirect %s, %d starting from " 1526428d7b3dSmrg "%d\n", primtype, len, vertex); 1527428d7b3dSmrg kgem_debug_print(data, offset, 1, " start\n"); 1528428d7b3dSmrg for (i = 0; i < len; i++) { 1529428d7b3dSmrg ErrorF(" [%d]: ", vertex); 1530428d7b3dSmrg indirect_vertex_out(kgem, vertex++); 1531428d7b3dSmrg ErrorF("\n"); 1532428d7b3dSmrg } 1533428d7b3dSmrg ret = 2; 1534428d7b3dSmrg goto out; 1535428d7b3dSmrg } 1536428d7b3dSmrg } 1537428d7b3dSmrg 1538428d7b3dSmrgout: 1539428d7b3dSmrg return ret; 1540428d7b3dSmrg} 1541428d7b3dSmrg 1542428d7b3dSmrgint kgem_gen3_decode_3d(struct kgem *kgem, uint32_t offset) 1543428d7b3dSmrg{ 1544428d7b3dSmrg static const struct { 1545428d7b3dSmrg uint32_t opcode; 1546428d7b3dSmrg int min_len; 1547428d7b3dSmrg int max_len; 1548428d7b3dSmrg const char *name; 1549428d7b3dSmrg } opcodes[] = { 1550428d7b3dSmrg { 0x06, 1, 1, "3DSTATE_ANTI_ALIASING" }, 1551428d7b3dSmrg { 0x08, 1, 1, "3DSTATE_BACKFACE_STENCIL_OPS" }, 1552428d7b3dSmrg { 0x09, 1, 1, "3DSTATE_BACKFACE_STENCIL_MASKS" }, 1553428d7b3dSmrg { 0x16, 1, 1, "3DSTATE_COORD_SET_BINDINGS" }, 1554428d7b3dSmrg { 0x15, 1, 1, "3DSTATE_FOG_COLOR" }, 1555428d7b3dSmrg { 0x0b, 1, 1, "3DSTATE_INDEPENDENT_ALPHA_BLEND" }, 1556428d7b3dSmrg { 0x0d, 1, 1, "3DSTATE_MODES_4" }, 1557428d7b3dSmrg { 0x0c, 1, 1, "3DSTATE_MODES_5" }, 1558428d7b3dSmrg { 0x07, 1, 1, "3DSTATE_RASTERIZATION_RULES" }, 1559428d7b3dSmrg }; 1560428d7b3dSmrg uint32_t *data = kgem->batch + offset; 1561428d7b3dSmrg uint32_t opcode; 1562428d7b3dSmrg unsigned int idx; 1563428d7b3dSmrg 1564428d7b3dSmrg opcode = (data[0] & 0x1f000000) >> 24; 1565428d7b3dSmrg 1566428d7b3dSmrg switch (opcode) { 1567428d7b3dSmrg case 0x1f: 1568428d7b3dSmrg return gen3_decode_3d_primitive(kgem, offset); 1569428d7b3dSmrg case 0x1d: 1570428d7b3dSmrg return gen3_decode_3d_1d(kgem, offset); 1571428d7b3dSmrg case 0x1c: 1572428d7b3dSmrg return gen3_decode_3d_1c(kgem, offset); 1573428d7b3dSmrg } 1574428d7b3dSmrg 1575428d7b3dSmrg for (idx = 0; idx < ARRAY_SIZE(opcodes); idx++) { 1576428d7b3dSmrg if (opcode == opcodes[idx].opcode) { 1577428d7b3dSmrg unsigned int len = 1, i; 1578428d7b3dSmrg 1579428d7b3dSmrg kgem_debug_print(data, offset, 0, "%s\n", opcodes[idx].name); 1580428d7b3dSmrg if (opcodes[idx].max_len > 1) { 1581428d7b3dSmrg len = (data[0] & 0xff) + 2; 1582428d7b3dSmrg assert(len >= opcodes[idx].min_len || 1583428d7b3dSmrg len <= opcodes[idx].max_len); 1584428d7b3dSmrg } 1585428d7b3dSmrg 1586428d7b3dSmrg for (i = 1; i < len; i++) 1587428d7b3dSmrg kgem_debug_print(data, offset, i, "dword %d\n", i); 1588428d7b3dSmrg return len; 1589428d7b3dSmrg } 1590428d7b3dSmrg } 1591428d7b3dSmrg 1592428d7b3dSmrg kgem_debug_print(data, offset, 0, "3D UNKNOWN: 3d opcode = 0x%x\n", opcode); 1593428d7b3dSmrg return 1; 1594428d7b3dSmrg} 1595428d7b3dSmrg 1596428d7b3dSmrg 1597428d7b3dSmrgvoid kgem_gen3_finish_state(struct kgem *kgem) 1598428d7b3dSmrg{ 1599428d7b3dSmrg memset(&state, 0, sizeof(state)); 1600428d7b3dSmrg} 1601