All pastes #1038873 Raw Edit

Miscellany

public diff v1 · immutable
#1038873 ·published 2008-06-04 19:14 UTC
rendered paste body
diff --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..c2c093d 100644--- a/src/mesa/drivers/dri/r300/r300_context.c+++ b/src/mesa/drivers/dri/r300/r300_context.c@@ -398,6 +398,10 @@ 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));+	r300UpdateStippleTexture(ctx, 0xffff);+ 	return GL_TRUE; } diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.hindex 53e5d18..62ec3de 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,10 @@ struct r300_swtcl_info {    struct r300_dma_region indexed_verts; }; +struct r300_stipple_line {+	GLvoid    *tex;+	GLushort  pattern;+};  /**  * \brief R300 context structure.@@ -962,6 +968,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..942e327 100644--- a/src/mesa/drivers/dri/r300/r300_state.c+++ b/src/mesa/drivers/dri/r300/r300_state.c@@ -852,6 +852,55 @@ 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)+	{+		char fps[] = "!!ARBfp1.0\nTEMP a;\nINPUT b;\nTEX a, b, texture[0], 1D;\nKIL a;\nMOV result.color, fragment.color;\nEND";+		//char fps[] = "!!ARBfp1.0\nTEX result.texcoord, fragment.color, texture[0], 1D;\nKIL result.texcoord;\nMOV result.color, fragment.color;\nEND";++		r300->hw.gb_enable.cmd[1] |= R300_GB_LINE_STUFF_ENABLE;++		struct gl_fragment_program fp;+		_mesa_parse_arb_fragment_program(ctx, GL_FRAGMENT_PROGRAM_ARB, (GLvoid *) fps, strlen(fps), &fp);+		memcpy(ctx->FragmentProgram._Current, &fp, sizeof(struct gl_fragment_program));+		struct r300_fragment_program *rfp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;+		r300TranslateFragmentShader(r300, rfp);+		fprintf(stderr, "%s: jestem tu\n", __FUNCTION__);+	}+	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 +1544,30 @@ static void r300SetupTextures(GLcontext * ctx) 		} 	} +	if (/*(type == GL_LINES) &&*/ (ctx->Line.StippleFlag == GL_TRUE))+	{+		GLuint offset;++		if (RADEON_DEBUG & DEBUG_STATE)+				fprintf(stderr, "Activating texture unit %d\n", hw_tmu+1);++		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+				| (hw_tmu << 28);+		r300->hw.tex.filter_1.cmd[R300_TEX_VALUE_0 + hw_tmu] = 0x0;+		r300->hw.tex.size.cmd[R300_TEX_VALUE_0 + hw_tmu] = 15; //16 bit pattern+		r300->hw.tex.format.cmd[R300_TEX_VALUE_0 + hw_tmu] = R300_TX_FORMAT_X8;+		r300->hw.tex.pitch.cmd[R300_TEX_VALUE_0 + hw_tmu] = 0x0;+		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 +1589,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 +2179,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 +2323,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 +2752,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_swtcl.c b/src/mesa/drivers/dri/r300/r300_swtcl.cindex 8aebd9b..22bfeb4 100644--- a/src/mesa/drivers/dri/r300/r300_swtcl.c+++ b/src/mesa/drivers/dri/r300/r300_swtcl.c@@ -576,6 +576,7 @@ static void r300RenderStart(GLcontext *ctx) 	r300SetVertexFormat(ctx);  	r300UpdateShaders(rmesa);+ 	r300UpdateShaderStates(rmesa);  	r300EmitCacheFlush(rmesa);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__ */diff --git a/src/mesa/drivers/dri/r300/r300_texmem.c b/src/mesa/drivers/dri/r300/r300_texmem.cindex 723601a..3b90aa7 100644--- a/src/mesa/drivers/dri/r300/r300_texmem.c+++ b/src/mesa/drivers/dri/r300/r300_texmem.c@@ -569,3 +569,104 @@ int r300UploadTexImages(r300ContextPtr rmesa, r300TexObjPtr t, GLuint face)  	return 0; }+/*+void r300UploadStippleTex(r300ContextPtr rmesa, GLubyte *data)+{+    GLint ret;+    drm_radeon_texture_t tex;+    drm_radeon_tex_image_t tmp;+	GLuint srcPitch, dstPitch;++	if (rmesa->sline.is_dirty == false)+	{+		return;+	}++    if (RADEON_DEBUG & (DEBUG_TEXTURE | DEBUG_IOCTL)) {+        fprintf(stderr, "%s: ( %p, %p ) Uploading stipple texture\n",+            __FUNCTION__, (void *)rmesa->radeon.glCtx, (void *)data);+    }++    if (RADEON_DEBUG & DEBUG_SYNC) {+        fprintf(stderr, "%s: Syncing\n", __FUNCTION__);+        radeonFinish(rmesa->radeon.glCtx);+    }++    if (data == NULL) {+        if (RADEON_DEBUG & DEBUG_TEXTURE)+            fprintf(stderr, "%s: image data is NULL!\n", __FUNCTION__);+        return -1;+    }++    tmp.x = 0;+    tmp.y = 0;+    tmp.width = sizeof(GLushort) * 8;+    tmp.height = 1;+    tmp.data = (void *) data;++	rmesa->sline.tex_offset = 0;++	r300EmitWait(rmesa, R300_WAIT_3D);+	r300EmitBlit(rmesa,+		R300_CP_COLOR_FORMAT_CI8,+		16,+		r300GartOffsetFromVirtual(rmesa, tmp.data),+		16,+		0,+		0,+		0,+		0,+		0,+		16,+		1);+	r300EmitWait(rmesa, R300_WAIT_2D);+	tex.image = &tmp;+    tex.offset = rmesa->sline.tex_offset;+    tex.height = 1;+    tex.width = sizeof(GLushort) * 8;+    tex.format = RADEON_TXFORMAT_I8;+    tex.pitch = 1;++    tex.offset += tmp.x & ~1023;+    tmp.x = tmp.x % 1024;+#if 0+    if (t->tile_bits & R300_TXO_MICRO_TILE) {+        // need something like "tiled coordinates" ? +        tmp.y = tmp.x / (tex.pitch * 128) * 2;+        tmp.x = tmp.x % (tex.pitch * 128) / 2;+        tex.pitch |= RADEON_DST_TILE_MICRO >> 22;+    }+#endif+    //fprintf(stderr, "tmp.x=%i, tmp.y=%i\n", tmp.x, tmp.y);+    // Macro tiling doesn't apply - tex to small++    LOCK_HARDWARE(&rmesa->radeon);+    do {+        ret = drmCommandWriteRead(rmesa->radeon.dri.fd, DRM_RADEON_TEXTURE,+                                    &tex, sizeof(drm_radeon_texture_t));+        if (ret) {+            if (RADEON_DEBUG & DEBUG_IOCTL)+                fprintf(stderr, "DRM_RADEON_TEXTURE:  again!\n");+            usleep(1);+        }+    } while (ret == -EAGAIN);++    UNLOCK_HARDWARE(&rmesa->radeon);++    if (ret) {+        fprintf(stderr, "DRM_RADEON_TEXTURE: return = %d\n", ret);+        fprintf(stderr, "   offset=0x%08x\n", tex.offset);+        fprintf(stderr, "   image width=16 height=1\n");+        fprintf(stderr, "   blit width=%d height=%d data=%p\n",+            tmp.width, tmp.height, tmp.data);+        _mesa_exit(-1);+    }++    if (RADEON_DEBUG & DEBUG_SYNC) {+        fprintf(stderr, "%s: Syncing\n", __FUNCTION__);+        radeonFinish(rmesa->radeon.glCtx);+    }++    return 0;+}+*/\ No newline at end of file