Skip to content

Commit

Permalink
JBR-8287 Vulkan: enable hw accelerated VolatileImage
Browse files Browse the repository at this point in the history
Separated surfaces implementation into two files
Moved offscreen surface to the shared code
  • Loading branch information
avu authored and YaaZ committed Feb 26, 2025
1 parent 9c682e3 commit 6d1677d
Show file tree
Hide file tree
Showing 8 changed files with 319 additions and 333 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* Copyright 2025 JetBrains s.r.o.
* 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

package sun.java2d.vulkan;

import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.ColorModel;
import sun.java2d.SurfaceData;
import sun.java2d.pipe.BufferedContext;

/**
* SurfaceData object representing an off-screen buffer
*/
public class VKOffScreenSurfaceData extends VKSurfaceData {
private final Image offscreenImage;
private native void initOps(int width, int height);

public VKOffScreenSurfaceData(VKGraphicsConfig gc, Image image, ColorModel cm,
int type, int width, int height)
{
super(gc, cm, type, width, height);
offscreenImage = image;
initOps(width, height);
}

@Override
public SurfaceData getReplacement() {
return restoreContents(offscreenImage);
}

@Override
public GraphicsConfiguration getDeviceConfiguration() {
return null;
}

@Override
public long getNativeResource(int resType) {
return 0;
}

@Override
public Rectangle getBounds() {
return new Rectangle(width, height);
}

/**
* Returns destination Image associated with this SurfaceData.
*/
@Override
public Object getDestination() {
return offscreenImage;
}

@Override
public BufferedContext getContext() {
return getGraphicsConfig().getContext();
}


@Override
public boolean isOnScreen() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import sun.java2d.loops.CompositeType;
import sun.java2d.loops.GraphicsPrimitive;
import sun.java2d.loops.SurfaceType;
import static sun.java2d.pipe.BufferedOpCodes.CONFIGURE_SURFACE;
import sun.java2d.pipe.ParallelogramPipe;
import sun.java2d.pipe.PixelToParallelogramConverter;
import sun.java2d.pipe.RenderBuffer;
Expand Down Expand Up @@ -303,5 +304,22 @@ public VKGraphicsConfig getGraphicsConfig() {
return graphicsConfig;
}

protected synchronized void configure() {
VKRenderQueue rq = VKRenderQueue.getInstance();
rq.lock();
try {
RenderBuffer buf = rq.getBuffer();
rq.ensureCapacityAndAlignment(20, 4);
buf.putInt(CONFIGURE_SURFACE);
buf.putLong(getNativeOps());
buf.putInt(width);
buf.putInt(height);

rq.flushNow();
} finally {
rq.unlock();
}
}

public abstract boolean isOnScreen();
}
22 changes: 20 additions & 2 deletions src/java.desktop/share/native/common/java2d/vulkan/VKSurfaceData.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2024, JetBrains s.r.o.. All rights reserved.
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2025, JetBrains s.r.o.. 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
Expand Down Expand Up @@ -294,4 +294,22 @@ VkBool32 VKSD_ConfigureWindowSurface(VKWinSDOps* vkwinsdo) {
return VK_TRUE;
}

/*
* Class: sun_java2d_vulkan_VKOffScreenSurfaceData
* Method: initOps
* Signature: (II)V
*/
JNIEXPORT void JNICALL Java_sun_java2d_vulkan_VKOffScreenSurfaceData_initOps
(JNIEnv *env, jobject vksd, jint width, jint height) {
VKSDOps * sd = (VKSDOps*)SurfaceData_InitOps(env, vksd, sizeof(VKSDOps));
J2dTraceLn1(J2D_TRACE_VERBOSE, "VKOffScreenSurfaceData_initOps(%p)", sd);
if (sd == NULL) {
JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed.");
return;
}
sd->drawableType = VKSD_RT_TEXTURE;
sd->background = VKUtil_DecodeJavaColor(0);
VKRenderer_ConfigureSurface(sd, (VkExtent2D){width, height});
}

#endif /* !HEADLESS */
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ public VolatileImage createCompatibleVolatileImage(int width, int height,

@Override
public SurfaceData createSurfaceData(WLComponentPeer peer) {
return WLVKSurfaceData.createData(peer);
return new WLVKWindowSurfaceData(peer);
}

/**
Expand Down
Loading

0 comments on commit 6d1677d

Please sign in to comment.