[mtl renderer] fix msaa sample positions

This commit is contained in:
Martin Fouilleul 2023-04-08 12:11:38 +02:00
parent effd8f1dd0
commit ee3e55dadd
4 changed files with 16 additions and 31 deletions

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
DEBUG_FLAGS="-g -DDEBUG -DLOG_COMPILE_DEBUG" DEBUG_FLAGS="-g -O2 -DDEBUG -DLOG_COMPILE_DEBUG"
#DEBUG_FLAGS="-O3" #DEBUG_FLAGS="-O3"
#-------------------------------------------------------------- #--------------------------------------------------------------

View File

@ -200,8 +200,8 @@ int main()
if(singlePath) if(singlePath)
{ {
printf("display single path %i\n", singlePathIndex); printf("display single path %i\n", singlePathIndex);
printf("viewpos = (%f, %f), zoom = %f\n", startX, startY, zoom);
} }
printf("viewpos = (%f, %f), zoom = %f\n", startX, startY, zoom);
mg_matrix_pop(); mg_matrix_pop();

View File

@ -20,7 +20,7 @@
const int MG_MTL_INPUT_BUFFERS_COUNT = 3, const int MG_MTL_INPUT_BUFFERS_COUNT = 3,
MG_MTL_TILE_SIZE = 16, MG_MTL_TILE_SIZE = 16,
MG_MTL_MSAA_COUNT = 1; MG_MTL_MSAA_COUNT = 8;
typedef struct mg_mtl_canvas_backend typedef struct mg_mtl_canvas_backend
{ {

View File

@ -1271,22 +1271,6 @@ kernel void mtl_segment_setup(constant int* elementCount [[buffer(0)]],
uint eltIndex [[thread_position_in_grid]]) uint eltIndex [[thread_position_in_grid]])
{ {
const device mg_mtl_path_elt* elt = &elementBuffer[eltIndex]; const device mg_mtl_path_elt* elt = &elementBuffer[eltIndex];
//28
// 125
// 112
// if(elt->pathIndex != 96)
{
// return;
}
/*
if(elt->localEltIndex != 21)// && elt->localEltIndex != 22)
{
return;
}
*/
const device mg_mtl_path_queue* pathQueue = &pathQueueBuffer[elt->pathIndex]; const device mg_mtl_path_queue* pathQueue = &pathQueueBuffer[elt->pathIndex];
device mg_mtl_tile_queue* tileQueues = &tileQueueBuffer[pathQueue->tileQueues]; device mg_mtl_tile_queue* tileQueues = &tileQueueBuffer[pathQueue->tileQueues];
@ -1472,8 +1456,8 @@ kernel void mtl_raster(const device int* screenTilesBuffer [[buffer(0)]],
.offset = logOffsetBuffer, .offset = logOffsetBuffer,
.enabled = true}; .enabled = true};
*/ */
float2 pixelCoord = float2(threadCoord); uint2 pixelCoord = threadCoord;
int2 tileCoord = int2(threadCoord) / tileSize[0]; int2 tileCoord = int2(pixelCoord) / tileSize[0];
int nTilesX = (int(gridSize.x) + tileSize[0] - 1)/tileSize[0]; int nTilesX = (int(gridSize.x) + tileSize[0] - 1)/tileSize[0];
int tileIndex = tileCoord.y * nTilesX + tileCoord.x; int tileIndex = tileCoord.y * nTilesX + tileCoord.x;
@ -1483,23 +1467,24 @@ kernel void mtl_raster(const device int* screenTilesBuffer [[buffer(0)]],
const int MG_MTL_MAX_SAMPLE_COUNT = 8; const int MG_MTL_MAX_SAMPLE_COUNT = 8;
float2 sampleCoords[MG_MTL_MAX_SAMPLE_COUNT]; float2 sampleCoords[MG_MTL_MAX_SAMPLE_COUNT];
int sampleCount = sampleCountBuffer[0]; int sampleCount = sampleCountBuffer[0];
float2 centerCoord = float2(pixelCoord) + float2(0.5, 0.5);
if(sampleCount == 8) if(sampleCount == 8)
{ {
sampleCount = 8; sampleCount = 8;
sampleCoords[0] = pixelCoord + float2(1, 3)/16; sampleCoords[0] = centerCoord + float2(1, 3)/16;
sampleCoords[1] = pixelCoord + float2(-1, -3)/16; sampleCoords[1] = centerCoord + float2(-1, -3)/16;
sampleCoords[2] = pixelCoord + float2(5, -1)/16; sampleCoords[2] = centerCoord + float2(5, -1)/16;
sampleCoords[3] = pixelCoord + float2(-3, 5)/16; sampleCoords[3] = centerCoord + float2(-3, 5)/16;
sampleCoords[4] = pixelCoord + float2(-5, -5)/16; sampleCoords[4] = centerCoord + float2(-5, -5)/16;
sampleCoords[5] = pixelCoord + float2(-7, 1)/16; sampleCoords[5] = centerCoord + float2(-7, 1)/16;
sampleCoords[6] = pixelCoord + float2(3, -7)/16; sampleCoords[6] = centerCoord + float2(3, -7)/16;
sampleCoords[7] = pixelCoord + float2(7, 7)/16; sampleCoords[7] = centerCoord + float2(7, 7)/16;
} }
else else
{ {
sampleCount = 1; sampleCount = 1;
sampleCoords[0] = pixelCoord; sampleCoords[0] = centerCoord;
} }
float4 color[MG_MTL_MAX_SAMPLE_COUNT] = {0}; float4 color[MG_MTL_MAX_SAMPLE_COUNT] = {0};
@ -1584,7 +1569,7 @@ kernel void mtl_raster(const device int* screenTilesBuffer [[buffer(0)]],
} }
//*/ //*/
outTexture.write(pixelColor, uint2(pixelCoord)); outTexture.write(pixelColor, pixelCoord);
} }
//------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------