📄 r300_texstate.c
字号:
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 + -