📄 r300_state.c
字号:
case GL_BLEND: case GL_COLOR_LOGIC_OP: r300_set_blend_state(ctx); break; case GL_DEPTH_TEST: R300_STATECHANGE(r300, zs); if (state) { if (ctx->Depth.Mask) newval = R300_RB3D_Z_TEST_AND_WRITE; else newval = R300_RB3D_Z_TEST; } else newval = R300_RB3D_Z_DISABLED_1; r300->hw.zs.cmd[R300_ZS_CNTL_0] &= R300_RB3D_STENCIL_ENABLE; r300->hw.zs.cmd[R300_ZS_CNTL_0] |= newval; update_early_z(ctx); break; case GL_STENCIL_TEST: if (r300->state.stencil.hw_stencil) { R300_STATECHANGE(r300, zs); if (state) { WARN_ONCE("TODO - double side stencil !\n"); r300->hw.zs.cmd[R300_ZS_CNTL_0] |= R300_RB3D_STENCIL_ENABLE; } else { r300->hw.zs.cmd[R300_ZS_CNTL_0] &= ~R300_RB3D_STENCIL_ENABLE; } } else {#if R200_MERGED FALLBACK(&r300->radeon, RADEON_FALLBACK_STENCIL, state);#endif } break; case GL_CULL_FACE: r300UpdateCulling(ctx); break; case GL_POLYGON_OFFSET_POINT: case GL_POLYGON_OFFSET_LINE: break; case GL_POLYGON_OFFSET_FILL: R300_STATECHANGE(r300, unk42B4); if(state){ r300->hw.unk42B4.cmd[1] |= (3<<0); } else { r300->hw.unk42B4.cmd[1] &= ~(3<<0); } break; default: radeonEnable(ctx, cap, state); return; }}static void r300UpdatePolygonMode(GLcontext *ctx){ r300ContextPtr r300 = R300_CONTEXT(ctx); uint32_t hw_mode=0; if (ctx->Polygon.FrontMode != GL_FILL || ctx->Polygon.BackMode != GL_FILL) { GLenum f, b; if (ctx->Polygon.FrontFace == GL_CCW) { f = ctx->Polygon.FrontMode; b = ctx->Polygon.BackMode; } else { f = ctx->Polygon.BackMode; b = ctx->Polygon.FrontMode; } hw_mode |= R300_PM_ENABLED; switch (f) { case GL_LINE: hw_mode |= R300_PM_FRONT_LINE; break; case GL_POINT: /* noop */ hw_mode |= R300_PM_FRONT_POINT; break; case GL_FILL: hw_mode |= R300_PM_FRONT_FILL; break; } switch (b) { case GL_LINE: hw_mode |= R300_PM_BACK_LINE; break; case GL_POINT: /* noop */ hw_mode |= R300_PM_BACK_POINT; break; case GL_FILL: hw_mode |= R300_PM_BACK_FILL; break; } } if (r300->hw.unk4288.cmd[1] != hw_mode) { R300_STATECHANGE(r300, unk4288); r300->hw.unk4288.cmd[1] = hw_mode; }}/** * Change the culling mode. * * \note Mesa already filters redundant calls to this function. */static void r300CullFace(GLcontext* ctx, GLenum mode){ (void)mode; r300UpdateCulling(ctx);}/** * Change the polygon orientation. * * \note Mesa already filters redundant calls to this function. */static void r300FrontFace(GLcontext* ctx, GLenum mode){ (void)mode; r300UpdateCulling(ctx); r300UpdatePolygonMode(ctx);}/** * Change the depth testing function. * * \note Mesa already filters redundant calls to this function. */static void r300DepthFunc(GLcontext* ctx, GLenum func){ r300ContextPtr r300 = R300_CONTEXT(ctx); R300_STATECHANGE(r300, zs); r300->hw.zs.cmd[R300_ZS_CNTL_1] &= ~(R300_ZS_MASK << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT); switch(func) { case GL_NEVER: r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_NEVER << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT; break; case GL_LESS: r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_LESS << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT; break; case GL_EQUAL: r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_EQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT; break; case GL_LEQUAL: r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_LEQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT; break; case GL_GREATER: r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_GREATER << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT; break; case GL_NOTEQUAL: r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_NOTEQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT; break; case GL_GEQUAL: r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_GEQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT; break; case GL_ALWAYS: r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_ALWAYS << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT; break; }}/** * Enable/Disable depth writing. * * \note Mesa already filters redundant calls to this function. */static void r300DepthMask(GLcontext* ctx, GLboolean mask){ r300Enable(ctx, GL_DEPTH_TEST, ctx->Depth.Test);}/** * Handle glColorMask() */static void r300ColorMask(GLcontext* ctx, GLboolean r, GLboolean g, GLboolean b, GLboolean a){ r300ContextPtr r300 = R300_CONTEXT(ctx); int mask = (r ? R300_COLORMASK0_R : 0) | (g ? R300_COLORMASK0_G : 0) | (b ? R300_COLORMASK0_B : 0) | (a ? R300_COLORMASK0_A : 0); if (mask != r300->hw.cmk.cmd[R300_CMK_COLORMASK]) { R300_STATECHANGE(r300, cmk); r300->hw.cmk.cmd[R300_CMK_COLORMASK] = mask; }}/* ============================================================= * Point state */static void r300PointSize(GLcontext * ctx, GLfloat size){ r300ContextPtr r300 = R300_CONTEXT(ctx); size = ctx->Point._Size; R300_STATECHANGE(r300, ps); r300->hw.ps.cmd[R300_PS_POINTSIZE] = ((int)(size * 6) << R300_POINTSIZE_X_SHIFT) | ((int)(size * 6) << R300_POINTSIZE_Y_SHIFT);}/* ============================================================= * Line state */static void r300LineWidth(GLcontext *ctx, GLfloat widthf){ r300ContextPtr r300 = R300_CONTEXT(ctx); widthf = ctx->Line._Width; R300_STATECHANGE(r300, lcntl); r300->hw.lcntl.cmd[1] = (int)(widthf * 6.0); r300->hw.lcntl.cmd[1] |= R300_LINE_CNT_VE;}static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode){ (void)face; (void)mode; r300UpdatePolygonMode(ctx);}/* ============================================================= * Stencil */static int translate_stencil_func(int func){ switch (func) { case GL_NEVER: return R300_ZS_NEVER; case GL_LESS: return R300_ZS_LESS; case GL_EQUAL: return R300_ZS_EQUAL; case GL_LEQUAL: return R300_ZS_LEQUAL; case GL_GREATER: return R300_ZS_GREATER; case GL_NOTEQUAL: return R300_ZS_NOTEQUAL; case GL_GEQUAL: return R300_ZS_GEQUAL; case GL_ALWAYS: return R300_ZS_ALWAYS; } return 0;}static int translate_stencil_op(int op){ switch (op) { case GL_KEEP: return R300_ZS_KEEP; case GL_ZERO: return R300_ZS_ZERO; case GL_REPLACE: return R300_ZS_REPLACE; case GL_INCR: return R300_ZS_INCR; case GL_DECR: return R300_ZS_DECR; case GL_INCR_WRAP_EXT: return R300_ZS_INCR_WRAP; case GL_DECR_WRAP_EXT: return R300_ZS_DECR_WRAP; case GL_INVERT: return R300_ZS_INVERT; default: WARN_ONCE("Do not know how to translate stencil op"); return R300_ZS_KEEP; } return 0;}static void r300ShadeModel(GLcontext * ctx, GLenum mode){ r300ContextPtr rmesa = R300_CONTEXT(ctx); R300_STATECHANGE(rmesa, unk4274); switch (mode) { case GL_FLAT: rmesa->hw.unk4274.cmd[2] = R300_RE_SHADE_MODEL_FLAT; break; case GL_SMOOTH: rmesa->hw.unk4274.cmd[2] = R300_RE_SHADE_MODEL_SMOOTH; break; default: return; }}static void r300StencilFuncSeparate(GLcontext * ctx, GLenum face, GLenum func, GLint ref, GLuint mask){ r300ContextPtr rmesa = R300_CONTEXT(ctx); GLuint refmask = ((ctx->Stencil.Ref[0] << R300_RB3D_ZS2_STENCIL_REF_SHIFT) | (ctx->Stencil.ValueMask[0] << R300_RB3D_ZS2_STENCIL_MASK_SHIFT)); GLuint flag; R300_STATECHANGE(rmesa, zs); rmesa->hw.zs.cmd[R300_ZS_CNTL_1] &= ~( (R300_ZS_MASK << R300_RB3D_ZS1_FRONT_FUNC_SHIFT) | (R300_ZS_MASK << R300_RB3D_ZS1_BACK_FUNC_SHIFT)); rmesa->hw.zs.cmd[R300_ZS_CNTL_2] &= ~((R300_RB3D_ZS2_STENCIL_MASK << R300_RB3D_ZS2_STENCIL_REF_SHIFT) | (R300_RB3D_ZS2_STENCIL_MASK << R300_RB3D_ZS2_STENCIL_MASK_SHIFT)); flag = translate_stencil_func(ctx->Stencil.Function[0]); rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |= (flag << R300_RB3D_ZS1_FRONT_FUNC_SHIFT) | (flag << R300_RB3D_ZS1_BACK_FUNC_SHIFT); rmesa->hw.zs.cmd[R300_ZS_CNTL_2] |= refmask;}static void r300StencilMaskSeparate(GLcontext * ctx, GLenum face, GLuint mask){ r300ContextPtr rmesa = R300_CONTEXT(ctx); R300_STATECHANGE(rmesa, zs); rmesa->hw.zs.cmd[R300_ZS_CNTL_2] &= ~(R300_RB3D_ZS2_STENCIL_MASK << R300_RB3D_ZS2_STENCIL_WRITE_MASK_SHIFT); rmesa->hw.zs.cmd[R300_ZS_CNTL_2] |= ctx->Stencil.WriteMask[0] << R300_RB3D_ZS2_STENCIL_WRITE_MASK_SHIFT;}static void r300StencilOpSeparate(GLcontext * ctx, GLenum face, GLenum fail, GLenum zfail, GLenum zpass){ r300ContextPtr rmesa = R300_CONTEXT(ctx); R300_STATECHANGE(rmesa, zs); /* It is easier to mask what's left.. */ rmesa->hw.zs.cmd[R300_ZS_CNTL_1] &= (R300_ZS_MASK << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT) | (R300_ZS_MASK << R300_RB3D_ZS1_FRONT_FUNC_SHIFT) | (R300_ZS_MASK << R300_RB3D_ZS1_BACK_FUNC_SHIFT); rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |= (translate_stencil_op(ctx->Stencil.FailFunc[0]) << R300_RB3D_ZS1_FRONT_FAIL_OP_SHIFT) |(translate_stencil_op(ctx->Stencil.ZFailFunc[0]) << R300_RB3D_ZS1_FRONT_ZFAIL_OP_SHIFT) |(translate_stencil_op(ctx->Stencil.ZPassFunc[0]) << R300_RB3D_ZS1_FRONT_ZPASS_OP_SHIFT) |(translate_stencil_op(ctx->Stencil.FailFunc[0]) << R300_RB3D_ZS1_BACK_FAIL_OP_SHIFT) |(translate_stencil_op(ctx->Stencil.ZFailFunc[0]) << R300_RB3D_ZS1_BACK_ZFAIL_OP_SHIFT) |(translate_stencil_op(ctx->Stencil.ZPassFunc[0]) << R300_RB3D_ZS1_BACK_ZPASS_OP_SHIFT);}static void r300ClearStencil(GLcontext * ctx, GLint s){ r300ContextPtr rmesa = R300_CONTEXT(ctx); rmesa->state.stencil.clear = ((GLuint) ctx->Stencil.Clear | (R300_RB3D_ZS2_STENCIL_MASK << R300_RB3D_ZS2_STENCIL_MASK_SHIFT) | (ctx->Stencil.WriteMask[0] << R300_RB3D_ZS2_STENCIL_WRITE_MASK_SHIFT));}/* ============================================================= * Window position and viewport transformation *//* * To correctly position primitives: */#define SUBPIXEL_X 0.125#define SUBPIXEL_Y 0.125void r300UpdateWindow(GLcontext * ctx){ r300ContextPtr rmesa = R300_CONTEXT(ctx); __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable; GLfloat xoffset = dPriv ? (GLfloat) dPriv->x : 0; GLfloat yoffset = dPriv ? (GLfloat) dPriv->y + dPriv->h : 0; const GLfloat *v = ctx->Viewport._WindowMap.m; GLfloat sx = v[MAT_SX]; GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X; GLfloat sy = -v[MAT_SY]; GLfloat ty = (-v[MAT_TY]) + yoffset + SUBPIXEL_Y; GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale; GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale; R300_FIREVERTICES(rmesa); R300_STATECHANGE(rmesa, vpt); rmesa->hw.vpt.cmd[R300_VPT_XSCALE] = r300PackFloat32(sx); rmesa->hw.vpt.cmd[R300_VPT_XOFFSET] = r300PackFloat32(tx); rmesa->hw.vpt.cmd[R300_VPT_YSCALE] = r300PackFloat32(sy); rmesa->hw.vpt.cmd[R300_VPT_YOFFSET] = r300PackFloat32(ty); rmesa->hw.vpt.cmd[R300_VPT_ZSCALE] = r300PackFloat32(sz); rmesa->hw.vpt.cmd[R300_VPT_ZOFFSET] = r300PackFloat32(tz);}static void r300Viewport(GLcontext * ctx, GLint x, GLint y, GLsizei width, GLsizei height){ /* Don't pipeline viewport changes, conflict with window offset * setting below. Could apply deltas to rescue pipelined viewport * values, or keep the originals hanging around. */ r300UpdateWindow(ctx);}static void r300DepthRange(GLcontext * ctx, GLclampd nearval, GLclampd farval){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -