@@ -159,19 +159,30 @@ void drawTex2Tex(MTLContext *mtlc,
159
159
replaceTextureRegion (MTLContext *mtlc, id <MTLTexture > dest, const SurfaceDataRasInfo *srcInfo,
160
160
const MTLRasterFormatInfo *rfi,
161
161
int dx1, int dy1, int dx2, int dy2) {
162
+ const int sw = srcInfo->bounds .x2 - srcInfo->bounds .x1 ;
163
+ const int sh = srcInfo->bounds .y2 - srcInfo->bounds .y1 ;
162
164
const int dw = dx2 - dx1;
163
165
const int dh = dy2 - dy1;
164
166
165
167
const void *raster = srcInfo->rasBase ;
166
- raster += srcInfo->bounds .y1 * srcInfo->scanStride + srcInfo->bounds .x1 * srcInfo->pixelStride ;
168
+ raster += ( NSUInteger ) srcInfo->bounds .y1 * ( NSUInteger ) srcInfo->scanStride + ( NSUInteger ) srcInfo->bounds .x1 * ( NSUInteger ) srcInfo->pixelStride ;
167
169
168
170
@autoreleasepool {
169
171
J2dTraceLn4 (J2D_TRACE_VERBOSE, " replaceTextureRegion src (dw, dh) : [%d , %d ] dest (dx1, dy1) =[%d , %d ]" ,
170
172
dw, dh, dx1, dy1);
171
173
// NOTE: we might want to fill alpha channel when !rfi->hasAlpha
172
- id <MTLBuffer > buff = [mtlc.device newBufferWithBytes: raster length: srcInfo->scanStride * dh options: MTLResourceStorageModeManaged ];
174
+
175
+ id <MTLBuffer > buff = [mtlc.device newBufferWithLength: (sw * sh * srcInfo->pixelStride) options: MTLResourceStorageModeManaged ];
176
+
177
+ // copy src pixels inside src bounds to buff
178
+ for (int row = 0 ; row < sh; row++) {
179
+ memcpy (buff.contents + (row * sw * srcInfo->pixelStride ), raster, sw * srcInfo->pixelStride );
180
+ raster += (NSUInteger )srcInfo->scanStride ;
181
+ }
182
+ [buff didModifyRange: NSMakeRange (0 , buff.length)];
183
+
173
184
if (rfi->swizzleKernel != nil ) {
174
- id <MTLBuffer > swizzled = [mtlc.device newBufferWithLength: srcInfo->scanStride * dh options: MTLResourceStorageModeManaged ];
185
+ id <MTLBuffer > swizzled = [mtlc.device newBufferWithLength: (sw * sh * srcInfo->pixelStride) options: MTLResourceStorageModeManaged ];
175
186
176
187
// this should be cheap, since data is already on GPU
177
188
id <MTLCommandBuffer > cb = [mtlc createCommandBuffer ];
@@ -198,8 +209,8 @@ void drawTex2Tex(MTLContext *mtlc,
198
209
199
210
id <MTLBlitCommandEncoder > blitEncoder = [mtlc.encoderManager createBlitEncoder ];
200
211
[blitEncoder copyFromBuffer: buff
201
- sourceOffset: 0 sourceBytesPerRow: srcInfo->scanStride
202
- sourceBytesPerImage: srcInfo->scanStride * dh sourceSize: MTLSizeMake (dw, dh , 1 )
212
+ sourceOffset: 0 sourceBytesPerRow: (sw * srcInfo->pixelStride)
213
+ sourceBytesPerImage: (sw * sh * srcInfo->pixelStride) sourceSize: MTLSizeMake (sw, sh , 1 )
203
214
toTexture: dest
204
215
destinationSlice: 0 destinationLevel: 0 destinationOrigin: MTLOriginMake (dx1, dy1, 0 )];
205
216
[blitEncoder endEncoding ];
0 commit comments