[mtl canvas] Fix shader contents scaling
This commit is contained in:
		
							parent
							
								
									4c4f27066b
								
							
						
					
					
						commit
						c4e866d9d4
					
				| 
						 | 
					@ -145,8 +145,8 @@ int main()
 | 
				
			||||||
			mg_set_color_rgba(0, 0, 1, 1);
 | 
								mg_set_color_rgba(0, 0, 1, 1);
 | 
				
			||||||
			mg_stroke();
 | 
								mg_stroke();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			mg_move_to(x+2*400, y+2*400);
 | 
								mg_move_to(x+400, y+300);
 | 
				
			||||||
			mg_cubic_to(x+2*400, y+2*200, x+2*600, y+2*500, x+2*600, y+2*400);
 | 
								mg_cubic_to(x+400, y+100, x+600, y+400, x+600, y+300);
 | 
				
			||||||
			mg_close_path();
 | 
								mg_close_path();
 | 
				
			||||||
			mg_set_color_rgba(0, 0, 1, 1);
 | 
								mg_set_color_rgba(0, 0, 1, 1);
 | 
				
			||||||
			mg_stroke();
 | 
								mg_stroke();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -689,6 +689,7 @@ void mg_mtl_canvas_render(mg_canvas_backend* interface,
 | 
				
			||||||
		[pathEncoder setBuffer:backend->tileQueueBuffer offset:0 atIndex:3];
 | 
							[pathEncoder setBuffer:backend->tileQueueBuffer offset:0 atIndex:3];
 | 
				
			||||||
		[pathEncoder setBuffer:backend->tileQueueCountBuffer offset:0 atIndex:4];
 | 
							[pathEncoder setBuffer:backend->tileQueueCountBuffer offset:0 atIndex:4];
 | 
				
			||||||
		[pathEncoder setBytes:&tileSize length:sizeof(int) atIndex:5];
 | 
							[pathEncoder setBytes:&tileSize length:sizeof(int) atIndex:5];
 | 
				
			||||||
 | 
							[pathEncoder setBytes:&scale length:sizeof(int) atIndex:6];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		MTLSize pathGridSize = MTLSizeMake(pathCount, 1, 1);
 | 
							MTLSize pathGridSize = MTLSizeMake(pathCount, 1, 1);
 | 
				
			||||||
		MTLSize pathGroupSize = MTLSizeMake([backend->pathPipeline maxTotalThreadsPerThreadgroup], 1, 1);
 | 
							MTLSize pathGroupSize = MTLSizeMake([backend->pathPipeline maxTotalThreadsPerThreadgroup], 1, 1);
 | 
				
			||||||
| 
						 | 
					@ -710,8 +711,9 @@ void mg_mtl_canvas_render(mg_canvas_backend* interface,
 | 
				
			||||||
		[segmentEncoder setBuffer:backend->tileOpBuffer offset:0 atIndex:6];
 | 
							[segmentEncoder setBuffer:backend->tileOpBuffer offset:0 atIndex:6];
 | 
				
			||||||
		[segmentEncoder setBuffer:backend->tileOpCountBuffer offset:0 atIndex:7];
 | 
							[segmentEncoder setBuffer:backend->tileOpCountBuffer offset:0 atIndex:7];
 | 
				
			||||||
		[segmentEncoder setBytes:&tileSize length:sizeof(int) atIndex:8];
 | 
							[segmentEncoder setBytes:&tileSize length:sizeof(int) atIndex:8];
 | 
				
			||||||
		[segmentEncoder setBuffer:backend->logBuffer[backend->bufferIndex] offset:0 atIndex:9];
 | 
							[segmentEncoder setBytes:&scale length:sizeof(int) atIndex:9];
 | 
				
			||||||
		[segmentEncoder setBuffer:backend->logOffsetBuffer[backend->bufferIndex] offset:0 atIndex:10];
 | 
							[segmentEncoder setBuffer:backend->logBuffer[backend->bufferIndex] offset:0 atIndex:10];
 | 
				
			||||||
 | 
							[segmentEncoder setBuffer:backend->logOffsetBuffer[backend->bufferIndex] offset:0 atIndex:11];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		MTLSize segmentGridSize = MTLSizeMake(context.mtlEltCount, 1, 1);
 | 
							MTLSize segmentGridSize = MTLSizeMake(context.mtlEltCount, 1, 1);
 | 
				
			||||||
		MTLSize segmentGroupSize = MTLSizeMake([backend->segmentPipeline maxTotalThreadsPerThreadgroup], 1, 1);
 | 
							MTLSize segmentGroupSize = MTLSizeMake([backend->segmentPipeline maxTotalThreadsPerThreadgroup], 1, 1);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,12 +171,13 @@ kernel void mtl_path_setup(constant int* pathCount [[buffer(0)]],
 | 
				
			||||||
                           device mg_mtl_tile_queue* tileQueueBuffer [[buffer(3)]],
 | 
					                           device mg_mtl_tile_queue* tileQueueBuffer [[buffer(3)]],
 | 
				
			||||||
                           device atomic_int* tileQueueCount [[buffer(4)]],
 | 
					                           device atomic_int* tileQueueCount [[buffer(4)]],
 | 
				
			||||||
                           constant int* tileSize [[buffer(5)]],
 | 
					                           constant int* tileSize [[buffer(5)]],
 | 
				
			||||||
 | 
					                           constant float* scale [[buffer(6)]],
 | 
				
			||||||
                           uint pathIndex [[thread_position_in_grid]])
 | 
					                           uint pathIndex [[thread_position_in_grid]])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const device mg_mtl_path* path = &pathBuffer[pathIndex];
 | 
						const device mg_mtl_path* path = &pathBuffer[pathIndex];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int2 firstTile = int2(path->box.xy)/tileSize[0];
 | 
						int2 firstTile = int2(path->box.xy*scale[0])/tileSize[0];
 | 
				
			||||||
	int2 lastTile = max(firstTile, int2(path->box.zw)/tileSize[0]);
 | 
						int2 lastTile = max(firstTile, int2(path->box.zw*scale[0])/tileSize[0]);
 | 
				
			||||||
	int nTilesX = lastTile.x - firstTile.x + 1;
 | 
						int nTilesX = lastTile.x - firstTile.x + 1;
 | 
				
			||||||
	int nTilesY = lastTile.y - firstTile.y + 1;
 | 
						int nTilesY = lastTile.y - firstTile.y + 1;
 | 
				
			||||||
	int tileCount = nTilesX * nTilesY;
 | 
						int tileCount = nTilesX * nTilesY;
 | 
				
			||||||
| 
						 | 
					@ -965,9 +966,10 @@ kernel void mtl_segment_setup(constant int* elementCount [[buffer(0)]],
 | 
				
			||||||
                              device mg_mtl_tile_op* tileOpBuffer [[buffer(6)]],
 | 
					                              device mg_mtl_tile_op* tileOpBuffer [[buffer(6)]],
 | 
				
			||||||
                              device atomic_int* tileOpCount [[buffer(7)]],
 | 
					                              device atomic_int* tileOpCount [[buffer(7)]],
 | 
				
			||||||
                              constant int* tileSize [[buffer(8)]],
 | 
					                              constant int* tileSize [[buffer(8)]],
 | 
				
			||||||
 | 
					                              constant float* scale [[buffer(9)]],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                              device char* logBuffer [[buffer(9)]],
 | 
					                              device char* logBuffer [[buffer(10)]],
 | 
				
			||||||
                              device atomic_int* logOffsetBuffer [[buffer(10)]],
 | 
					                              device atomic_int* logOffsetBuffer [[buffer(11)]],
 | 
				
			||||||
                              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];
 | 
				
			||||||
| 
						 | 
					@ -991,19 +993,19 @@ kernel void mtl_segment_setup(constant int* elementCount [[buffer(0)]],
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		case MG_MTL_LINE:
 | 
							case MG_MTL_LINE:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			float2 p[2] = {elt->p[0], elt->p[1]};
 | 
								float2 p[2] = {elt->p[0]*scale[0], elt->p[1]*scale[0]};
 | 
				
			||||||
			mtl_line_setup(&setupCtx, p);
 | 
								mtl_line_setup(&setupCtx, p);
 | 
				
			||||||
		} break;
 | 
							} break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case MG_MTL_QUADRATIC:
 | 
							case MG_MTL_QUADRATIC:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			float2 p[3] = {elt->p[0], elt->p[1], elt->p[2]};
 | 
								float2 p[3] = {elt->p[0]*scale[0], elt->p[1]*scale[0], elt->p[2]*scale[0]};
 | 
				
			||||||
			mtl_quadratic_setup(&setupCtx, p);
 | 
								mtl_quadratic_setup(&setupCtx, p);
 | 
				
			||||||
		} break;
 | 
							} break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case MG_MTL_CUBIC:
 | 
							case MG_MTL_CUBIC:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			float2 p[4] = {elt->p[0], elt->p[1], elt->p[2], elt->p[3]};
 | 
								float2 p[4] = {elt->p[0]*scale[0], elt->p[1]*scale[0], elt->p[2]*scale[0], elt->p[3]*scale[0]};
 | 
				
			||||||
			mtl_cubic_setup(&setupCtx, p);
 | 
								mtl_cubic_setup(&setupCtx, p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		} break;
 | 
							} break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue