--- src/mesa/state_tracker/st_cb_texture.c | 67 ++++++++++++++++++++----------- src/mesa/state_tracker/st_cb_texture.h | 5 ++ src/mesa/state_tracker/st_gen_mipmap.c | 4 +- 3 files changed, 50 insertions(+), 26 deletions(-)
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index ad4f23c..3cd1b2b 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -1197,39 +1197,34 @@ copy_image_data_to_texture(struct st_context *st, pipe_resource_reference(&stImage->pt, stObj->pt); } +static void inline +set_mipmap_level(struct st_texture_object *stObj) +{ + /* The texture is complete and we know exactly how many mipmap levels + * are present/needed. This is conditional because we may be called + * from the st_generate_mipmap() function when the texture object is + * incomplete. In that case, we'll have set stObj->lastLevel before + * we get here. + */ + if (stObj->base.Sampler.MinFilter == GL_LINEAR || + stObj->base.Sampler.MinFilter == GL_NEAREST) + stObj->lastLevel = stObj->base.BaseLevel; + else + stObj->lastLevel = stObj->base._MaxLevel; +} -/** - * Called during state validation. When this function is finished, - * the texture object should be ready for rendering. - * \return GL_TRUE for success, GL_FALSE for failure (out of mem) - */ -GLboolean -st_finalize_texture(struct gl_context *ctx, - struct pipe_context *pipe, - struct gl_texture_object *tObj) +static GLboolean inline +st_finalize_texture_body(struct gl_context *ctx, + struct pipe_context *pipe, + struct st_texture_object *stObj) { struct st_context *st = st_context(ctx); - struct st_texture_object *stObj = st_texture_object(tObj); const GLuint nr_faces = (stObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; GLuint face; struct st_texture_image *firstImage; enum pipe_format firstImageFormat; GLuint ptWidth, ptHeight, ptDepth, ptLayers; - if (stObj->base._Complete) { - /* The texture is complete and we know exactly how many mipmap levels - * are present/needed. This is conditional because we may be called - * from the st_generate_mipmap() function when the texture object is - * incomplete. In that case, we'll have set stObj->lastLevel before - * we get here. - */ - if (stObj->base.Sampler.MinFilter == GL_LINEAR || - stObj->base.Sampler.MinFilter == GL_NEAREST) - stObj->lastLevel = stObj->base.BaseLevel; - else - stObj->lastLevel = stObj->base._MaxLevel; - } - firstImage = st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]); assert(firstImage); @@ -1333,6 +1328,30 @@ st_finalize_texture(struct gl_context *ctx, return GL_TRUE; } +GLboolean +st_finalize_texture_mip_map(struct gl_context *ctx, + struct pipe_context *pipe, + struct gl_texture_object *tObj) +{ + return st_finalize_texture_body(ctx, pipe, st_texture_object(tObj)); +} + +/** + * Called during state validation. When this function is finished, + * the texture object should be ready for rendering. + * \return GL_TRUE for success, GL_FALSE for failure (out of mem) + */ +GLboolean +st_finalize_texture(struct gl_context *ctx, + struct pipe_context *pipe, + struct gl_texture_object *tObj) +{ + struct st_texture_object *stObj = st_texture_object(tObj); + + set_mipmap_level(stObj); + return st_finalize_texture_body(ctx, pipe, stObj); +} + /** * Returns pointer to a default/dummy texture. diff --git a/src/mesa/state_tracker/st_cb_texture.h b/src/mesa/state_tracker/st_cb_texture.h index f1502bd..0724aba 100644 --- a/src/mesa/state_tracker/st_cb_texture.h +++ b/src/mesa/state_tracker/st_cb_texture.h @@ -39,6 +39,11 @@ struct pipe_context; struct st_context; extern GLboolean +st_finalize_texture_mip_map(struct gl_context *ctx, + struct pipe_context *pipe, + struct gl_texture_object *tObj); + +extern GLboolean st_finalize_texture(struct gl_context *ctx, struct pipe_context *pipe, struct gl_texture_object *tObj); diff --git a/src/mesa/state_tracker/st_gen_mipmap.c b/src/mesa/state_tracker/st_gen_mipmap.c index d817a9c..6b4ebe5 100644 --- a/src/mesa/state_tracker/st_gen_mipmap.c +++ b/src/mesa/state_tracker/st_gen_mipmap.c @@ -196,7 +196,7 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target, /* This will copy the old texture's base image into the new texture * which we just allocated. */ - st_finalize_texture(ctx, st->pipe, texObj); + st_finalize_texture_mip_map(ctx, st->pipe, texObj); /* release the old tex (will likely be freed too) */ pipe_resource_reference(&oldTex, NULL); @@ -206,7 +206,7 @@ st_generate_mipmap(struct gl_context *ctx, GLenum target, /* Make sure that the base texture image data is present in the * texture buffer. */ - st_finalize_texture(ctx, st->pipe, texObj); + st_finalize_texture_mip_map(ctx, st->pipe, texObj); } pt = stObj->pt; -- 1.7.7 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev