diff --git a/Memola/Canvas/Elements/Photo/Photo.swift b/Memola/Canvas/Elements/Photo/Photo.swift index 3ec2741..c153d74 100644 --- a/Memola/Canvas/Elements/Photo/Photo.swift +++ b/Memola/Canvas/Elements/Photo/Photo.swift @@ -48,35 +48,36 @@ final class Photo: @unchecked Sendable, Equatable, Comparable { } func generateVertices() { - let minX = origin.x - size.width / 2 - let maxX = origin.x + size.width / 2 - let minY = origin.y - size.height / 2 - let maxY = origin.y + size.height / 2 + let minX = origin.x - (size.width / 2) + let maxX = origin.x + (size.width / 2) + let minY = origin.y - (size.height / 2) + let maxY = origin.y + (size.height / 2) vertices = [ PhotoVertex(x: minX, y: minY, textCoord: CGPoint(x: 0, y: 0)), + PhotoVertex(x: maxX, y: minY, textCoord: CGPoint(x: 1, y: 0)), PhotoVertex(x: minX, y: maxY, textCoord: CGPoint(x: 0, y: 1)), PhotoVertex(x: maxX, y: minY, textCoord: CGPoint(x: 1, y: 0)), - PhotoVertex(x: maxX, y: maxY, textCoord: CGPoint(x: 1, y: 1)), + PhotoVertex(x: minX, y: maxY, textCoord: CGPoint(x: 0, y: 1)), + PhotoVertex(x: maxX, y: maxY, textCoord: CGPoint(x: 1, y: 1)) ] } } extension Photo: Drawable { func prepare(device: any MTLDevice) { - if vertexBuffer == nil { - vertexCount = vertices.endIndex - vertexBuffer = device.makeBuffer(bytes: vertices, length: vertexCount * MemoryLayout.stride, options: []) - } if texture == nil, let url = bookmark?.getBookmarkURL() { texture = Textures.createPhotoTexture(for: url, on: device) } + vertexCount = vertices.endIndex + vertexBuffer = device.makeBuffer(bytes: vertices, length: vertexCount * MemoryLayout.stride, options: [.cpuCacheModeWriteCombined]) } func draw(device: any MTLDevice, renderEncoder: any MTLRenderCommandEncoder) { prepare(device: device) renderEncoder.setFragmentTexture(texture, index: 0) renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0) - renderEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: vertices.count) + renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: vertices.count) + vertexBuffer = nil } } diff --git a/Memola/Canvas/RenderPasses/EraserRenderPass.swift b/Memola/Canvas/RenderPasses/EraserRenderPass.swift index 9a1099c..34d89cb 100644 --- a/Memola/Canvas/RenderPasses/EraserRenderPass.swift +++ b/Memola/Canvas/RenderPasses/EraserRenderPass.swift @@ -69,8 +69,8 @@ class EraserRenderPass: RenderPass { computeEncoder.label = "Quad Render Pass" let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout.stride * quadCount, options: []) - let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout.stride * quadCount * 6, options: []) - let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout.stride * quadCount * 4, options: []) + let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout.stride * quadCount * 6, options: [.cpuCacheModeWriteCombined]) + let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout.stride * quadCount * 4, options: [.cpuCacheModeWriteCombined]) computeEncoder.setComputePipelineState(quadPipelineState) computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0) diff --git a/Memola/Canvas/RenderPasses/StrokeRenderPass.swift b/Memola/Canvas/RenderPasses/StrokeRenderPass.swift index d5fa1be..f365459 100644 --- a/Memola/Canvas/RenderPasses/StrokeRenderPass.swift +++ b/Memola/Canvas/RenderPasses/StrokeRenderPass.swift @@ -79,8 +79,8 @@ class StrokeRenderPass: RenderPass { let quadCount = stroke.quads.endIndex var quads = stroke.quads let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout.stride * quadCount, options: []) - let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout.stride * quadCount * 6, options: []) - let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout.stride * quadCount * 4, options: []) + let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout.stride * quadCount * 6, options: [.cpuCacheModeWriteCombined]) + let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout.stride * quadCount * 4, options: [.cpuCacheModeWriteCombined]) computeEncoder.setComputePipelineState(quadPipelineState) computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0)