Merge pull request #47 from dscyrescotti/feature/photo-render-pass

Fix content disappearing in subsequent render
This commit is contained in:
Aye Chan
2024-06-20 00:21:23 +07:00
committed by GitHub
3 changed files with 15 additions and 14 deletions
+11 -10
View File
@@ -48,35 +48,36 @@ final class Photo: @unchecked Sendable, Equatable, Comparable {
} }
func generateVertices() { func generateVertices() {
let minX = origin.x - size.width / 2 let minX = origin.x - (size.width / 2)
let maxX = origin.x + size.width / 2 let maxX = origin.x + (size.width / 2)
let minY = origin.y - size.height / 2 let minY = origin.y - (size.height / 2)
let maxY = origin.y + size.height / 2 let maxY = origin.y + (size.height / 2)
vertices = [ vertices = [
PhotoVertex(x: minX, y: minY, textCoord: CGPoint(x: 0, y: 0)), 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: minX, y: maxY, textCoord: CGPoint(x: 0, y: 1)),
PhotoVertex(x: maxX, y: minY, textCoord: CGPoint(x: 1, y: 0)), 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 { extension Photo: Drawable {
func prepare(device: any MTLDevice) { func prepare(device: any MTLDevice) {
if vertexBuffer == nil {
vertexCount = vertices.endIndex
vertexBuffer = device.makeBuffer(bytes: vertices, length: vertexCount * MemoryLayout<PhotoVertex>.stride, options: [])
}
if texture == nil, let url = bookmark?.getBookmarkURL() { if texture == nil, let url = bookmark?.getBookmarkURL() {
texture = Textures.createPhotoTexture(for: url, on: device) texture = Textures.createPhotoTexture(for: url, on: device)
} }
vertexCount = vertices.endIndex
vertexBuffer = device.makeBuffer(bytes: vertices, length: vertexCount * MemoryLayout<PhotoVertex>.stride, options: [.cpuCacheModeWriteCombined])
} }
func draw(device: any MTLDevice, renderEncoder: any MTLRenderCommandEncoder) { func draw(device: any MTLDevice, renderEncoder: any MTLRenderCommandEncoder) {
prepare(device: device) prepare(device: device)
renderEncoder.setFragmentTexture(texture, index: 0) renderEncoder.setFragmentTexture(texture, index: 0)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, 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
} }
} }
@@ -69,8 +69,8 @@ class EraserRenderPass: RenderPass {
computeEncoder.label = "Quad Render Pass" computeEncoder.label = "Quad Render Pass"
let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout<Quad>.stride * quadCount, options: []) let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout<Quad>.stride * quadCount, options: [])
let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout<UInt>.stride * quadCount * 6, options: []) let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout<UInt>.stride * quadCount * 6, options: [.cpuCacheModeWriteCombined])
let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout<QuadVertex>.stride * quadCount * 4, options: []) let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout<QuadVertex>.stride * quadCount * 4, options: [.cpuCacheModeWriteCombined])
computeEncoder.setComputePipelineState(quadPipelineState) computeEncoder.setComputePipelineState(quadPipelineState)
computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0) computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0)
@@ -79,8 +79,8 @@ class StrokeRenderPass: RenderPass {
let quadCount = stroke.quads.endIndex let quadCount = stroke.quads.endIndex
var quads = stroke.quads var quads = stroke.quads
let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout<Quad>.stride * quadCount, options: []) let quadBuffer = renderer.device.makeBuffer(bytes: &quads, length: MemoryLayout<Quad>.stride * quadCount, options: [])
let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout<UInt>.stride * quadCount * 6, options: []) let indexBuffer = renderer.device.makeBuffer(length: MemoryLayout<UInt>.stride * quadCount * 6, options: [.cpuCacheModeWriteCombined])
let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout<QuadVertex>.stride * quadCount * 4, options: []) let vertexBuffer = renderer.device.makeBuffer(length: MemoryLayout<QuadVertex>.stride * quadCount * 4, options: [.cpuCacheModeWriteCombined])
computeEncoder.setComputePipelineState(quadPipelineState) computeEncoder.setComputePipelineState(quadPipelineState)
computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0) computeEncoder.setBuffer(quadBuffer, offset: 0, index: 0)