corrected azrp_circle shader to work with multiple instances

This commit is contained in:
Sylvain PILLOT 2023-05-25 12:57:02 +02:00
parent 406cc3739e
commit 9cf20a11d9
1 changed files with 24 additions and 31 deletions

View File

@ -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;