Skip to content
This repository was archived by the owner on Aug 27, 2022. It is now read-only.
/ lanai Public archive

Commit aafb51f

Browse files
committedNov 30, 2020
8257413: Lanai - Use optimum sized temporary buffer while replacing texture region
1 parent 7be48b0 commit aafb51f

File tree

1 file changed

+16
-5
lines changed
  • src/java.desktop/macosx/native/libawt_lwawt/java2d/metal

1 file changed

+16
-5
lines changed
 

‎src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLBlitLoops.m

+16-5
Original file line numberDiff line numberDiff line change
@@ -159,19 +159,30 @@ void drawTex2Tex(MTLContext *mtlc,
159159
replaceTextureRegion(MTLContext *mtlc, id<MTLTexture> dest, const SurfaceDataRasInfo *srcInfo,
160160
const MTLRasterFormatInfo *rfi,
161161
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;
162164
const int dw = dx2 - dx1;
163165
const int dh = dy2 - dy1;
164166

165167
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;
167169

168170
@autoreleasepool {
169171
J2dTraceLn4(J2D_TRACE_VERBOSE, "replaceTextureRegion src (dw, dh) : [%d, %d] dest (dx1, dy1) =[%d, %d]",
170172
dw, dh, dx1, dy1);
171173
// 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+
173184
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];
175186

176187
// this should be cheap, since data is already on GPU
177188
id<MTLCommandBuffer> cb = [mtlc createCommandBuffer];
@@ -198,8 +209,8 @@ void drawTex2Tex(MTLContext *mtlc,
198209

199210
id<MTLBlitCommandEncoder> blitEncoder = [mtlc.encoderManager createBlitEncoder];
200211
[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)
203214
toTexture:dest
204215
destinationSlice:0 destinationLevel:0 destinationOrigin:MTLOriginMake(dx1, dy1, 0)];
205216
[blitEncoder endEncoding];

0 commit comments

Comments
 (0)