[Mesa-dev] [PATCH 2/2] gallium: avoid generating loop overhead in case of a non cubemap texture.
Vincent Lejeune
vljn at ovi.com
Sun Jan 8 14:15:34 PST 2012
---
src/mesa/state_tracker/st_cb_texture.c | 82 ++++++++++++++++++++++++--------
1 files changed, 62 insertions(+), 20 deletions(-)
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 3cd1b2b..eeb6e3a 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -1197,6 +1197,60 @@ copy_image_data_to_texture(struct st_context *st,
pipe_resource_reference(&stImage->pt, stObj->pt);
}
+
+static void inline
+import_texture_given_level(struct st_context *st, struct st_texture_object *stObj,const struct pipe_resource *stObjpt,struct gl_texture_image **img, const GLuint level)
+{
+ struct st_texture_image *stImage =
+ st_texture_image(img[level]);
+
+ /* Need to import images in main memory or held in other textures.
+ */
+ if (stImage && stObjpt != stImage->pt) {
+ if (level == 0 ||
+ (stImage->base.Width == u_minify(stObj->width0, level) &&
+ stImage->base.Height == u_minify(stObj->height0, level) &&
+ stImage->base.Depth == u_minify(stObj->depth0, level))) {
+ /* src image fits expected dest mipmap level size */
+ copy_image_data_to_texture(st, stObj, level, stImage);
+ }
+ }
+}
+
+
+static void inline
+import_texture(struct st_context *st, struct st_texture_object *stObj, const GLuint face)
+{
+ const GLuint baselevel = stObj->base.BaseLevel;
+ const GLuint levelcount = stObj->lastLevel - baselevel;
+ const struct pipe_resource* stObjpt = stObj->pt;
+
+ struct gl_texture_image **img = &(stObj->base.Image[face][baselevel]);
+
+ for (unsigned n = (levelcount + 7) / 8;n>0;n--) {
+ import_texture_given_level(st,stObj,stObjpt,img,0);
+ import_texture_given_level(st,stObj,stObjpt,img,1);
+ import_texture_given_level(st,stObj,stObjpt,img,2);
+ import_texture_given_level(st,stObj,stObjpt,img,3);
+ import_texture_given_level(st,stObj,stObjpt,img,4);
+ import_texture_given_level(st,stObj,stObjpt,img,5);
+ import_texture_given_level(st,stObj,stObjpt,img,6);
+ import_texture_given_level(st,stObj,stObjpt,img,7);
+ img += 8;
+ }
+
+ switch (levelcount % 8) {
+ case 7: import_texture_given_level(st,stObj,stObjpt,img,6);
+ case 6: import_texture_given_level(st,stObj,stObjpt,img,5);
+ case 5: import_texture_given_level(st,stObj,stObjpt,img,4);
+ case 4: import_texture_given_level(st,stObj,stObjpt,img,3);
+ case 3: import_texture_given_level(st,stObj,stObjpt,img,2);
+ case 2: import_texture_given_level(st,stObj,stObjpt,img,1);
+ case 1: import_texture_given_level(st,stObj,stObjpt,img,0);
+ case 0: break;
+ }
+}
+
static void inline
set_mipmap_level(struct st_texture_object *stObj)
{
@@ -1219,8 +1273,6 @@ st_finalize_texture_body(struct gl_context *ctx,
struct st_texture_object *stObj)
{
struct st_context *st = st_context(ctx);
- 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;
@@ -1305,25 +1357,15 @@ st_finalize_texture_body(struct gl_context *ctx,
/* Pull in any images not in the object's texture:
*/
- for (face = 0; face < nr_faces; face++) {
- GLuint level;
- for (level = stObj->base.BaseLevel; level <= stObj->lastLevel; level++) {
- struct st_texture_image *stImage =
- st_texture_image(stObj->base.Image[face][level]);
+ import_texture(st, stObj, 0);
+ if (stObj->base.Target != GL_TEXTURE_CUBE_MAP)
+ return GL_TRUE;
- /* Need to import images in main memory or held in other textures.
- */
- if (stImage && stObj->pt != stImage->pt) {
- if (level == 0 ||
- (stImage->base.Width == u_minify(stObj->width0, level) &&
- stImage->base.Height == u_minify(stObj->height0, level) &&
- stImage->base.Depth == u_minify(stObj->depth0, level))) {
- /* src image fits expected dest mipmap level size */
- copy_image_data_to_texture(st, stObj, level, stImage);
- }
- }
- }
- }
+ import_texture(st, stObj, 1);
+ import_texture(st, stObj, 2);
+ import_texture(st, stObj, 3);
+ import_texture(st, stObj, 4);
+ import_texture(st, stObj, 5);
return GL_TRUE;
}
--
1.7.7
More information about the mesa-dev
mailing list