Port to libspe2

libspe is deprecated in Cell SDK 2.1, and it is removed in Cell SDK 3.0.
This patch ports the existing libspe-based code to libspe2.  Some error
checking (eh-hem) would be nice.
This commit is contained in:
Ian Romanick
2007-12-11 12:40:58 -08:00
parent bfb43e8e79
commit 9a0fe23d49
5 changed files with 59 additions and 50 deletions

View File

@@ -25,7 +25,7 @@ MKDEP_OPTIONS = -fdepend -Y
GL_LIB_DEPS = $(EXTRA_LIB_PATH) -lX11 -lXext -lm -lpthread \
-L$(SDK)/lib -m32 -Wl,-m,elf32ppc -R$(SDK)/lib -lspe
-L$(SDK)/lib -m32 -Wl,-m,elf32ppc -R$(SDK)/lib -lspe2

View File

@@ -43,12 +43,12 @@ cell_flush(struct pipe_context *pipe, unsigned flags)
/* Send CMD_FINISH to all SPUs */
for (i = 0; i < cell->num_spus; i++) {
send_mbox_message(control_ps_area[i], CELL_CMD_FINISH);
send_mbox_message(spe_contexts[i], CELL_CMD_FINISH);
}
/* Wait for ack */
for (i = 0; i < cell->num_spus; i++) {
uint k = wait_mbox_message(control_ps_area[i]);
uint k = wait_mbox_message(spe_contexts[i]);
assert(k == CELL_CMD_FINISH);
}
}

View File

@@ -27,6 +27,7 @@
#include <cbe_mfc.h>
#include <pthread.h>
#include "cell_spu.h"
#include "pipe/p_format.h"
@@ -43,9 +44,8 @@ helpful headers:
/**
* SPU/SPE handles, etc
*/
speid_t speid[MAX_SPUS];
spe_spu_control_area_t *control_ps_area[MAX_SPUS];
spe_context_ptr_t spe_contexts[MAX_SPUS];
pthread_t spe_threads[MAX_SPUS];
/**
* Data sent to SPUs
@@ -58,11 +58,9 @@ struct cell_command command[MAX_SPUS];
* Write a 1-word message to the given SPE mailbox.
*/
void
send_mbox_message(spe_spu_control_area_t *ca, unsigned int msg)
send_mbox_message(spe_context_ptr_t ctx, unsigned int msg)
{
while (_spe_in_mbox_status(ca) < 1)
;
_spe_in_mbox_write(ca, msg);
spe_in_mbox_write(ctx, &msg, 1, SPE_MBOX_ALL_BLOCKING);
}
@@ -70,13 +68,30 @@ send_mbox_message(spe_spu_control_area_t *ca, unsigned int msg)
* Wait for a 1-word message to arrive in given mailbox.
*/
uint
wait_mbox_message(spe_spu_control_area_t *ca)
wait_mbox_message(spe_context_ptr_t ctx)
{
uint k;
while (_spe_out_mbox_status(ca) < 1)
;
k = _spe_out_mbox_read(ca);
return k;
do {
unsigned data;
int count = spe_out_mbox_read(ctx, &data, 1);
if (count == 1) {
return data;
}
if (count < 0) {
/* error */ ;
}
} while (1);
}
static void *cell_thread_function(void *arg)
{
struct cell_init_info *init = (struct cell_init_info *) arg;
unsigned entry = SPE_DEFAULT_ENTRY;
spe_context_run(spe_contexts[init->id], &entry, 0, init, NULL, NULL);
pthread_exit(NULL);
}
@@ -96,22 +111,17 @@ cell_start_spus(uint num_spus)
ASSERT_ALIGN16(&inits[0]);
ASSERT_ALIGN16(&inits[1]);
/* XXX do we need to create a gid with spe_create_group()? */
for (i = 0; i < num_spus; i++) {
inits[i].id = i;
inits[i].num_spus = num_spus;
inits[i].cmd = &command[i];
speid[i] = spe_create_thread(0, /* gid */
&g3d_spu, /* spe program handle */
&inits[i], /* argp */
NULL, /* envp */
-1, /* mask */
SPE_MAP_PS/*0*/ ); /* flags */
spe_contexts[i] = spe_context_create(0, NULL);
control_ps_area[i] = spe_get_ps_area(speid[i], SPE_CONTROL_AREA);
assert(control_ps_area[i]);
spe_program_load(spe_contexts[i], &g3d_spu);
pthread_create(&spe_threads[i], NULL, cell_thread_function,
& inits[i]);
}
}
@@ -124,14 +134,15 @@ finish_all(uint num_spus)
uint i;
for (i = 0; i < num_spus; i++) {
send_mbox_message(control_ps_area[i], CELL_CMD_FINISH);
send_mbox_message(spe_contexts[i], CELL_CMD_FINISH);
}
for (i = 0; i < num_spus; i++) {
/* wait for mbox message */
unsigned k;
while (_spe_out_mbox_status(control_ps_area[i]) < 1)
while (spe_out_mbox_read(spe_contexts[i], &k, 1) < 1)
;
k = _spe_out_mbox_read(control_ps_area[i]);
assert(k == CELL_CMD_FINISH);
}
}
@@ -154,12 +165,12 @@ test_spus(struct cell_context *cell)
command[i].fb.width = surf->width;
command[i].fb.height = surf->height;
command[i].fb.format = PIPE_FORMAT_A8R8G8B8_UNORM;
send_mbox_message(control_ps_area[i], CELL_CMD_FRAMEBUFFER);
send_mbox_message(spe_contexts[i], CELL_CMD_FRAMEBUFFER);
}
for (i = 0; i < cell->num_spus; i++) {
command[i].clear.value = 0xff880044; /* XXX */
send_mbox_message(control_ps_area[i], CELL_CMD_CLEAR_TILES);
send_mbox_message(spe_contexts[i], CELL_CMD_CLEAR_TILES);
}
finish_all(cell->num_spus);
@@ -171,7 +182,7 @@ test_spus(struct cell_context *cell)
}
for (i = 0; i < cell->num_spus; i++) {
send_mbox_message(control_ps_area[i], CELL_CMD_EXIT);
send_mbox_message(spe_contexts[i], CELL_CMD_EXIT);
}
}
@@ -182,10 +193,11 @@ test_spus(struct cell_context *cell)
void
wait_spus(uint num_spus)
{
int i, status;
unsigned i;
void *value;
for (i = 0; i < num_spus; i++) {
spe_wait( speid[i], &status, 1 );
pthread_join(spe_threads[i], &value);
}
}
@@ -196,14 +208,11 @@ wait_spus(uint num_spus)
void
cell_spu_exit(struct cell_context *cell)
{
uint i;
int status;
unsigned i;
for (i = 0; i < cell->num_spus; i++) {
send_mbox_message(control_ps_area[i], CELL_CMD_EXIT);
send_mbox_message(spe_contexts[i], CELL_CMD_EXIT);
}
for (i = 0; i < cell->num_spus; i++) {
spe_wait( speid[i], &status, 1 );
}
wait_spus(cell->num_spus);
}

