rendered paste bodydiff --git a/src/mesa/drivers/dri/r300/r300_cmdbuf.c b/src/mesa/drivers/dri/r300/r300_cmdbuf.cindex 8d4d604..baee815 100644--- a/src/mesa/drivers/dri/r300/r300_cmdbuf.c+++ b/src/mesa/drivers/dri/r300/r300_cmdbuf.c@@ -380,8 +380,12 @@ void r300InitCmdBuf(r300ContextPtr r300) r300->hw.ga_point_minmax.cmd[0] = cmdpacket0(R300_GA_POINT_MINMAX, 3); ALLOC_STATE(lcntl, always, 2, 0); r300->hw.lcntl.cmd[0] = cmdpacket0(R300_GA_LINE_CNTL, 1);- ALLOC_STATE(ga_line_stipple, always, 4, 0);- r300->hw.ga_line_stipple.cmd[0] = cmdpacket0(R300_GA_LINE_STIPPLE_VALUE, 3);+ ALLOC_STATE(ga_line_stipple_config, always, 2, 0);+ r300->hw.ga_line_stipple_config.cmd[0] = cmdpacket0(R300_GA_LINE_STIPPLE_CONFIG, 1);+ ALLOC_STATE(ga_line_stipple_value, always, 2, 0);+ r300->hw.ga_line_stipple_value.cmd[0] = cmdpacket0(R300_GA_LINE_STIPPLE_VALUE, 1);+ ALLOC_STATE(ga_line_s, always, 3, 0);+ r300->hw.ga_line_s.cmd[0] = cmdpacket0(R300_GA_LINE_S0, 2); ALLOC_STATE(shade, always, 5, 0); r300->hw.shade.cmd[0] = cmdpacket0(R300_GA_ENHANCE, 4); ALLOC_STATE(polygon_mode, always, 4, 0);diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.cindex 31cc00a..ebacda6 100644--- a/src/mesa/drivers/dri/r300/r300_context.c+++ b/src/mesa/drivers/dri/r300/r300_context.c@@ -398,6 +398,12 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual, RADEON_TCL_FALLBACK_TCL_DISABLE, 1); } + // default stipple pattern+ r300->sline.tex = r300_mem_ptr(r300, r300_mem_alloc(r300, 4096, 16));+ //r300->sline.pattern = 0xffff;+ r300UpdateStippleTexture(ctx, 0xffff);+ //r300->sline.is_idirty = GL_TRUE;+ return GL_TRUE; } diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.hindex 53e5d18..a95081f 100644--- a/src/mesa/drivers/dri/r300/r300_context.h+++ b/src/mesa/drivers/dri/r300/r300_context.h@@ -494,7 +494,9 @@ struct r300_hw_state { struct r300_state_atom ps; /* pointsize (421C) */ struct r300_state_atom ga_point_minmax; /* (4230) */ struct r300_state_atom lcntl; /* line control */- struct r300_state_atom ga_line_stipple; /* (4260) */+ struct r300_state_atom ga_line_stipple_config; /* (4238) */+ struct r300_state_atom ga_line_stipple_value; /* (4260) */+ struct r300_state_atom ga_line_s; /* (4264/4268) */ struct r300_state_atom shade; struct r300_state_atom polygon_mode; struct r300_state_atom fogp; /* fog parameters (4294) */@@ -920,6 +922,12 @@ struct r300_swtcl_info { struct r300_dma_region indexed_verts; }; +struct r300_stipple_line {+ GLvoid *tex;+ GLushort pattern;+ //GLuint tex_offset;+ //GLboolean is_dirty;+}; /** * \brief R300 context structure.@@ -962,6 +970,8 @@ struct r300_context { DECLARE_RENDERINPUTS(tnl_index_bitset); /* index of bits for last tnl_install_attrs */ struct r300_swtcl_info swtcl;++ struct r300_stipple_line sline; }; struct r300_buffer_object {diff --git a/src/mesa/drivers/dri/r300/r300_render.c b/src/mesa/drivers/dri/r300/r300_render.cindex fc07105..8c018f6 100644--- a/src/mesa/drivers/dri/r300/r300_render.c+++ b/src/mesa/drivers/dri/r300/r300_render.c@@ -290,7 +290,6 @@ static GLboolean r300RunRender(GLcontext * ctx, TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *vb = &tnl->vb; - if (RADEON_DEBUG & DEBUG_PRIMS) fprintf(stderr, "%s\n", __FUNCTION__); @@ -373,7 +372,6 @@ static int r300Fallback(GLcontext * ctx) if (!r300->disable_lowimpact_fallback) { FALLBACK_IF(ctx->Polygon.StippleFlag); FALLBACK_IF(ctx->Multisample.Enabled);- FALLBACK_IF(ctx->Line.StippleFlag); FALLBACK_IF(ctx->Line.SmoothFlag); FALLBACK_IF(ctx->Point.SmoothFlag); }diff --git a/src/mesa/drivers/dri/r300/r300_state.c b/src/mesa/drivers/dri/r300/r300_state.cindex dc14759..1691c64 100644--- a/src/mesa/drivers/dri/r300/r300_state.c+++ b/src/mesa/drivers/dri/r300/r300_state.c@@ -852,6 +852,45 @@ static void r300LineWidth(GLcontext * ctx, GLfloat widthf) R300_LINE_CNT_HO | R300_LINE_CNT_VE | (int)(widthf * 6.0); } +static void r300SetStippleLineState(GLcontext * ctx, GLboolean state)+{+ r300ContextPtr r300 = R300_CONTEXT(ctx);++ R300_STATECHANGE(r300, gb_enable);+ if (state == GL_TRUE)+ {+ r300->hw.gb_enable.cmd[1] |= R300_GB_LINE_STUFF_ENABLE;+ }+ else+ {+ r300->hw.gb_enable.cmd[1] &= ~R300_GB_LINE_STUFF_ENABLE;+ }+}++static void r300LineStipple(GLcontext * ctx, GLint factor, GLushort pattern)+{+ r300ContextPtr r300 = R300_CONTEXT(ctx);++ // delete stipple tex when destroying context+ if (r300->sline.pattern != pattern)+ {+ //evict current tex+ r300UpdateStippleTexture(ctx, pattern);+ }++ R300_STATECHANGE(r300, ga_line_stipple_config);+ R300_STATECHANGE(r300, ga_line_stipple_value);+ R300_STATECHANGE(r300, ga_line_s);++ r300->hw.ga_line_s.cmd[1] = r300PackFloat32(20.0);+ r300->hw.ga_line_s.cmd[2] = r300PackFloat32(80.0);++ //it's somehow related to factor, but not to pattern+ r300->hw.ga_line_stipple_config.cmd[1] = 0x3b2aaaaa;++ r300->hw.ga_line_stipple_value.cmd[1] = 0;+}+ static void r300PolygonMode(GLcontext * ctx, GLenum face, GLenum mode) { (void)face;@@ -1495,6 +1534,25 @@ static void r300SetupTextures(GLcontext * ctx) } } + if (/*(type == GL_LINES) &&*/ (ctx->Line.StippleFlag == GL_TRUE))+ {+ GLuint offset;+ offset = r300GartOffsetFromVirtual(r300, r300->sline.tex);++ r300->hw.txe.cmd[R300_TXE_ENABLE] |= (1 << hw_tmu);+ r300->hw.tex.filter.cmd[R300_TEX_VALUE_0 + hw_tmu] =+ R300_TX_MAG_FILTER_LINEAR | R300_TX_MIN_FILTER_LINEAR;+ r300->hw.tex.filter_1.cmd[R300_TEX_VALUE_0 + hw_tmu] = 0x0;+ r300->hw.tex.size.cmd[R300_TEX_VALUE_0 + hw_tmu] = 16; //16 bit pattern+ r300->hw.tex.format.cmd[R300_TEX_VALUE_0 + hw_tmu] = GL_ALPHA;+ r300->hw.tex.pitch.cmd[R300_TEX_VALUE_0 + hw_tmu] = 1;+ r300->hw.tex.offset.cmd[R300_TEX_VALUE_0 + hw_tmu] = offset;+ r300->hw.tex.chroma_key.cmd[R300_TEX_VALUE_0 + hw_tmu] = 0x0;+ r300->hw.tex.border_color.cmd[R300_TEX_VALUE_0 + hw_tmu] = 0x0;++ last_hw_tmu = hw_tmu;+ }+ r300->hw.tex.filter.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_FILTER0_0, last_hw_tmu + 1); r300->hw.tex.filter_1.cmd[R300_TEX_CMD_0] =@@ -1516,7 +1574,7 @@ static void r300SetupTextures(GLcontext * ctx) return; - if (r300->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV515)+ if (r300->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV515) r300SetupFragmentShaderTextures(ctx, tmu_mappings); else r500SetupFragmentShaderTextures(ctx, tmu_mappings);@@ -2106,6 +2164,9 @@ static void r300Enable(GLcontext * ctx, GLenum cap, GLboolean state) case GL_POLYGON_OFFSET_FILL: r300SetPolygonOffsetState(ctx, state); break;+ case GL_LINE_STIPPLE:+ r300SetStippleLineState(ctx, state);+ break; default: radeonEnable(ctx, cap, state); break;@@ -2247,9 +2308,11 @@ static void r300ResetHwState(r300ContextPtr r300) r300LineWidth(ctx, 1.0); - r300->hw.ga_line_stipple.cmd[1] = 0;- r300->hw.ga_line_stipple.cmd[2] = r300PackFloat32(0.0);- r300->hw.ga_line_stipple.cmd[3] = r300PackFloat32(1.0);+ r300->hw.ga_line_stipple_config.cmd[1] = 0;+ r300->hw.ga_line_stipple_value.cmd[1] = 0;++ r300->hw.ga_line_s.cmd[1] = r300PackFloat32(0.0);+ r300->hw.ga_line_s.cmd[2] = r300PackFloat32(1.0); r300ShadeModel(ctx, ctx->Light.ShadeModel); @@ -2674,6 +2737,7 @@ void r300InitStateFuncs(struct dd_function_table *functions) functions->Fogfv = r300Fogfv; functions->FrontFace = r300FrontFace; functions->ShadeModel = r300ShadeModel;+ functions->LineStipple = r300LineStipple; /* Stencil related */ functions->ClearStencil = r300ClearStencil;diff --git a/src/mesa/drivers/dri/r300/r300_tex.c b/src/mesa/drivers/dri/r300/r300_tex.cindex 0b4acec..db96279 100644--- a/src/mesa/drivers/dri/r300/r300_tex.c+++ b/src/mesa/drivers/dri/r300/r300_tex.c@@ -1161,6 +1161,24 @@ static struct gl_texture_object *r300NewTextureObject(GLcontext * ctx, return obj; } +void r300UpdateStippleTexture(GLcontext *ctx, GLushort pattern)+{+ r300ContextPtr rmesa = R300_CONTEXT(ctx);+ GLubyte *pixels = (GLubyte *) rmesa->sline.tex;++ fprintf(stderr, "pattern: ");+ + for (int i=15; i>=0; --i)+ {+ pixels[i] = (pattern & 1) * 10;+ fprintf(stderr, "%i ", pixels[i]);+ pattern >>= 1;+ }++ fprintf(stderr, "\n");+ rmesa->sline.pattern = pattern;+}+ void r300InitTextureFuncs(struct dd_function_table *functions) { /* Note: we only plug in the functions we implement in the driverdiff --git a/src/mesa/drivers/dri/r300/r300_tex.h b/src/mesa/drivers/dri/r300/r300_tex.hindex b86d45b..5520bd6 100644--- a/src/mesa/drivers/dri/r300/r300_tex.h+++ b/src/mesa/drivers/dri/r300/r300_tex.h@@ -50,4 +50,7 @@ extern void r300DestroyTexObj(r300ContextPtr rmesa, r300TexObjPtr t); extern void r300InitTextureFuncs(struct dd_function_table *functions); +extern void r300UpdateStippleTexture(GLcontext *ctx, GLushort pattern);+ #endif /* __r300_TEX_H__ */