int main(int argc, char **argv) { if (argc > 1) { char *endptr = NULL; steplimit = strtoll(argv[1], &endptr, 10); if (errno || (*endptr != '\0')) { fprintf(stderr, "Usage: %s [steplimit]\n", argv[0]); exit(2); } } cpu_t cpu = {.pc = 0, .sp = -1, .state = Cpu_Running, .steps = 0, .stack = {0}, .pmem = Program}; pcpu = &cpu; /* Code section is protected from writes by default, un-protect it */ if (mprotect(gen_code, JIT_CODE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC)) { perror("mprotect"); exit(2); } /* Pre-populate resulting code buffer with INT3 (machine code 0xCC). This will help to catch jumps to wrong locations */ memset(gen_code, 0xcc, JIT_CODE_SIZE); void* entrypoints[PROGRAM_SIZE] = {0}; /* a map of guest PCs to capsules */ translate_program(cpu.pmem, gen_code, entrypoints, PROGRAM_SIZE); setjmp(return_buf); /* Will get here from generated code. */ while (cpu.state == Cpu_Running && cpu.steps < steplimit) { if (cpu.pc > PROGRAM_SIZE) { cpu.state = Cpu_Break; break; } enter_generated_code(entrypoints[cpu.pc]); /* Will not return */ } assert(cpu.state != Cpu_Running || cpu.steps == steplimit); /* Print CPU state */ printf("CPU executed %lld steps. End state \"%s\".\n", cpu.steps, cpu.state == Cpu_Halted? "Halted": cpu.state == Cpu_Running? "Running": "Break"); printf("PC = %#x, SP = %d\n", cpu.pc, cpu.sp); printf("Stack: "); for (int32_t i=cpu.sp; i >= 0 ; i--) { printf("%#10x ", cpu.stack[i]); } printf("%s\n", cpu.sp == -1? "(empty)": ""); return cpu.state == Cpu_Halted || (cpu.state == Cpu_Running && cpu.steps == steplimit)?0:1; }
static GLboolean i915IsProgramNative(GLcontext * ctx, GLenum target, struct gl_program *prog) { if (target == GL_FRAGMENT_PROGRAM_ARB) { struct i915_fragment_program *p = (struct i915_fragment_program *) prog; if (!p->translated) translate_program(p); return !p->error; } else return GL_TRUE; }
void i915ValidateFragmentProgram(struct i915_context *i915) { GLcontext *ctx = &i915->intel.ctx; struct intel_context *intel = intel_context(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &tnl->vb; struct i915_fragment_program *p = (struct i915_fragment_program *) ctx->FragmentProgram._Current; const GLuint inputsRead = p->FragProg.Base.InputsRead; GLuint s4 = i915->state.Ctx[I915_CTXREG_LIS4] & ~S4_VFMT_MASK; GLuint s2 = S2_TEXCOORD_NONE; int i, offset = 0; if (i915->current_program != p) { if (i915->current_program) { i915->current_program->on_hardware = 0; i915->current_program->params_uptodate = 0; } i915->current_program = p; } /* Important: */ VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr; if (!p->translated) translate_program(p); intel->vertex_attr_count = 0; intel->wpos_offset = 0; intel->wpos_size = 0; intel->coloroffset = 0; intel->specoffset = 0; if (inputsRead & FRAG_BITS_TEX_ANY) { EMIT_ATTR(_TNL_ATTRIB_POS, EMIT_4F_VIEWPORT, S4_VFMT_XYZW, 16); } else { EMIT_ATTR(_TNL_ATTRIB_POS, EMIT_3F_VIEWPORT, S4_VFMT_XYZ, 12); } if (inputsRead & FRAG_BIT_COL0) { intel->coloroffset = offset / 4; EMIT_ATTR(_TNL_ATTRIB_COLOR0, EMIT_4UB_4F_BGRA, S4_VFMT_COLOR, 4); } if ((inputsRead & (FRAG_BIT_COL1 | FRAG_BIT_FOGC)) || i915->vertex_fog != I915_FOG_NONE) { if (inputsRead & FRAG_BIT_COL1) { intel->specoffset = offset / 4; EMIT_ATTR(_TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR, S4_VFMT_SPEC_FOG, 3); } else EMIT_PAD(3); if ((inputsRead & FRAG_BIT_FOGC) || i915->vertex_fog != I915_FOG_NONE) EMIT_ATTR(_TNL_ATTRIB_FOG, EMIT_1UB_1F, S4_VFMT_SPEC_FOG, 1); else EMIT_PAD(1); } /* XXX this was disabled, but enabling this code helped fix the Glean * tfragprog1 fog tests. */ #if 1 if ((inputsRead & FRAG_BIT_FOGC) || i915->vertex_fog != I915_FOG_NONE) { EMIT_ATTR(_TNL_ATTRIB_FOG, EMIT_1F, S4_VFMT_FOG_PARAM, 4); } #endif for (i = 0; i < p->ctx->Const.MaxTextureCoordUnits; i++) { if (inputsRead & FRAG_BIT_TEX(i)) { int sz = VB->TexCoordPtr[i]->size; s2 &= ~S2_TEXCOORD_FMT(i, S2_TEXCOORD_FMT0_MASK); s2 |= S2_TEXCOORD_FMT(i, SZ_TO_HW(sz)); EMIT_ATTR(_TNL_ATTRIB_TEX0 + i, EMIT_SZ(sz), 0, sz * 4); } else if (i == p->wpos_tex) { /* If WPOS is required, duplicate the XYZ position data in an * unused texture coordinate: */ s2 &= ~S2_TEXCOORD_FMT(i, S2_TEXCOORD_FMT0_MASK); s2 |= S2_TEXCOORD_FMT(i, SZ_TO_HW(3)); intel->wpos_offset = offset; intel->wpos_size = 3 * sizeof(GLuint); EMIT_PAD(intel->wpos_size); } } if (s2 != i915->state.Ctx[I915_CTXREG_LIS2] || s4 != i915->state.Ctx[I915_CTXREG_LIS4]) { int k; I915_STATECHANGE(i915, I915_UPLOAD_CTX); /* Must do this *after* statechange, so as not to affect * buffered vertices reliant on the old state: */ intel->vertex_size = _tnl_install_attrs(&intel->ctx, intel->vertex_attrs, intel->vertex_attr_count, intel->ViewportMatrix.m, 0); intel->vertex_size >>= 2; i915->state.Ctx[I915_CTXREG_LIS2] = s2; i915->state.Ctx[I915_CTXREG_LIS4] = s4; k = intel->vtbl.check_vertex_size(intel, intel->vertex_size); assert(k); }