#include "zbuffer.h" #include #include #include #include #include #include #include #include /** size_uint32 * taille du zbuffer exprimée en uint32_t * utile pour l'effacement du zbuffer sur sh3 **/ static const uint32_t size_uint32 = FE_ZB_SIZE_X*FE_ZB_SIZE_Y; /** size_char * taille du zbuffer exprimée en octets * sera utile pour le DMA Controller **/ static const uint32_t size_char = size_uint32*sizeof(int32_t); /** address * addresse du zbuffer **/ static int32_t* address=0; const int32_t clearval=3000; #define ALIGN 4 static void* buffer_malloc(uint32_t size) { void *mem = malloc(size+ALIGN+sizeof(void*)); void **ptr = (void**)((uintptr_t)(mem+ALIGN+sizeof(void*)) & ~(ALIGN-1)); ptr[-1] = mem; return ptr; } void buffer_free(void *ptr) { free(((void**)ptr)[-1]); } void FE_zbuffer_clear() { if (address==0) { address = buffer_malloc(size_char); if (address==0) // cas de figure où il n'y a plus assez de RAM { dclear(C_WHITE); dtext(1, 1, "Not enough RAM...", C_BLACK, C_NONE); dupdate(); while (1==1) getkey(); } } // TODO déterminer le type d'effacement if (isSH3()) { // effacement CPU uint_fast16_t indice; for (indice = 0; indice < size_uint32; indice ++) address[indice] = clearval; } else { // effacement DMA dma_transfer(0, DMA_32B, size_uint32, &clearval, DMA_FIXED, address, DMA_INC); } } void FE_start_rendering() { if (!isSH3()) dma_transfer_wait(0); } bool FE_zbuffer_set_dist(int32_t x, int32_t y, int32_t dist) { x %= FE_ZB_SIZE_X; y %= FE_ZB_SIZE_Y; const uint32_t indice = x * 64 + y; if (address[indice]>dist && dist>0) { address[indice] = dist; return true; } else return false; }