summaryrefslogtreecommitdiffstats
path: root/src/mesa/pipe/cell/spu/main.c
diff options
context:
space:
mode:
authorBrian <[email protected]>2007-12-10 17:32:08 -0700
committerBrian <[email protected]>2007-12-10 17:32:43 -0700
commit7d1894c6558c5cc7f503142cda11b8a12ea24e65 (patch)
tree0e6bdb0417a0f444f527d2559cc809cab4228703 /src/mesa/pipe/cell/spu/main.c
parentaef25b1994cf93aaf64baf24a2ec4e29ee086a08 (diff)
Cell: first triangle.
This is a feeble first step, but it works. The cell_clear_surface() function has been hijacked to set up a "draw triangle" command and send it to all the SPUs. The Gallium softpipe triangle code was copied to the SPU module and modified. Only the progs/trivial/clear.c program runs.
Diffstat (limited to 'src/mesa/pipe/cell/spu/main.c')
-rw-r--r--src/mesa/pipe/cell/spu/main.c66
1 files changed, 34 insertions, 32 deletions
diff --git a/src/mesa/pipe/cell/spu/main.c b/src/mesa/pipe/cell/spu/main.c
index 226d81b4cac..f2c6d31d3cc 100644
--- a/src/mesa/pipe/cell/spu/main.c
+++ b/src/mesa/pipe/cell/spu/main.c
@@ -34,6 +34,7 @@
#include <libmisc.h>
#include <spu_mfcio.h>
+#include "main.h"
#include "tri.h"
#include "pipe/cell/common.h"
@@ -43,21 +44,15 @@ helpful headers:
/opt/ibm/cell-sdk/prototype/sysroot/usr/include/libmisc.h
*/
-static struct cell_init_info init;
+struct cell_init_info init;
-struct framebuffer {
- void *start;
- uint width, height;
- uint width_tiles, height_tiles; /**< width and height in tiles */
-};
-static struct framebuffer fb;
+struct framebuffer fb;
+int DefaultTag;
-static int DefaultTag = 1;
-
-static inline void
+void
wait_on_mask(unsigned tag)
{
mfc_write_tag_mask( tag );
@@ -66,7 +61,7 @@ wait_on_mask(unsigned tag)
-static void
+void
get_tile(const struct framebuffer *fb, uint tx, uint ty, uint *tile)
{
uint offset = ty * fb->width_tiles + tx;
@@ -89,7 +84,7 @@ get_tile(const struct framebuffer *fb, uint tx, uint ty, uint *tile)
0 /* rid */);
}
-static void
+void
put_tile(const struct framebuffer *fb, uint tx, uint ty, const uint *tile)
{
uint offset = ty * fb->width_tiles + tx;
@@ -136,32 +131,29 @@ clear_tiles(const struct cell_command_clear_tiles *clear)
}
-/** Invert all pixels in all tiles */
static void
-invert_tiles(void)
+triangle(const struct cell_command_triangle *tri)
{
uint num_tiles = fb.width_tiles * fb.height_tiles;
- uint i, j;
- uint tile[TILE_SIZE * TILE_SIZE] ALIGN16;
+ struct prim_header prim;
+ uint i;
+
+ prim.v[0].data[0][0] = tri->x0;
+ prim.v[0].data[0][1] = tri->y0;
+ prim.v[1].data[0][0] = tri->x1;
+ prim.v[1].data[0][1] = tri->y1;
+ prim.v[2].data[0][0] = tri->x2;
+ prim.v[2].data[0][1] = tri->y2;
+ prim.color = tri->color;
for (i = init.id; i < num_tiles; i += init.num_spus) {
uint tx = i % fb.width_tiles;
uint ty = i / fb.width_tiles;
-
- get_tile(&fb, tx, ty, tile);
- wait_on_mask(1 << DefaultTag);
-
- for (j = 0; j < TILE_SIZE * TILE_SIZE; j++) {
- tile[j] = ~tile[j];
- }
-
- put_tile(&fb, tx, ty, tile);
+ draw_triangle(&prim, tx, ty);
}
}
-struct cell_command cmd ALIGN16;
-
/**
* Temporary/simple main loop for SPEs: Get a command, execute it, repeat.
@@ -169,7 +161,9 @@ struct cell_command cmd ALIGN16;
static void
main_loop(void)
{
+ struct cell_command cmd ALIGN16;
int exitFlag = 0;
+
printf("SPU %u: Enter main loop\n", init.id);
assert((sizeof(struct cell_command) & 0xf) == 0);
@@ -207,17 +201,23 @@ main_loop(void)
cmd.fb.start);
fb.width = cmd.fb.width;
fb.height = cmd.fb.height;
- fb.width_tiles = fb.width / TILE_SIZE;
- fb.height_tiles = fb.height / TILE_SIZE;
+ fb.width_tiles = (fb.width + TILE_SIZE - 1) / TILE_SIZE;
+ fb.height_tiles = (fb.height + TILE_SIZE - 1) / TILE_SIZE;
+ printf("SPU %u: %u x %u tiles\n",
+ init.id, fb.width_tiles, fb.height_tiles);
fb.start = cmd.fb.start;
break;
case CELL_CMD_CLEAR_TILES:
printf("SPU %u: CLEAR to 0x%08x\n", init.id, cmd.clear.value);
clear_tiles(&cmd.clear);
break;
- case CELL_CMD_INVERT_TILES:
- printf("SPU %u: INVERT_TILES\n", init.id);
- invert_tiles();
+ case CELL_CMD_TRIANGLE:
+ printf("SPU %u: TRIANGLE (%g,%g) (%g,%g) (%g,%g)\n",
+ init.id,
+ cmd.tri.x0, cmd.tri.y0,
+ cmd.tri.x1, cmd.tri.y1,
+ cmd.tri.x2, cmd.tri.y2);
+ triangle(&cmd.tri);
break;
case CELL_CMD_FINISH:
printf("SPU %u: FINISH\n", init.id);
@@ -245,6 +245,8 @@ main(unsigned long long speid,
{
int tag = 0;
+ DefaultTag = 1;
+
(void) speid;
(void) envp;