6827989: Use Unsafe.copyMemory for array->Unsafe copy operations in RenderBuffer
Reviewed-by: campbell, flar
This commit is contained in:
parent
15dd62fcba
commit
dce704d578
@ -125,7 +125,6 @@ FILES_2D_c = \
|
|||||||
FourByteAbgrPre.c \
|
FourByteAbgrPre.c \
|
||||||
BufferedMaskBlit.c \
|
BufferedMaskBlit.c \
|
||||||
BufferedRenderPipe.c \
|
BufferedRenderPipe.c \
|
||||||
RenderBuffer.c \
|
|
||||||
ShapeSpanIterator.c \
|
ShapeSpanIterator.c \
|
||||||
SpanClipRenderer.c \
|
SpanClipRenderer.c \
|
||||||
awt_ImageRep.c \
|
awt_ImageRep.c \
|
||||||
|
@ -70,7 +70,6 @@ FILES_c = \
|
|||||||
FourByteAbgrPre.c \
|
FourByteAbgrPre.c \
|
||||||
BufferedMaskBlit.c \
|
BufferedMaskBlit.c \
|
||||||
BufferedRenderPipe.c \
|
BufferedRenderPipe.c \
|
||||||
RenderBuffer.c \
|
|
||||||
ShapeSpanIterator.c \
|
ShapeSpanIterator.c \
|
||||||
SpanClipRenderer.c \
|
SpanClipRenderer.c \
|
||||||
SurfaceData.c \
|
SurfaceData.c \
|
||||||
|
@ -65,7 +65,6 @@ SUNWprivate_1.1 {
|
|||||||
Java_sun_awt_image_ShortComponentRaster_initIDs;
|
Java_sun_awt_image_ShortComponentRaster_initIDs;
|
||||||
Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile;
|
Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile;
|
||||||
Java_sun_java2d_pipe_BufferedRenderPipe_fillSpans;
|
Java_sun_java2d_pipe_BufferedRenderPipe_fillSpans;
|
||||||
Java_sun_java2d_pipe_RenderBuffer_copyFromArray;
|
|
||||||
Java_sun_java2d_pipe_SpanClipRenderer_eraseTile;
|
Java_sun_java2d_pipe_SpanClipRenderer_eraseTile;
|
||||||
Java_sun_java2d_pipe_SpanClipRenderer_fillTile;
|
Java_sun_java2d_pipe_SpanClipRenderer_fillTile;
|
||||||
Java_sun_java2d_pipe_ShapeSpanIterator_addSegment;
|
Java_sun_java2d_pipe_ShapeSpanIterator_addSegment;
|
||||||
|
@ -117,7 +117,6 @@ SUNWprivate_1.1 {
|
|||||||
Java_sun_java2d_loops_MaskBlit_MaskBlit;
|
Java_sun_java2d_loops_MaskBlit_MaskBlit;
|
||||||
Java_sun_java2d_loops_MaskFill_MaskFill;
|
Java_sun_java2d_loops_MaskFill_MaskFill;
|
||||||
Java_sun_java2d_pipe_BufferedRenderPipe_fillSpans;
|
Java_sun_java2d_pipe_BufferedRenderPipe_fillSpans;
|
||||||
Java_sun_java2d_pipe_RenderBuffer_copyFromArray;
|
|
||||||
Java_sun_java2d_pipe_SpanClipRenderer_initIDs;
|
Java_sun_java2d_pipe_SpanClipRenderer_initIDs;
|
||||||
sun_awt_image_GifImageDecoder_initIDs;
|
sun_awt_image_GifImageDecoder_initIDs;
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ public class RenderBuffer {
|
|||||||
* (This value can be adjusted if the cost of JNI downcalls is reduced
|
* (This value can be adjusted if the cost of JNI downcalls is reduced
|
||||||
* in a future release.)
|
* in a future release.)
|
||||||
*/
|
*/
|
||||||
private static final int COPY_FROM_ARRAY_THRESHOLD = 28;
|
private static final int COPY_FROM_ARRAY_THRESHOLD = 6;
|
||||||
|
|
||||||
protected final Unsafe unsafe;
|
protected final Unsafe unsafe;
|
||||||
protected final long baseAddress;
|
protected final long baseAddress;
|
||||||
@ -92,20 +92,6 @@ public class RenderBuffer {
|
|||||||
return baseAddress;
|
return baseAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Copies length bytes from the Java-level srcArray to the native
|
|
||||||
* memory located at dstAddr. Note that this method performs no bounds
|
|
||||||
* checking. Verification that the copy will not result in memory
|
|
||||||
* corruption should be done by the caller prior to invocation.
|
|
||||||
*
|
|
||||||
* @param srcArray the source array
|
|
||||||
* @param srcPos the starting position of the source array (in bytes)
|
|
||||||
* @param dstAddr pointer to the destination block of native memory
|
|
||||||
* @param length the number of bytes to copy from source to destination
|
|
||||||
*/
|
|
||||||
private static native void copyFromArray(Object srcArray, long srcPos,
|
|
||||||
long dstAddr, long length);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The behavior (and names) of the following methods are nearly
|
* The behavior (and names) of the following methods are nearly
|
||||||
* identical to their counterparts in the various NIO Buffer classes.
|
* identical to their counterparts in the various NIO Buffer classes.
|
||||||
@ -147,9 +133,9 @@ public class RenderBuffer {
|
|||||||
|
|
||||||
public RenderBuffer put(byte[] x, int offset, int length) {
|
public RenderBuffer put(byte[] x, int offset, int length) {
|
||||||
if (length > COPY_FROM_ARRAY_THRESHOLD) {
|
if (length > COPY_FROM_ARRAY_THRESHOLD) {
|
||||||
long offsetInBytes = offset * SIZEOF_BYTE;
|
long offsetInBytes = offset * SIZEOF_BYTE + Unsafe.ARRAY_BYTE_BASE_OFFSET;
|
||||||
long lengthInBytes = length * SIZEOF_BYTE;
|
long lengthInBytes = length * SIZEOF_BYTE;
|
||||||
copyFromArray(x, offsetInBytes, curAddress, lengthInBytes);
|
unsafe.copyMemory(x, offsetInBytes, null, curAddress, lengthInBytes);
|
||||||
position(position() + lengthInBytes);
|
position(position() + lengthInBytes);
|
||||||
} else {
|
} else {
|
||||||
int end = offset + length;
|
int end = offset + length;
|
||||||
@ -178,9 +164,9 @@ public class RenderBuffer {
|
|||||||
public RenderBuffer put(short[] x, int offset, int length) {
|
public RenderBuffer put(short[] x, int offset, int length) {
|
||||||
// assert (position() % SIZEOF_SHORT == 0);
|
// assert (position() % SIZEOF_SHORT == 0);
|
||||||
if (length > COPY_FROM_ARRAY_THRESHOLD) {
|
if (length > COPY_FROM_ARRAY_THRESHOLD) {
|
||||||
long offsetInBytes = offset * SIZEOF_SHORT;
|
long offsetInBytes = offset * SIZEOF_SHORT + Unsafe.ARRAY_SHORT_BASE_OFFSET;
|
||||||
long lengthInBytes = length * SIZEOF_SHORT;
|
long lengthInBytes = length * SIZEOF_SHORT;
|
||||||
copyFromArray(x, offsetInBytes, curAddress, lengthInBytes);
|
unsafe.copyMemory(x, offsetInBytes, null, curAddress, lengthInBytes);
|
||||||
position(position() + lengthInBytes);
|
position(position() + lengthInBytes);
|
||||||
} else {
|
} else {
|
||||||
int end = offset + length;
|
int end = offset + length;
|
||||||
@ -215,9 +201,9 @@ public class RenderBuffer {
|
|||||||
public RenderBuffer put(int[] x, int offset, int length) {
|
public RenderBuffer put(int[] x, int offset, int length) {
|
||||||
// assert (position() % SIZEOF_INT == 0);
|
// assert (position() % SIZEOF_INT == 0);
|
||||||
if (length > COPY_FROM_ARRAY_THRESHOLD) {
|
if (length > COPY_FROM_ARRAY_THRESHOLD) {
|
||||||
long offsetInBytes = offset * SIZEOF_INT;
|
long offsetInBytes = offset * SIZEOF_INT + Unsafe.ARRAY_INT_BASE_OFFSET;
|
||||||
long lengthInBytes = length * SIZEOF_INT;
|
long lengthInBytes = length * SIZEOF_INT;
|
||||||
copyFromArray(x, offsetInBytes, curAddress, lengthInBytes);
|
unsafe.copyMemory(x, offsetInBytes, null, curAddress, lengthInBytes);
|
||||||
position(position() + lengthInBytes);
|
position(position() + lengthInBytes);
|
||||||
} else {
|
} else {
|
||||||
int end = offset + length;
|
int end = offset + length;
|
||||||
@ -246,9 +232,9 @@ public class RenderBuffer {
|
|||||||
public RenderBuffer put(float[] x, int offset, int length) {
|
public RenderBuffer put(float[] x, int offset, int length) {
|
||||||
// assert (position() % SIZEOF_FLOAT == 0);
|
// assert (position() % SIZEOF_FLOAT == 0);
|
||||||
if (length > COPY_FROM_ARRAY_THRESHOLD) {
|
if (length > COPY_FROM_ARRAY_THRESHOLD) {
|
||||||
long offsetInBytes = offset * SIZEOF_FLOAT;
|
long offsetInBytes = offset * SIZEOF_FLOAT + Unsafe.ARRAY_FLOAT_BASE_OFFSET;
|
||||||
long lengthInBytes = length * SIZEOF_FLOAT;
|
long lengthInBytes = length * SIZEOF_FLOAT;
|
||||||
copyFromArray(x, offsetInBytes, curAddress, lengthInBytes);
|
unsafe.copyMemory(x, offsetInBytes, null, curAddress, lengthInBytes);
|
||||||
position(position() + lengthInBytes);
|
position(position() + lengthInBytes);
|
||||||
} else {
|
} else {
|
||||||
int end = offset + length;
|
int end = offset + length;
|
||||||
@ -277,9 +263,9 @@ public class RenderBuffer {
|
|||||||
public RenderBuffer put(long[] x, int offset, int length) {
|
public RenderBuffer put(long[] x, int offset, int length) {
|
||||||
// assert (position() % SIZEOF_LONG == 0);
|
// assert (position() % SIZEOF_LONG == 0);
|
||||||
if (length > COPY_FROM_ARRAY_THRESHOLD) {
|
if (length > COPY_FROM_ARRAY_THRESHOLD) {
|
||||||
long offsetInBytes = offset * SIZEOF_LONG;
|
long offsetInBytes = offset * SIZEOF_LONG + Unsafe.ARRAY_LONG_BASE_OFFSET;
|
||||||
long lengthInBytes = length * SIZEOF_LONG;
|
long lengthInBytes = length * SIZEOF_LONG;
|
||||||
copyFromArray(x, offsetInBytes, curAddress, lengthInBytes);
|
unsafe.copyMemory(x, offsetInBytes, null, curAddress, lengthInBytes);
|
||||||
position(position() + lengthInBytes);
|
position(position() + lengthInBytes);
|
||||||
} else {
|
} else {
|
||||||
int end = offset + length;
|
int end = offset + length;
|
||||||
|
@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2005 Sun Microsystems, Inc. All Rights Reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Sun designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Sun in the LICENSE file that accompanied this code.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
||||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
|
||||||
* have any questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "jni.h"
|
|
||||||
#include "jni_util.h"
|
|
||||||
#include "jlong.h"
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "sun_java2d_pipe_RenderBuffer.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Note: The code in this file is nearly identical to that in
|
|
||||||
* java/nio/Bits.c...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define MBYTE 1048576
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
|
||||||
Java_sun_java2d_pipe_RenderBuffer_copyFromArray
|
|
||||||
(JNIEnv *env, jclass rb,
|
|
||||||
jobject srcArray, jlong srcPos, jlong dstAddr, jlong length)
|
|
||||||
{
|
|
||||||
jbyte *bytes;
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
while (length > 0) {
|
|
||||||
/*
|
|
||||||
* Copy no more than one megabyte at a time, to allow for GC.
|
|
||||||
* (Probably not an issue for STR, since our buffer size is likely
|
|
||||||
* much smaller than a megabyte, but just in case...)
|
|
||||||
*/
|
|
||||||
size = (size_t)(length > MBYTE ? MBYTE : length);
|
|
||||||
|
|
||||||
bytes = (*env)->GetPrimitiveArrayCritical(env, srcArray, NULL);
|
|
||||||
if (bytes == NULL) {
|
|
||||||
JNU_ThrowInternalError(env, "Unable to get array");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(jlong_to_ptr(dstAddr), bytes + srcPos, size);
|
|
||||||
|
|
||||||
(*env)->ReleasePrimitiveArrayCritical(env, srcArray,
|
|
||||||
bytes, JNI_ABORT);
|
|
||||||
|
|
||||||
length -= size;
|
|
||||||
dstAddr += size;
|
|
||||||
srcPos += size;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user