mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 11:00:11 +01:00
Cell: send actual vertex size in the render command
This commit is contained in:
parent
0673c571c7
commit
fa82d86368
4 changed files with 22 additions and 40 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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…
Add table
Reference in a new issue