📄 i830_vtbl.c
字号:
BEGIN_BATCH( 200 ); OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(0)); OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(1)); OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(2)); OUT_BATCH(_3DSTATE_MAP_CUBE | MAP_UNIT(3)); OUT_BATCH(_3DSTATE_DFLT_DIFFUSE_CMD); OUT_BATCH(0); OUT_BATCH(_3DSTATE_DFLT_SPEC_CMD); OUT_BATCH(0); OUT_BATCH(_3DSTATE_DFLT_Z_CMD); OUT_BATCH(0); OUT_BATCH(_3DSTATE_FOG_MODE_CMD); OUT_BATCH(FOGFUNC_ENABLE | FOG_LINEAR_CONST | FOGSRC_INDEX_Z | ENABLE_FOG_DENSITY); OUT_BATCH(0); OUT_BATCH(0); OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD | MAP_UNIT(0) | DISABLE_TEX_STREAM_BUMP | ENABLE_TEX_STREAM_COORD_SET | TEX_STREAM_COORD_SET(0) | ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(0)); OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD | MAP_UNIT(1) | DISABLE_TEX_STREAM_BUMP | ENABLE_TEX_STREAM_COORD_SET | TEX_STREAM_COORD_SET(1) | ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(1)); OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD | MAP_UNIT(2) | DISABLE_TEX_STREAM_BUMP | ENABLE_TEX_STREAM_COORD_SET | TEX_STREAM_COORD_SET(2) | ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(2)); OUT_BATCH(_3DSTATE_MAP_TEX_STREAM_CMD | MAP_UNIT(3) | DISABLE_TEX_STREAM_BUMP | ENABLE_TEX_STREAM_COORD_SET | TEX_STREAM_COORD_SET(3) | ENABLE_TEX_STREAM_MAP_IDX | TEX_STREAM_MAP_IDX(3)); OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM); OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(0)); OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM); OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(1)); OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM); OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(2)); OUT_BATCH(_3DSTATE_MAP_COORD_TRANSFORM); OUT_BATCH(DISABLE_TEX_TRANSFORM | TEXTURE_SET(3)); OUT_BATCH(_3DSTATE_RASTER_RULES_CMD | ENABLE_POINT_RASTER_RULE | OGL_POINT_RASTER_RULE | ENABLE_LINE_STRIP_PROVOKE_VRTX | ENABLE_TRI_FAN_PROVOKE_VRTX | ENABLE_TRI_STRIP_PROVOKE_VRTX | LINE_STRIP_PROVOKE_VRTX(1) | TRI_FAN_PROVOKE_VRTX(2) | TRI_STRIP_PROVOKE_VRTX(2)); OUT_BATCH(_3DSTATE_SCISSOR_ENABLE_CMD | DISABLE_SCISSOR_RECT); OUT_BATCH(_3DSTATE_SCISSOR_RECT_0_CMD); OUT_BATCH(0); OUT_BATCH(0); OUT_BATCH(_3DSTATE_VERTEX_TRANSFORM); OUT_BATCH(DISABLE_VIEWPORT_TRANSFORM | DISABLE_PERSPECTIVE_DIVIDE); OUT_BATCH(_3DSTATE_W_STATE_CMD); OUT_BATCH(MAGIC_W_STATE_DWORD1); OUT_BATCH(0x3f800000 /* 1.0 in IEEE float */ ); OUT_BATCH(_3DSTATE_COLOR_FACTOR_CMD); OUT_BATCH(0x80808080); /* .5 required in alpha for GL_DOT3_RGBA_EXT */ ADVANCE_BATCH();}#define emit( intel, state, size ) \do { \ int k; \ BEGIN_BATCH( size / sizeof(GLuint)); \ for (k = 0 ; k < size / sizeof(GLuint) ; k++) \ OUT_BATCH(state[k]); \ ADVANCE_BATCH(); \} while (0);static GLuint get_state_size( struct i830_hw_state *state ){ GLuint dirty = state->active & ~state->emitted; GLuint sz = 0; GLuint i; if (dirty & I830_UPLOAD_CTX) sz += sizeof(state->Ctx); if (dirty & I830_UPLOAD_BUFFERS) sz += sizeof(state->Buffer); if (dirty & I830_UPLOAD_STIPPLE) sz += sizeof(state->Stipple); for (i = 0; i < I830_TEX_UNITS; i++) { if ((dirty & I830_UPLOAD_TEX(i))) sz += sizeof(state->Tex[i]); if (dirty & I830_UPLOAD_TEXBLEND(i)) sz += state->TexBlendWordsUsed[i] * 4; } return sz;}/* Push the state into the sarea and/or texture memory. */static void i830_emit_state( intelContextPtr intel ){ i830ContextPtr i830 = I830_CONTEXT(intel); struct i830_hw_state *state = i830->current; int i; GLuint dirty = state->active & ~state->emitted; GLuint counter = intel->batch.counter; BATCH_LOCALS; if (intel->batch.space < get_state_size(state)) { intelFlushBatch(intel, GL_TRUE); dirty = state->active & ~state->emitted; counter = intel->batch.counter; } if (dirty & I830_UPLOAD_CTX) { if (VERBOSE) fprintf(stderr, "I830_UPLOAD_CTX:\n"); emit( i830, state->Ctx, sizeof(state->Ctx) ); } if (dirty & I830_UPLOAD_BUFFERS) { if (VERBOSE) fprintf(stderr, "I830_UPLOAD_BUFFERS:\n"); emit( i830, state->Buffer, sizeof(state->Buffer) ); } if (dirty & I830_UPLOAD_STIPPLE) { if (VERBOSE) fprintf(stderr, "I830_UPLOAD_STIPPLE:\n"); emit( i830, state->Stipple, sizeof(state->Stipple) ); } for (i = 0; i < I830_TEX_UNITS; i++) { if ((dirty & I830_UPLOAD_TEX(i))) { if (VERBOSE) fprintf(stderr, "I830_UPLOAD_TEX(%d):\n", i); emit( i830, state->Tex[i], sizeof(state->Tex[i])); } if (dirty & I830_UPLOAD_TEXBLEND(i)) { if (VERBOSE) fprintf(stderr, "I830_UPLOAD_TEXBLEND(%d):\n", i); emit( i830, state->TexBlend[i], state->TexBlendWordsUsed[i] * 4 ); } } state->emitted |= dirty; intel->batch.last_emit_state = counter; assert(counter == intel->batch.counter);}static void i830_destroy_context( intelContextPtr intel ){ _tnl_free_vertices(&intel->ctx);}static voidi830_set_color_region(intelContextPtr intel, const intelRegion *region){ i830ContextPtr i830 = I830_CONTEXT(intel); I830_STATECHANGE( i830, I830_UPLOAD_BUFFERS ); i830->state.Buffer[I830_DESTREG_CBUFADDR1] = (BUF_3D_ID_COLOR_BACK | BUF_3D_PITCH(region->pitch) | BUF_3D_USE_FENCE); i830->state.Buffer[I830_DESTREG_CBUFADDR2] = region->offset;}static voidi830_set_z_region(intelContextPtr intel, const intelRegion *region){ i830ContextPtr i830 = I830_CONTEXT(intel); I830_STATECHANGE( i830, I830_UPLOAD_BUFFERS ); i830->state.Buffer[I830_DESTREG_DBUFADDR1] = (BUF_3D_ID_DEPTH | BUF_3D_PITCH(region->pitch) | BUF_3D_USE_FENCE); i830->state.Buffer[I830_DESTREG_DBUFADDR2] = region->offset;}static voidi830_update_color_z_regions(intelContextPtr intel, const intelRegion *colorRegion, const intelRegion *depthRegion){ i830ContextPtr i830 = I830_CONTEXT(intel); i830->state.Buffer[I830_DESTREG_CBUFADDR1] = (BUF_3D_ID_COLOR_BACK | BUF_3D_PITCH(colorRegion->pitch) | BUF_3D_USE_FENCE); i830->state.Buffer[I830_DESTREG_CBUFADDR2] = colorRegion->offset; i830->state.Buffer[I830_DESTREG_DBUFADDR1] = (BUF_3D_ID_DEPTH | BUF_3D_PITCH(depthRegion->pitch) | BUF_3D_USE_FENCE); i830->state.Buffer[I830_DESTREG_DBUFADDR2] = depthRegion->offset;}/* This isn't really handled at the moment. */static void i830_lost_hardware( intelContextPtr intel ){ I830_CONTEXT(intel)->state.emitted = 0;}static void i830_emit_flush( intelContextPtr intel ){ BATCH_LOCALS; BEGIN_BATCH(2); OUT_BATCH( MI_FLUSH | FLUSH_MAP_CACHE ); OUT_BATCH( 0 ); ADVANCE_BATCH();}void i830InitVtbl( i830ContextPtr i830 ){ i830->intel.vtbl.alloc_tex_obj = i830AllocTexObj; i830->intel.vtbl.check_vertex_size = i830_check_vertex_size; i830->intel.vtbl.clear_with_tris = i830ClearWithTris; i830->intel.vtbl.rotate_window = i830RotateWindow; i830->intel.vtbl.destroy = i830_destroy_context; i830->intel.vtbl.emit_invarient_state = i830_emit_invarient_state; i830->intel.vtbl.emit_state = i830_emit_state; i830->intel.vtbl.lost_hardware = i830_lost_hardware; i830->intel.vtbl.reduced_primitive_state = i830_reduced_primitive_state; i830->intel.vtbl.set_color_region = i830_set_color_region; i830->intel.vtbl.set_z_region = i830_set_z_region; i830->intel.vtbl.update_color_z_regions = i830_update_color_z_regions; i830->intel.vtbl.update_texture_state = i830UpdateTextureState; i830->intel.vtbl.emit_flush = i830_emit_flush; i830->intel.vtbl.render_start = i830_render_start;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -