aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2019-11-29 07:32:52 +0100
committerSven Gothel <[email protected]>2019-11-29 07:32:52 +0100
commit381858b82c5197193ba2f490a8282149536a54f7 (patch)
tree4e416ce275283f84c051afb6d2b76496e09f137e
parentbdbdcdc800294db3a84926b79503fc2e0e919128 (diff)
Bug 1156: DRM/GBM: Add full PointerIcon (Cursor) Support
DRM allows 64x64 pixel cursor images, using GBM_FORMAT_ARGB888 only. Notable: GBM_FORMAT_ARGB888 == PixelFormat.BGRA8888 Having fixed mouse and keyboard input with previous commit, the demo com.jogamp.opengl.test.junit.jogl.demos.es2.newt.TestGearsES2NEWT shows via key press - i -> pointer visible/invisible - c -> pointer icon change
-rw-r--r--src/newt/classes/jogamp/newt/driver/bcm/vc/iv/WindowDriver.java11
-rw-r--r--src/newt/classes/jogamp/newt/driver/egl/gbm/DisplayDriver.java69
-rw-r--r--src/newt/classes/jogamp/newt/driver/egl/gbm/ScreenDriver.java97
-rw-r--r--src/newt/classes/jogamp/newt/driver/egl/gbm/WindowDriver.java63
-rw-r--r--src/newt/native/drm_gbm.c105
-rw-r--r--src/newt/native/drm_gbm_legacy.c2
6 files changed, 307 insertions, 40 deletions
diff --git a/src/newt/classes/jogamp/newt/driver/bcm/vc/iv/WindowDriver.java b/src/newt/classes/jogamp/newt/driver/bcm/vc/iv/WindowDriver.java
index 42ddb8e7f..31b1d7087 100644
--- a/src/newt/classes/jogamp/newt/driver/bcm/vc/iv/WindowDriver.java
+++ b/src/newt/classes/jogamp/newt/driver/bcm/vc/iv/WindowDriver.java
@@ -48,7 +48,7 @@ import jogamp.newt.PointerIconImpl;
import jogamp.newt.WindowImpl;
import jogamp.newt.driver.KeyTracker;
import jogamp.newt.driver.MouseTracker;
-import jogamp.newt.driver.linux.LinuxEventDeviceTracker;
+import jogamp.newt.driver.linux.LinuxKeyEventTracker;
import jogamp.newt.driver.linux.LinuxMouseTracker;
import jogamp.newt.driver.x11.X11UnderlayTracker;
import jogamp.opengl.egl.EGLDisplayUtil;
@@ -73,11 +73,8 @@ public class WindowDriver extends WindowImpl {
mouseTracker = x11UnderlayTracker;
keyTracker = x11UnderlayTracker;
} catch(final ExceptionInInitializerError e) {
- linuxMouseTracker = LinuxMouseTracker.getSingleton();
- linuxEventDeviceTracker = LinuxEventDeviceTracker.getSingleton();
-
- mouseTracker = linuxMouseTracker;
- keyTracker = linuxEventDeviceTracker;
+ mouseTracker = LinuxMouseTracker.getSingleton();
+ keyTracker = LinuxKeyEventTracker.getSingleton();
}
layer = -1;
@@ -301,8 +298,6 @@ public class WindowDriver extends WindowImpl {
//----------------------------------------------------------------------
// Internals only
//
- private LinuxMouseTracker linuxMouseTracker;
- private LinuxEventDeviceTracker linuxEventDeviceTracker;
private X11UnderlayTracker x11UnderlayTracker;
private MouseTracker mouseTracker;
diff --git a/src/newt/classes/jogamp/newt/driver/egl/gbm/DisplayDriver.java b/src/newt/classes/jogamp/newt/driver/egl/gbm/DisplayDriver.java
index 847532bb4..edc5fb532 100644
--- a/src/newt/classes/jogamp/newt/driver/egl/gbm/DisplayDriver.java
+++ b/src/newt/classes/jogamp/newt/driver/egl/gbm/DisplayDriver.java
@@ -27,18 +27,27 @@
*/
package jogamp.newt.driver.egl.gbm;
+import java.net.URLConnection;
+import java.nio.Buffer;
+import java.nio.ByteBuffer;
+
+import com.jogamp.common.nio.Buffers;
+import com.jogamp.common.util.IOUtil;
import com.jogamp.nativewindow.AbstractGraphicsDevice;
import com.jogamp.nativewindow.NativeWindowException;
+import com.jogamp.nativewindow.util.PixelFormat;
+import com.jogamp.newt.Display;
import com.jogamp.opengl.GLProfile;
+import com.jogamp.opengl.util.PNGPixelRect;
import jogamp.nativewindow.drm.DRMLib;
import jogamp.nativewindow.drm.DRMUtil;
import jogamp.newt.DisplayImpl;
import jogamp.newt.NEWTJNILibLoader;
+import jogamp.newt.PointerIconImpl;
import jogamp.opengl.egl.EGLDisplayUtil;
public class DisplayDriver extends DisplayImpl {
-
static {
NEWTJNILibLoader.loadNEWT();
GLProfile.initSingleton();
@@ -52,6 +61,20 @@ public class DisplayDriver extends DisplayImpl {
if (!WindowDriver.initIDs()) {
throw new NativeWindowException("Failed to initialize egl.gbm Window jmethodIDs");
}
+
+ PNGPixelRect image = null;
+ if( DisplayImpl.isPNGUtilAvailable() ) {
+ final IOUtil.ClassResources res = new IOUtil.ClassResources(new String[] { "newt/data/pointer-grey-alpha-16x24.png" }, DisplayDriver.class.getClassLoader(), null);
+ try {
+ final URLConnection urlConn = res.resolve(0);
+ if( null != urlConn ) {
+ image = PNGPixelRect.read(urlConn.getInputStream(), PixelFormat.BGRA8888, false /* directBuffer */, 0 /* destMinStrideInBytes */, false /* destIsGLOriented */);
+ }
+ } catch (final Exception e) {
+ e.printStackTrace();
+ }
+ }
+ defaultPointerIconImage = image;
}
public static void initSingleton() {
@@ -71,6 +94,15 @@ public class DisplayDriver extends DisplayImpl {
gbmHandle = DRMLib.gbm_create_device(drmFd);
aDevice = EGLDisplayUtil.eglCreateEGLGraphicsDevice(gbmHandle, AbstractGraphicsDevice.DEFAULT_CONNECTION, AbstractGraphicsDevice.DEFAULT_UNIT);
aDevice.open();
+
+ if( null != defaultPointerIconImage ) {
+ defaultPointerIcon = (PointerIconImpl) createPointerIcon(defaultPointerIconImage, 0, 0);
+ } else {
+ defaultPointerIcon = null;
+ }
+ if( DEBUG_POINTER_ICON ) {
+ System.err.println("Display.PointerIcon.createDefault: "+defaultPointerIcon);
+ }
}
@Override
@@ -87,6 +119,19 @@ public class DisplayDriver extends DisplayImpl {
DispatchMessages0();
}
+ @Override
+ public final PixelFormat getNativePointerIconPixelFormat() { return PixelFormat.BGRA8888; }
+
+ @Override
+ protected final long createPointerIconImpl(final PixelFormat pixelformat, final int width, final int height, final ByteBuffer pixels, final int hotX, final int hotY) {
+ return CreatePointerIcon(gbmHandle, pixels, width, height, hotX, hotY);
+ }
+
+ @Override
+ protected final void destroyPointerIconImpl(final long displayHandle, final long piHandle) {
+ DestroyPointerIcon0(piHandle);
+ }
+
//----------------------------------------------------------------------
// Internals only
//
@@ -94,5 +139,27 @@ public class DisplayDriver extends DisplayImpl {
private static native void DispatchMessages0();
+ private static long CreatePointerIcon(final long gbmDevice, final Buffer pixels, final int width, final int height, final int hotX, final int hotY) {
+ if( 0 >= width || width > 64 || 0 >= height || height > 64 ) {
+ throw new IllegalArgumentException("implementation only supports BGRA icons of size [1x1] -> [64x64]");
+ }
+ final boolean pixels_is_direct = Buffers.isDirect(pixels);
+ return CreatePointerIcon0(gbmDevice,
+ pixels_is_direct ? pixels : Buffers.getArray(pixels),
+ pixels_is_direct ? Buffers.getDirectBufferByteOffset(pixels) : Buffers.getIndirectBufferByteOffset(pixels),
+ pixels_is_direct,
+ width, height,
+ hotX, hotY);
+ }
+ private static native long CreatePointerIcon0(long gbmDevice, Object pixels, int pixels_byte_offset, boolean pixels_is_direct,
+ int width, int height, int hotX, int hotY);
+ private static native void DestroyPointerIcon0(long piHandle);
+ /* pp */ static native boolean SetPointerIcon0(int drmFd, int crtc_id, long piHandle, boolean enable, int x, int y);
+ /* pp */ static native boolean MovePointerIcon0(int drmFd, int crtc_id, int x, int y);
+
+ /* pp */ static final boolean DEBUG_POINTER_ICON = Display.DEBUG_POINTER_ICON;
+ /* pp */ PointerIconImpl defaultPointerIcon = null;
+
private long gbmHandle;
+ private static final PNGPixelRect defaultPointerIconImage;
}
diff --git a/src/newt/classes/jogamp/newt/driver/egl/gbm/ScreenDriver.java b/src/newt/classes/jogamp/newt/driver/egl/gbm/ScreenDriver.java
index 7d6c2b41c..77ec3ce1a 100644
--- a/src/newt/classes/jogamp/newt/driver/egl/gbm/ScreenDriver.java
+++ b/src/newt/classes/jogamp/newt/driver/egl/gbm/ScreenDriver.java
@@ -29,13 +29,19 @@ package jogamp.newt.driver.egl.gbm;
import com.jogamp.nativewindow.DefaultGraphicsScreen;
import com.jogamp.nativewindow.util.Rectangle;
+import com.jogamp.newt.Display;
import com.jogamp.newt.MonitorDevice;
import com.jogamp.newt.MonitorMode;
import jogamp.nativewindow.drm.DRMUtil;
import jogamp.nativewindow.drm.DrmMode;
+import jogamp.nativewindow.drm.drmModeConnector;
+import jogamp.nativewindow.drm.drmModeEncoder;
+import jogamp.nativewindow.drm.drmModeModeInfo;
import jogamp.newt.MonitorModeProps;
+import jogamp.newt.PointerIconImpl;
import jogamp.newt.ScreenImpl;
+import jogamp.newt.driver.linux.LinuxMouseTracker;
public class ScreenDriver extends ScreenImpl {
static {
@@ -52,10 +58,12 @@ public class ScreenDriver extends ScreenImpl {
if( DEBUG ) {
drmMode.print(System.err);
}
+ defaultPointerIcon = ((DisplayDriver)display).defaultPointerIcon;
}
@Override
protected void closeNativeImpl() {
+ defaultPointerIcon = null;
drmMode.destroy();
drmMode = null;
}
@@ -75,13 +83,17 @@ public class ScreenDriver extends ScreenImpl {
// FIXME add multi-monitor multi-mode support
final int scridx = 0; // getIndex();
+ final drmModeConnector[] connectors = drmMode.getConnectors();
+ final drmModeEncoder[] encoder = drmMode.getEncoder();
+ final drmModeModeInfo[] mode = drmMode.getModes();
+
int[] props = new int[ MonitorModeProps.NUM_MONITOR_MODE_PROPERTIES_ALL ];
int i = 0;
props[i++] = MonitorModeProps.NUM_MONITOR_MODE_PROPERTIES_ALL;
- props[i++] = drmMode.getModes()[scridx].getHdisplay();
- props[i++] = drmMode.getModes()[scridx].getVdisplay();
+ props[i++] = mode[scridx].getHdisplay();
+ props[i++] = mode[scridx].getVdisplay();
props[i++] = ScreenImpl.default_sm_bpp; // FIXME
- props[i++] = drmMode.getModes()[scridx].getVrefresh() * 100;
+ props[i++] = mode[scridx].getVrefresh() * 100;
props[i++] = 0; // flags
props[i++] = 0; // mode_idx
props[i++] = 0; // rotation
@@ -90,20 +102,26 @@ public class ScreenDriver extends ScreenImpl {
props = new int[MonitorModeProps.MIN_MONITOR_DEVICE_PROPERTIES - 1 - MonitorModeProps.NUM_MONITOR_MODE_PROPERTIES];
i = 0;
props[i++] = props.length;
- props[i++] = 0; // crt_idx
+ props[i++] = encoder[scridx].getCrtc_id(); // crt_id
props[i++] = 0; // is-clone
props[i++] = 1; // is-primary
- props[i++] = drmMode.getConnectors()[scridx].getMmWidth();
- props[i++] = drmMode.getConnectors()[scridx].getMmHeight();
+ props[i++] = connectors[scridx].getMmWidth();
+ props[i++] = connectors[scridx].getMmHeight();
props[i++] = 0; // rotated viewport x pixel-units
props[i++] = 0; // rotated viewport y pixel-units
- props[i++] = drmMode.getModes()[scridx].getHdisplay(); // rotated viewport width pixel-units
- props[i++] = drmMode.getModes()[scridx].getVdisplay(); // rotated viewport height pixel-units
+ props[i++] = mode[scridx].getHdisplay(); // rotated viewport width pixel-units
+ props[i++] = mode[scridx].getVdisplay(); // rotated viewport height pixel-units
props[i++] = 0; // rotated viewport x window-units
props[i++] = 0; // rotated viewport y window-units
- props[i++] = drmMode.getModes()[scridx].getHdisplay(); // rotated viewport width window-units
- props[i++] = drmMode.getModes()[scridx].getVdisplay(); // rotated viewport height window-units
+ props[i++] = mode[scridx].getHdisplay(); // rotated viewport width window-units
+ props[i++] = mode[scridx].getVdisplay(); // rotated viewport height window-units
MonitorModeProps.streamInMonitorDevice(cache, this, currentMode, null, cache.monitorModes, props, 0, null);
+
+ crtc_ids = new int[] { encoder[scridx].getCrtc_id() };
+ if( null != defaultPointerIcon ) {
+ final LinuxMouseTracker lmt = LinuxMouseTracker.getSingleton();
+ setPointerIconActive(defaultPointerIcon.getHandle(), lmt.getLastX(), lmt.getLastY());
+ }
}
@Override
@@ -126,8 +144,67 @@ public class ScreenDriver extends ScreenImpl {
viewportInWindowUnits.set(viewport);
}
+ /* pp */ void setPointerIconActive(long piHandle, final int x, final int y) {
+ synchronized(pointerIconSync) {
+ if( DisplayDriver.DEBUG_POINTER_ICON ) {
+ System.err.println("Screen.PointerIcon.set.0: "+Thread.currentThread().getName());
+ System.err.println("Screen.PointerIcon.set.0: crtc id "+Display.toHexString(crtc_ids[0])+", active ["+Display.toHexString(activePointerIcon)+", visible "+activePointerIconVisible+"] -> "+Display.toHexString(piHandle));
+ }
+ if( 0 != activePointerIcon && activePointerIconVisible ) {
+ System.err.println("Screen.PointerIcon.set.1");
+ DisplayDriver.SetPointerIcon0(DRMUtil.getDrmFd(), crtc_ids[0], activePointerIcon, false, x, y);
+ }
+ if( 0 == piHandle && null != defaultPointerIcon ) {
+ System.err.println("Screen.PointerIcon.set.2");
+ piHandle = ((DisplayDriver)display).defaultPointerIcon.getHandle();
+ }
+ if( 0 != piHandle ) {
+ System.err.println("Screen.PointerIcon.set.3");
+ DisplayDriver.SetPointerIcon0(DRMUtil.getDrmFd(), crtc_ids[0], piHandle, true, x, y);
+ activePointerIconVisible = true;
+ } else {
+ System.err.println("Screen.PointerIcon.set.4");
+ activePointerIconVisible = false;
+ }
+ activePointerIcon = piHandle;
+ if( DisplayDriver.DEBUG_POINTER_ICON ) {
+ System.err.println("Screen.PointerIcon.set.X: active ["+Display.toHexString(activePointerIcon)+", visible "+activePointerIconVisible+"]");
+ }
+ }
+ }
+ /* pp */ void setActivePointerIconVisible(final boolean visible, final int x, final int y) {
+ synchronized(pointerIconSync) {
+ if( DisplayDriver.DEBUG_POINTER_ICON ) {
+ System.err.println("Screen.PointerIcon.visible: crtc id "+Display.toHexString(crtc_ids[0])+", active ["+Display.toHexString(activePointerIcon)+", visible "+activePointerIconVisible+"] -> visible "+visible);
+ }
+ if( activePointerIconVisible != visible ) {
+ if( 0 != activePointerIcon ) {
+ DisplayDriver.SetPointerIcon0(DRMUtil.getDrmFd(), crtc_ids[0], activePointerIcon, visible, x, y);
+ }
+ activePointerIconVisible = visible;
+ }
+ }
+ }
+ /* pp */ void moveActivePointerIcon(final int x, final int y) {
+ synchronized(pointerIconSync) {
+ if( DisplayDriver.DEBUG_POINTER_ICON ) {
+ System.err.println("Screen.PointerIcon.move: crtc id "+Display.toHexString(crtc_ids[0])+", active ["+Display.toHexString(activePointerIcon)+", visible "+activePointerIconVisible+"], "+x+"/"+y);
+ }
+ if( 0 != activePointerIcon && activePointerIconVisible ) {
+ DisplayDriver.MovePointerIcon0(DRMUtil.getDrmFd(), crtc_ids[0], x, y);
+ }
+ }
+ }
+
+
/* pp */ DrmMode drmMode;
protected static native boolean initIDs();
protected native void initNative(long drmHandle);
+ protected int[] crtc_ids;
+
+ private long activePointerIcon;
+ private boolean activePointerIconVisible;
+ private final Object pointerIconSync = new Object();
+ private PointerIconImpl defaultPointerIcon = null;
}
diff --git a/src/newt/classes/jogamp/newt/driver/egl/gbm/WindowDriver.java b/src/newt/classes/jogamp/newt/driver/egl/gbm/WindowDriver.java
index 7253fac52..de09ba6e3 100644
--- a/src/newt/classes/jogamp/newt/driver/egl/gbm/WindowDriver.java
+++ b/src/newt/classes/jogamp/newt/driver/egl/gbm/WindowDriver.java
@@ -28,17 +28,15 @@
package jogamp.newt.driver.egl.gbm;
import java.nio.ByteBuffer;
-import java.nio.IntBuffer;
import com.jogamp.common.nio.Buffers;
-import com.jogamp.nativewindow.AbstractGraphicsDevice;
import com.jogamp.nativewindow.AbstractGraphicsScreen;
import com.jogamp.nativewindow.NativeWindowException;
-import com.jogamp.nativewindow.egl.EGLGraphicsDevice;
import com.jogamp.nativewindow.util.Point;
import com.jogamp.nativewindow.util.Rectangle;
import com.jogamp.nativewindow.util.RectangleImmutable;
import com.jogamp.newt.Display;
+import com.jogamp.newt.event.MouseEvent;
import com.jogamp.opengl.GLCapabilitiesChooser;
import com.jogamp.opengl.GLCapabilitiesImmutable;
import com.jogamp.opengl.GLException;
@@ -48,8 +46,11 @@ import jogamp.nativewindow.drm.DRMLib;
import jogamp.nativewindow.drm.DRMUtil;
import jogamp.nativewindow.drm.DrmMode;
import jogamp.nativewindow.drm.drmModeModeInfo;
+import jogamp.newt.PointerIconImpl;
import jogamp.newt.WindowImpl;
-import jogamp.newt.driver.linux.LinuxEventDeviceTracker;
+import jogamp.newt.driver.KeyTracker;
+import jogamp.newt.driver.MouseTracker;
+import jogamp.newt.driver.linux.LinuxKeyEventTracker;
import jogamp.newt.driver.linux.LinuxMouseTracker;
import jogamp.opengl.egl.EGLGraphicsConfiguration;
import jogamp.opengl.egl.EGLGraphicsConfigurationFactory;
@@ -62,8 +63,8 @@ public class WindowDriver extends WindowImpl {
}
public WindowDriver() {
- linuxMouseTracker = null; // LinuxMouseTracker.getSingleton();
- linuxEventDeviceTracker = null; // LinuxEventDeviceTracker.getSingleton();
+ mouseTracker = LinuxMouseTracker.getSingleton();
+ keyTracker = LinuxKeyEventTracker.getSingleton();
windowHandleClose = 0;
}
@@ -236,11 +237,11 @@ public class WindowDriver extends WindowImpl {
lastBO = 0;
- if( null != linuxEventDeviceTracker ) {
- addWindowListener(linuxEventDeviceTracker);
+ if( null != keyTracker ) {
+ addWindowListener(keyTracker);
}
- if( null != linuxMouseTracker ) {
- addWindowListener(linuxMouseTracker);
+ if( null != mouseTracker ) {
+ addWindowListener(mouseTracker);
}
visibleChanged(true);
focusChanged(false, true);
@@ -250,11 +251,11 @@ public class WindowDriver extends WindowImpl {
protected void closeNativeImpl() {
final Display display = getScreen().getDisplay();
- if( null != linuxMouseTracker ) {
- removeWindowListener(linuxMouseTracker);
+ if( null != mouseTracker ) {
+ removeWindowListener(mouseTracker);
}
- if( null != linuxEventDeviceTracker ) {
- removeWindowListener(linuxEventDeviceTracker);
+ if( null != keyTracker ) {
+ removeWindowListener(keyTracker);
}
lastBO = 0;
@@ -307,7 +308,7 @@ public class WindowDriver extends WindowImpl {
@Override
protected final int getSupportedReconfigMaskImpl() {
- return minimumReconfigStateMask
+ return minimumReconfigStateMask |
// | STATE_MASK_UNDECORATED
// | STATE_MASK_ALWAYSONTOP
// | STATE_MASK_ALWAYSONBOTTOM
@@ -315,9 +316,8 @@ public class WindowDriver extends WindowImpl {
// | STATE_MASK_RESIZABLE
// | STATE_MASK_MAXIMIZED_VERT
// | STATE_MASK_MAXIMIZED_HORZ
- // | STATE_MASK_POINTERVISIBLE
- // | STATE_MASK_POINTERCONFINED
- ;
+ STATE_MASK_POINTERVISIBLE |
+ STATE_MASK_POINTERCONFINED;
}
@Override
@@ -334,11 +334,34 @@ public class WindowDriver extends WindowImpl {
return new Point(x,y);
}
+ @Override
+ protected final void doMouseEvent(final boolean enqueue, final boolean wait, final short eventType, final int modifiers,
+ final int x, final int y, final short button, final float[] rotationXYZ, final float rotationScale) {
+ if( MouseEvent.EVENT_MOUSE_MOVED == eventType || MouseEvent.EVENT_MOUSE_DRAGGED == eventType ) {
+ final ScreenDriver screen = (ScreenDriver) getScreen();
+ screen.moveActivePointerIcon(getX() + x, getY() + y);
+ }
+ super.doMouseEvent(enqueue, wait, eventType, modifiers, x, y, button, rotationXYZ, rotationScale);
+ }
+
+ @Override
+ protected void setPointerIconImpl(final PointerIconImpl pi) {
+ final ScreenDriver screen = (ScreenDriver) getScreen();
+ screen.setPointerIconActive(null != pi ? pi.validatedHandle() : 0, mouseTracker.getLastX(), mouseTracker.getLastY());
+ }
+
+ @Override
+ protected boolean setPointerVisibleImpl(final boolean pointerVisible) {
+ final ScreenDriver screen = (ScreenDriver) getScreen();
+ screen.setActivePointerIconVisible(pointerVisible, mouseTracker.getLastX(), mouseTracker.getLastY());
+ return true;
+ }
+
//----------------------------------------------------------------------
// Internals only
//
- private final LinuxMouseTracker linuxMouseTracker;
- private final LinuxEventDeviceTracker linuxEventDeviceTracker;
+ private final MouseTracker mouseTracker;
+ private final KeyTracker keyTracker;
private long windowHandleClose;
private long eglSurface;
private long lastBO;
diff --git a/src/newt/native/drm_gbm.c b/src/newt/native/drm_gbm.c
index 93b02dbe7..fd1879d88 100644
--- a/src/newt/native/drm_gbm.c
+++ b/src/newt/native/drm_gbm.c
@@ -49,6 +49,111 @@ JNIEXPORT void JNICALL Java_jogamp_newt_driver_egl_gbm_DisplayDriver_DispatchMes
{
}
+JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_egl_gbm_DisplayDriver_CreatePointerIcon0
+ (JNIEnv *env, jclass clazz, jlong jgbmDevice, jobject jpixels, jint pixels_byte_offset, jboolean pixels_is_direct,
+ jint width, jint height, jint hotX, jint hotY)
+{
+ const uint32_t *pixels = NULL;
+ struct gbm_device * gbmDevice = (struct gbm_device *) (intptr_t) jgbmDevice;
+ struct gbm_bo *bo = NULL;
+ uint32_t bo_handle;
+ uint32_t buf[64 * 64];
+ int i, j;
+
+ ERR_PRINT("cursor.cstr %dx%d %d/%d\n", width, height, hotX, hotY);
+
+ if ( NULL == jpixels ) {
+ ERR_PRINT("CreateCursor: null icon pixels\n");
+ return 0;
+ }
+ if( 0 >= width || width > 64 || 0 >= height || height > 64 ) {
+ ERR_PRINT("CreateCursor: icon must be of size [1..64] x [1..64]\n");
+ return 0;
+ }
+ {
+ const char * c1 = (const char *) ( JNI_TRUE == pixels_is_direct ?
+ (*env)->GetDirectBufferAddress(env, jpixels) :
+ (*env)->GetPrimitiveArrayCritical(env, jpixels, NULL) );
+ pixels = (uint32_t *) ( c1 + pixels_byte_offset );
+ }
+
+ bo = gbm_bo_create(gbmDevice, 64, 64,
+ GBM_FORMAT_ARGB8888,
+ // GBM_FORMAT_BGRA8888,
+ GBM_BO_USE_CURSOR_64X64 | GBM_BO_USE_WRITE);
+ if( NULL == bo ) {
+ ERR_PRINT("cursor.cstr gbm_bo_create failed\n");
+ return 0;
+ }
+
+ // align user data width x height -> 64 x 64
+ memset(buf, 0, sizeof(buf)); // cleanup
+ for(int i=0; i<height; i++) {
+ memcpy(buf + i * 64, pixels + i * width, width * 4);
+ }
+ if ( gbm_bo_write(bo, buf, sizeof(buf)) < 0 ) {
+ ERR_PRINT("cursor.cstr gbm_bo_write failed\n");
+ gbm_bo_destroy(bo);
+ return 0;
+ }
+ return (jlong) (intptr_t) bo;
+}
+
+JNIEXPORT void JNICALL Java_jogamp_newt_driver_egl_gbm_DisplayDriver_DestroyPointerIcon0
+ (JNIEnv *env, jclass clazz, jlong jcursor)
+{
+ struct gbm_bo *bo = (struct gbm_bo *) (intptr_t) jcursor;
+
+ if ( NULL == bo ) {
+ ERR_PRINT("DestroyCursor: null cursor\n");
+ return;
+ }
+ gbm_bo_destroy(bo);
+}
+
+JNIEXPORT jboolean JNICALL Java_jogamp_newt_driver_egl_gbm_DisplayDriver_SetPointerIcon0
+ (JNIEnv *env, jobject obj, jint drmFd, jint jcrtc_id, jlong jcursor, jboolean enable, jint x, jint y)
+{
+ uint32_t crtc_id = (uint32_t)jcrtc_id;
+ struct gbm_bo *bo = (struct gbm_bo *) (intptr_t) jcursor;
+ uint32_t bo_handle = gbm_bo_get_handle(bo).u32;
+ int ret;
+
+ // int drmModeSetCursor(int fd, uint32_t crtcId, uint32_t bo_handle, uint32_t width, uint32_t height);
+ // int drmModeSetCursor2(int fd, uint32_t crtcId, uint32_t bo_handle, uint32_t width, uint32_t height, int32_t hot_x, int32_t hot_y);
+ if( enable ) {
+ ret = drmModeSetCursor(drmFd, crtc_id, bo_handle, 64, 64);
+ if( ret ) {
+ ERR_PRINT("SetCursor enable failed: %d %s\n", ret, strerror(errno));
+ } else {
+ ret = drmModeMoveCursor(drmFd, crtc_id, x, y);
+ if( ret ) {
+ ERR_PRINT("SetCursor move failed: %d %s\n", ret, strerror(errno));
+ }
+ }
+ } else {
+ ret = drmModeSetCursor(drmFd, crtc_id, 0, 0, 0);
+ if( ret ) {
+ ERR_PRINT("SetCursor disable failed: %d %s\n", ret, strerror(errno));
+ }
+ }
+ return ret ? JNI_FALSE : JNI_TRUE;
+}
+
+JNIEXPORT jboolean JNICALL Java_jogamp_newt_driver_egl_gbm_DisplayDriver_MovePointerIcon0
+ (JNIEnv *env, jobject obj, jint drmFd, jint jcrtc_id, jint x, jint y)
+{
+ uint32_t crtc_id = (uint32_t)jcrtc_id;
+ int ret;
+
+ ret = drmModeMoveCursor(drmFd, crtc_id, x, y);
+ if( ret ) {
+ ERR_PRINT("cursor drmModeMoveCursor failed: %d %s\n", ret, strerror(errno));
+ return JNI_FALSE;
+ }
+ return JNI_TRUE;
+}
+
/**
* Screen
*/
diff --git a/src/newt/native/drm_gbm_legacy.c b/src/newt/native/drm_gbm_legacy.c
index 8cc1c3c15..a6356bacf 100644
--- a/src/newt/native/drm_gbm_legacy.c
+++ b/src/newt/native/drm_gbm_legacy.c
@@ -300,7 +300,7 @@ JNIEXPORT jlong JNICALL Java_jogamp_newt_driver_egl_gbm_WindowDriver_NextSwapSur
gbm_surface_release_buffer(gbmSurface, lastBO);
}
- DBG_PRINT( "EGL_GBM.Window NextSwapSurface0 %p -> %p\n", lastBO, nextBO);
+ // DBG_PRINT( "EGL_GBM.Window NextSwapSurface0 %p -> %p\n", lastBO, nextBO);
return (jlong) (intptr_t) nextBO;
}