Unverified Commit a97f6e93 authored by Roman Sedaikin's avatar Roman Sedaikin Committed by GitHub

Fixed getting surface in SOFTWARE_FAST renderer. (#388)

parent 8be256ce
...@@ -83,16 +83,16 @@ extern "C" ...@@ -83,16 +83,16 @@ extern "C"
JNIEnv *env, jobject redrawer, jlong devicePtr) JNIEnv *env, jobject redrawer, jlong devicePtr)
{ {
SoftwareDevice *device = fromJavaPointer<SoftwareDevice *>(devicePtr); SoftwareDevice *device = fromJavaPointer<SoftwareDevice *>(devicePtr);
device->surface.get()->ref(); return toJavaPointer(device->surface.release());
return toJavaPointer(device->surface.get());
} }
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_AbstractDirectSoftwareRedrawer_finishFrame( JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_AbstractDirectSoftwareRedrawer_finishFrame(
JNIEnv *env, jobject redrawer, jlong devicePtr) JNIEnv *env, jobject redrawer, jlong devicePtr, jlong surfacePtr)
{ {
SoftwareDevice *device = fromJavaPointer<SoftwareDevice *>(devicePtr); SoftwareDevice *device = fromJavaPointer<SoftwareDevice *>(devicePtr);
SkSurface *surface = fromJavaPointer<SkSurface *>(surfacePtr);
SkPixmap pm; SkPixmap pm;
if (!device->surface->peekPixels(&pm)) { if (!surface->peekPixels(&pm)) {
return; return;
} }
int bitsPerPixel = pm.info().bytesPerPixel() * 8; int bitsPerPixel = pm.info().bytesPerPixel() * 8;
......
...@@ -68,12 +68,11 @@ extern "C" ...@@ -68,12 +68,11 @@ extern "C"
JNIEnv *env, jobject redrawer, jlong devicePtr) JNIEnv *env, jobject redrawer, jlong devicePtr)
{ {
SoftwareDevice *device = fromJavaPointer<SoftwareDevice *>(devicePtr); SoftwareDevice *device = fromJavaPointer<SoftwareDevice *>(devicePtr);
device->surface.get()->ref(); return toJavaPointer(device->surface.release());
return toJavaPointer(device->surface.get());
} }
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_AbstractDirectSoftwareRedrawer_finishFrame( JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_AbstractDirectSoftwareRedrawer_finishFrame(
JNIEnv *env, jobject redrawer, jlong devicePtr) JNIEnv *env, jobject redrawer, jlong devicePtr, jlong surfacePtr)
{ {
__try __try
{ {
......
...@@ -5,6 +5,7 @@ import org.jetbrains.skia.impl.Native ...@@ -5,6 +5,7 @@ import org.jetbrains.skia.impl.Native
import org.jetbrains.skia.impl.getPtr import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skiko.SkiaLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.redrawer.AbstractDirectSoftwareRedrawer import org.jetbrains.skiko.redrawer.AbstractDirectSoftwareRedrawer
import java.lang.ref.Reference
internal class DirectSoftwareContextHandler(layer: SkiaLayer) : JvmContextHandler(layer) { internal class DirectSoftwareContextHandler(layer: SkiaLayer) : JvmContextHandler(layer) {
var isInited = false var isInited = false
...@@ -46,6 +47,10 @@ internal class DirectSoftwareContextHandler(layer: SkiaLayer) : JvmContextHandle ...@@ -46,6 +47,10 @@ internal class DirectSoftwareContextHandler(layer: SkiaLayer) : JvmContextHandle
} }
override fun flush() { override fun flush() {
softwareRedrawer.finishFrame() try {
softwareRedrawer.finishFrame(getPtr(surface!!))
} finally {
Reference.reachabilityFence(surface!!)
}
} }
} }
\ No newline at end of file
...@@ -51,7 +51,7 @@ internal abstract class AbstractDirectSoftwareRedrawer( ...@@ -51,7 +51,7 @@ internal abstract class AbstractDirectSoftwareRedrawer(
} }
return Surface(surface) return Surface(surface)
} }
open fun finishFrame() = finishFrame(device) open fun finishFrame(surface: Long) = finishFrame(device, surface)
override fun dispose() { override fun dispose() {
frameDispatcher.cancel() frameDispatcher.cancel()
contextHandler.dispose() contextHandler.dispose()
...@@ -63,6 +63,6 @@ internal abstract class AbstractDirectSoftwareRedrawer( ...@@ -63,6 +63,6 @@ internal abstract class AbstractDirectSoftwareRedrawer(
private external fun resize(devicePtr: Long, width: Int, height: Int) private external fun resize(devicePtr: Long, width: Int, height: Int)
private external fun acquireSurface(devicePtr: Long): Long private external fun acquireSurface(devicePtr: Long): Long
private external fun finishFrame(devicePtr: Long) private external fun finishFrame(devicePtr: Long, surfacePtr: Long)
private external fun disposeDevice(devicePtr: Long) private external fun disposeDevice(devicePtr: Long)
} }
\ No newline at end of file
...@@ -36,8 +36,8 @@ internal class LinuxSoftwareRedrawer( ...@@ -36,8 +36,8 @@ internal class LinuxSoftwareRedrawer(
super.resize(width, height) super.resize(width, height)
} }
override fun finishFrame() = layer.backedLayer.lockLinuxDrawingSurface { override fun finishFrame(surface: Long) = layer.backedLayer.lockLinuxDrawingSurface {
super.finishFrame() super.finishFrame(surface)
} }
private external fun createDevice(display: Long, window: Long, width: Int, height: Int): Long private external fun createDevice(display: Long, window: Long, width: Int, height: Int): Long
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment