Commit 9d840af0 authored by Roman Sedaikin's avatar Roman Sedaikin

Refactoring: BuffersCount, toJavaPointer, fromJavaPointer, directXRedrawer.

parent e1188e24
#ifdef SK_DIRECT3D #ifdef SK_DIRECT3D
#include <windows.h> #include <windows.h>
#include <jawt_md.h> #include <jawt_md.h>
#include "jni_helpers.h"
#include "GrBackendSurface.h" #include "GrBackendSurface.h"
#include "GrDirectContext.h" #include "GrDirectContext.h"
#include "SkSurface.h" #include "SkSurface.h"
...@@ -11,6 +13,7 @@ ...@@ -11,6 +13,7 @@
#include <d3d12.h> #include <d3d12.h>
#include <dxgi1_4.h> #include <dxgi1_4.h>
#define GR_D3D_CALL_ERRCHECK(X) \ #define GR_D3D_CALL_ERRCHECK(X) \
do \ do \
{ \ { \
...@@ -22,7 +25,7 @@ ...@@ -22,7 +25,7 @@
} \ } \
} while (false) } while (false)
extern "C" jboolean Skiko_GetAWT(JNIEnv *env, JAWT *awt); const int BuffersCount = 2;
class DirectXDevice class DirectXDevice
{ {
...@@ -49,15 +52,15 @@ extern "C" ...@@ -49,15 +52,15 @@ extern "C"
JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_makeDirectXContext( JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_makeDirectXContext(
JNIEnv* env, jobject redrawer, jlong devicePtr) JNIEnv* env, jobject redrawer, jlong devicePtr)
{ {
DirectXDevice *d3dDevice = reinterpret_cast<DirectXDevice *>(static_cast<uintptr_t>(devicePtr)); DirectXDevice *d3dDevice = fromJavaPointer<DirectXDevice*>(devicePtr);
GrD3DBackendContext backendContext = d3dDevice->backendContext; GrD3DBackendContext backendContext = d3dDevice->backendContext;
return reinterpret_cast<jlong>(GrDirectContext::MakeDirect3D(backendContext).release()); return toJavaPointer(GrDirectContext::MakeDirect3D(backendContext).release());
} }
JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_makeDirectXRenderTarget( JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_makeDirectXRenderTarget(
JNIEnv * env, jobject redrawer, jlong devicePtr, jint width, jint height) JNIEnv * env, jobject redrawer, jlong devicePtr, jint width, jint height)
{ {
DirectXDevice *d3dDevice = reinterpret_cast<DirectXDevice *>(static_cast<uintptr_t>(devicePtr)); DirectXDevice *d3dDevice = fromJavaPointer<DirectXDevice*>(devicePtr);
d3dDevice->bufferIndex = d3dDevice->swapChain->GetCurrentBackBufferIndex(); d3dDevice->bufferIndex = d3dDevice->swapChain->GetCurrentBackBufferIndex();
ID3D12Resource* buffer; ID3D12Resource* buffer;
GR_D3D_CALL_ERRCHECK(d3dDevice->swapChain->GetBuffer(d3dDevice->bufferIndex, IID_PPV_ARGS(&buffer))); GR_D3D_CALL_ERRCHECK(d3dDevice->swapChain->GetBuffer(d3dDevice->bufferIndex, IID_PPV_ARGS(&buffer)));
...@@ -69,7 +72,7 @@ extern "C" ...@@ -69,7 +72,7 @@ extern "C"
1, 1,
0); 0);
GrBackendRenderTarget* renderTarget = new GrBackendRenderTarget(width, height, info); GrBackendRenderTarget* renderTarget = new GrBackendRenderTarget(width, height, info);
return reinterpret_cast<jlong>(renderTarget); return toJavaPointer(renderTarget);
} }
void defineHardwareAdapter(IDXGIFactory4 *pFactory, IDXGIAdapter1 **ppAdapter) void defineHardwareAdapter(IDXGIFactory4 *pFactory, IDXGIAdapter1 **ppAdapter)
...@@ -127,13 +130,13 @@ extern "C" ...@@ -127,13 +130,13 @@ extern "C"
d3dDevice->device = device; d3dDevice->device = device;
d3dDevice->queue = queue; d3dDevice->queue = queue;
return reinterpret_cast<jlong>(d3dDevice); return toJavaPointer(d3dDevice);
} }
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_createSwapChain( JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_createSwapChain(
JNIEnv *env, jobject redrawer, jlong windowHandle, jlong devicePtr) JNIEnv *env, jobject redrawer, jlong windowHandle, jlong devicePtr)
{ {
DirectXDevice *d3dDevice = reinterpret_cast<DirectXDevice *>(static_cast<uintptr_t>(devicePtr)); DirectXDevice *d3dDevice = fromJavaPointer<DirectXDevice*>(devicePtr);
// Make the swapchain // Make the swapchain
HWND fWindow = (HWND)windowHandle; HWND fWindow = (HWND)windowHandle;
...@@ -142,7 +145,7 @@ extern "C" ...@@ -142,7 +145,7 @@ extern "C"
GR_D3D_CALL_ERRCHECK(CreateDXGIFactory2(0, IID_PPV_ARGS(&factory))); GR_D3D_CALL_ERRCHECK(CreateDXGIFactory2(0, IID_PPV_ARGS(&factory)));
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {}; DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
swapChainDesc.BufferCount = 2; swapChainDesc.BufferCount = BuffersCount;
swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
...@@ -161,10 +164,10 @@ extern "C" ...@@ -161,10 +164,10 @@ extern "C"
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_resizeBuffers( JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_resizeBuffers(
JNIEnv *env, jobject redrawer, jlong devicePtr, jint width, jint height) JNIEnv *env, jobject redrawer, jlong devicePtr, jint width, jint height)
{ {
DirectXDevice *d3dDevice = reinterpret_cast<DirectXDevice *>(static_cast<uintptr_t>(devicePtr)); DirectXDevice *d3dDevice = fromJavaPointer<DirectXDevice*>(devicePtr);
if (!d3dDevice->isSizeEqualTo(width, height)) if (!d3dDevice->isSizeEqualTo(width, height))
{ {
GR_D3D_CALL_ERRCHECK(d3dDevice->swapChain->ResizeBuffers(2, width, height, DXGI_FORMAT_R8G8B8A8_UNORM, 0)); GR_D3D_CALL_ERRCHECK(d3dDevice->swapChain->ResizeBuffers(BuffersCount, width, height, DXGI_FORMAT_R8G8B8A8_UNORM, 0));
d3dDevice->bufferWidth = width; d3dDevice->bufferWidth = width;
d3dDevice->bufferHeight = height; d3dDevice->bufferHeight = height;
} }
...@@ -173,11 +176,11 @@ extern "C" ...@@ -173,11 +176,11 @@ extern "C"
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_finishFrame( JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_finishFrame(
JNIEnv *env, jobject redrawer, jlong devicePtr, jlong contextPtr, jlong surfacePtr) JNIEnv *env, jobject redrawer, jlong devicePtr, jlong contextPtr, jlong surfacePtr)
{ {
DirectXDevice *d3dDevice = reinterpret_cast<DirectXDevice *>(static_cast<uintptr_t>(devicePtr)); DirectXDevice *d3dDevice = fromJavaPointer<DirectXDevice*>(devicePtr);
SkSurface *surface = reinterpret_cast<SkSurface *>(static_cast<uintptr_t>(surfacePtr)); SkSurface *surface = fromJavaPointer<SkSurface*>(surfacePtr);
surface->flushAndSubmit(); surface->flushAndSubmit();
GrDirectContext *fContext = reinterpret_cast<GrDirectContext *>(static_cast<uintptr_t>(contextPtr)); GrDirectContext *fContext = fromJavaPointer<GrDirectContext*>(contextPtr);
surface->flush(SkSurface::BackendSurfaceAccess::kPresent, GrFlushInfo()); surface->flush(SkSurface::BackendSurfaceAccess::kPresent, GrFlushInfo());
fContext->flush({}); fContext->flush({});
fContext->submit(true); fContext->submit(true);
......
...@@ -26,7 +26,7 @@ open class SkiaLayer : HardwareLayer() { ...@@ -26,7 +26,7 @@ open class SkiaLayer : HardwareLayer() {
@Volatile @Volatile
private var isDisposed = false private var isDisposed = false
private var redrawer: Redrawer? = null internal var redrawer: Redrawer? = null
@Volatile @Volatile
private var picture: PictureHolder? = null private var picture: PictureHolder? = null
...@@ -103,7 +103,7 @@ open class SkiaLayer : HardwareLayer() { ...@@ -103,7 +103,7 @@ open class SkiaLayer : HardwareLayer() {
override fun draw() { override fun draw() {
check(!isDisposed) check(!isDisposed)
contextHandler.apply { contextHandler.apply {
if (!initContext(redrawer!!)) { if (!initContext()) {
fallbackToRaster() fallbackToRaster()
return return
} }
......
...@@ -30,10 +30,12 @@ internal object SkikoProperties { ...@@ -30,10 +30,12 @@ internal object SkikoProperties {
"SOFTWARE" -> return GraphicsApi.SOFTWARE "SOFTWARE" -> return GraphicsApi.SOFTWARE
"OPENGL" -> return GraphicsApi.OPENGL "OPENGL" -> return GraphicsApi.OPENGL
"DIRECT3D" -> { "DIRECT3D" -> {
return if (hostOs == OS.Windows) GraphicsApi.DIRECT3D else bestRenderApiForCurrentOS() return if (hostOs == OS.Windows) GraphicsApi.DIRECT3D
else throw Exception("$hostOs does not support DirectX rendering API.")
} }
"METAL" -> { "METAL" -> {
return if (hostOs == OS.MacOS) GraphicsApi.METAL else bestRenderApiForCurrentOS() return if (hostOs == OS.MacOS) GraphicsApi.METAL
else throw Exception("$hostOs does not support Metal rendering API.")
} }
else -> return bestRenderApiForCurrentOS() else -> return bestRenderApiForCurrentOS()
} }
......
...@@ -6,13 +6,13 @@ import org.jetbrains.skija.DirectContext ...@@ -6,13 +6,13 @@ import org.jetbrains.skija.DirectContext
import org.jetbrains.skija.Picture import org.jetbrains.skija.Picture
import org.jetbrains.skija.Surface import org.jetbrains.skija.Surface
import org.jetbrains.skiko.GraphicsApi import org.jetbrains.skiko.GraphicsApi
import org.jetbrains.skiko.HardwareLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.OS import org.jetbrains.skiko.OS
import org.jetbrains.skiko.SkikoProperties import org.jetbrains.skiko.SkikoProperties
import org.jetbrains.skiko.hostOs import org.jetbrains.skiko.hostOs
import org.jetbrains.skiko.redrawer.Redrawer import org.jetbrains.skiko.redrawer.Redrawer
internal fun createContextHandler(layer: HardwareLayer): ContextHandler { internal fun createContextHandler(layer: SkiaLayer): ContextHandler {
return when (SkikoProperties.renderApi) { return when (SkikoProperties.renderApi) {
GraphicsApi.SOFTWARE -> SoftwareContextHandler(layer) GraphicsApi.SOFTWARE -> SoftwareContextHandler(layer)
GraphicsApi.OPENGL -> OpenGLContextHandler(layer) GraphicsApi.OPENGL -> OpenGLContextHandler(layer)
...@@ -21,14 +21,14 @@ internal fun createContextHandler(layer: HardwareLayer): ContextHandler { ...@@ -21,14 +21,14 @@ internal fun createContextHandler(layer: HardwareLayer): ContextHandler {
} }
} }
internal abstract class ContextHandler(val layer: HardwareLayer) { internal abstract class ContextHandler(val layer: SkiaLayer) {
open val bleachConstant = if (hostOs == OS.MacOS) 0 else -1 open val bleachConstant = if (hostOs == OS.MacOS) 0 else -1
var context: DirectContext? = null var context: DirectContext? = null
var renderTarget: BackendRenderTarget? = null var renderTarget: BackendRenderTarget? = null
var surface: Surface? = null var surface: Surface? = null
var canvas: Canvas? = null var canvas: Canvas? = null
abstract fun initContext(redrawer: Redrawer): Boolean abstract fun initContext(): Boolean
abstract fun initCanvas() abstract fun initCanvas()
......
...@@ -7,19 +7,17 @@ import org.jetbrains.skija.Surface ...@@ -7,19 +7,17 @@ import org.jetbrains.skija.Surface
import org.jetbrains.skija.SurfaceColorFormat import org.jetbrains.skija.SurfaceColorFormat
import org.jetbrains.skija.SurfaceOrigin import org.jetbrains.skija.SurfaceOrigin
import org.jetbrains.skija.impl.Native import org.jetbrains.skija.impl.Native
import org.jetbrains.skiko.HardwareLayer
import org.jetbrains.skiko.SkiaLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.redrawer.Direct3DRedrawer import org.jetbrains.skiko.redrawer.Direct3DRedrawer
import org.jetbrains.skiko.redrawer.Redrawer import org.jetbrains.skiko.redrawer.Redrawer
internal class Direct3DContextHandler(layer: HardwareLayer) : ContextHandler(layer) { internal class Direct3DContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
lateinit var directXRedrawer: Direct3DRedrawer val directXRedrawer: Direct3DRedrawer
get() = layer.redrawer!! as Direct3DRedrawer
var device: Long = 0 var device: Long = 0
override fun initContext(redrawer: Redrawer): Boolean { override fun initContext(): Boolean {
try { try {
if (!this::directXRedrawer.isInitialized) {
directXRedrawer = redrawer as Direct3DRedrawer
}
if (context == null) { if (context == null) {
device = directXRedrawer.createDevice() device = directXRedrawer.createDevice()
directXRedrawer.createSwapChain(layer.windowHandle, device) directXRedrawer.createSwapChain(layer.windowHandle, device)
......
...@@ -5,13 +5,13 @@ import org.jetbrains.skija.Surface ...@@ -5,13 +5,13 @@ import org.jetbrains.skija.Surface
import org.jetbrains.skija.SurfaceColorFormat import org.jetbrains.skija.SurfaceColorFormat
import org.jetbrains.skija.SurfaceOrigin import org.jetbrains.skija.SurfaceOrigin
import org.jetbrains.skiko.GraphicsApi import org.jetbrains.skiko.GraphicsApi
import org.jetbrains.skiko.HardwareLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.makeMetalContext import org.jetbrains.skiko.makeMetalContext
import org.jetbrains.skiko.makeMetalRenderTarget import org.jetbrains.skiko.makeMetalRenderTarget
import org.jetbrains.skiko.redrawer.Redrawer import org.jetbrains.skiko.redrawer.Redrawer
internal class MetalContextHandler(layer: HardwareLayer) : ContextHandler(layer) { internal class MetalContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
override fun initContext(redrawer: Redrawer): Boolean { override fun initContext(): Boolean {
try { try {
if (context == null) { if (context == null) {
context = makeMetalContext() context = makeMetalContext()
......
...@@ -6,14 +6,14 @@ import org.jetbrains.skija.Picture ...@@ -6,14 +6,14 @@ import org.jetbrains.skija.Picture
import org.jetbrains.skija.Surface import org.jetbrains.skija.Surface
import org.jetbrains.skija.SurfaceColorFormat import org.jetbrains.skija.SurfaceColorFormat
import org.jetbrains.skija.SurfaceOrigin import org.jetbrains.skija.SurfaceOrigin
import org.jetbrains.skiko.HardwareLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.makeGLContext import org.jetbrains.skiko.makeGLContext
import org.jetbrains.skiko.makeGLRenderTarget import org.jetbrains.skiko.makeGLRenderTarget
import org.jetbrains.skiko.OpenGLApi import org.jetbrains.skiko.OpenGLApi
import org.jetbrains.skiko.redrawer.Redrawer import org.jetbrains.skiko.redrawer.Redrawer
internal class OpenGLContextHandler(layer: HardwareLayer) : ContextHandler(layer) { internal class OpenGLContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
override fun initContext(redrawer: Redrawer): Boolean { override fun initContext(): Boolean {
try { try {
if (context == null) { if (context == null) {
context = makeGLContext() context = makeGLContext()
......
...@@ -14,12 +14,12 @@ import java.awt.image.Raster ...@@ -14,12 +14,12 @@ import java.awt.image.Raster
import org.jetbrains.skija.Bitmap import org.jetbrains.skija.Bitmap
import org.jetbrains.skija.ColorAlphaType import org.jetbrains.skija.ColorAlphaType
import org.jetbrains.skija.Canvas import org.jetbrains.skija.Canvas
import org.jetbrains.skiko.HardwareLayer import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skija.ImageInfo import org.jetbrains.skija.ImageInfo
import org.jetbrains.skija.Picture import org.jetbrains.skija.Picture
import org.jetbrains.skiko.redrawer.Redrawer import org.jetbrains.skiko.redrawer.Redrawer
internal class SoftwareContextHandler(layer: HardwareLayer) : ContextHandler(layer) { internal class SoftwareContextHandler(layer: SkiaLayer) : ContextHandler(layer) {
override val bleachConstant = -1 // it looks like java.awt.Canvas doesn't support transparency override val bleachConstant = -1 // it looks like java.awt.Canvas doesn't support transparency
val colorModel = ComponentColorModel( val colorModel = ComponentColorModel(
...@@ -34,7 +34,7 @@ internal class SoftwareContextHandler(layer: HardwareLayer) : ContextHandler(lay ...@@ -34,7 +34,7 @@ internal class SoftwareContextHandler(layer: HardwareLayer) : ContextHandler(lay
var imageData: ByteArray? = null var imageData: ByteArray? = null
var raster: WritableRaster? = null var raster: WritableRaster? = null
override fun initContext(redrawer: Redrawer): Boolean { override fun initContext(): Boolean {
// Raster does not need context // Raster does not need context
return true return true
} }
......
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