diff --git a/azur/src/gint/shaders/circle.c b/azur/src/gint/shaders/circle.c index 181aac2..f615c10 100644 --- a/azur/src/gint/shaders/circle.c +++ b/azur/src/gint/shaders/circle.c @@ -26,33 +26,29 @@ static int max(int x, int y) //--- -#define TABLE_WIDTH 512 - -uint16_t DataPixelsX[14*TABLE_WIDTH]; // 14 fragments each able to store as much pixels as width -uint16_t DataPixelsY[14*TABLE_WIDTH]; // 14 fragments each able to store as much pixels as width -uint16_t NbPixels[14]; // Nunmber of pixels in each fragment +#define TABLE_WIDTH 256 struct command { uint8_t shader_id; uint16_t color; uint8_t curr_frag; - uint16_t *pixnb; - uint16_t *dataX; - uint16_t *dataY; + uint16_t NbPixels[14]; // Nunmber of pixels in each fragment + uint16_t DataPixelsX[14*TABLE_WIDTH]; // 14 fragments each able to store as much pixels as width + uint16_t DataPixelsY[14*TABLE_WIDTH]; // 14 fragments each able to store as much pixels as width }; -void AddPixel( int16_t xp, int16_t yp ) +void AddPixel( int16_t xp, int16_t yp, struct command *cmd ) { if (xp >= 0 && xp < azrp_width && yp >= 0 && yp < azrp_height) { uint8_t cfrag = yp / azrp_frag_height; - uint16_t nbpixinfrag = NbPixels[ cfrag ]; + uint16_t nbpixinfrag = cmd->NbPixels[ cfrag ]; uint16_t index = cfrag * TABLE_WIDTH + nbpixinfrag; - DataPixelsX[ index ] = xp; - DataPixelsY[ index ] = yp & 15; - NbPixels[ cfrag ]++; + cmd->DataPixelsX[ index ] = xp; + cmd->DataPixelsY[ index ] = yp & 15; + cmd->NbPixels[ cfrag ]++; } } @@ -73,9 +69,7 @@ void azrp_circle(int xc, int yc, uint16_t rad, uint16_t color) return; } - // reset the point counters in each cell of the table - for( int i = 0; i < 14; i++ ) - NbPixels[i]=0; + int ytop = max( ymin, 0 ); @@ -91,6 +85,9 @@ void azrp_circle(int xc, int yc, uint16_t rad, uint16_t color) cmd.color = color; cmd.curr_frag = frag_first; + // reset the point counters in each cell of the table + for( int i = 0; i < 14; i++ ) + cmd.NbPixels[i]=0; int x = 0; int y = rad; @@ -98,14 +95,14 @@ void azrp_circle(int xc, int yc, uint16_t rad, uint16_t color) while (x <= y) { - AddPixel( xc+x, yc+y ); - AddPixel( xc+y, yc+x ); - AddPixel( xc-x, yc+y ); - AddPixel( xc-y, yc+x ); - AddPixel( xc+x, yc-y ); - AddPixel( xc+y, yc-x ); - AddPixel( xc-x, yc-y ); - AddPixel( xc-y, yc-x ); + AddPixel( xc+x, yc+y, &cmd ); + AddPixel( xc+y, yc+x, &cmd ); + AddPixel( xc-x, yc+y, &cmd ); + AddPixel( xc-y, yc+x, &cmd ); + AddPixel( xc+x, yc-y, &cmd ); + AddPixel( xc+y, yc-x, &cmd ); + AddPixel( xc-x, yc-y, &cmd ); + AddPixel( xc-y, yc-x, &cmd ); if (m > 0) { @@ -116,10 +113,6 @@ void azrp_circle(int xc, int yc, uint16_t rad, uint16_t color) m += 8*x + 4; } - cmd.pixnb = &NbPixels[0]; - cmd.dataX = &DataPixelsX[0]; - cmd.dataY = &DataPixelsY[0]; - azrp_queue_command(&cmd, sizeof cmd, frag_first, frag_count); prof_leave(azrp_perf_cmdgen); } @@ -129,9 +122,9 @@ void azrp_shader_circle( void *uniforms, void *comnd, void *fragment ) struct command *cmd = (struct command *) comnd; uint16_t *frag = (uint16_t *) fragment; - uint16_t *taille = (uint16_t *) cmd->pixnb; - uint16_t *DX = (uint16_t *) cmd->dataX; - uint16_t *DY = (uint16_t *) cmd->dataY; + uint16_t *taille = (uint16_t *) cmd->NbPixels; + uint16_t *DX = (uint16_t *) cmd->DataPixelsX; + uint16_t *DY = (uint16_t *) cmd->DataPixelsY; uint16_t nbpix = taille[ cmd->curr_frag ]; int BaseAdress = cmd->curr_frag * TABLE_WIDTH;