
Updated all necessary files to 1.0.42. This includes the various headers as well as the loader, and the parameter validation, object tracking, and threading layers. Additionally, bump all layer JSON files to 1.0.42. Also, in this change: - Enable loader extension automation so that the loader now generates all extension entry-points automatically during build to reduce likelihood of missing a critical piece on header update. - Enable layer dispatch table extension automation for the same reason. - Fixes from Mark Lobodzinski and Tony Barbour to resolve crash in loader when working with Intel's Windows driver due to GetInstanceProcAddr getting called on inappropriate command names. Change-Id: Ic18d3fac2e145c386c0192031deb5089c91a00d8
135 lines
4.7 KiB
C
135 lines
4.7 KiB
C
//
|
|
// File: vk_layer.h
|
|
//
|
|
/*
|
|
* Copyright (c) 2015-2017 The Khronos Group Inc.
|
|
* Copyright (c) 2015-2017 Valve Corporation
|
|
* Copyright (c) 2015-2017 LunarG, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*/
|
|
|
|
/* Need to define dispatch table
|
|
* Core struct can then have ptr to dispatch table at the top
|
|
* Along with object ptrs for current and next OBJ
|
|
*/
|
|
#pragma once
|
|
|
|
#include "vulkan.h"
|
|
#if defined(__GNUC__) && __GNUC__ >= 4
|
|
#define VK_LAYER_EXPORT __attribute__((visibility("default")))
|
|
#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
|
|
#define VK_LAYER_EXPORT __attribute__((visibility("default")))
|
|
#else
|
|
#define VK_LAYER_EXPORT
|
|
#endif
|
|
|
|
// Definition for VkLayerDispatchTable and VkLayerInstanceDispatchTable now appear in externally generated header
|
|
#include "vk_layer_dispatch_table.h"
|
|
|
|
#define MAX_NUM_UNKNOWN_EXTS 250
|
|
|
|
// Loader-Layer version negotiation API. Versions add the following features:
|
|
// Versions 0/1 - Initial. Doesn't support vk_layerGetPhysicalDeviceProcAddr
|
|
// or vk_icdNegotiateLoaderLayerInterfaceVersion.
|
|
// Version 2 - Add support for vk_layerGetPhysicalDeviceProcAddr and
|
|
// vk_icdNegotiateLoaderLayerInterfaceVersion.
|
|
#define CURRENT_LOADER_LAYER_INTERFACE_VERSION 2
|
|
#define MIN_SUPPORTED_LOADER_LAYER_INTERFACE_VERSION 1
|
|
|
|
// Version negotiation values
|
|
typedef enum VkNegotiateLayerStructType {
|
|
LAYER_NEGOTIATE_UNINTIALIZED = 0,
|
|
LAYER_NEGOTIATE_INTERFACE_STRUCT = 1,
|
|
} VkNegotiateLayerStructType;
|
|
|
|
// Version negotiation structures
|
|
typedef struct VkNegotiateLayerInterface {
|
|
VkNegotiateLayerStructType sType;
|
|
void *pNext;
|
|
uint32_t loaderLayerInterfaceVersion;
|
|
PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr;
|
|
PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr;
|
|
PFN_GetPhysicalDeviceProcAddr pfnGetPhysicalDeviceProcAddr;
|
|
} VkNegotiateLayerInterface;
|
|
|
|
// Version negotiation functions
|
|
typedef VkResult (VKAPI_PTR *PFN_vkNegotiateLoaderLayerInterfaceVersion)(VkNegotiateLayerInterface *pVersionStruct);
|
|
|
|
// Function prototype for unknown physical device extension command
|
|
typedef VkResult(VKAPI_PTR *PFN_PhysDevExt)(VkPhysicalDevice phys_device, ...);
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
// CreateInstance and CreateDevice support structures
|
|
|
|
/* Sub type of structure for instance and device loader ext of CreateInfo.
|
|
* When sType == VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO
|
|
* or sType == VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO
|
|
* then VkLayerFunction indicates struct type pointed to by pNext
|
|
*/
|
|
typedef enum VkLayerFunction_ {
|
|
VK_LAYER_LINK_INFO = 0,
|
|
VK_LOADER_DATA_CALLBACK = 1
|
|
} VkLayerFunction;
|
|
|
|
typedef struct VkLayerInstanceLink_ {
|
|
struct VkLayerInstanceLink_ *pNext;
|
|
PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
|
|
PFN_GetPhysicalDeviceProcAddr pfnNextGetPhysicalDeviceProcAddr;
|
|
} VkLayerInstanceLink;
|
|
|
|
/*
|
|
* When creating the device chain the loader needs to pass
|
|
* down information about it's device structure needed at
|
|
* the end of the chain. Passing the data via the
|
|
* VkLayerDeviceInfo avoids issues with finding the
|
|
* exact instance being used.
|
|
*/
|
|
typedef struct VkLayerDeviceInfo_ {
|
|
void *device_info;
|
|
PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
|
|
} VkLayerDeviceInfo;
|
|
|
|
typedef VkResult (VKAPI_PTR *PFN_vkSetInstanceLoaderData)(VkInstance instance,
|
|
void *object);
|
|
typedef VkResult (VKAPI_PTR *PFN_vkSetDeviceLoaderData)(VkDevice device,
|
|
void *object);
|
|
|
|
typedef struct {
|
|
VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO
|
|
const void *pNext;
|
|
VkLayerFunction function;
|
|
union {
|
|
VkLayerInstanceLink *pLayerInfo;
|
|
PFN_vkSetInstanceLoaderData pfnSetInstanceLoaderData;
|
|
} u;
|
|
} VkLayerInstanceCreateInfo;
|
|
|
|
typedef struct VkLayerDeviceLink_ {
|
|
struct VkLayerDeviceLink_ *pNext;
|
|
PFN_vkGetInstanceProcAddr pfnNextGetInstanceProcAddr;
|
|
PFN_vkGetDeviceProcAddr pfnNextGetDeviceProcAddr;
|
|
} VkLayerDeviceLink;
|
|
|
|
typedef struct {
|
|
VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO
|
|
const void *pNext;
|
|
VkLayerFunction function;
|
|
union {
|
|
VkLayerDeviceLink *pLayerInfo;
|
|
PFN_vkSetDeviceLoaderData pfnSetDeviceLoaderData;
|
|
} u;
|
|
} VkLayerDeviceCreateInfo;
|
|
|