Browse Source

Cell: send actual vertex size in the render command

tags/mesa_20090313
Brian 17 years ago
parent
commit
fa82d86368

+ 4
- 2
src/mesa/pipe/cell/common.h View File

@@ -96,12 +96,14 @@ struct cell_command_clear_surface

#define CELL_MAX_VBUF_SIZE (16 * 1024)
#define CELL_MAX_VBUF_INDEXES 1024
#define CELL_MAX_ATTRIBS 2 /* temporary! */


struct cell_command_render
{
uint opcode;
uint prim_type;
uint num_verts, num_attribs;
uint num_verts;
uint vertex_size; /**< bytes per vertex */
uint num_indexes;
const void *vertex_data;
const ushort *index_data;

+ 1
- 1
src/mesa/pipe/cell/ppu/cell_render.c View File

@@ -152,7 +152,7 @@ cell_flush_prim_buffer(struct cell_context *cell)
struct cell_command_render *render = &cell_global.command[i].render;
render->prim_type = PIPE_PRIM_TRIANGLES;
render->num_verts = cell->prim_buffer.num_verts;
render->num_attribs = CELL_MAX_ATTRIBS;
render->vertex_size = cell->vertex_info->size * 4;
render->xmin = cell->prim_buffer.xmin;
render->ymin = cell->prim_buffer.ymin;
render->xmax = cell->prim_buffer.xmax;

+ 4
- 22
src/mesa/pipe/cell/ppu/cell_vbuf.c View File

@@ -31,7 +31,9 @@
*/


#include "cell_batch.h"
#include "cell_context.h"
#include "cell_flush.h"
#include "cell_spu.h"
#include "cell_vbuf.h"
#include "pipe/draw/draw_vbuf.h"
@@ -141,26 +143,7 @@ cell_vbuf_draw(struct vbuf_render *vbr,
if (cvbr->prim != PIPE_PRIM_TRIANGLES)
return; /* only render tris for now */

#if 0
for (i = 0; i < cell->num_spus; i++) {
struct cell_command_render *render = &cell_global.command[i].render;
render->opcode = CELL_CMD_RENDER;
render->prim_type = cvbr->prim;
render->num_verts = nr_vertices;
render->num_attribs = CELL_MAX_ATTRIBS; /* XXX fix */
render->vertex_data = vertices;
render->index_data = indices;
render->num_indexes = nr_indices;
render->xmin = xmin;
render->ymin = ymin;
render->xmax = xmax;
render->ymax = ymax;

ASSERT_ALIGN16(render->vertex_data);
ASSERT_ALIGN16(render->index_data);
send_mbox_message(cell_global.spe_contexts[i], CELL_CMD_RENDER);
}
#else
/* build/insert batch RENDER command */
{
struct cell_command_render *render
= (struct cell_command_render *)
@@ -168,7 +151,7 @@ cell_vbuf_draw(struct vbuf_render *vbr,
render->opcode = CELL_CMD_RENDER;
render->prim_type = cvbr->prim;
render->num_verts = nr_vertices;
render->num_attribs = CELL_MAX_ATTRIBS; /* XXX fix */
render->vertex_size = 4 * cell->vertex_info.size;
render->vertex_data = vertices;
render->index_data = indices;
render->num_indexes = nr_indices;
@@ -180,7 +163,6 @@ cell_vbuf_draw(struct vbuf_render *vbr,
ASSERT_ALIGN16(render->vertex_data);
ASSERT_ALIGN16(render->index_data);
}
#endif

#if 01
/* XXX this is temporary */

+ 13
- 15
src/mesa/pipe/cell/spu/spu_main.c View File

@@ -210,8 +210,8 @@ cmd_render(const struct cell_command_render *render)
/* we'll DMA into these buffers */
ubyte vertex_data[CELL_MAX_VBUF_SIZE] ALIGN16_ATTRIB;
ushort indexes[CELL_MAX_VBUF_INDEXES] ALIGN16_ATTRIB;
uint i, j, vertex_size, vertex_bytes, index_bytes;
uint i, j, total_vertex_bytes, total_index_bytes;
const uint vertex_size = render->vertex_size; /* in bytes */

if (Debug) {
printf("SPU %u: RENDER prim %u, indices: %u, nr_vert: %u\n",
@@ -228,36 +228,34 @@ cmd_render(const struct cell_command_render *render)
ASSERT_ALIGN16(render->vertex_data);
ASSERT_ALIGN16(render->index_data);

vertex_size = render->num_attribs * 4 * sizeof(float);

/* how much vertex data */
vertex_bytes = render->num_verts * vertex_size;
index_bytes = render->num_indexes * sizeof(ushort);
if (index_bytes < 16)
index_bytes = 16;
total_vertex_bytes = render->num_verts * vertex_size;
total_index_bytes = render->num_indexes * sizeof(ushort);
if (total_index_bytes < 16)
total_index_bytes = 16;
else
index_bytes = (index_bytes + 15) & ~0xf; /* multiple of 16 */
total_index_bytes = (total_index_bytes + 15) & ~0xf; /* multiple of 16 */

/*
printf("VBUF: indices at %p, vertices at %p vertex_bytes %u ind_bytes %u\n",
render->index_data, render->vertex_data, vertex_bytes, index_bytes);
printf("VBUF: indices at %p, vertices at %p total_vertex_bytes %u ind_bytes %u\n",
render->index_data, render->vertex_data, total_vertex_bytes, total_index_bytes);
*/

ASSERT(vertex_bytes % 16 == 0);
ASSERT(total_vertex_bytes % 16 == 0);
/* get vertex data from main memory */
mfc_get(vertex_data, /* dest */
(unsigned int) render->vertex_data, /* src */
vertex_bytes, /* size */
total_vertex_bytes, /* size */
TAG_VERTEX_BUFFER,
0, /* tid */
0 /* rid */);

ASSERT(index_bytes % 16 == 0);
ASSERT(total_index_bytes % 16 == 0);

/* get index data from main memory */
mfc_get(indexes, /* dest */
(unsigned int) render->index_data, /* src */
index_bytes,
total_index_bytes,
TAG_INDEX_BUFFER,
0, /* tid */
0 /* rid */);

Loading…
Cancel
Save