View File

@@ -29,7 +29,7 @@
#define CELL_SPU
#include <libspe.h>
#include <libspe2.h>
#include <libmisc.h>
#include "pipe/cell/common.h"
@@ -42,8 +42,8 @@
* SPU/SPE handles, etc
*/
extern spe_program_handle_t g3d_spu;
extern speid_t speid[MAX_SPUS];
extern spe_spu_control_area_t *control_ps_area[MAX_SPUS];
extern spe_context_ptr_t spe_contexts[MAX_SPUS];
extern pthread_t spe_threads[MAX_SPUS];
/**
@@ -53,11 +53,11 @@ extern struct cell_init_info inits[MAX_SPUS];
extern struct cell_command command[MAX_SPUS];
void
send_mbox_message(spe_spu_control_area_t *ca, unsigned int msg);
extern void
send_mbox_message(spe_context_ptr_t ctx, unsigned int msg);
uint
wait_mbox_message(spe_spu_control_area_t *ca);
extern uint
wait_mbox_message(spe_context_ptr_t ctx);
void

View File

@@ -78,13 +78,13 @@ cell_clear_surface(struct pipe_context *pipe, struct pipe_surface *ps,
command[i].fb.width = ps->width;
command[i].fb.height = ps->height;
command[i].fb.format = ps->format;
send_mbox_message(control_ps_area[i], CELL_CMD_FRAMEBUFFER);
send_mbox_message(spe_contexts[i], CELL_CMD_FRAMEBUFFER);
}
for (i = 0; i < cell->num_spus; i++) {
/* XXX clear color varies per-SPU for debugging */
command[i].clear.value = clearValue | (i << 21);
send_mbox_message(control_ps_area[i], CELL_CMD_CLEAR_TILES);
send_mbox_message(spe_contexts[i], CELL_CMD_CLEAR_TILES);
}
#if 1
@@ -103,7 +103,7 @@ cell_clear_surface(struct pipe_context *pipe, struct pipe_surface *ps,
/* XXX color varies per SPU */
command[i].tri.color = 0xffff00 | ((i*40)<<24); /* yellow */
send_mbox_message(control_ps_area[i], CELL_CMD_TRIANGLE);
send_mbox_message(spe_contexts[i], CELL_CMD_TRIANGLE);
}
#endif
}