the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at master 117 lines 3.5 kB view raw
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