the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1/* SCE CONFIDENTIAL
2PlayStation(R)3 Programmer Tool Runtime Library 430.001
3* Copyright (C) 2007 Sony Computer Entertainment Inc.
4* All Rights Reserved.
5*/
6
7/* common headers */
8#include <stdint.h>
9#include <stdlib.h>
10#include <spu_intrinsics.h>
11#include <cell/spurs.h>
12#include <spu_printf.h>
13#include <cell/dma.h>
14#include <cell/gcm_spu.h>
15#include <cell/gcm_spu.h>
16
17
18#include "..\Common\DmaData.h"
19#include "LevelRenderChunks.h"
20#include <cell/gcm_spu.h>
21
22#define SPU_HEAPSIZE (128*1024)
23#define SPU_STACKSIZE (16*1024)
24
25CELL_SPU_LS_PARAM(128*1024, 16*1024); // can't use #defines here as it seems to create an asm instruction
26
27
28static const bool sc_verbose = false;
29
30
31
32static int32_t gcmReserveFailed(CellGcmContextData *context, uint32_t count)
33{
34 (void)count;
35 spu_assert(0);
36 context->current = context->begin; // Back to the beginning so we don't trample memory.
37 return CELL_OK;
38}
39
40
41int cellSpursTaskMain(qword argTask, uint64_t argTaskset)
42{
43 (void)argTaskset;
44 int ret;
45 CellSpursTaskId idTask = cellSpursGetTaskId();
46 unsigned int idSpu = cellSpursGetCurrentSpuId();
47
48// if(sc_verbose)
49 spu_printf("[Task#%02u][SPU#%u] start\n", idTask, idSpu);
50
51 void* pVolatileMem = NULL;
52 uint32_t volatileSize = 0;
53 ret = cellSpursGetTaskVolatileArea(&pVolatileMem, &volatileSize);
54 spu_printf( "----------------- LevelRenderChunks SPU Memory ------------------\n"
55 "Stack : %dKb\n"
56 "Heap : %dKb\n"
57 "Prog : %dKb\n"
58 "Free : %dKb\n"
59 "-------------------------------------------------------------\n",
60 SPU_STACKSIZE/1024,
61 SPU_HEAPSIZE/1024,
62 256 - ((SPU_HEAPSIZE+SPU_STACKSIZE+volatileSize)/1024),
63 volatileSize/1024);
64
65 uint32_t eaEventFlag = spu_extract((vec_uint4)argTask, 0);
66 uint32_t eaDataIn = spu_extract((vec_uint4)argTask, 1);
67 uint32_t eaDataOut = spu_extract((vec_uint4)argTask, 2);
68
69 cell::Spurs::EventFlagStub eventFlag;
70 eventFlag.setObject(eaEventFlag);
71
72 RenderChunksSpuDataIn* pDataIn = new RenderChunksSpuDataIn;
73 RenderChunksSpuDataOut* pDataOut = new RenderChunksSpuDataOut;
74 CellGcmContextData gcmContext;
75 cellGcmSetupContextData(&gcmContext, pDataOut->m_commandBuffer, sizeof(pDataOut->m_commandBuffer), gcmReserveFailed);
76
77
78 while(1)
79 {
80 // wait for the chunk rebuild thread to signal us
81 uint16_t mask = 0x1;
82 if(sc_verbose)
83 spu_printf("[Task#%02u][SPU#%u] waiting for event flag#0, mask = 0x%04x\n", idTask, idSpu, mask);
84 ret = eventFlag.wait(&mask, CELL_SPURS_EVENT_FLAG_AND);
85 if (ret) {
86 spu_printf("[Task#%02u][SPU#%u] eventFlag0.wait() failed : %x\n", idTask, idSpu, ret);
87 abort();
88 }
89
90 if(sc_verbose)
91 spu_printf("[Task#%02u][SPU#%u] woken up\n", idTask, idSpu);
92 eventFlag.clear(0x01);
93
94 DmaData_SPU::getAndWait(pDataIn, eaDataIn, sizeof(RenderChunksSpuDataIn));
95
96 for(int i=0;i<pDataIn->m_numLists; i++)
97 {
98 cellGcmSetCallCommand(&gcmContext, pDataIn->m_listArray[i]);
99 }
100
101 pDataOut->m_commandBufferSize = ((unsigned int)gcmContext.current) - ((unsigned int)gcmContext.begin);
102
103 DmaData_SPU::putAndWait(pDataOut, eaDataOut, sizeof(RenderChunksSpuDataOut));
104
105 mask = 0x2;
106 if(sc_verbose)
107 spu_printf("[Task#%02u][SPU#%u] set event flag#1, mask = 0x%04x\n", idTask, idSpu, mask);
108 ret = eventFlag.set(mask);
109 if (ret) {
110 spu_printf("[Task#%02u][SPU#%u] eventFlag1.set(mask) failed : %x\n", idTask, idSpu, ret);
111 abort();
112 }
113 }
114 spu_printf("[Task#%02u][SPU#%u] exit\n", idTask, idSpu);
115 return 0;
116}
117