⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r300_texstate.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	    t->image[0][i].y = curOffset / BLIT_WIDTH_BYTES;	    t->image[0][i].width = MIN2(size, BLIT_WIDTH_BYTES);	    t->image[0][i].height = size / t->image[0][i].width;	  }#if 0	  /* for debugging only and only  applicable to non-rectangle targets */	  assert(size % t->image[0][i].width == 0);	  assert(t->image[0][i].x == 0		 || (size < BLIT_WIDTH_BYTES		     && t->image[0][i].height == 1));#endif	  	  if (0)	    fprintf(stderr,		    "level %d: %dx%d x=%d y=%d w=%d h=%d size=%d at %d\n",		    i, texImage->Width, texImage->Height,		    t->image[0][i].x, t->image[0][i].y,		    t->image[0][i].width, t->image[0][i].height,		    size, curOffset);	  	  curOffset += size;	  	}		/* Align the total size of texture memory block.	 */	t->base.totalSize =	    (curOffset + RADEON_OFFSET_MASK) & ~RADEON_OFFSET_MASK;	/* Setup remaining cube face blits, if needed */	if (tObj->Target == GL_TEXTURE_CUBE_MAP) {		GLuint face;		for (face = 1; face < 6; face++) {			for (i = 0; i < numLevels; i++) {				t->image[face][i].x = t->image[0][i].x;				t->image[face][i].y = t->image[0][i].y;				t->image[face][i].width = t->image[0][i].width;				t->image[face][i].height =				    t->image[0][i].height;			}		}		t->base.totalSize *= 6;	/* total texmem needed */	}	/* Hardware state:	 */#if 0	t->format &= ~(R200_TXFORMAT_WIDTH_MASK |			    R200_TXFORMAT_HEIGHT_MASK |			    R200_TXFORMAT_CUBIC_MAP_ENABLE |			    R200_TXFORMAT_F5_WIDTH_MASK |			    R200_TXFORMAT_F5_HEIGHT_MASK);	t->format |= ((log2Width << R200_TXFORMAT_WIDTH_SHIFT) |			   (log2Height << R200_TXFORMAT_HEIGHT_SHIFT));#endif	t->format_x &= ~(R200_DEPTH_LOG2_MASK | R200_TEXCOORD_MASK);	if (tObj->Target == GL_TEXTURE_3D) {		t->format_x |= (log2Depth << R200_DEPTH_LOG2_SHIFT);		t->format_x |= R200_TEXCOORD_VOLUME;	} else if (tObj->Target == GL_TEXTURE_CUBE_MAP) {		ASSERT(log2Width == log2Height);		t->format |= R300_TX_FORMAT_CUBIC_MAP;				t->format_x |= R200_TEXCOORD_CUBIC_ENV;		t->pp_cubic_faces = ((log2Width << R200_FACE_WIDTH_1_SHIFT) |				     (log2Height << R200_FACE_HEIGHT_1_SHIFT) |				     (log2Width << R200_FACE_WIDTH_2_SHIFT) |				     (log2Height << R200_FACE_HEIGHT_2_SHIFT) |				     (log2Width << R200_FACE_WIDTH_3_SHIFT) |				     (log2Height << R200_FACE_HEIGHT_3_SHIFT) |				     (log2Width << R200_FACE_WIDTH_4_SHIFT) |				     (log2Height << R200_FACE_HEIGHT_4_SHIFT));	}		t->size = (((tObj->Image[0][t->base.firstLevel]->Width - 1) << R300_TX_WIDTHMASK_SHIFT)			|((tObj->Image[0][t->base.firstLevel]->Height - 1) << R300_TX_HEIGHTMASK_SHIFT))			|((numLevels - 1) << R300_TX_MAX_MIP_LEVEL_SHIFT);	/* Only need to round to nearest 32 for textures, but the blitter	 * requires 64-byte aligned pitches, and we may/may not need the	 * blitter.   NPOT only!	 */	if (baseImage->IsCompressed) {		t->pitch =		    (tObj->Image[0][t->base.firstLevel]->Width + 63) & ~(63);	}	else if (tObj->Target == GL_TEXTURE_RECTANGLE_NV) {		unsigned int align = blitWidth - 1;		t->pitch = ((tObj->Image[0][t->base.firstLevel]->Width *		      texelBytes) + 63) & ~(63);		t->size |= R300_TX_SIZE_TXPITCH_EN;		t->pitch_reg = (((tObj->Image[0][t->base.firstLevel]->Width) + align) & ~align) - 1;	}	else {		t->pitch =		    ((tObj->Image[0][t->base.firstLevel]->Width *		      texelBytes) + 63) & ~(63);	}	t->dirty_state = TEX_ALL;	/* FYI: r300UploadTexImages( rmesa, t ) used to be called here */}/* ================================================================ * Texture unit state management */static GLboolean enable_tex_2d(GLcontext * ctx, int unit){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];	struct gl_texture_object *tObj = texUnit->_Current;	r300TexObjPtr t = (r300TexObjPtr) tObj->DriverData;	ASSERT(tObj->Target == GL_TEXTURE_2D || tObj->Target == GL_TEXTURE_1D);	if (t->base.dirty_images[0]) {		R300_FIREVERTICES(rmesa);		r300SetTexImages(rmesa, tObj);		r300UploadTexImages(rmesa, (r300TexObjPtr) tObj->DriverData, 0);		if (!t->base.memBlock)			return GL_FALSE;	}	return GL_TRUE;}#if ENABLE_HW_3D_TEXTUREstatic GLboolean enable_tex_3d(GLcontext * ctx, int unit){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];	struct gl_texture_object *tObj = texUnit->_Current;	r300TexObjPtr t = (r300TexObjPtr) tObj->DriverData;	/* Need to load the 3d images associated with this unit.	 */	if (t->format & R200_TXFORMAT_NON_POWER2) {		t->format &= ~R200_TXFORMAT_NON_POWER2;		t->base.dirty_images[0] = ~0;	}	ASSERT(tObj->Target == GL_TEXTURE_3D);	/* R100 & R200 do not support mipmaps for 3D textures.	 */	if ((tObj->MinFilter != GL_NEAREST) && (tObj->MinFilter != GL_LINEAR)) {		return GL_FALSE;	}	if (t->base.dirty_images[0]) {		R300_FIREVERTICES(rmesa);		r300SetTexImages(rmesa, tObj);		r300UploadTexImages(rmesa, (r300TexObjPtr) tObj->DriverData, 0);		if (!t->base.memBlock)			return GL_FALSE;	}	return GL_TRUE;}#endifstatic GLboolean enable_tex_cube(GLcontext * ctx, int unit){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];	struct gl_texture_object *tObj = texUnit->_Current;	r300TexObjPtr t = (r300TexObjPtr) tObj->DriverData;	GLuint face;	/* Need to load the 2d images associated with this unit.	 */	if (t->format & R200_TXFORMAT_NON_POWER2) {		t->format &= ~R200_TXFORMAT_NON_POWER2;		for (face = 0; face < 6; face++)			t->base.dirty_images[face] = ~0;	}	ASSERT(tObj->Target == GL_TEXTURE_CUBE_MAP);	if (t->base.dirty_images[0] || t->base.dirty_images[1] ||	    t->base.dirty_images[2] || t->base.dirty_images[3] ||	    t->base.dirty_images[4] || t->base.dirty_images[5]) {		/* flush */		R300_FIREVERTICES(rmesa);		/* layout memory space, once for all faces */		r300SetTexImages(rmesa, tObj);	}	/* upload (per face) */	for (face = 0; face < 6; face++) {		if (t->base.dirty_images[face]) {			r300UploadTexImages(rmesa,					    (r300TexObjPtr) tObj->DriverData,					    face);		}	}	if (!t->base.memBlock) {		/* texmem alloc failed, use s/w fallback */		return GL_FALSE;	}	return GL_TRUE;}static GLboolean enable_tex_rect(GLcontext * ctx, int unit){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];	struct gl_texture_object *tObj = texUnit->_Current;	r300TexObjPtr t = (r300TexObjPtr) tObj->DriverData;	ASSERT(tObj->Target == GL_TEXTURE_RECTANGLE_NV);	if (t->base.dirty_images[0]) {		R300_FIREVERTICES(rmesa);		r300SetTexImages(rmesa, tObj);		r300UploadTexImages(rmesa, (r300TexObjPtr) tObj->DriverData, 0);		if (!t->base.memBlock && !rmesa->prefer_gart_client_texturing)			return GL_FALSE;	}	return GL_TRUE;}static GLboolean update_tex_common(GLcontext * ctx, int unit){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];	struct gl_texture_object *tObj = texUnit->_Current;	r300TexObjPtr t = (r300TexObjPtr) tObj->DriverData;	/* Fallback if there's a texture border */	if (tObj->Image[0][tObj->BaseLevel]->Border > 0)		return GL_FALSE;	/* Update state if this is a different texture object to last	 * time.	 */	if (rmesa->state.texture.unit[unit].texobj != t) {		if (rmesa->state.texture.unit[unit].texobj != NULL) {			/* The old texture is no longer bound to this texture unit.			 * Mark it as such.			 */			rmesa->state.texture.unit[unit].texobj->base.bound &=			    ~(1UL << unit);		}		rmesa->state.texture.unit[unit].texobj = t;		t->base.bound |= (1UL << unit);		t->dirty_state |= 1 << unit;		driUpdateTextureLRU((driTextureObject *) t);	/* XXX: should be locked! */	}#if R200_MERGED	FALLBACK(&rmesa->radeon, RADEON_FALLBACK_BORDER_MODE, t->border_fallback);#endif			return !t->border_fallback;}static GLboolean r300UpdateTextureUnit(GLcontext * ctx, int unit){	struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];	if (texUnit->_ReallyEnabled & (TEXTURE_RECT_BIT)) {		return (enable_tex_rect(ctx, unit) &&			update_tex_common(ctx, unit));	} else if (texUnit->_ReallyEnabled & (TEXTURE_1D_BIT | TEXTURE_2D_BIT)) {		return (enable_tex_2d(ctx, unit) &&			update_tex_common(ctx, unit));	}#if ENABLE_HW_3D_TEXTURE	else if (texUnit->_ReallyEnabled & (TEXTURE_3D_BIT)) {		return (enable_tex_3d(ctx, unit) &&			update_tex_common(ctx, unit));	}#endif	else if (texUnit->_ReallyEnabled & (TEXTURE_CUBE_BIT)) {		return (enable_tex_cube(ctx, unit) &&			update_tex_common(ctx, unit));	} else if (texUnit->_ReallyEnabled) {		return GL_FALSE;	} else {		return GL_TRUE; 	}}void r300UpdateTextureState(GLcontext * ctx){	GLboolean ok;	ok = (r300UpdateTextureUnit(ctx, 0) &&	      r300UpdateTextureUnit(ctx, 1) &&	      r300UpdateTextureUnit(ctx, 2) &&	      r300UpdateTextureUnit(ctx, 3) &&	      r300UpdateTextureUnit(ctx, 4) &&	      r300UpdateTextureUnit(ctx, 5) &&	      r300UpdateTextureUnit(ctx, 6) &&	      r300UpdateTextureUnit(ctx, 7)	      );#if R200_MERGED	FALLBACK(&rmesa->radeon, RADEON_FALLBACK_TEXTURE, !ok);#endif	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -