diff options
Diffstat (limited to 'src/gallium/drivers/softpipe')
-rw-r--r-- | src/gallium/drivers/softpipe/sp_prim_vbuf.c | 33 | ||||
-rw-r--r-- | src/gallium/drivers/softpipe/sp_texture.c | 26 |
2 files changed, 48 insertions, 11 deletions
diff --git a/src/gallium/drivers/softpipe/sp_prim_vbuf.c b/src/gallium/drivers/softpipe/sp_prim_vbuf.c index d56eed80a4..eef6e5806c 100644 --- a/src/gallium/drivers/softpipe/sp_prim_vbuf.c +++ b/src/gallium/drivers/softpipe/sp_prim_vbuf.c @@ -60,6 +60,7 @@ struct softpipe_vbuf_render struct softpipe_context *softpipe; uint prim; uint vertex_size; + uint nr_vertices; uint vertex_buffer_size; void *vertex_buffer; }; @@ -95,12 +96,44 @@ sp_vbuf_allocate_vertices(struct vbuf_render *vbr, } cvbr->vertex_size = vertex_size; + cvbr->nr_vertices = nr_vertices; + return cvbr->vertex_buffer != NULL; } static void sp_vbuf_release_vertices(struct vbuf_render *vbr) { +#if 0 + { + struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr); + const struct vertex_info *info = + softpipe_get_vbuf_vertex_info(cvbr->softpipe); + const float *vtx = (const float *) cvbr->vertex_buffer; + uint i, j; + debug_printf("%s (vtx_size = %u, vtx_used = %u)\n", + __FUNCTION__, cvbr->vertex_size, cvbr->nr_vertices); + for (i = 0; i < cvbr->nr_vertices; i++) { + for (j = 0; j < info->num_attribs; j++) { + uint k; + switch (info->attrib[j].emit) { + case EMIT_4F: k = 4; break; + case EMIT_3F: k = 3; break; + case EMIT_2F: k = 2; break; + case EMIT_1F: k = 1; break; + default: assert(0); + } + debug_printf("Vert %u attr %u: ", i, j); + while (k-- > 0) { + debug_printf("%g ", vtx[0]); + vtx++; + } + debug_printf("\n"); + } + } + } +#endif + /* keep the old allocation for next time */ } diff --git a/src/gallium/drivers/softpipe/sp_texture.c b/src/gallium/drivers/softpipe/sp_texture.c index 28a9784b16..142ce230fc 100644 --- a/src/gallium/drivers/softpipe/sp_texture.c +++ b/src/gallium/drivers/softpipe/sp_texture.c @@ -243,9 +243,11 @@ softpipe_get_tex_surface(struct pipe_screen *screen, ps->level = level; ps->zslice = zslice; - if (pt->target == PIPE_TEXTURE_CUBE || pt->target == PIPE_TEXTURE_3D) { - ps->offset += ((pt->target == PIPE_TEXTURE_CUBE) ? face : zslice) * - pt->nblocksy[level] * spt->stride[level]; + if (pt->target == PIPE_TEXTURE_CUBE) { + ps->offset += face * pt->nblocksy[level] * spt->stride[level]; + } + else if (pt->target == PIPE_TEXTURE_3D) { + ps->offset += zslice * pt->nblocksy[level] * spt->stride[level]; } else { assert(face == 0); @@ -283,14 +285,13 @@ softpipe_get_tex_transfer(struct pipe_screen *screen, { struct softpipe_texture *sptex = softpipe_texture(texture); struct softpipe_transfer *spt; - struct pipe_transfer *pt; assert(texture); assert(level <= texture->last_level); spt = CALLOC_STRUCT(softpipe_transfer); - pt = &spt->base; if (spt) { + struct pipe_transfer *pt = &spt->base; pt->refcount = 1; pipe_texture_reference(&pt->texture, texture); pt->format = texture->format; @@ -302,23 +303,26 @@ softpipe_get_tex_transfer(struct pipe_screen *screen, pt->nblocksx = texture->nblocksx[level]; pt->nblocksy = texture->nblocksy[level]; pt->stride = sptex->stride[level]; - spt->offset = sptex->level_offset[level]; pt->usage = usage; pt->face = face; pt->level = level; pt->zslice = zslice; - if (texture->target == PIPE_TEXTURE_CUBE || - texture->target == PIPE_TEXTURE_3D) { - spt->offset += ((texture->target == PIPE_TEXTURE_CUBE) ? face : - zslice) * pt->nblocksy * pt->stride; + spt->offset = sptex->level_offset[level]; + + if (texture->target == PIPE_TEXTURE_CUBE) { + spt->offset += face * pt->nblocksy * pt->stride; + } + else if (texture->target == PIPE_TEXTURE_3D) { + spt->offset += zslice * pt->nblocksy * pt->stride; } else { assert(face == 0); assert(zslice == 0); } + return pt; } - return pt; + return NULL; } |