Skip to content

Commit f211a48

Browse files
committed
fixup! JBR-8601 Vulkan: Decouple from Wayland
1 parent 2f2a15d commit f211a48

File tree

12 files changed

+237
-310
lines changed

12 files changed

+237
-310
lines changed

make/autoconf/lib-vulkan.m4

-7
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,6 @@ AC_DEFUN_ONCE([LIB_SETUP_VULKAN],
108108
fi
109109
fi
110110
111-
# Add platform-specific flags
112-
if test "x$VULKAN_ENABLED" = xtrue; then
113-
if test "x$NEEDS_LIB_WAYLAND" = xtrue; then
114-
VULKAN_FLAGS="$VULKAN_FLAGS -DVK_USE_PLATFORM_WAYLAND_KHR"
115-
fi
116-
fi
117-
118111
AC_SUBST(VULKAN_ENABLED)
119112
AC_SUBST(VULKAN_FLAGS)
120113
AC_SUBST(VULKAN_SHADER_COMPILER)

src/java.desktop/share/classes/sun/java2d/vulkan/VKSurfaceData.java

+10-13
Original file line numberDiff line numberDiff line change
@@ -67,20 +67,17 @@ public abstract class VKSurfaceData extends SurfaceData
6767
protected static VKDrawImage vkImagePipe;
6868

6969
static {
70-
if (!GraphicsEnvironment.isHeadless()) {
71-
VKRenderQueue rq = VKRenderQueue.getInstance();
72-
vkImagePipe = new VKDrawImage();
73-
vkTextPipe = new VKTextRenderer(rq);
74-
vkRenderPipe = new VKRenderer(rq);
75-
if (GraphicsPrimitive.tracingEnabled()) {
76-
vkTextPipe = vkTextPipe.traceWrap();
77-
//The wrapped vkRenderPipe will wrap the AA pipe as well...
78-
vkAAPgramPipe = vkRenderPipe.traceWrap();
79-
}
80-
vkAAPgramPipe = vkRenderPipe.getAAParallelogramPipe();
81-
vkTxRenderPipe =
82-
new PixelToParallelogramConverter(vkRenderPipe, vkRenderPipe, 1.0, 0.25, true);
70+
VKRenderQueue rq = VKRenderQueue.getInstance();
71+
vkImagePipe = new VKDrawImage();
72+
vkTextPipe = new VKTextRenderer(rq);
73+
vkRenderPipe = new VKRenderer(rq);
74+
if (GraphicsPrimitive.tracingEnabled()) {
75+
vkTextPipe = vkTextPipe.traceWrap();
76+
//The wrapped vkRenderPipe will wrap the AA pipe as well...
77+
vkAAPgramPipe = vkRenderPipe.traceWrap();
8378
}
79+
vkAAPgramPipe = vkRenderPipe.getAAParallelogramPipe();
80+
vkTxRenderPipe = new PixelToParallelogramConverter(vkRenderPipe, vkRenderPipe, 1.0, 0.25, true);
8481
}
8582

8683
private final VKFormat format;

src/java.desktop/share/native/common/java2d/vulkan/VKDevice.c

+13-8
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,6 @@ void VKDevice_CheckAndAdd(VKEnv* vk, VkPhysicalDevice physicalDevice) {
296296
};
297297
}
298298

299-
const char* VKFunctionTable_InitDevice(VKEnv* vk, VKDevice* device);
300-
301299
void VKDevice_Reset(VKDevice* device) {
302300
if (device == NULL) return;
303301
VKRenderer_Destroy(device->renderer);
@@ -377,13 +375,20 @@ Java_sun_java2d_vulkan_VKGPU_init(JNIEnv *env, jclass jClass, jlong jDevice) {
377375
}
378376
J2dRlsTraceLn1(J2D_TRACE_INFO, "VKDevice_init(%s)", device->name);
379377

380-
const char* missingAPI = VKFunctionTable_InitDevice(vk, device);
381-
if (missingAPI != NULL) {
378+
VkBool32 missingAPI = JNI_FALSE;
379+
DEVICE_FUNCTION_TABLE(CHECK_PROC_ADDR, missingAPI, vk->vkGetDeviceProcAddr, device->handle, device->)
380+
if (missingAPI) {
382381
VKDevice_Reset(device);
383-
const char* fixedMessage = "Vulkan: Required API is missing: ";
384-
char message[strlen(fixedMessage) + strlen(missingAPI) + 1];
385-
strcpy(message, fixedMessage);
386-
strcat(message, missingAPI);
382+
#define REQUIRED_API_MISSING_MESSAGE "Vulkan: Required API is missing: "
383+
size_t size = sizeof(REQUIRED_API_MISSING_MESSAGE);
384+
#define PFN_CALC_MISSING_NAMES_SIZE(_, NAME) if (device->NAME == NULL) size += sizeof(#NAME) + 1;
385+
DEVICE_FUNCTION_TABLE(PFN_CALC_MISSING_NAMES_SIZE)
386+
char message[size];
387+
memcpy(message, REQUIRED_API_MISSING_MESSAGE, size = sizeof(REQUIRED_API_MISSING_MESSAGE) - 1);
388+
#define PFN_APPEND_MISSING_NAME(_, NAME) if (device->NAME == NULL) { \
389+
memcpy(message + size, #NAME ", ", sizeof(#NAME) + 1); size += sizeof(#NAME) + 1; }
390+
DEVICE_FUNCTION_TABLE(PFN_APPEND_MISSING_NAME)
391+
message[size - 2] = '\0';
387392
JNU_ThrowByName(env, "java/lang/RuntimeException", message);
388393
return;
389394
}

src/java.desktop/share/native/common/java2d/vulkan/VKDevice.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "sun_java2d_vulkan_VKSwToSurfaceBlit.h"
3030
#include "VKTexturePool.h"
3131
#include "VKUtil.h"
32+
#include "VKFunctionTable.h"
3233

3334
/**
3435
* Description of a sampled source type bound to a specific format, supported on the device.
@@ -59,8 +60,7 @@ struct VKDevice {
5960
VKRenderer* renderer;
6061
VKTexturePool* texturePool;
6162

62-
#define DEVICE_FUNCTION_TABLE_ENTRY(NAME) PFN_ ## NAME NAME
63-
#include "VKFunctionTable.inl"
63+
DEVICE_FUNCTION_TABLE(DECL_PFN)
6464
};
6565

6666
#endif //VKDevice_h_Included

src/java.desktop/share/native/common/java2d/vulkan/VKEnv.c

+24-19
Original file line numberDiff line numberDiff line change
@@ -115,22 +115,22 @@ static VkBool32 debugCallback(
115115
}
116116
#endif
117117

118-
const char* VKFunctionTable_InitGlobal(PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr, VKFunctionTableGlobal* table);
119-
const char* VKFunctionTable_InitInstance(PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr, VKEnv* instance);
120-
121118
static VKEnv* VKEnv_Create(PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr, VKPlatformData* platformData) {
122119
if (vkGetInstanceProcAddr == NULL) return NULL;
123120

124-
VKFunctionTableGlobal table;
125-
const char* missingAPI = VKFunctionTable_InitGlobal(vkGetInstanceProcAddr, &table);
126-
if (missingAPI != NULL) {
127-
J2dRlsTraceLn1(J2D_TRACE_ERROR, "Vulkan: Required API is missing: %s", missingAPI)
121+
// Init global function table.
122+
VkBool32 missingAPI = JNI_FALSE;
123+
GLOBAL_FUNCTION_TABLE(DECL_PFN)
124+
GLOBAL_FUNCTION_TABLE(CHECK_PROC_ADDR, missingAPI, vkGetInstanceProcAddr, NULL,)
125+
if (missingAPI) {
126+
J2dRlsTraceLn(J2D_TRACE_ERROR, "Vulkan: Required API is missing:")
127+
GLOBAL_FUNCTION_TABLE(LOG_MISSING_PFN,)
128128
return NULL;
129129
}
130130

131131
uint32_t apiVersion = 0;
132132

133-
VK_IF_ERROR(table.vkEnumerateInstanceVersion(&apiVersion)) return NULL;
133+
VK_IF_ERROR(vkEnumerateInstanceVersion(&apiVersion)) return NULL;
134134

135135
J2dRlsTraceLn3(J2D_TRACE_INFO, "Vulkan: Available (%d.%d.%d)",
136136
VK_API_VERSION_MAJOR(apiVersion),
@@ -147,14 +147,14 @@ static VKEnv* VKEnv_Create(PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr, VKPl
147147

148148
uint32_t extensionsCount;
149149
// Get the number of extensions and layers
150-
VK_IF_ERROR(table.vkEnumerateInstanceExtensionProperties(NULL, &extensionsCount, NULL)) return NULL;
150+
VK_IF_ERROR(vkEnumerateInstanceExtensionProperties(NULL, &extensionsCount, NULL)) return NULL;
151151
VkExtensionProperties extensions[extensionsCount];
152-
VK_IF_ERROR(table.vkEnumerateInstanceExtensionProperties(NULL, &extensionsCount, extensions)) return NULL;
152+
VK_IF_ERROR(vkEnumerateInstanceExtensionProperties(NULL, &extensionsCount, extensions)) return NULL;
153153

154154
uint32_t layersCount;
155-
VK_IF_ERROR(table.vkEnumerateInstanceLayerProperties(&layersCount, NULL)) return NULL;
155+
VK_IF_ERROR(vkEnumerateInstanceLayerProperties(&layersCount, NULL)) return NULL;
156156
VkLayerProperties layers[layersCount];
157-
VK_IF_ERROR(table.vkEnumerateInstanceLayerProperties(&layersCount, layers)) return NULL;
157+
VK_IF_ERROR(vkEnumerateInstanceLayerProperties(&layersCount, layers)) return NULL;
158158

159159
J2dRlsTraceLn(J2D_TRACE_VERBOSE, " Supported instance layers:")
160160
for (uint32_t i = 0; i < layersCount; i++) {
@@ -266,7 +266,7 @@ static VKEnv* VKEnv_Create(PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr, VKPl
266266
.ppEnabledExtensionNames = enabledExtensions
267267
};
268268

269-
VK_IF_ERROR(table.vkCreateInstance(&instanceCreateInfo, NULL, &vk->instance)) {
269+
VK_IF_ERROR(vkCreateInstance(&instanceCreateInfo, NULL, &vk->instance)) {
270270
ARRAY_FREE(enabledLayers);
271271
ARRAY_FREE(enabledExtensions);
272272
VKEnv_Destroy(vk);
@@ -276,12 +276,16 @@ static VKEnv* VKEnv_Create(PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr, VKPl
276276
ARRAY_FREE(enabledLayers);
277277
ARRAY_FREE(enabledExtensions);
278278

279-
missingAPI = VKFunctionTable_InitInstance(vkGetInstanceProcAddr, vk);
280-
if (missingAPI == NULL && vk->platformData != NULL && vk->platformData->checkMissingAPI != NULL) {
281-
missingAPI = vk->platformData->checkMissingAPI(vk);
279+
INSTANCE_FUNCTION_TABLE(CHECK_PROC_ADDR, missingAPI, vkGetInstanceProcAddr, vk->instance, vk->)
280+
DEBUG_INSTANCE_FUNCTION_TABLE(GET_PROC_ADDR, vkGetInstanceProcAddr, vk->instance, vk->)
281+
if (missingAPI) {
282+
J2dRlsTraceLn(J2D_TRACE_ERROR, "Vulkan: Required API is missing:")
283+
INSTANCE_FUNCTION_TABLE(LOG_MISSING_PFN, vk->)
284+
VKEnv_Destroy(vk);
285+
return NULL;
282286
}
283-
if (missingAPI != NULL) {
284-
J2dRlsTraceLn1(J2D_TRACE_ERROR, "Vulkan: Required API is missing: %s", missingAPI)
287+
if (vk->platformData != NULL && vk->platformData->initFunctions != NULL &&
288+
!vk->platformData->initFunctions(vk, vkGetInstanceProcAddr)) {
285289
VKEnv_Destroy(vk);
286290
return NULL;
287291
}
@@ -290,7 +294,8 @@ static VKEnv* VKEnv_Create(PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr, VKPl
290294

291295
// Create debug messenger
292296
#if defined(DEBUG)
293-
if (foundDebugLayer && foundDebugExt && pNext) {
297+
if (foundDebugLayer && foundDebugExt &&
298+
vk->vkCreateDebugUtilsMessengerEXT != NULL && pNext) {
294299
VkDebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfo = {
295300
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
296301
.flags = 0,

src/java.desktop/share/native/common/java2d/vulkan/VKEnv.h

+5-10
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "VKComposites.h"
3030
#include "VKDevice.h"
3131
#include "VKUtil.h"
32+
#include "VKFunctionTable.h"
3233

3334
// For old Vulkan headers - define version-related macros.
3435
#ifndef VK_MAKE_API_VERSION
@@ -39,19 +40,14 @@
3940
#endif
4041
static const uint32_t REQUIRED_VULKAN_VERSION = VK_MAKE_API_VERSION(0, 1, 2, 0);
4142

42-
typedef const char* (*VKPlatform_CheckMissingAPI)(VKEnv* vk);
43+
typedef VkBool32 (*VKPlatform_InitFunctions)(VKEnv* vk, PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr);
4344
typedef VkBool32 (*VKPlatform_CheckPresentationSupport)(VKEnv* vk, VkPhysicalDevice device, uint32_t queueFamily);
4445
typedef struct {
4546
const char* surfaceExtensionName;
46-
VKPlatform_CheckMissingAPI checkMissingAPI;
47+
VKPlatform_InitFunctions initFunctions;
4748
VKPlatform_CheckPresentationSupport checkPresentationSupport;
4849
} VKPlatformData;
4950

50-
typedef struct {
51-
#define GLOBAL_FUNCTION_TABLE_ENTRY(NAME) PFN_ ## NAME NAME
52-
#include "VKFunctionTable.inl"
53-
} VKFunctionTableGlobal;
54-
5551
struct VKEnv {
5652
VkInstance instance;
5753
ARRAY(VKDevice) devices;
@@ -64,9 +60,8 @@ struct VKEnv {
6460

6561
VKPlatformData* platformData;
6662

67-
#define INSTANCE_FUNCTION_TABLE_ENTRY(NAME) PFN_ ## NAME NAME
68-
#define OPTIONAL_INSTANCE_FUNCTION_TABLE_ENTRY(NAME) PFN_ ## NAME NAME
69-
#include "VKFunctionTable.inl"
63+
INSTANCE_FUNCTION_TABLE(DECL_PFN)
64+
DEBUG_INSTANCE_FUNCTION_TABLE(DECL_PFN)
7065
};
7166

7267
VKEnv* VKEnv_GetInstance();

src/java.desktop/share/native/common/java2d/vulkan/VKFunctionTable.c

-58
This file was deleted.

0 commit comments

Comments
 (0)