@@ -102,6 +102,39 @@ - (void)mtkView:(nonnull MTKView *)view drawableSizeWillChange:(CGSize)size
102
102
_viewportSize.y = size.height ;
103
103
}
104
104
105
+ // / Create a translation+scale matrix
106
+ static matrix_float4x4 matrix_scale_translate (CGFloat scale, CGPoint translate)
107
+ {
108
+ matrix_float4x4 m = {
109
+ .columns [0 ] = {
110
+ scale,
111
+ 0 ,
112
+ 0 ,
113
+ 0
114
+ },
115
+ .columns [1 ] = {
116
+ 0 ,
117
+ scale,
118
+ 0 ,
119
+ 0
120
+ },
121
+ .columns [2 ] = {
122
+ 0 ,
123
+ 0 ,
124
+ 1 ,
125
+ 0
126
+ },
127
+ .columns [3 ] = {
128
+ translate.x ,
129
+ -translate.y , // y flipped
130
+ 0 ,
131
+ 1
132
+ }
133
+
134
+ };
135
+ return m;
136
+ }
137
+
105
138
// / Called whenever the view needs to render a frame
106
139
- (void )drawInMTKView : (nonnull MTKView *)view
107
140
{
@@ -133,18 +166,9 @@ - (void)drawInMTKView:(nonnull MTKView *)view
133
166
dispatch_semaphore_wait (screenLock, DISPATCH_TIME_FOREVER);
134
167
135
168
// Render the screen first
136
- // Set the region of the drawable to which we'll draw.
137
- CGSize scaled = CGSizeMake (_viewportSize.x * self.sourceScreen .viewportScale ,
138
- _viewportSize.y * self.sourceScreen .viewportScale );
139
- MTLViewport viewport = {
140
- self.sourceScreen .viewportOrigin .x + -scaled.width /2 + _viewportSize.x /2 ,
141
- self.sourceScreen .viewportOrigin .y + -scaled.height /2 + _viewportSize.y /2 ,
142
- scaled.width ,
143
- scaled.height ,
144
- -1.0 ,
145
- 1.0
146
- };
147
- [renderEncoder setViewport: viewport];
169
+
170
+ matrix_float4x4 transform = matrix_scale_translate (self.sourceScreen .viewportScale ,
171
+ self.sourceScreen .viewportOrigin );
148
172
149
173
[renderEncoder setRenderPipelineState: _pipelineState];
150
174
@@ -156,6 +180,10 @@ - (void)drawInMTKView:(nonnull MTKView *)view
156
180
length: sizeof (_viewportSize)
157
181
atIndex: UTMVertexInputIndexViewportSize];
158
182
183
+ [renderEncoder setVertexBytes: &transform
184
+ length: sizeof (transform)
185
+ atIndex: UTMVertexInputIndexTransform];
186
+
159
187
[renderEncoder setVertexBytes: &hasAlpha
160
188
length: sizeof (hasAlpha)
161
189
atIndex: UTMVertexInputIndexHasAlpha];
@@ -179,23 +207,20 @@ - (void)drawInMTKView:(nonnull MTKView *)view
179
207
dispatch_semaphore_wait (cursorLock, DISPATCH_TIME_FOREVER);
180
208
181
209
// Next render the cursor
182
- CGSize scaled = CGSizeMake (_viewportSize.x * self.sourceCursor .viewportScale ,
183
- _viewportSize.y * self.sourceCursor .viewportScale );
184
- MTLViewport cursorViewport = {
185
- self.sourceCursor .viewportOrigin .x + self.sourceScreen .viewportOrigin .x + -scaled.width /2 + _viewportSize.x /2 ,
186
- self.sourceCursor .viewportOrigin .y + self.sourceScreen .viewportOrigin .y + -scaled.height /2 + _viewportSize.y /2 ,
187
- scaled.width ,
188
- scaled.height ,
189
- -1.0 ,
190
- 1.0
191
- };
192
- [renderEncoder setViewport: cursorViewport];
210
+ matrix_float4x4 transform = matrix_scale_translate (self.sourceScreen .viewportScale ,
211
+ CGPointMake (self.sourceScreen .viewportOrigin .x +
212
+ self.sourceCursor .viewportOrigin .x ,
213
+ self.sourceScreen .viewportOrigin .y +
214
+ self.sourceCursor .viewportOrigin .y ));
193
215
[renderEncoder setVertexBuffer: self .sourceCursor.vertices
194
216
offset: 0
195
217
atIndex: UTMVertexInputIndexVertices];
196
218
[renderEncoder setVertexBytes: &_viewportSize
197
219
length: sizeof (_viewportSize)
198
220
atIndex: UTMVertexInputIndexViewportSize];
221
+ [renderEncoder setVertexBytes: &transform
222
+ length: sizeof (transform)
223
+ atIndex: UTMVertexInputIndexTransform];
199
224
[renderEncoder setVertexBytes: &hasAlpha
200
225
length: sizeof (hasAlpha)
201
226
atIndex: UTMVertexInputIndexHasAlpha];
0 commit comments