| @@ -0,0 +1,4 @@ | |||
| libs/ | |||
| obj/ | |||
| *.spv | |||
| *.png | |||
| @@ -0,0 +1,50 @@ | |||
| LOCAL_PATH := $(call my-dir) | |||
| include $(CLEAR_VARS) | |||
| PNG_DIR = external/libpng/src | |||
| PNG_SRC_FILES = $(PNG_DIR)/png.c \ | |||
| $(PNG_DIR)/pngerror.c \ | |||
| $(PNG_DIR)/pngget.c \ | |||
| $(PNG_DIR)/pngmem.c \ | |||
| $(PNG_DIR)/pngpread.c \ | |||
| $(PNG_DIR)/pngread.c \ | |||
| $(PNG_DIR)/pngrio.c \ | |||
| $(PNG_DIR)/pngrtran.c \ | |||
| $(PNG_DIR)/pngrutil.c \ | |||
| $(PNG_DIR)/pngset.c \ | |||
| $(PNG_DIR)/pngtrans.c \ | |||
| $(PNG_DIR)/pngwio.c \ | |||
| $(PNG_DIR)/pngwrite.c \ | |||
| $(PNG_DIR)/pngwtran.c \ | |||
| $(PNG_DIR)/pngwutil.c \ | |||
| $(PNG_DIR)/arm/arm_init.c \ | |||
| $(PNG_DIR)/arm/filter_neon_intrinsics.c | |||
| ZLIB_DIR = external/zlib/src | |||
| ZLIB_SRC_FILES = \ | |||
| $(ZLIB_DIR)/adler32.c \ | |||
| $(ZLIB_DIR)/compress.c \ | |||
| $(ZLIB_DIR)/crc32.c \ | |||
| $(ZLIB_DIR)/deflate.c \ | |||
| $(ZLIB_DIR)/gzclose.c \ | |||
| $(ZLIB_DIR)/gzlib.c \ | |||
| $(ZLIB_DIR)/gzread.c \ | |||
| $(ZLIB_DIR)/gzwrite.c \ | |||
| $(ZLIB_DIR)/infback.c \ | |||
| $(ZLIB_DIR)/inflate.c \ | |||
| $(ZLIB_DIR)/inftrees.c \ | |||
| $(ZLIB_DIR)/inffast.c \ | |||
| $(ZLIB_DIR)/trees.c \ | |||
| $(ZLIB_DIR)/uncompr.c \ | |||
| $(ZLIB_DIR)/zutil.c | |||
| NAME := triangle | |||
| LOCAL_MODULE := $(NAME) | |||
| LOCAL_SRC_FILES := $(PNG_SRC_FILES) $(ZLIB_SRC_FILES) $(NAME).cc | |||
| LOCAL_C_INCLUDES := $(LOCAL_PATH)/include | |||
| LOCAL_CPP_INCLUDES := $(LOCAL_PATH)/include $(LOCAL_PATH)/external | |||
| LOCAL_CFLAGS := -Wall | |||
| LOCAL_CPPFLAGS = -Wall -stdlib=libc++ | |||
| LOCAL_LDLIBS := -lvulkan | |||
| include $(BUILD_EXECUTABLE) | |||
| @@ -0,0 +1,8 @@ | |||
| APP_OPTIM := debug | |||
| #APP_ABI := armeabi-v7a | |||
| APP_ABI := arm64-v8a | |||
| APP_STL := c++_static | |||
| APP_CPPFLAGS := -frtti -fexceptions -std=c++14 | |||
| APP_PLATFORM := android-24 | |||
| APP_BUILD_SCRIPT := Android.mk | |||
| NDK_TOOLCHAIN_VERSION := clang | |||
| @@ -0,0 +1,32 @@ | |||
| NAME = triangle | |||
| all: shaders build deploy run | |||
| build: | |||
| @echo Building... | |||
| @./ndk-build.sh | |||
| deploy: | |||
| @echo Deploying to device... | |||
| @adb push ${NAME}.vert.spv /data/vulkan/${NAME}/ | |||
| @adb push ${NAME}.frag.spv /data/vulkan/${NAME}/ | |||
| @adb push libs/arm64-v8a/${NAME} /data/vulkan/${NAME}/ | |||
| run: | |||
| @echo Running on device... | |||
| @adb shell "cd /data/vulkan/${NAME} && ./${NAME}" | |||
| @echo Copying artifacts back to local device... | |||
| @adb pull /data/vulkan/${NAME}/${NAME}.png . | |||
| shaders: | |||
| @echo Compiling shaders... | |||
| @glslc -c ${NAME}.vert | |||
| @glslc -c ${NAME}.frag | |||
| clean: | |||
| @rm -rf obj | |||
| @rm -rf libs | |||
| @rm -f ${NAME}.png | |||
| @rm -f ${NAME}.vert.spv | |||
| @rm -f ${NAME}.frag.spv | |||
| @adb shell rm /data/vulkan/${NAME}/* | |||
| @@ -0,0 +1,2 @@ | |||
| src | |||
| packages | |||
| @@ -0,0 +1,67 @@ | |||
| # cmake file for libpng | |||
| if (NOT DE_DEFS) | |||
| message(FATAL_ERROR "Include Defs.cmake") | |||
| endif () | |||
| if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/png.h") | |||
| set(DEFAULT_PNG_SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src) | |||
| else () | |||
| # Assume build inside Android source tree | |||
| set(DEFAULT_PNG_SRC_PATH "../libpng") | |||
| endif () | |||
| set(PNG_SRC_PATH ${DEFAULT_PNG_SRC_PATH} CACHE STRING "Path to libpng source tree") | |||
| if (IS_ABSOLUTE ${PNG_SRC_PATH}) | |||
| set(PNG_ABS_PATH ${PNG_SRC_PATH}) | |||
| else () | |||
| set(PNG_ABS_PATH "${CMAKE_SOURCE_DIR}/${PNG_SRC_PATH}") | |||
| endif () | |||
| set(PNG_SRCS | |||
| ${PNG_ABS_PATH}/png.h | |||
| ${PNG_ABS_PATH}/pngconf.h | |||
| ${PNG_ABS_PATH}/png.c | |||
| ${PNG_ABS_PATH}/pngset.c | |||
| ${PNG_ABS_PATH}/pngget.c | |||
| ${PNG_ABS_PATH}/pngrutil.c | |||
| ${PNG_ABS_PATH}/pngtrans.c | |||
| ${PNG_ABS_PATH}/pngwutil.c | |||
| ${PNG_ABS_PATH}/pngread.c | |||
| ${PNG_ABS_PATH}/pngrio.c | |||
| ${PNG_ABS_PATH}/pngwio.c | |||
| ${PNG_ABS_PATH}/pngwrite.c | |||
| ${PNG_ABS_PATH}/pngrtran.c | |||
| ${PNG_ABS_PATH}/pngwtran.c | |||
| ${PNG_ABS_PATH}/pngmem.c | |||
| ${PNG_ABS_PATH}/pngerror.c | |||
| ${PNG_ABS_PATH}/pngpread.c | |||
| ) | |||
| if (DE_CPU_IS_ARM_64) | |||
| # armv8-a has always neon | |||
| set(PNG_SRCS | |||
| ${PNG_SRCS} | |||
| ${PNG_ABS_PATH}/arm/arm_init.c | |||
| ${PNG_ABS_PATH}/arm/filter_neon_intrinsics.c | |||
| ${PNG_ABS_PATH}/arm/filter_neon.S | |||
| ) | |||
| endif () | |||
| if (DE_DEBUG EQUAL 1) | |||
| add_definitions(-DPNG_DEBUG) | |||
| endif () | |||
| if (DE_OS_IS_UNIX) | |||
| # for snprintf() | |||
| add_definitions(-D_XOPEN_SOURCE=600) | |||
| endif () | |||
| set(CMAKE_C_FLAGS ${DE_3RD_PARTY_C_FLAGS}) | |||
| add_library(png STATIC ${PNG_SRCS}) | |||
| target_link_libraries(png ${ZLIB_LIBRARY}) | |||
| set(PNG_INCLUDE_PATH ${PNG_ABS_PATH} PARENT_SCOPE) | |||
| set(PNG_LIBRARY png PARENT_SCOPE) | |||
| @@ -0,0 +1,2 @@ | |||
| src | |||
| packages | |||
| @@ -0,0 +1,73 @@ | |||
| # cmake file for zlib | |||
| if (NOT DE_DEFS) | |||
| message(FATAL_ERROR "Include Defs.cmake") | |||
| endif () | |||
| if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/zlib.h") | |||
| set(DEFAULT_ZLIB_SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src) | |||
| else () | |||
| # Assume build inside Android source tree | |||
| set(DEFAULT_ZLIB_SRC_PATH "../zlib/src") | |||
| endif () | |||
| set(ZLIB_SRC_PATH ${DEFAULT_ZLIB_SRC_PATH} CACHE STRING "Path to zlib source tree") | |||
| if (IS_ABSOLUTE ${ZLIB_SRC_PATH}) | |||
| set(ZLIB_ABS_PATH ${ZLIB_SRC_PATH}) | |||
| else () | |||
| set(ZLIB_ABS_PATH "${CMAKE_SOURCE_DIR}/${ZLIB_SRC_PATH}") | |||
| endif () | |||
| set(ZLIB_SRCS | |||
| ${ZLIB_ABS_PATH}/adler32.c | |||
| ${ZLIB_ABS_PATH}/compress.c | |||
| ${ZLIB_ABS_PATH}/crc32.c | |||
| ${ZLIB_ABS_PATH}/crc32.h | |||
| ${ZLIB_ABS_PATH}/deflate.c | |||
| ${ZLIB_ABS_PATH}/deflate.h | |||
| ${ZLIB_ABS_PATH}/gzclose.c | |||
| ${ZLIB_ABS_PATH}/gzguts.h | |||
| ${ZLIB_ABS_PATH}/gzlib.c | |||
| ${ZLIB_ABS_PATH}/gzread.c | |||
| ${ZLIB_ABS_PATH}/gzwrite.c | |||
| ${ZLIB_ABS_PATH}/infback.c | |||
| ${ZLIB_ABS_PATH}/inffast.c | |||
| ${ZLIB_ABS_PATH}/inffast.h | |||
| ${ZLIB_ABS_PATH}/inffixed.h | |||
| ${ZLIB_ABS_PATH}/inflate.c | |||
| ${ZLIB_ABS_PATH}/inflate.h | |||
| ${ZLIB_ABS_PATH}/inftrees.c | |||
| ${ZLIB_ABS_PATH}/inftrees.h | |||
| ${ZLIB_ABS_PATH}/trees.c | |||
| ${ZLIB_ABS_PATH}/trees.h | |||
| ${ZLIB_ABS_PATH}/uncompr.c | |||
| ${ZLIB_ABS_PATH}/zconf.h | |||
| ${ZLIB_ABS_PATH}/zlib.h | |||
| ${ZLIB_ABS_PATH}/zutil.c | |||
| ${ZLIB_ABS_PATH}/zutil.h | |||
| ) | |||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_UNISTD_H") | |||
| if (DE_COMPILER_IS_MSC) | |||
| # 4127: conditional expression is constant | |||
| # 4131: 'x': uses old style declarator | |||
| # 4242, 4244: conversion from 'x' to 'y', possible loss of data | |||
| # 4996: deprecated POSIX name | |||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Wall /wd4127 /wd4131 /wd4242 /wd4244 /wd4996") | |||
| elseif (DE_COMPILER_IS_GCC OR DE_COMPILER_IS_CLANG) | |||
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-implicit-function-declaration") | |||
| endif () | |||
| if (DE_OS_IS_UNIX) | |||
| add_definitions(-D_XOPEN_SOURCE=600) | |||
| endif () | |||
| set(CMAKE_C_FLAGS ${DE_3RD_PARTY_C_FLAGS}) | |||
| add_library(z STATIC ${ZLIB_SRCS}) | |||
| set(ZLIB_INCLUDE_PATH ${ZLIB_ABS_PATH} PARENT_SCOPE) | |||
| set(ZLIB_LIBRARY z PARENT_SCOPE) | |||
| @@ -0,0 +1,623 @@ | |||
| /* pngconf.h - machine-configurable file for libpng | |||
| * | |||
| * libpng version 1.6.37 | |||
| * | |||
| * Copyright (c) 2018-2019 Cosmin Truta | |||
| * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson | |||
| * Copyright (c) 1996-1997 Andreas Dilger | |||
| * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. | |||
| * | |||
| * This code is released under the libpng license. | |||
| * For conditions of distribution and use, see the disclaimer | |||
| * and license in png.h | |||
| * | |||
| * Any machine specific code is near the front of this file, so if you | |||
| * are configuring libpng for a machine, you may want to read the section | |||
| * starting here down to where it starts to typedef png_color, png_text, | |||
| * and png_info. | |||
| */ | |||
| #ifndef PNGCONF_H | |||
| #define PNGCONF_H | |||
| #ifndef PNG_BUILDING_SYMBOL_TABLE /* else includes may cause problems */ | |||
| /* From libpng 1.6.0 libpng requires an ANSI X3.159-1989 ("ISOC90") compliant C | |||
| * compiler for correct compilation. The following header files are required by | |||
| * the standard. If your compiler doesn't provide these header files, or they | |||
| * do not match the standard, you will need to provide/improve them. | |||
| */ | |||
| #include <limits.h> | |||
| #include <stddef.h> | |||
| /* Library header files. These header files are all defined by ISOC90; libpng | |||
| * expects conformant implementations, however, an ISOC90 conformant system need | |||
| * not provide these header files if the functionality cannot be implemented. | |||
| * In this case it will be necessary to disable the relevant parts of libpng in | |||
| * the build of pnglibconf.h. | |||
| * | |||
| * Prior to 1.6.0 string.h was included here; the API changes in 1.6.0 to not | |||
| * include this unnecessary header file. | |||
| */ | |||
| #ifdef PNG_STDIO_SUPPORTED | |||
| /* Required for the definition of FILE: */ | |||
| # include <stdio.h> | |||
| #endif | |||
| #ifdef PNG_SETJMP_SUPPORTED | |||
| /* Required for the definition of jmp_buf and the declaration of longjmp: */ | |||
| # include <setjmp.h> | |||
| #endif | |||
| #ifdef PNG_CONVERT_tIME_SUPPORTED | |||
| /* Required for struct tm: */ | |||
| # include <time.h> | |||
| #endif | |||
| #endif /* PNG_BUILDING_SYMBOL_TABLE */ | |||
| /* Prior to 1.6.0, it was possible to turn off 'const' in declarations, | |||
| * using PNG_NO_CONST. This is no longer supported. | |||
| */ | |||
| #define PNG_CONST const /* backward compatibility only */ | |||
| /* This controls optimization of the reading of 16-bit and 32-bit | |||
| * values from PNG files. It can be set on a per-app-file basis: it | |||
| * just changes whether a macro is used when the function is called. | |||
| * The library builder sets the default; if read functions are not | |||
| * built into the library the macro implementation is forced on. | |||
| */ | |||
| #ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED | |||
| # define PNG_USE_READ_MACROS | |||
| #endif | |||
| #if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) | |||
| # if PNG_DEFAULT_READ_MACROS | |||
| # define PNG_USE_READ_MACROS | |||
| # endif | |||
| #endif | |||
| /* COMPILER SPECIFIC OPTIONS. | |||
| * | |||
| * These options are provided so that a variety of difficult compilers | |||
| * can be used. Some are fixed at build time (e.g. PNG_API_RULE | |||
| * below) but still have compiler specific implementations, others | |||
| * may be changed on a per-file basis when compiling against libpng. | |||
| */ | |||
| /* The PNGARG macro was used in versions of libpng prior to 1.6.0 to protect | |||
| * against legacy (pre ISOC90) compilers that did not understand function | |||
| * prototypes. It is not required for modern C compilers. | |||
| */ | |||
| #ifndef PNGARG | |||
| # define PNGARG(arglist) arglist | |||
| #endif | |||
| /* Function calling conventions. | |||
| * ============================= | |||
| * Normally it is not necessary to specify to the compiler how to call | |||
| * a function - it just does it - however on x86 systems derived from | |||
| * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems | |||
| * and some others) there are multiple ways to call a function and the | |||
| * default can be changed on the compiler command line. For this reason | |||
| * libpng specifies the calling convention of every exported function and | |||
| * every function called via a user supplied function pointer. This is | |||
| * done in this file by defining the following macros: | |||
| * | |||
| * PNGAPI Calling convention for exported functions. | |||
| * PNGCBAPI Calling convention for user provided (callback) functions. | |||
| * PNGCAPI Calling convention used by the ANSI-C library (required | |||
| * for longjmp callbacks and sometimes used internally to | |||
| * specify the calling convention for zlib). | |||
| * | |||
| * These macros should never be overridden. If it is necessary to | |||
| * change calling convention in a private build this can be done | |||
| * by setting PNG_API_RULE (which defaults to 0) to one of the values | |||
| * below to select the correct 'API' variants. | |||
| * | |||
| * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout. | |||
| * This is correct in every known environment. | |||
| * PNG_API_RULE=1 Use the operating system convention for PNGAPI and | |||
| * the 'C' calling convention (from PNGCAPI) for | |||
| * callbacks (PNGCBAPI). This is no longer required | |||
| * in any known environment - if it has to be used | |||
| * please post an explanation of the problem to the | |||
| * libpng mailing list. | |||
| * | |||
| * These cases only differ if the operating system does not use the C | |||
| * calling convention, at present this just means the above cases | |||
| * (x86 DOS/Windows systems) and, even then, this does not apply to | |||
| * Cygwin running on those systems. | |||
| * | |||
| * Note that the value must be defined in pnglibconf.h so that what | |||
| * the application uses to call the library matches the conventions | |||
| * set when building the library. | |||
| */ | |||
| /* Symbol export | |||
| * ============= | |||
| * When building a shared library it is almost always necessary to tell | |||
| * the compiler which symbols to export. The png.h macro 'PNG_EXPORT' | |||
| * is used to mark the symbols. On some systems these symbols can be | |||
| * extracted at link time and need no special processing by the compiler, | |||
| * on other systems the symbols are flagged by the compiler and just | |||
| * the declaration requires a special tag applied (unfortunately) in a | |||
| * compiler dependent way. Some systems can do either. | |||
| * | |||
| * A small number of older systems also require a symbol from a DLL to | |||
| * be flagged to the program that calls it. This is a problem because | |||
| * we do not know in the header file included by application code that | |||
| * the symbol will come from a shared library, as opposed to a statically | |||
| * linked one. For this reason the application must tell us by setting | |||
| * the magic flag PNG_USE_DLL to turn on the special processing before | |||
| * it includes png.h. | |||
| * | |||
| * Four additional macros are used to make this happen: | |||
| * | |||
| * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from | |||
| * the build or imported if PNG_USE_DLL is set - compiler | |||
| * and system specific. | |||
| * | |||
| * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to | |||
| * 'type', compiler specific. | |||
| * | |||
| * PNG_DLL_EXPORT Set to the magic to use during a libpng build to | |||
| * make a symbol exported from the DLL. Not used in the | |||
| * public header files; see pngpriv.h for how it is used | |||
| * in the libpng build. | |||
| * | |||
| * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come | |||
| * from a DLL - used to define PNG_IMPEXP when | |||
| * PNG_USE_DLL is set. | |||
| */ | |||
| /* System specific discovery. | |||
| * ========================== | |||
| * This code is used at build time to find PNG_IMPEXP, the API settings | |||
| * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL | |||
| * import processing is possible. On Windows systems it also sets | |||
| * compiler-specific macros to the values required to change the calling | |||
| * conventions of the various functions. | |||
| */ | |||
| #if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ | |||
| defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) | |||
| /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or | |||
| * MinGW on any architecture currently supported by Windows. Also includes | |||
| * Watcom builds but these need special treatment because they are not | |||
| * compatible with GCC or Visual C because of different calling conventions. | |||
| */ | |||
| # if PNG_API_RULE == 2 | |||
| /* If this line results in an error, either because __watcall is not | |||
| * understood or because of a redefine just below you cannot use *this* | |||
| * build of the library with the compiler you are using. *This* build was | |||
| * build using Watcom and applications must also be built using Watcom! | |||
| */ | |||
| # define PNGCAPI __watcall | |||
| # endif | |||
| # if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800)) | |||
| # define PNGCAPI __cdecl | |||
| # if PNG_API_RULE == 1 | |||
| /* If this line results in an error __stdcall is not understood and | |||
| * PNG_API_RULE should not have been set to '1'. | |||
| */ | |||
| # define PNGAPI __stdcall | |||
| # endif | |||
| # else | |||
| /* An older compiler, or one not detected (erroneously) above, | |||
| * if necessary override on the command line to get the correct | |||
| * variants for the compiler. | |||
| */ | |||
| # ifndef PNGCAPI | |||
| # define PNGCAPI _cdecl | |||
| # endif | |||
| # if PNG_API_RULE == 1 && !defined(PNGAPI) | |||
| # define PNGAPI _stdcall | |||
| # endif | |||
| # endif /* compiler/api */ | |||
| /* NOTE: PNGCBAPI always defaults to PNGCAPI. */ | |||
| # if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD) | |||
| # error "PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed" | |||
| # endif | |||
| # if (defined(_MSC_VER) && _MSC_VER < 800) ||\ | |||
| (defined(__BORLANDC__) && __BORLANDC__ < 0x500) | |||
| /* older Borland and MSC | |||
| * compilers used '__export' and required this to be after | |||
| * the type. | |||
| */ | |||
| # ifndef PNG_EXPORT_TYPE | |||
| # define PNG_EXPORT_TYPE(type) type PNG_IMPEXP | |||
| # endif | |||
| # define PNG_DLL_EXPORT __export | |||
| # else /* newer compiler */ | |||
| # define PNG_DLL_EXPORT __declspec(dllexport) | |||
| # ifndef PNG_DLL_IMPORT | |||
| # define PNG_DLL_IMPORT __declspec(dllimport) | |||
| # endif | |||
| # endif /* compiler */ | |||
| #else /* !Windows */ | |||
| # if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) | |||
| # define PNGAPI _System | |||
| # else /* !Windows/x86 && !OS/2 */ | |||
| /* Use the defaults, or define PNG*API on the command line (but | |||
| * this will have to be done for every compile!) | |||
| */ | |||
| # endif /* other system, !OS/2 */ | |||
| #endif /* !Windows/x86 */ | |||
| /* Now do all the defaulting . */ | |||
| #ifndef PNGCAPI | |||
| # define PNGCAPI | |||
| #endif | |||
| #ifndef PNGCBAPI | |||
| # define PNGCBAPI PNGCAPI | |||
| #endif | |||
| #ifndef PNGAPI | |||
| # define PNGAPI PNGCAPI | |||
| #endif | |||
| /* PNG_IMPEXP may be set on the compilation system command line or (if not set) | |||
| * then in an internal header file when building the library, otherwise (when | |||
| * using the library) it is set here. | |||
| */ | |||
| #ifndef PNG_IMPEXP | |||
| # if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT) | |||
| /* This forces use of a DLL, disallowing static linking */ | |||
| # define PNG_IMPEXP PNG_DLL_IMPORT | |||
| # endif | |||
| # ifndef PNG_IMPEXP | |||
| # define PNG_IMPEXP | |||
| # endif | |||
| #endif | |||
| /* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat | |||
| * 'attributes' as a storage class - the attributes go at the start of the | |||
| * function definition, and attributes are always appended regardless of the | |||
| * compiler. This considerably simplifies these macros but may cause problems | |||
| * if any compilers both need function attributes and fail to handle them as | |||
| * a storage class (this is unlikely.) | |||
| */ | |||
| #ifndef PNG_FUNCTION | |||
| # define PNG_FUNCTION(type, name, args, attributes) attributes type name args | |||
| #endif | |||
| #ifndef PNG_EXPORT_TYPE | |||
| # define PNG_EXPORT_TYPE(type) PNG_IMPEXP type | |||
| #endif | |||
| /* The ordinal value is only relevant when preprocessing png.h for symbol | |||
| * table entries, so we discard it here. See the .dfn files in the | |||
| * scripts directory. | |||
| */ | |||
| #ifndef PNG_EXPORTA | |||
| # define PNG_EXPORTA(ordinal, type, name, args, attributes) \ | |||
| PNG_FUNCTION(PNG_EXPORT_TYPE(type), (PNGAPI name), PNGARG(args), \ | |||
| PNG_LINKAGE_API attributes) | |||
| #endif | |||
| /* ANSI-C (C90) does not permit a macro to be invoked with an empty argument, | |||
| * so make something non-empty to satisfy the requirement: | |||
| */ | |||
| #define PNG_EMPTY /*empty list*/ | |||
| #define PNG_EXPORT(ordinal, type, name, args) \ | |||
| PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY) | |||
| /* Use PNG_REMOVED to comment out a removed interface. */ | |||
| #ifndef PNG_REMOVED | |||
| # define PNG_REMOVED(ordinal, type, name, args, attributes) | |||
| #endif | |||
| #ifndef PNG_CALLBACK | |||
| # define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args) | |||
| #endif | |||
| /* Support for compiler specific function attributes. These are used | |||
| * so that where compiler support is available incorrect use of API | |||
| * functions in png.h will generate compiler warnings. | |||
| * | |||
| * Added at libpng-1.2.41. | |||
| */ | |||
| #ifndef PNG_NO_PEDANTIC_WARNINGS | |||
| # ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED | |||
| # define PNG_PEDANTIC_WARNINGS_SUPPORTED | |||
| # endif | |||
| #endif | |||
| #ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED | |||
| /* Support for compiler specific function attributes. These are used | |||
| * so that where compiler support is available, incorrect use of API | |||
| * functions in png.h will generate compiler warnings. Added at libpng | |||
| * version 1.2.41. Disabling these removes the warnings but may also produce | |||
| * less efficient code. | |||
| */ | |||
| # if defined(__clang__) && defined(__has_attribute) | |||
| /* Clang defines both __clang__ and __GNUC__. Check __clang__ first. */ | |||
| # if !defined(PNG_USE_RESULT) && __has_attribute(__warn_unused_result__) | |||
| # define PNG_USE_RESULT __attribute__((__warn_unused_result__)) | |||
| # endif | |||
| # if !defined(PNG_NORETURN) && __has_attribute(__noreturn__) | |||
| # define PNG_NORETURN __attribute__((__noreturn__)) | |||
| # endif | |||
| # if !defined(PNG_ALLOCATED) && __has_attribute(__malloc__) | |||
| # define PNG_ALLOCATED __attribute__((__malloc__)) | |||
| # endif | |||
| # if !defined(PNG_DEPRECATED) && __has_attribute(__deprecated__) | |||
| # define PNG_DEPRECATED __attribute__((__deprecated__)) | |||
| # endif | |||
| # if !defined(PNG_PRIVATE) | |||
| # ifdef __has_extension | |||
| # if __has_extension(attribute_unavailable_with_message) | |||
| # define PNG_PRIVATE __attribute__((__unavailable__(\ | |||
| "This function is not exported by libpng."))) | |||
| # endif | |||
| # endif | |||
| # endif | |||
| # ifndef PNG_RESTRICT | |||
| # define PNG_RESTRICT __restrict | |||
| # endif | |||
| # elif defined(__GNUC__) | |||
| # ifndef PNG_USE_RESULT | |||
| # define PNG_USE_RESULT __attribute__((__warn_unused_result__)) | |||
| # endif | |||
| # ifndef PNG_NORETURN | |||
| # define PNG_NORETURN __attribute__((__noreturn__)) | |||
| # endif | |||
| # if __GNUC__ >= 3 | |||
| # ifndef PNG_ALLOCATED | |||
| # define PNG_ALLOCATED __attribute__((__malloc__)) | |||
| # endif | |||
| # ifndef PNG_DEPRECATED | |||
| # define PNG_DEPRECATED __attribute__((__deprecated__)) | |||
| # endif | |||
| # ifndef PNG_PRIVATE | |||
| # if 0 /* Doesn't work so we use deprecated instead*/ | |||
| # define PNG_PRIVATE \ | |||
| __attribute__((warning("This function is not exported by libpng."))) | |||
| # else | |||
| # define PNG_PRIVATE \ | |||
| __attribute__((__deprecated__)) | |||
| # endif | |||
| # endif | |||
| # if ((__GNUC__ > 3) || !defined(__GNUC_MINOR__) || (__GNUC_MINOR__ >= 1)) | |||
| # ifndef PNG_RESTRICT | |||
| # define PNG_RESTRICT __restrict | |||
| # endif | |||
| # endif /* __GNUC__.__GNUC_MINOR__ > 3.0 */ | |||
| # endif /* __GNUC__ >= 3 */ | |||
| # elif defined(_MSC_VER) && (_MSC_VER >= 1300) | |||
| # ifndef PNG_USE_RESULT | |||
| # define PNG_USE_RESULT /* not supported */ | |||
| # endif | |||
| # ifndef PNG_NORETURN | |||
| # define PNG_NORETURN __declspec(noreturn) | |||
| # endif | |||
| # ifndef PNG_ALLOCATED | |||
| # if (_MSC_VER >= 1400) | |||
| # define PNG_ALLOCATED __declspec(restrict) | |||
| # endif | |||
| # endif | |||
| # ifndef PNG_DEPRECATED | |||
| # define PNG_DEPRECATED __declspec(deprecated) | |||
| # endif | |||
| # ifndef PNG_PRIVATE | |||
| # define PNG_PRIVATE __declspec(deprecated) | |||
| # endif | |||
| # ifndef PNG_RESTRICT | |||
| # if (_MSC_VER >= 1400) | |||
| # define PNG_RESTRICT __restrict | |||
| # endif | |||
| # endif | |||
| # elif defined(__WATCOMC__) | |||
| # ifndef PNG_RESTRICT | |||
| # define PNG_RESTRICT __restrict | |||
| # endif | |||
| # endif | |||
| #endif /* PNG_PEDANTIC_WARNINGS */ | |||
| #ifndef PNG_DEPRECATED | |||
| # define PNG_DEPRECATED /* Use of this function is deprecated */ | |||
| #endif | |||
| #ifndef PNG_USE_RESULT | |||
| # define PNG_USE_RESULT /* The result of this function must be checked */ | |||
| #endif | |||
| #ifndef PNG_NORETURN | |||
| # define PNG_NORETURN /* This function does not return */ | |||
| #endif | |||
| #ifndef PNG_ALLOCATED | |||
| # define PNG_ALLOCATED /* The result of the function is new memory */ | |||
| #endif | |||
| #ifndef PNG_PRIVATE | |||
| # define PNG_PRIVATE /* This is a private libpng function */ | |||
| #endif | |||
| #ifndef PNG_RESTRICT | |||
| # define PNG_RESTRICT /* The C99 "restrict" feature */ | |||
| #endif | |||
| #ifndef PNG_FP_EXPORT /* A floating point API. */ | |||
| # ifdef PNG_FLOATING_POINT_SUPPORTED | |||
| # define PNG_FP_EXPORT(ordinal, type, name, args)\ | |||
| PNG_EXPORT(ordinal, type, name, args); | |||
| # else /* No floating point APIs */ | |||
| # define PNG_FP_EXPORT(ordinal, type, name, args) | |||
| # endif | |||
| #endif | |||
| #ifndef PNG_FIXED_EXPORT /* A fixed point API. */ | |||
| # ifdef PNG_FIXED_POINT_SUPPORTED | |||
| # define PNG_FIXED_EXPORT(ordinal, type, name, args)\ | |||
| PNG_EXPORT(ordinal, type, name, args); | |||
| # else /* No fixed point APIs */ | |||
| # define PNG_FIXED_EXPORT(ordinal, type, name, args) | |||
| # endif | |||
| #endif | |||
| #ifndef PNG_BUILDING_SYMBOL_TABLE | |||
| /* Some typedefs to get us started. These should be safe on most of the common | |||
| * platforms. | |||
| * | |||
| * png_uint_32 and png_int_32 may, currently, be larger than required to hold a | |||
| * 32-bit value however this is not normally advisable. | |||
| * | |||
| * png_uint_16 and png_int_16 should always be two bytes in size - this is | |||
| * verified at library build time. | |||
| * | |||
| * png_byte must always be one byte in size. | |||
| * | |||
| * The checks below use constants from limits.h, as defined by the ISOC90 | |||
| * standard. | |||
| */ | |||
| #if CHAR_BIT == 8 && UCHAR_MAX == 255 | |||
| typedef unsigned char png_byte; | |||
| #else | |||
| # error "libpng requires 8-bit bytes" | |||
| #endif | |||
| #if INT_MIN == -32768 && INT_MAX == 32767 | |||
| typedef int png_int_16; | |||
| #elif SHRT_MIN == -32768 && SHRT_MAX == 32767 | |||
| typedef short png_int_16; | |||
| #else | |||
| # error "libpng requires a signed 16-bit type" | |||
| #endif | |||
| #if UINT_MAX == 65535 | |||
| typedef unsigned int png_uint_16; | |||
| #elif USHRT_MAX == 65535 | |||
| typedef unsigned short png_uint_16; | |||
| #else | |||
| # error "libpng requires an unsigned 16-bit type" | |||
| #endif | |||
| #if INT_MIN < -2147483646 && INT_MAX > 2147483646 | |||
| typedef int png_int_32; | |||
| #elif LONG_MIN < -2147483646 && LONG_MAX > 2147483646 | |||
| typedef long int png_int_32; | |||
| #else | |||
| # error "libpng requires a signed 32-bit (or more) type" | |||
| #endif | |||
| #if UINT_MAX > 4294967294U | |||
| typedef unsigned int png_uint_32; | |||
| #elif ULONG_MAX > 4294967294U | |||
| typedef unsigned long int png_uint_32; | |||
| #else | |||
| # error "libpng requires an unsigned 32-bit (or more) type" | |||
| #endif | |||
| /* Prior to 1.6.0, it was possible to disable the use of size_t and ptrdiff_t. | |||
| * From 1.6.0 onwards, an ISO C90 compiler, as well as a standard-compliant | |||
| * behavior of sizeof and ptrdiff_t are required. | |||
| * The legacy typedefs are provided here for backwards compatibility. | |||
| */ | |||
| typedef size_t png_size_t; | |||
| typedef ptrdiff_t png_ptrdiff_t; | |||
| /* libpng needs to know the maximum value of 'size_t' and this controls the | |||
| * definition of png_alloc_size_t, below. This maximum value of size_t limits | |||
| * but does not control the maximum allocations the library makes - there is | |||
| * direct application control of this through png_set_user_limits(). | |||
| */ | |||
| #ifndef PNG_SMALL_SIZE_T | |||
| /* Compiler specific tests for systems where size_t is known to be less than | |||
| * 32 bits (some of these systems may no longer work because of the lack of | |||
| * 'far' support; see above.) | |||
| */ | |||
| # if (defined(__TURBOC__) && !defined(__FLAT__)) ||\ | |||
| (defined(_MSC_VER) && defined(MAXSEG_64K)) | |||
| # define PNG_SMALL_SIZE_T | |||
| # endif | |||
| #endif | |||
| /* png_alloc_size_t is guaranteed to be no smaller than size_t, and no smaller | |||
| * than png_uint_32. Casts from size_t or png_uint_32 to png_alloc_size_t are | |||
| * not necessary; in fact, it is recommended not to use them at all, so that | |||
| * the compiler can complain when something turns out to be problematic. | |||
| * | |||
| * Casts in the other direction (from png_alloc_size_t to size_t or | |||
| * png_uint_32) should be explicitly applied; however, we do not expect to | |||
| * encounter practical situations that require such conversions. | |||
| * | |||
| * PNG_SMALL_SIZE_T must be defined if the maximum value of size_t is less than | |||
| * 4294967295 - i.e. less than the maximum value of png_uint_32. | |||
| */ | |||
| #ifdef PNG_SMALL_SIZE_T | |||
| typedef png_uint_32 png_alloc_size_t; | |||
| #else | |||
| typedef size_t png_alloc_size_t; | |||
| #endif | |||
| /* Prior to 1.6.0 libpng offered limited support for Microsoft C compiler | |||
| * implementations of Intel CPU specific support of user-mode segmented address | |||
| * spaces, where 16-bit pointers address more than 65536 bytes of memory using | |||
| * separate 'segment' registers. The implementation requires two different | |||
| * types of pointer (only one of which includes the segment value.) | |||
| * | |||
| * If required this support is available in version 1.2 of libpng and may be | |||
| * available in versions through 1.5, although the correctness of the code has | |||
| * not been verified recently. | |||
| */ | |||
| /* Typedef for floating-point numbers that are converted to fixed-point with a | |||
| * multiple of 100,000, e.g., gamma | |||
| */ | |||
| typedef png_int_32 png_fixed_point; | |||
| /* Add typedefs for pointers */ | |||
| typedef void * png_voidp; | |||
| typedef const void * png_const_voidp; | |||
| typedef png_byte * png_bytep; | |||
| typedef const png_byte * png_const_bytep; | |||
| typedef png_uint_32 * png_uint_32p; | |||
| typedef const png_uint_32 * png_const_uint_32p; | |||
| typedef png_int_32 * png_int_32p; | |||
| typedef const png_int_32 * png_const_int_32p; | |||
| typedef png_uint_16 * png_uint_16p; | |||
| typedef const png_uint_16 * png_const_uint_16p; | |||
| typedef png_int_16 * png_int_16p; | |||
| typedef const png_int_16 * png_const_int_16p; | |||
| typedef char * png_charp; | |||
| typedef const char * png_const_charp; | |||
| typedef png_fixed_point * png_fixed_point_p; | |||
| typedef const png_fixed_point * png_const_fixed_point_p; | |||
| typedef size_t * png_size_tp; | |||
| typedef const size_t * png_const_size_tp; | |||
| #ifdef PNG_STDIO_SUPPORTED | |||
| typedef FILE * png_FILE_p; | |||
| #endif | |||
| #ifdef PNG_FLOATING_POINT_SUPPORTED | |||
| typedef double * png_doublep; | |||
| typedef const double * png_const_doublep; | |||
| #endif | |||
| /* Pointers to pointers; i.e. arrays */ | |||
| typedef png_byte * * png_bytepp; | |||
| typedef png_uint_32 * * png_uint_32pp; | |||
| typedef png_int_32 * * png_int_32pp; | |||
| typedef png_uint_16 * * png_uint_16pp; | |||
| typedef png_int_16 * * png_int_16pp; | |||
| typedef const char * * png_const_charpp; | |||
| typedef char * * png_charpp; | |||
| typedef png_fixed_point * * png_fixed_point_pp; | |||
| #ifdef PNG_FLOATING_POINT_SUPPORTED | |||
| typedef double * * png_doublepp; | |||
| #endif | |||
| /* Pointers to pointers to pointers; i.e., pointer to array */ | |||
| typedef char * * * png_charppp; | |||
| #endif /* PNG_BUILDING_SYMBOL_TABLE */ | |||
| #endif /* PNGCONF_H */ | |||
| @@ -0,0 +1,219 @@ | |||
| /* pnglibconf.h - library build configuration */ | |||
| /* libpng version 1.6.37 */ | |||
| /* Copyright (c) 2018-2019 Cosmin Truta */ | |||
| /* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */ | |||
| /* This code is released under the libpng license. */ | |||
| /* For conditions of distribution and use, see the disclaimer */ | |||
| /* and license in png.h */ | |||
| /* pnglibconf.h */ | |||
| /* Machine generated file: DO NOT EDIT */ | |||
| /* Derived from: scripts/pnglibconf.dfa */ | |||
| #ifndef PNGLCONF_H | |||
| #define PNGLCONF_H | |||
| /* options */ | |||
| #define PNG_16BIT_SUPPORTED | |||
| #define PNG_ALIGNED_MEMORY_SUPPORTED | |||
| /*#undef PNG_ARM_NEON_API_SUPPORTED*/ | |||
| /*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/ | |||
| #define PNG_BENIGN_ERRORS_SUPPORTED | |||
| #define PNG_BENIGN_READ_ERRORS_SUPPORTED | |||
| /*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/ | |||
| #define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED | |||
| #define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED | |||
| #define PNG_COLORSPACE_SUPPORTED | |||
| #define PNG_CONSOLE_IO_SUPPORTED | |||
| #define PNG_CONVERT_tIME_SUPPORTED | |||
| #define PNG_EASY_ACCESS_SUPPORTED | |||
| /*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ | |||
| #define PNG_ERROR_TEXT_SUPPORTED | |||
| #define PNG_FIXED_POINT_SUPPORTED | |||
| #define PNG_FLOATING_ARITHMETIC_SUPPORTED | |||
| #define PNG_FLOATING_POINT_SUPPORTED | |||
| #define PNG_FORMAT_AFIRST_SUPPORTED | |||
| #define PNG_FORMAT_BGR_SUPPORTED | |||
| #define PNG_GAMMA_SUPPORTED | |||
| #define PNG_GET_PALETTE_MAX_SUPPORTED | |||
| #define PNG_HANDLE_AS_UNKNOWN_SUPPORTED | |||
| #define PNG_INCH_CONVERSIONS_SUPPORTED | |||
| #define PNG_INFO_IMAGE_SUPPORTED | |||
| #define PNG_IO_STATE_SUPPORTED | |||
| #define PNG_MNG_FEATURES_SUPPORTED | |||
| #define PNG_POINTER_INDEXING_SUPPORTED | |||
| /*#undef PNG_POWERPC_VSX_API_SUPPORTED*/ | |||
| /*#undef PNG_POWERPC_VSX_CHECK_SUPPORTED*/ | |||
| #define PNG_PROGRESSIVE_READ_SUPPORTED | |||
| #define PNG_READ_16BIT_SUPPORTED | |||
| #define PNG_READ_ALPHA_MODE_SUPPORTED | |||
| #define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED | |||
| #define PNG_READ_BACKGROUND_SUPPORTED | |||
| #define PNG_READ_BGR_SUPPORTED | |||
| #define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED | |||
| #define PNG_READ_COMPOSITE_NODIV_SUPPORTED | |||
| #define PNG_READ_COMPRESSED_TEXT_SUPPORTED | |||
| #define PNG_READ_EXPAND_16_SUPPORTED | |||
| #define PNG_READ_EXPAND_SUPPORTED | |||
| #define PNG_READ_FILLER_SUPPORTED | |||
| #define PNG_READ_GAMMA_SUPPORTED | |||
| #define PNG_READ_GET_PALETTE_MAX_SUPPORTED | |||
| #define PNG_READ_GRAY_TO_RGB_SUPPORTED | |||
| #define PNG_READ_INTERLACING_SUPPORTED | |||
| #define PNG_READ_INT_FUNCTIONS_SUPPORTED | |||
| #define PNG_READ_INVERT_ALPHA_SUPPORTED | |||
| #define PNG_READ_INVERT_SUPPORTED | |||
| #define PNG_READ_OPT_PLTE_SUPPORTED | |||
| #define PNG_READ_PACKSWAP_SUPPORTED | |||
| #define PNG_READ_PACK_SUPPORTED | |||
| #define PNG_READ_QUANTIZE_SUPPORTED | |||
| #define PNG_READ_RGB_TO_GRAY_SUPPORTED | |||
| #define PNG_READ_SCALE_16_TO_8_SUPPORTED | |||
| #define PNG_READ_SHIFT_SUPPORTED | |||
| #define PNG_READ_STRIP_16_TO_8_SUPPORTED | |||
| #define PNG_READ_STRIP_ALPHA_SUPPORTED | |||
| #define PNG_READ_SUPPORTED | |||
| #define PNG_READ_SWAP_ALPHA_SUPPORTED | |||
| #define PNG_READ_SWAP_SUPPORTED | |||
| #define PNG_READ_TEXT_SUPPORTED | |||
| #define PNG_READ_TRANSFORMS_SUPPORTED | |||
| #define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED | |||
| #define PNG_READ_USER_CHUNKS_SUPPORTED | |||
| #define PNG_READ_USER_TRANSFORM_SUPPORTED | |||
| #define PNG_READ_bKGD_SUPPORTED | |||
| #define PNG_READ_cHRM_SUPPORTED | |||
| #define PNG_READ_eXIf_SUPPORTED | |||
| #define PNG_READ_gAMA_SUPPORTED | |||
| #define PNG_READ_hIST_SUPPORTED | |||
| #define PNG_READ_iCCP_SUPPORTED | |||
| #define PNG_READ_iTXt_SUPPORTED | |||
| #define PNG_READ_oFFs_SUPPORTED | |||
| #define PNG_READ_pCAL_SUPPORTED | |||
| #define PNG_READ_pHYs_SUPPORTED | |||
| #define PNG_READ_sBIT_SUPPORTED | |||
| #define PNG_READ_sCAL_SUPPORTED | |||
| #define PNG_READ_sPLT_SUPPORTED | |||
| #define PNG_READ_sRGB_SUPPORTED | |||
| #define PNG_READ_tEXt_SUPPORTED | |||
| #define PNG_READ_tIME_SUPPORTED | |||
| #define PNG_READ_tRNS_SUPPORTED | |||
| #define PNG_READ_zTXt_SUPPORTED | |||
| #define PNG_SAVE_INT_32_SUPPORTED | |||
| #define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED | |||
| #define PNG_SEQUENTIAL_READ_SUPPORTED | |||
| #define PNG_SETJMP_SUPPORTED | |||
| #define PNG_SET_OPTION_SUPPORTED | |||
| #define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED | |||
| #define PNG_SET_USER_LIMITS_SUPPORTED | |||
| #define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED | |||
| #define PNG_SIMPLIFIED_READ_BGR_SUPPORTED | |||
| #define PNG_SIMPLIFIED_READ_SUPPORTED | |||
| #define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED | |||
| #define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED | |||
| #define PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED | |||
| #define PNG_SIMPLIFIED_WRITE_SUPPORTED | |||
| #define PNG_STDIO_SUPPORTED | |||
| #define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED | |||
| #define PNG_TEXT_SUPPORTED | |||
| #define PNG_TIME_RFC1123_SUPPORTED | |||
| #define PNG_UNKNOWN_CHUNKS_SUPPORTED | |||
| #define PNG_USER_CHUNKS_SUPPORTED | |||
| #define PNG_USER_LIMITS_SUPPORTED | |||
| #define PNG_USER_MEM_SUPPORTED | |||
| #define PNG_USER_TRANSFORM_INFO_SUPPORTED | |||
| #define PNG_USER_TRANSFORM_PTR_SUPPORTED | |||
| #define PNG_WARNINGS_SUPPORTED | |||
| #define PNG_WRITE_16BIT_SUPPORTED | |||
| #define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED | |||
| #define PNG_WRITE_BGR_SUPPORTED | |||
| #define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED | |||
| #define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED | |||
| #define PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED | |||
| #define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED | |||
| #define PNG_WRITE_FILLER_SUPPORTED | |||
| #define PNG_WRITE_FILTER_SUPPORTED | |||
| #define PNG_WRITE_FLUSH_SUPPORTED | |||
| #define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED | |||
| #define PNG_WRITE_INTERLACING_SUPPORTED | |||
| #define PNG_WRITE_INT_FUNCTIONS_SUPPORTED | |||
| #define PNG_WRITE_INVERT_ALPHA_SUPPORTED | |||
| #define PNG_WRITE_INVERT_SUPPORTED | |||
| #define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED | |||
| #define PNG_WRITE_PACKSWAP_SUPPORTED | |||
| #define PNG_WRITE_PACK_SUPPORTED | |||
| #define PNG_WRITE_SHIFT_SUPPORTED | |||
| #define PNG_WRITE_SUPPORTED | |||
| #define PNG_WRITE_SWAP_ALPHA_SUPPORTED | |||
| #define PNG_WRITE_SWAP_SUPPORTED | |||
| #define PNG_WRITE_TEXT_SUPPORTED | |||
| #define PNG_WRITE_TRANSFORMS_SUPPORTED | |||
| #define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED | |||
| #define PNG_WRITE_USER_TRANSFORM_SUPPORTED | |||
| #define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED | |||
| #define PNG_WRITE_bKGD_SUPPORTED | |||
| #define PNG_WRITE_cHRM_SUPPORTED | |||
| #define PNG_WRITE_eXIf_SUPPORTED | |||
| #define PNG_WRITE_gAMA_SUPPORTED | |||
| #define PNG_WRITE_hIST_SUPPORTED | |||
| #define PNG_WRITE_iCCP_SUPPORTED | |||
| #define PNG_WRITE_iTXt_SUPPORTED | |||
| #define PNG_WRITE_oFFs_SUPPORTED | |||
| #define PNG_WRITE_pCAL_SUPPORTED | |||
| #define PNG_WRITE_pHYs_SUPPORTED | |||
| #define PNG_WRITE_sBIT_SUPPORTED | |||
| #define PNG_WRITE_sCAL_SUPPORTED | |||
| #define PNG_WRITE_sPLT_SUPPORTED | |||
| #define PNG_WRITE_sRGB_SUPPORTED | |||
| #define PNG_WRITE_tEXt_SUPPORTED | |||
| #define PNG_WRITE_tIME_SUPPORTED | |||
| #define PNG_WRITE_tRNS_SUPPORTED | |||
| #define PNG_WRITE_zTXt_SUPPORTED | |||
| #define PNG_bKGD_SUPPORTED | |||
| #define PNG_cHRM_SUPPORTED | |||
| #define PNG_eXIf_SUPPORTED | |||
| #define PNG_gAMA_SUPPORTED | |||
| #define PNG_hIST_SUPPORTED | |||
| #define PNG_iCCP_SUPPORTED | |||
| #define PNG_iTXt_SUPPORTED | |||
| #define PNG_oFFs_SUPPORTED | |||
| #define PNG_pCAL_SUPPORTED | |||
| #define PNG_pHYs_SUPPORTED | |||
| #define PNG_sBIT_SUPPORTED | |||
| #define PNG_sCAL_SUPPORTED | |||
| #define PNG_sPLT_SUPPORTED | |||
| #define PNG_sRGB_SUPPORTED | |||
| #define PNG_tEXt_SUPPORTED | |||
| #define PNG_tIME_SUPPORTED | |||
| #define PNG_tRNS_SUPPORTED | |||
| #define PNG_zTXt_SUPPORTED | |||
| /* end of options */ | |||
| /* settings */ | |||
| #define PNG_API_RULE 0 | |||
| #define PNG_DEFAULT_READ_MACROS 1 | |||
| #define PNG_GAMMA_THRESHOLD_FIXED 5000 | |||
| #define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE | |||
| #define PNG_INFLATE_BUF_SIZE 1024 | |||
| #define PNG_LINKAGE_API extern | |||
| #define PNG_LINKAGE_CALLBACK extern | |||
| #define PNG_LINKAGE_DATA extern | |||
| #define PNG_LINKAGE_FUNCTION extern | |||
| #define PNG_MAX_GAMMA_8 11 | |||
| #define PNG_QUANTIZE_BLUE_BITS 5 | |||
| #define PNG_QUANTIZE_GREEN_BITS 5 | |||
| #define PNG_QUANTIZE_RED_BITS 5 | |||
| #define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1) | |||
| #define PNG_TEXT_Z_DEFAULT_STRATEGY 0 | |||
| #define PNG_USER_CHUNK_CACHE_MAX 1000 | |||
| #define PNG_USER_CHUNK_MALLOC_MAX 8000000 | |||
| #define PNG_USER_HEIGHT_MAX 1000000 | |||
| #define PNG_USER_WIDTH_MAX 1000000 | |||
| #define PNG_ZBUF_SIZE 8192 | |||
| #define PNG_ZLIB_VERNUM 0x12b0 | |||
| #define PNG_Z_DEFAULT_COMPRESSION (-1) | |||
| #define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0 | |||
| #define PNG_Z_DEFAULT_STRATEGY 1 | |||
| #define PNG_sCAL_PRECISION 5 | |||
| #define PNG_sRGB_PROFILE_CHECKS 2 | |||
| /* end of settings */ | |||
| #endif /* PNGLCONF_H */ | |||
| @@ -0,0 +1,175 @@ | |||
| // | |||
| // File: vk_icd.h | |||
| // | |||
| /* | |||
| * Copyright (c) 2015-2016 The Khronos Group Inc. | |||
| * Copyright (c) 2015-2016 Valve Corporation | |||
| * Copyright (c) 2015-2016 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. | |||
| * | |||
| */ | |||
| #ifndef VKICD_H | |||
| #define VKICD_H | |||
| #include "vulkan.h" | |||
| #include <stdbool.h> | |||
| // Loader-ICD version negotiation API. Versions add the following features: | |||
| // Version 0 - Initial. Doesn't support vk_icdGetInstanceProcAddr | |||
| // or vk_icdNegotiateLoaderICDInterfaceVersion. | |||
| // Version 1 - Add support for vk_icdGetInstanceProcAddr. | |||
| // Version 2 - Add Loader/ICD Interface version negotiation | |||
| // via vk_icdNegotiateLoaderICDInterfaceVersion. | |||
| // Version 3 - Add ICD creation/destruction of KHR_surface objects. | |||
| // Version 4 - Add unknown physical device extension qyering via | |||
| // vk_icdGetPhysicalDeviceProcAddr. | |||
| // Version 5 - Tells ICDs that the loader is now paying attention to the | |||
| // application version of Vulkan passed into the ApplicationInfo | |||
| // structure during vkCreateInstance. This will tell the ICD | |||
| // that if the loader is older, it should automatically fail a | |||
| // call for any API version > 1.0. Otherwise, the loader will | |||
| // manually determine if it can support the expected version. | |||
| #define CURRENT_LOADER_ICD_INTERFACE_VERSION 5 | |||
| #define MIN_SUPPORTED_LOADER_ICD_INTERFACE_VERSION 0 | |||
| #define MIN_PHYS_DEV_EXTENSION_ICD_INTERFACE_VERSION 4 | |||
| typedef VkResult(VKAPI_PTR *PFN_vkNegotiateLoaderICDInterfaceVersion)(uint32_t *pVersion); | |||
| // This is defined in vk_layer.h which will be found by the loader, but if an ICD is building against this | |||
| // file directly, it won't be found. | |||
| #ifndef PFN_GetPhysicalDeviceProcAddr | |||
| typedef PFN_vkVoidFunction(VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char *pName); | |||
| #endif | |||
| /* | |||
| * The ICD must reserve space for a pointer for the loader's dispatch | |||
| * table, at the start of <each object>. | |||
| * The ICD must initialize this variable using the SET_LOADER_MAGIC_VALUE macro. | |||
| */ | |||
| #define ICD_LOADER_MAGIC 0x01CDC0DE | |||
| typedef union { | |||
| uintptr_t loaderMagic; | |||
| void *loaderData; | |||
| } VK_LOADER_DATA; | |||
| static inline void set_loader_magic_value(void *pNewObject) { | |||
| VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject; | |||
| loader_info->loaderMagic = ICD_LOADER_MAGIC; | |||
| } | |||
| static inline bool valid_loader_magic_value(void *pNewObject) { | |||
| const VK_LOADER_DATA *loader_info = (VK_LOADER_DATA *)pNewObject; | |||
| return (loader_info->loaderMagic & 0xffffffff) == ICD_LOADER_MAGIC; | |||
| } | |||
| /* | |||
| * Windows and Linux ICDs will treat VkSurfaceKHR as a pointer to a struct that | |||
| * contains the platform-specific connection and surface information. | |||
| */ | |||
| typedef enum { | |||
| VK_ICD_WSI_PLATFORM_MIR, | |||
| VK_ICD_WSI_PLATFORM_WAYLAND, | |||
| VK_ICD_WSI_PLATFORM_WIN32, | |||
| VK_ICD_WSI_PLATFORM_XCB, | |||
| VK_ICD_WSI_PLATFORM_XLIB, | |||
| VK_ICD_WSI_PLATFORM_ANDROID, | |||
| VK_ICD_WSI_PLATFORM_MACOS, | |||
| VK_ICD_WSI_PLATFORM_IOS, | |||
| VK_ICD_WSI_PLATFORM_DISPLAY, | |||
| VK_ICD_WSI_PLATFORM_HEADLESS | |||
| } VkIcdWsiPlatform; | |||
| typedef struct { | |||
| VkIcdWsiPlatform platform; | |||
| } VkIcdSurfaceBase; | |||
| #ifdef VK_USE_PLATFORM_MIR_KHR | |||
| typedef struct { | |||
| VkIcdSurfaceBase base; | |||
| MirConnection *connection; | |||
| MirSurface *mirSurface; | |||
| } VkIcdSurfaceMir; | |||
| #endif // VK_USE_PLATFORM_MIR_KHR | |||
| #ifdef VK_USE_PLATFORM_WAYLAND_KHR | |||
| typedef struct { | |||
| VkIcdSurfaceBase base; | |||
| struct wl_display *display; | |||
| struct wl_surface *surface; | |||
| } VkIcdSurfaceWayland; | |||
| #endif // VK_USE_PLATFORM_WAYLAND_KHR | |||
| #ifdef VK_USE_PLATFORM_WIN32_KHR | |||
| typedef struct { | |||
| VkIcdSurfaceBase base; | |||
| HINSTANCE hinstance; | |||
| HWND hwnd; | |||
| } VkIcdSurfaceWin32; | |||
| #endif // VK_USE_PLATFORM_WIN32_KHR | |||
| #ifdef VK_USE_PLATFORM_XCB_KHR | |||
| typedef struct { | |||
| VkIcdSurfaceBase base; | |||
| xcb_connection_t *connection; | |||
| xcb_window_t window; | |||
| } VkIcdSurfaceXcb; | |||
| #endif // VK_USE_PLATFORM_XCB_KHR | |||
| #ifdef VK_USE_PLATFORM_XLIB_KHR | |||
| typedef struct { | |||
| VkIcdSurfaceBase base; | |||
| Display *dpy; | |||
| Window window; | |||
| } VkIcdSurfaceXlib; | |||
| #endif // VK_USE_PLATFORM_XLIB_KHR | |||
| #ifdef VK_USE_PLATFORM_ANDROID_KHR | |||
| typedef struct { | |||
| VkIcdSurfaceBase base; | |||
| struct ANativeWindow *window; | |||
| } VkIcdSurfaceAndroid; | |||
| #endif // VK_USE_PLATFORM_ANDROID_KHR | |||
| #ifdef VK_USE_PLATFORM_MACOS_MVK | |||
| typedef struct { | |||
| VkIcdSurfaceBase base; | |||
| const void *pView; | |||
| } VkIcdSurfaceMacOS; | |||
| #endif // VK_USE_PLATFORM_MACOS_MVK | |||
| #ifdef VK_USE_PLATFORM_IOS_MVK | |||
| typedef struct { | |||
| VkIcdSurfaceBase base; | |||
| const void *pView; | |||
| } VkIcdSurfaceIOS; | |||
| #endif // VK_USE_PLATFORM_IOS_MVK | |||
| typedef struct { | |||
| VkIcdSurfaceBase base; | |||
| VkDisplayModeKHR displayMode; | |||
| uint32_t planeIndex; | |||
| uint32_t planeStackIndex; | |||
| VkSurfaceTransformFlagBitsKHR transform; | |||
| float globalAlpha; | |||
| VkDisplayPlaneAlphaFlagBitsKHR alphaMode; | |||
| VkExtent2D imageExtent; | |||
| } VkIcdSurfaceDisplay; | |||
| typedef struct { | |||
| VkIcdSurfaceBase base; | |||
| } VkIcdSurfaceHeadless; | |||
| #endif // VKICD_H | |||
| @@ -0,0 +1,202 @@ | |||
| // | |||
| // 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 | |||
| #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 | |||
| #define VK_CURRENT_CHAIN_VERSION 1 | |||
| // Typedef for use in the interfaces below | |||
| typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName); | |||
| // 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, | |||
| VK_LOADER_LAYER_CREATE_DEVICE_CALLBACK = 2 | |||
| } 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 VkResult (VKAPI_PTR *PFN_vkLayerCreateDevice)(VkInstance instance, VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo, | |||
| const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, PFN_vkGetInstanceProcAddr layerGIPA, PFN_vkGetDeviceProcAddr *nextGDPA); | |||
| typedef void (VKAPI_PTR *PFN_vkLayerDestroyDevice)(VkDevice physicalDevice, const VkAllocationCallbacks *pAllocator, PFN_vkDestroyDevice destroyFunction); | |||
| typedef struct { | |||
| VkStructureType sType; // VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO | |||
| const void *pNext; | |||
| VkLayerFunction function; | |||
| union { | |||
| VkLayerInstanceLink *pLayerInfo; | |||
| PFN_vkSetInstanceLoaderData pfnSetInstanceLoaderData; | |||
| struct { | |||
| PFN_vkLayerCreateDevice pfnLayerCreateDevice; | |||
| PFN_vkLayerDestroyDevice pfnLayerDestroyDevice; | |||
| } layerDevice; | |||
| } 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; | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkNegotiateLoaderLayerInterfaceVersion(VkNegotiateLayerInterface *pVersionStruct); | |||
| typedef enum VkChainType { | |||
| VK_CHAIN_TYPE_UNKNOWN = 0, | |||
| VK_CHAIN_TYPE_ENUMERATE_INSTANCE_EXTENSION_PROPERTIES = 1, | |||
| VK_CHAIN_TYPE_ENUMERATE_INSTANCE_LAYER_PROPERTIES = 2, | |||
| VK_CHAIN_TYPE_ENUMERATE_INSTANCE_VERSION = 3, | |||
| } VkChainType; | |||
| typedef struct VkChainHeader { | |||
| VkChainType type; | |||
| uint32_t version; | |||
| uint32_t size; | |||
| } VkChainHeader; | |||
| typedef struct VkEnumerateInstanceExtensionPropertiesChain { | |||
| VkChainHeader header; | |||
| VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceExtensionPropertiesChain *, const char *, uint32_t *, | |||
| VkExtensionProperties *); | |||
| const struct VkEnumerateInstanceExtensionPropertiesChain *pNextLink; | |||
| #if defined(__cplusplus) | |||
| inline VkResult CallDown(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties) const { | |||
| return pfnNextLayer(pNextLink, pLayerName, pPropertyCount, pProperties); | |||
| } | |||
| #endif | |||
| } VkEnumerateInstanceExtensionPropertiesChain; | |||
| typedef struct VkEnumerateInstanceLayerPropertiesChain { | |||
| VkChainHeader header; | |||
| VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceLayerPropertiesChain *, uint32_t *, VkLayerProperties *); | |||
| const struct VkEnumerateInstanceLayerPropertiesChain *pNextLink; | |||
| #if defined(__cplusplus) | |||
| inline VkResult CallDown(uint32_t *pPropertyCount, VkLayerProperties *pProperties) const { | |||
| return pfnNextLayer(pNextLink, pPropertyCount, pProperties); | |||
| } | |||
| #endif | |||
| } VkEnumerateInstanceLayerPropertiesChain; | |||
| typedef struct VkEnumerateInstanceVersionChain { | |||
| VkChainHeader header; | |||
| VkResult(VKAPI_PTR *pfnNextLayer)(const struct VkEnumerateInstanceVersionChain *, uint32_t *); | |||
| const struct VkEnumerateInstanceVersionChain *pNextLink; | |||
| #if defined(__cplusplus) | |||
| inline VkResult CallDown(uint32_t *pApiVersion) const { | |||
| return pfnNextLayer(pNextLink, pApiVersion); | |||
| } | |||
| #endif | |||
| } VkEnumerateInstanceVersionChain; | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| @@ -0,0 +1,92 @@ | |||
| // | |||
| // File: vk_platform.h | |||
| // | |||
| /* | |||
| ** Copyright (c) 2014-2017 The Khronos Group 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. | |||
| */ | |||
| #ifndef VK_PLATFORM_H_ | |||
| #define VK_PLATFORM_H_ | |||
| #ifdef __cplusplus | |||
| extern "C" | |||
| { | |||
| #endif // __cplusplus | |||
| /* | |||
| *************************************************************************************************** | |||
| * Platform-specific directives and type declarations | |||
| *************************************************************************************************** | |||
| */ | |||
| /* Platform-specific calling convention macros. | |||
| * | |||
| * Platforms should define these so that Vulkan clients call Vulkan commands | |||
| * with the same calling conventions that the Vulkan implementation expects. | |||
| * | |||
| * VKAPI_ATTR - Placed before the return type in function declarations. | |||
| * Useful for C++11 and GCC/Clang-style function attribute syntax. | |||
| * VKAPI_CALL - Placed after the return type in function declarations. | |||
| * Useful for MSVC-style calling convention syntax. | |||
| * VKAPI_PTR - Placed between the '(' and '*' in function pointer types. | |||
| * | |||
| * Function declaration: VKAPI_ATTR void VKAPI_CALL vkCommand(void); | |||
| * Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void); | |||
| */ | |||
| #if defined(_WIN32) | |||
| // On Windows, Vulkan commands use the stdcall convention | |||
| #define VKAPI_ATTR | |||
| #define VKAPI_CALL __stdcall | |||
| #define VKAPI_PTR VKAPI_CALL | |||
| #elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7 | |||
| #error "Vulkan isn't supported for the 'armeabi' NDK ABI" | |||
| #elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE) | |||
| // On Android 32-bit ARM targets, Vulkan functions use the "hardfloat" | |||
| // calling convention, i.e. float parameters are passed in registers. This | |||
| // is true even if the rest of the application passes floats on the stack, | |||
| // as it does by default when compiling for the armeabi-v7a NDK ABI. | |||
| #define VKAPI_ATTR __attribute__((pcs("aapcs-vfp"))) | |||
| #define VKAPI_CALL | |||
| #define VKAPI_PTR VKAPI_ATTR | |||
| #else | |||
| // On other platforms, use the default calling convention | |||
| #define VKAPI_ATTR | |||
| #define VKAPI_CALL | |||
| #define VKAPI_PTR | |||
| #endif | |||
| #include <stddef.h> | |||
| #if !defined(VK_NO_STDINT_H) | |||
| #if defined(_MSC_VER) && (_MSC_VER < 1600) | |||
| typedef signed __int8 int8_t; | |||
| typedef unsigned __int8 uint8_t; | |||
| typedef signed __int16 int16_t; | |||
| typedef unsigned __int16 uint16_t; | |||
| typedef signed __int32 int32_t; | |||
| typedef unsigned __int32 uint32_t; | |||
| typedef signed __int64 int64_t; | |||
| typedef unsigned __int64 uint64_t; | |||
| #else | |||
| #include <stdint.h> | |||
| #endif | |||
| #endif // !defined(VK_NO_STDINT_H) | |||
| #ifdef __cplusplus | |||
| } // extern "C" | |||
| #endif // __cplusplus | |||
| #endif | |||
| @@ -0,0 +1,69 @@ | |||
| // | |||
| // File: vk_sdk_platform.h | |||
| // | |||
| /* | |||
| * Copyright (c) 2015-2016 The Khronos Group Inc. | |||
| * Copyright (c) 2015-2016 Valve Corporation | |||
| * Copyright (c) 2015-2016 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. | |||
| */ | |||
| #ifndef VK_SDK_PLATFORM_H | |||
| #define VK_SDK_PLATFORM_H | |||
| #if defined(_WIN32) | |||
| #define NOMINMAX | |||
| #ifndef __cplusplus | |||
| #undef inline | |||
| #define inline __inline | |||
| #endif // __cplusplus | |||
| #if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) | |||
| // C99: | |||
| // Microsoft didn't implement C99 in Visual Studio; but started adding it with | |||
| // VS2013. However, VS2013 still didn't have snprintf(). The following is a | |||
| // work-around (Note: The _CRT_SECURE_NO_WARNINGS macro must be set in the | |||
| // "CMakeLists.txt" file). | |||
| // NOTE: This is fixed in Visual Studio 2015. | |||
| #define snprintf _snprintf | |||
| #endif | |||
| #define strdup _strdup | |||
| #endif // _WIN32 | |||
| // Check for noexcept support using clang, with fallback to Windows or GCC version numbers | |||
| #ifndef NOEXCEPT | |||
| #if defined(__clang__) | |||
| #if __has_feature(cxx_noexcept) | |||
| #define HAS_NOEXCEPT | |||
| #endif | |||
| #else | |||
| #if defined(__GXX_EXPERIMENTAL_CXX0X__) && __GNUC__ * 10 + __GNUC_MINOR__ >= 46 | |||
| #define HAS_NOEXCEPT | |||
| #else | |||
| #if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023026 && defined(_HAS_EXCEPTIONS) && _HAS_EXCEPTIONS | |||
| #define HAS_NOEXCEPT | |||
| #endif | |||
| #endif | |||
| #endif | |||
| #ifdef HAS_NOEXCEPT | |||
| #define NOEXCEPT noexcept | |||
| #else | |||
| #define NOEXCEPT | |||
| #endif | |||
| #endif | |||
| #endif // VK_SDK_PLATFORM_H | |||
| @@ -0,0 +1,86 @@ | |||
| #ifndef VULKAN_H_ | |||
| #define VULKAN_H_ 1 | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| #include "vk_platform.h" | |||
| #include "vulkan_core.h" | |||
| #ifdef VK_USE_PLATFORM_ANDROID_KHR | |||
| #include "vulkan_android.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_FUCHSIA | |||
| #include <zircon/types.h> | |||
| #include "vulkan_fuchsia.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_IOS_MVK | |||
| #include "vulkan_ios.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_MACOS_MVK | |||
| #include "vulkan_macos.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_METAL_EXT | |||
| #include "vulkan_metal.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_VI_NN | |||
| #include "vulkan_vi.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_WAYLAND_KHR | |||
| #include <wayland-client.h> | |||
| #include "vulkan_wayland.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_WIN32_KHR | |||
| #include <windows.h> | |||
| #include "vulkan_win32.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_XCB_KHR | |||
| #include <xcb/xcb.h> | |||
| #include "vulkan_xcb.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_XLIB_KHR | |||
| #include <X11/Xlib.h> | |||
| #include "vulkan_xlib.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT | |||
| #include <X11/Xlib.h> | |||
| #include <X11/extensions/Xrandr.h> | |||
| #include "vulkan_xlib_xrandr.h" | |||
| #endif | |||
| #ifdef VK_USE_PLATFORM_GGP | |||
| #include <ggp_c/vulkan_types.h> | |||
| #include "vulkan_ggp.h" | |||
| #endif | |||
| #endif // VULKAN_H_ | |||
| @@ -0,0 +1,121 @@ | |||
| #ifndef VULKAN_ANDROID_H_ | |||
| #define VULKAN_ANDROID_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_KHR_android_surface 1 | |||
| struct ANativeWindow; | |||
| #define VK_KHR_ANDROID_SURFACE_SPEC_VERSION 6 | |||
| #define VK_KHR_ANDROID_SURFACE_EXTENSION_NAME "VK_KHR_android_surface" | |||
| typedef VkFlags VkAndroidSurfaceCreateFlagsKHR; | |||
| typedef struct VkAndroidSurfaceCreateInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkAndroidSurfaceCreateFlagsKHR flags; | |||
| struct ANativeWindow* window; | |||
| } VkAndroidSurfaceCreateInfoKHR; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateAndroidSurfaceKHR)(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR( | |||
| VkInstance instance, | |||
| const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| #endif | |||
| #define VK_ANDROID_external_memory_android_hardware_buffer 1 | |||
| struct AHardwareBuffer; | |||
| #define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION 3 | |||
| #define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME "VK_ANDROID_external_memory_android_hardware_buffer" | |||
| typedef struct VkAndroidHardwareBufferUsageANDROID { | |||
| VkStructureType sType; | |||
| void* pNext; | |||
| uint64_t androidHardwareBufferUsage; | |||
| } VkAndroidHardwareBufferUsageANDROID; | |||
| typedef struct VkAndroidHardwareBufferPropertiesANDROID { | |||
| VkStructureType sType; | |||
| void* pNext; | |||
| VkDeviceSize allocationSize; | |||
| uint32_t memoryTypeBits; | |||
| } VkAndroidHardwareBufferPropertiesANDROID; | |||
| typedef struct VkAndroidHardwareBufferFormatPropertiesANDROID { | |||
| VkStructureType sType; | |||
| void* pNext; | |||
| VkFormat format; | |||
| uint64_t externalFormat; | |||
| VkFormatFeatureFlags formatFeatures; | |||
| VkComponentMapping samplerYcbcrConversionComponents; | |||
| VkSamplerYcbcrModelConversion suggestedYcbcrModel; | |||
| VkSamplerYcbcrRange suggestedYcbcrRange; | |||
| VkChromaLocation suggestedXChromaOffset; | |||
| VkChromaLocation suggestedYChromaOffset; | |||
| } VkAndroidHardwareBufferFormatPropertiesANDROID; | |||
| typedef struct VkImportAndroidHardwareBufferInfoANDROID { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| struct AHardwareBuffer* buffer; | |||
| } VkImportAndroidHardwareBufferInfoANDROID; | |||
| typedef struct VkMemoryGetAndroidHardwareBufferInfoANDROID { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkDeviceMemory memory; | |||
| } VkMemoryGetAndroidHardwareBufferInfoANDROID; | |||
| typedef struct VkExternalFormatANDROID { | |||
| VkStructureType sType; | |||
| void* pNext; | |||
| uint64_t externalFormat; | |||
| } VkExternalFormatANDROID; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkGetAndroidHardwareBufferPropertiesANDROID)(VkDevice device, const struct AHardwareBuffer* buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties); | |||
| typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryAndroidHardwareBufferANDROID)(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct AHardwareBuffer** pBuffer); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkGetAndroidHardwareBufferPropertiesANDROID( | |||
| VkDevice device, | |||
| const struct AHardwareBuffer* buffer, | |||
| VkAndroidHardwareBufferPropertiesANDROID* pProperties); | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryAndroidHardwareBufferANDROID( | |||
| VkDevice device, | |||
| const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, | |||
| struct AHardwareBuffer** pBuffer); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,56 @@ | |||
| #ifndef VULKAN_FUCHSIA_H_ | |||
| #define VULKAN_FUCHSIA_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_FUCHSIA_imagepipe_surface 1 | |||
| #define VK_FUCHSIA_IMAGEPIPE_SURFACE_SPEC_VERSION 1 | |||
| #define VK_FUCHSIA_IMAGEPIPE_SURFACE_EXTENSION_NAME "VK_FUCHSIA_imagepipe_surface" | |||
| typedef VkFlags VkImagePipeSurfaceCreateFlagsFUCHSIA; | |||
| typedef struct VkImagePipeSurfaceCreateInfoFUCHSIA { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkImagePipeSurfaceCreateFlagsFUCHSIA flags; | |||
| zx_handle_t imagePipeHandle; | |||
| } VkImagePipeSurfaceCreateInfoFUCHSIA; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateImagePipeSurfaceFUCHSIA)(VkInstance instance, const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateImagePipeSurfaceFUCHSIA( | |||
| VkInstance instance, | |||
| const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,67 @@ | |||
| #ifndef VULKAN_GGP_H_ | |||
| #define VULKAN_GGP_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_GGP_stream_descriptor_surface 1 | |||
| #define VK_GGP_STREAM_DESCRIPTOR_SURFACE_SPEC_VERSION 1 | |||
| #define VK_GGP_STREAM_DESCRIPTOR_SURFACE_EXTENSION_NAME "VK_GGP_stream_descriptor_surface" | |||
| typedef VkFlags VkStreamDescriptorSurfaceCreateFlagsGGP; | |||
| typedef struct VkStreamDescriptorSurfaceCreateInfoGGP { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkStreamDescriptorSurfaceCreateFlagsGGP flags; | |||
| GgpStreamDescriptor streamDescriptor; | |||
| } VkStreamDescriptorSurfaceCreateInfoGGP; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateStreamDescriptorSurfaceGGP)(VkInstance instance, const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateStreamDescriptorSurfaceGGP( | |||
| VkInstance instance, | |||
| const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| #endif | |||
| #define VK_GGP_frame_token 1 | |||
| #define VK_GGP_FRAME_TOKEN_SPEC_VERSION 1 | |||
| #define VK_GGP_FRAME_TOKEN_EXTENSION_NAME "VK_GGP_frame_token" | |||
| typedef struct VkPresentFrameTokenGGP { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| GgpFrameToken frameToken; | |||
| } VkPresentFrameTokenGGP; | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,56 @@ | |||
| #ifndef VULKAN_IOS_H_ | |||
| #define VULKAN_IOS_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_MVK_ios_surface 1 | |||
| #define VK_MVK_IOS_SURFACE_SPEC_VERSION 2 | |||
| #define VK_MVK_IOS_SURFACE_EXTENSION_NAME "VK_MVK_ios_surface" | |||
| typedef VkFlags VkIOSSurfaceCreateFlagsMVK; | |||
| typedef struct VkIOSSurfaceCreateInfoMVK { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkIOSSurfaceCreateFlagsMVK flags; | |||
| const void* pView; | |||
| } VkIOSSurfaceCreateInfoMVK; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateIOSSurfaceMVK)(VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK( | |||
| VkInstance instance, | |||
| const VkIOSSurfaceCreateInfoMVK* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,56 @@ | |||
| #ifndef VULKAN_MACOS_H_ | |||
| #define VULKAN_MACOS_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_MVK_macos_surface 1 | |||
| #define VK_MVK_MACOS_SURFACE_SPEC_VERSION 2 | |||
| #define VK_MVK_MACOS_SURFACE_EXTENSION_NAME "VK_MVK_macos_surface" | |||
| typedef VkFlags VkMacOSSurfaceCreateFlagsMVK; | |||
| typedef struct VkMacOSSurfaceCreateInfoMVK { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkMacOSSurfaceCreateFlagsMVK flags; | |||
| const void* pView; | |||
| } VkMacOSSurfaceCreateInfoMVK; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateMacOSSurfaceMVK)(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK( | |||
| VkInstance instance, | |||
| const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,63 @@ | |||
| #ifndef VULKAN_METAL_H_ | |||
| #define VULKAN_METAL_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_EXT_metal_surface 1 | |||
| #ifdef __OBJC__ | |||
| @class CAMetalLayer; | |||
| #else | |||
| typedef void CAMetalLayer; | |||
| #endif | |||
| #define VK_EXT_METAL_SURFACE_SPEC_VERSION 1 | |||
| #define VK_EXT_METAL_SURFACE_EXTENSION_NAME "VK_EXT_metal_surface" | |||
| typedef VkFlags VkMetalSurfaceCreateFlagsEXT; | |||
| typedef struct VkMetalSurfaceCreateInfoEXT { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkMetalSurfaceCreateFlagsEXT flags; | |||
| const CAMetalLayer* pLayer; | |||
| } VkMetalSurfaceCreateInfoEXT; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateMetalSurfaceEXT)(VkInstance instance, const VkMetalSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateMetalSurfaceEXT( | |||
| VkInstance instance, | |||
| const VkMetalSurfaceCreateInfoEXT* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,56 @@ | |||
| #ifndef VULKAN_VI_H_ | |||
| #define VULKAN_VI_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_NN_vi_surface 1 | |||
| #define VK_NN_VI_SURFACE_SPEC_VERSION 1 | |||
| #define VK_NN_VI_SURFACE_EXTENSION_NAME "VK_NN_vi_surface" | |||
| typedef VkFlags VkViSurfaceCreateFlagsNN; | |||
| typedef struct VkViSurfaceCreateInfoNN { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkViSurfaceCreateFlagsNN flags; | |||
| void* window; | |||
| } VkViSurfaceCreateInfoNN; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateViSurfaceNN)(VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateViSurfaceNN( | |||
| VkInstance instance, | |||
| const VkViSurfaceCreateInfoNN* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,63 @@ | |||
| #ifndef VULKAN_WAYLAND_H_ | |||
| #define VULKAN_WAYLAND_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_KHR_wayland_surface 1 | |||
| #define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 6 | |||
| #define VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME "VK_KHR_wayland_surface" | |||
| typedef VkFlags VkWaylandSurfaceCreateFlagsKHR; | |||
| typedef struct VkWaylandSurfaceCreateInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkWaylandSurfaceCreateFlagsKHR flags; | |||
| struct wl_display* display; | |||
| struct wl_surface* surface; | |||
| } VkWaylandSurfaceCreateInfoKHR; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateWaylandSurfaceKHR)(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct wl_display* display); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR( | |||
| VkInstance instance, | |||
| const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR( | |||
| VkPhysicalDevice physicalDevice, | |||
| uint32_t queueFamilyIndex, | |||
| struct wl_display* display); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,327 @@ | |||
| #ifndef VULKAN_WIN32_H_ | |||
| #define VULKAN_WIN32_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_KHR_win32_surface 1 | |||
| #define VK_KHR_WIN32_SURFACE_SPEC_VERSION 6 | |||
| #define VK_KHR_WIN32_SURFACE_EXTENSION_NAME "VK_KHR_win32_surface" | |||
| typedef VkFlags VkWin32SurfaceCreateFlagsKHR; | |||
| typedef struct VkWin32SurfaceCreateInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkWin32SurfaceCreateFlagsKHR flags; | |||
| HINSTANCE hinstance; | |||
| HWND hwnd; | |||
| } VkWin32SurfaceCreateInfoKHR; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateWin32SurfaceKHR)(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR( | |||
| VkInstance instance, | |||
| const VkWin32SurfaceCreateInfoKHR* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR( | |||
| VkPhysicalDevice physicalDevice, | |||
| uint32_t queueFamilyIndex); | |||
| #endif | |||
| #define VK_KHR_external_memory_win32 1 | |||
| #define VK_KHR_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1 | |||
| #define VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_KHR_external_memory_win32" | |||
| typedef struct VkImportMemoryWin32HandleInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkExternalMemoryHandleTypeFlagBits handleType; | |||
| HANDLE handle; | |||
| LPCWSTR name; | |||
| } VkImportMemoryWin32HandleInfoKHR; | |||
| typedef struct VkExportMemoryWin32HandleInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| const SECURITY_ATTRIBUTES* pAttributes; | |||
| DWORD dwAccess; | |||
| LPCWSTR name; | |||
| } VkExportMemoryWin32HandleInfoKHR; | |||
| typedef struct VkMemoryWin32HandlePropertiesKHR { | |||
| VkStructureType sType; | |||
| void* pNext; | |||
| uint32_t memoryTypeBits; | |||
| } VkMemoryWin32HandlePropertiesKHR; | |||
| typedef struct VkMemoryGetWin32HandleInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkDeviceMemory memory; | |||
| VkExternalMemoryHandleTypeFlagBits handleType; | |||
| } VkMemoryGetWin32HandleInfoKHR; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleKHR)(VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); | |||
| typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandlePropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleKHR( | |||
| VkDevice device, | |||
| const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, | |||
| HANDLE* pHandle); | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandlePropertiesKHR( | |||
| VkDevice device, | |||
| VkExternalMemoryHandleTypeFlagBits handleType, | |||
| HANDLE handle, | |||
| VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties); | |||
| #endif | |||
| #define VK_KHR_win32_keyed_mutex 1 | |||
| #define VK_KHR_WIN32_KEYED_MUTEX_SPEC_VERSION 1 | |||
| #define VK_KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_KHR_win32_keyed_mutex" | |||
| typedef struct VkWin32KeyedMutexAcquireReleaseInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| uint32_t acquireCount; | |||
| const VkDeviceMemory* pAcquireSyncs; | |||
| const uint64_t* pAcquireKeys; | |||
| const uint32_t* pAcquireTimeouts; | |||
| uint32_t releaseCount; | |||
| const VkDeviceMemory* pReleaseSyncs; | |||
| const uint64_t* pReleaseKeys; | |||
| } VkWin32KeyedMutexAcquireReleaseInfoKHR; | |||
| #define VK_KHR_external_semaphore_win32 1 | |||
| #define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_SPEC_VERSION 1 | |||
| #define VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME "VK_KHR_external_semaphore_win32" | |||
| typedef struct VkImportSemaphoreWin32HandleInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkSemaphore semaphore; | |||
| VkSemaphoreImportFlags flags; | |||
| VkExternalSemaphoreHandleTypeFlagBits handleType; | |||
| HANDLE handle; | |||
| LPCWSTR name; | |||
| } VkImportSemaphoreWin32HandleInfoKHR; | |||
| typedef struct VkExportSemaphoreWin32HandleInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| const SECURITY_ATTRIBUTES* pAttributes; | |||
| DWORD dwAccess; | |||
| LPCWSTR name; | |||
| } VkExportSemaphoreWin32HandleInfoKHR; | |||
| typedef struct VkD3D12FenceSubmitInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| uint32_t waitSemaphoreValuesCount; | |||
| const uint64_t* pWaitSemaphoreValues; | |||
| uint32_t signalSemaphoreValuesCount; | |||
| const uint64_t* pSignalSemaphoreValues; | |||
| } VkD3D12FenceSubmitInfoKHR; | |||
| typedef struct VkSemaphoreGetWin32HandleInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkSemaphore semaphore; | |||
| VkExternalSemaphoreHandleTypeFlagBits handleType; | |||
| } VkSemaphoreGetWin32HandleInfoKHR; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreWin32HandleKHR)(VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo); | |||
| typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreWin32HandleKHR)(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreWin32HandleKHR( | |||
| VkDevice device, | |||
| const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo); | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreWin32HandleKHR( | |||
| VkDevice device, | |||
| const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, | |||
| HANDLE* pHandle); | |||
| #endif | |||
| #define VK_KHR_external_fence_win32 1 | |||
| #define VK_KHR_EXTERNAL_FENCE_WIN32_SPEC_VERSION 1 | |||
| #define VK_KHR_EXTERNAL_FENCE_WIN32_EXTENSION_NAME "VK_KHR_external_fence_win32" | |||
| typedef struct VkImportFenceWin32HandleInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkFence fence; | |||
| VkFenceImportFlags flags; | |||
| VkExternalFenceHandleTypeFlagBits handleType; | |||
| HANDLE handle; | |||
| LPCWSTR name; | |||
| } VkImportFenceWin32HandleInfoKHR; | |||
| typedef struct VkExportFenceWin32HandleInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| const SECURITY_ATTRIBUTES* pAttributes; | |||
| DWORD dwAccess; | |||
| LPCWSTR name; | |||
| } VkExportFenceWin32HandleInfoKHR; | |||
| typedef struct VkFenceGetWin32HandleInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkFence fence; | |||
| VkExternalFenceHandleTypeFlagBits handleType; | |||
| } VkFenceGetWin32HandleInfoKHR; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkImportFenceWin32HandleKHR)(VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo); | |||
| typedef VkResult (VKAPI_PTR *PFN_vkGetFenceWin32HandleKHR)(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkImportFenceWin32HandleKHR( | |||
| VkDevice device, | |||
| const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo); | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceWin32HandleKHR( | |||
| VkDevice device, | |||
| const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, | |||
| HANDLE* pHandle); | |||
| #endif | |||
| #define VK_NV_external_memory_win32 1 | |||
| #define VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION 1 | |||
| #define VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_NV_external_memory_win32" | |||
| typedef struct VkImportMemoryWin32HandleInfoNV { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkExternalMemoryHandleTypeFlagsNV handleType; | |||
| HANDLE handle; | |||
| } VkImportMemoryWin32HandleInfoNV; | |||
| typedef struct VkExportMemoryWin32HandleInfoNV { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| const SECURITY_ATTRIBUTES* pAttributes; | |||
| DWORD dwAccess; | |||
| } VkExportMemoryWin32HandleInfoNV; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleNV)(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleNV( | |||
| VkDevice device, | |||
| VkDeviceMemory memory, | |||
| VkExternalMemoryHandleTypeFlagsNV handleType, | |||
| HANDLE* pHandle); | |||
| #endif | |||
| #define VK_NV_win32_keyed_mutex 1 | |||
| #define VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION 1 | |||
| #define VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_NV_win32_keyed_mutex" | |||
| typedef struct VkWin32KeyedMutexAcquireReleaseInfoNV { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| uint32_t acquireCount; | |||
| const VkDeviceMemory* pAcquireSyncs; | |||
| const uint64_t* pAcquireKeys; | |||
| const uint32_t* pAcquireTimeoutMilliseconds; | |||
| uint32_t releaseCount; | |||
| const VkDeviceMemory* pReleaseSyncs; | |||
| const uint64_t* pReleaseKeys; | |||
| } VkWin32KeyedMutexAcquireReleaseInfoNV; | |||
| #define VK_EXT_full_screen_exclusive 1 | |||
| #define VK_EXT_FULL_SCREEN_EXCLUSIVE_SPEC_VERSION 3 | |||
| #define VK_EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME "VK_EXT_full_screen_exclusive" | |||
| typedef enum VkFullScreenExclusiveEXT { | |||
| VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT = 0, | |||
| VK_FULL_SCREEN_EXCLUSIVE_ALLOWED_EXT = 1, | |||
| VK_FULL_SCREEN_EXCLUSIVE_DISALLOWED_EXT = 2, | |||
| VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT = 3, | |||
| VK_FULL_SCREEN_EXCLUSIVE_BEGIN_RANGE_EXT = VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT, | |||
| VK_FULL_SCREEN_EXCLUSIVE_END_RANGE_EXT = VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT, | |||
| VK_FULL_SCREEN_EXCLUSIVE_RANGE_SIZE_EXT = (VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT - VK_FULL_SCREEN_EXCLUSIVE_DEFAULT_EXT + 1), | |||
| VK_FULL_SCREEN_EXCLUSIVE_MAX_ENUM_EXT = 0x7FFFFFFF | |||
| } VkFullScreenExclusiveEXT; | |||
| typedef struct VkSurfaceFullScreenExclusiveInfoEXT { | |||
| VkStructureType sType; | |||
| void* pNext; | |||
| VkFullScreenExclusiveEXT fullScreenExclusive; | |||
| } VkSurfaceFullScreenExclusiveInfoEXT; | |||
| typedef struct VkSurfaceCapabilitiesFullScreenExclusiveEXT { | |||
| VkStructureType sType; | |||
| void* pNext; | |||
| VkBool32 fullScreenExclusiveSupported; | |||
| } VkSurfaceCapabilitiesFullScreenExclusiveEXT; | |||
| typedef struct VkSurfaceFullScreenExclusiveWin32InfoEXT { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| HMONITOR hmonitor; | |||
| } VkSurfaceFullScreenExclusiveWin32InfoEXT; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfacePresentModes2EXT)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes); | |||
| typedef VkResult (VKAPI_PTR *PFN_vkAcquireFullScreenExclusiveModeEXT)(VkDevice device, VkSwapchainKHR swapchain); | |||
| typedef VkResult (VKAPI_PTR *PFN_vkReleaseFullScreenExclusiveModeEXT)(VkDevice device, VkSwapchainKHR swapchain); | |||
| typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupSurfacePresentModes2EXT)(VkDevice device, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkDeviceGroupPresentModeFlagsKHR* pModes); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModes2EXT( | |||
| VkPhysicalDevice physicalDevice, | |||
| const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, | |||
| uint32_t* pPresentModeCount, | |||
| VkPresentModeKHR* pPresentModes); | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkAcquireFullScreenExclusiveModeEXT( | |||
| VkDevice device, | |||
| VkSwapchainKHR swapchain); | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkReleaseFullScreenExclusiveModeEXT( | |||
| VkDevice device, | |||
| VkSwapchainKHR swapchain); | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModes2EXT( | |||
| VkDevice device, | |||
| const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, | |||
| VkDeviceGroupPresentModeFlagsKHR* pModes); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,64 @@ | |||
| #ifndef VULKAN_XCB_H_ | |||
| #define VULKAN_XCB_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_KHR_xcb_surface 1 | |||
| #define VK_KHR_XCB_SURFACE_SPEC_VERSION 6 | |||
| #define VK_KHR_XCB_SURFACE_EXTENSION_NAME "VK_KHR_xcb_surface" | |||
| typedef VkFlags VkXcbSurfaceCreateFlagsKHR; | |||
| typedef struct VkXcbSurfaceCreateInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkXcbSurfaceCreateFlagsKHR flags; | |||
| xcb_connection_t* connection; | |||
| xcb_window_t window; | |||
| } VkXcbSurfaceCreateInfoKHR; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateXcbSurfaceKHR)(VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t* connection, xcb_visualid_t visual_id); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR( | |||
| VkInstance instance, | |||
| const VkXcbSurfaceCreateInfoKHR* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR( | |||
| VkPhysicalDevice physicalDevice, | |||
| uint32_t queueFamilyIndex, | |||
| xcb_connection_t* connection, | |||
| xcb_visualid_t visual_id); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,64 @@ | |||
| #ifndef VULKAN_XLIB_H_ | |||
| #define VULKAN_XLIB_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_KHR_xlib_surface 1 | |||
| #define VK_KHR_XLIB_SURFACE_SPEC_VERSION 6 | |||
| #define VK_KHR_XLIB_SURFACE_EXTENSION_NAME "VK_KHR_xlib_surface" | |||
| typedef VkFlags VkXlibSurfaceCreateFlagsKHR; | |||
| typedef struct VkXlibSurfaceCreateInfoKHR { | |||
| VkStructureType sType; | |||
| const void* pNext; | |||
| VkXlibSurfaceCreateFlagsKHR flags; | |||
| Display* dpy; | |||
| Window window; | |||
| } VkXlibSurfaceCreateInfoKHR; | |||
| typedef VkResult (VKAPI_PTR *PFN_vkCreateXlibSurfaceKHR)(VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | |||
| typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy, VisualID visualID); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR( | |||
| VkInstance instance, | |||
| const VkXlibSurfaceCreateInfoKHR* pCreateInfo, | |||
| const VkAllocationCallbacks* pAllocator, | |||
| VkSurfaceKHR* pSurface); | |||
| VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR( | |||
| VkPhysicalDevice physicalDevice, | |||
| uint32_t queueFamilyIndex, | |||
| Display* dpy, | |||
| VisualID visualID); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,54 @@ | |||
| #ifndef VULKAN_XLIB_XRANDR_H_ | |||
| #define VULKAN_XLIB_XRANDR_H_ 1 | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /* | |||
| ** Copyright (c) 2015-2019 The Khronos Group 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. | |||
| */ | |||
| /* | |||
| ** This header is generated from the Khronos Vulkan XML API Registry. | |||
| ** | |||
| */ | |||
| #define VK_EXT_acquire_xlib_display 1 | |||
| #define VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION 1 | |||
| #define VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME "VK_EXT_acquire_xlib_display" | |||
| typedef VkResult (VKAPI_PTR *PFN_vkAcquireXlibDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, VkDisplayKHR display); | |||
| typedef VkResult (VKAPI_PTR *PFN_vkGetRandROutputDisplayEXT)(VkPhysicalDevice physicalDevice, Display* dpy, RROutput rrOutput, VkDisplayKHR* pDisplay); | |||
| #ifndef VK_NO_PROTOTYPES | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkAcquireXlibDisplayEXT( | |||
| VkPhysicalDevice physicalDevice, | |||
| Display* dpy, | |||
| VkDisplayKHR display); | |||
| VKAPI_ATTR VkResult VKAPI_CALL vkGetRandROutputDisplayEXT( | |||
| VkPhysicalDevice physicalDevice, | |||
| Display* dpy, | |||
| RROutput rrOutput, | |||
| VkDisplayKHR* pDisplay); | |||
| #endif | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif | |||
| @@ -0,0 +1,3 @@ | |||
| export NDK_PROJECT_PATH=`pwd` | |||
| export NDK_ROOT=/home/hob/android/ndk/ | |||
| /home/hob/android/ndk/ndk-build NDK_APPLICATION_MK=./Application.mk | |||
| @@ -0,0 +1,643 @@ | |||
| #include <png.h> | |||
| #include <vulkan/vulkan.h> | |||
| #include <fstream> | |||
| #include <iostream> | |||
| #include <sstream> | |||
| #include <string> | |||
| #include <vector> | |||
| const uint32_t kWidth = 256; | |||
| const uint32_t kHeight = 256; | |||
| const VkFormat kVulkanFormat = VK_FORMAT_A8B8G8R8_UNORM_PACK32; | |||
| const std::string kVertexShaderPath = "triangle.vert.spv"; | |||
| const std::string kFragmentShaderPath = "triangle.frag.spv"; | |||
| #define ERROR(message) \ | |||
| std::cerr << message << std::endl; \ | |||
| std::exit(EXIT_FAILURE) | |||
| VkInstance CreateVkInstance() { | |||
| VkApplicationInfo app_info = {}; | |||
| app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; | |||
| app_info.apiVersion = VK_API_VERSION_1_1; | |||
| VkInstanceCreateInfo create_info = {}; | |||
| create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; | |||
| create_info.pApplicationInfo = &app_info; | |||
| create_info.enabledExtensionCount = 0; | |||
| create_info.ppEnabledExtensionNames = nullptr; | |||
| create_info.enabledLayerCount = 0; | |||
| create_info.ppEnabledLayerNames = nullptr; | |||
| VkInstance instance; | |||
| VkResult result = vkCreateInstance(&create_info, nullptr, &instance); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Error creating VkInstance: " << result); | |||
| } | |||
| return instance; | |||
| } | |||
| VkPhysicalDevice ChooseVkPhysicalDevice(VkInstance instance) { | |||
| uint32_t device_count = 0; | |||
| VkResult result = vkEnumeratePhysicalDevices(instance, &device_count, nullptr); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Error enumerating VkPhysicalDevices: " << result); | |||
| } | |||
| if (device_count == 0) { | |||
| ERROR("No available VkPhysicalDevices"); | |||
| } | |||
| std::vector<VkPhysicalDevice> devices(device_count); | |||
| result = vkEnumeratePhysicalDevices(instance, &device_count, devices.data()); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Error fetching VkPhysicalDevices: " << result); | |||
| } | |||
| std::cout << "Found " << device_count << " device(s):" << std::endl; | |||
| VkPhysicalDevice chosen_device = VK_NULL_HANDLE; | |||
| for (VkPhysicalDevice device : devices) { | |||
| VkPhysicalDeviceProperties device_props; | |||
| vkGetPhysicalDeviceProperties(device, &device_props); | |||
| std::cout << "\t- " << device_props.deviceName << " [V: " << | |||
| VK_VERSION_MAJOR(device_props.apiVersion) << "." << | |||
| VK_VERSION_MINOR(device_props.apiVersion) << "." << | |||
| VK_VERSION_PATCH(device_props.apiVersion) << "]" << std::endl; | |||
| // Currently, any device with Vulkan API version 1.1 is fine. | |||
| if (chosen_device == VK_NULL_HANDLE && device_props.apiVersion >= VK_API_VERSION_1_1) { | |||
| chosen_device = device; | |||
| } | |||
| } | |||
| if (chosen_device == VK_NULL_HANDLE) { | |||
| ERROR("Unable to find suitable VkPhysicalDevice"); | |||
| } | |||
| return chosen_device; | |||
| } | |||
| uint32_t ChooseDeviceQueueFamilyIndex(VkPhysicalDevice physical_device) { | |||
| uint32_t props_count; | |||
| vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &props_count, nullptr); | |||
| std::vector<VkQueueFamilyProperties> props(props_count); | |||
| vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &props_count, props.data()); | |||
| // Simply choose the first graphics queue. | |||
| for (size_t i = 0; i < props_count; i++) { | |||
| const VkQueueFamilyProperties& prop = props[i]; | |||
| if ((prop.queueFlags & VK_QUEUE_GRAPHICS_BIT) && prop.queueCount > 0) { | |||
| return i; | |||
| } | |||
| } | |||
| ERROR("Unable to find suitable queue family"); | |||
| } | |||
| VkDevice CreateVkDevice(VkPhysicalDevice physical_device, uint32_t device_queue_family_index) { | |||
| VkDeviceQueueCreateInfo queue_create_info = {}; | |||
| queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; | |||
| queue_create_info.queueFamilyIndex = device_queue_family_index; | |||
| queue_create_info.queueCount = 1; | |||
| float queue_priority = 1.0f; | |||
| queue_create_info.pQueuePriorities = &queue_priority; | |||
| VkDeviceCreateInfo device_create_info = {}; | |||
| device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; | |||
| device_create_info.queueCreateInfoCount = 1; | |||
| device_create_info.pQueueCreateInfos = &queue_create_info; | |||
| // Let's not use any device extensions for now. | |||
| device_create_info.enabledExtensionCount = 0; | |||
| device_create_info.ppEnabledExtensionNames = nullptr; | |||
| VkDevice device; | |||
| VkResult result = vkCreateDevice(physical_device, &device_create_info, nullptr, &device); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to create logical device: " << result); | |||
| } | |||
| return device; | |||
| } | |||
| VkQueue GetVkQueue(VkDevice device, uint32_t device_queue_family_index) { | |||
| VkQueue queue; | |||
| vkGetDeviceQueue(device, device_queue_family_index, /*queueIndex*/ 0, &queue); | |||
| return queue; | |||
| } | |||
| VkCommandPool CreateVkCommandPool(VkDevice device, uint32_t device_queue_family_index) { | |||
| VkCommandPool command_pool; | |||
| VkCommandPoolCreateInfo create_info = {}; | |||
| create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; | |||
| create_info.flags = 0; | |||
| create_info.queueFamilyIndex = device_queue_family_index; | |||
| VkResult result = vkCreateCommandPool(device, &create_info, nullptr, &command_pool); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to create command pool: " << result); | |||
| } | |||
| return command_pool; | |||
| } | |||
| VkCommandBuffer CreateVkCommandBuffer(VkDevice device, VkCommandPool command_pool) { | |||
| VkCommandBufferAllocateInfo allocate_info = {}; | |||
| allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; | |||
| allocate_info.commandPool = command_pool; | |||
| allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; | |||
| allocate_info.commandBufferCount = 1; | |||
| VkCommandBuffer command_buffer; | |||
| VkResult result = vkAllocateCommandBuffers( device, &allocate_info, &command_buffer); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to create VkCommandBuffer: " << result); | |||
| } | |||
| return command_buffer; | |||
| } | |||
| VkRenderPass CreateVkRenderPass(VkDevice device) { | |||
| VkAttachmentDescription attachment_description = {}; | |||
| attachment_description.format = kVulkanFormat; | |||
| attachment_description.samples = VK_SAMPLE_COUNT_1_BIT; | |||
| attachment_description.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; | |||
| attachment_description.storeOp = VK_ATTACHMENT_STORE_OP_STORE; | |||
| attachment_description.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; | |||
| attachment_description.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; | |||
| attachment_description.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; | |||
| attachment_description.finalLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; | |||
| VkAttachmentReference attachment_reference = {}; | |||
| attachment_reference.attachment = 0; | |||
| attachment_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | |||
| VkSubpassDescription subpass_description = {}; | |||
| subpass_description.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; | |||
| subpass_description.colorAttachmentCount = 1; | |||
| subpass_description.pColorAttachments = &attachment_reference; | |||
| VkSubpassDependency subpass_dependency = {}; | |||
| subpass_dependency.srcSubpass = VK_SUBPASS_EXTERNAL; | |||
| subpass_dependency.dstSubpass = 0; | |||
| subpass_dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; | |||
| subpass_dependency.srcAccessMask = 0; | |||
| subpass_dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; | |||
| subpass_dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | | |||
| VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; | |||
| VkRenderPassCreateInfo render_pass_info = {}; | |||
| render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; | |||
| render_pass_info.attachmentCount = 1; | |||
| render_pass_info.pAttachments = &attachment_description; | |||
| render_pass_info.subpassCount = 1; | |||
| render_pass_info.pSubpasses = &subpass_description; | |||
| render_pass_info.dependencyCount = 1; | |||
| render_pass_info.pDependencies = &subpass_dependency; | |||
| VkRenderPass render_pass; | |||
| VkResult result = vkCreateRenderPass(device, &render_pass_info, nullptr, &render_pass); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to create render pass: " << result); | |||
| } | |||
| return render_pass; | |||
| } | |||
| VkShaderModule CreateVkShaderModule(VkDevice device, std::string path) { | |||
| std::ifstream fstream(path); | |||
| if (!fstream) { | |||
| ERROR("Unable to open: " << path); | |||
| } | |||
| std::stringstream buffer; | |||
| buffer << fstream.rdbuf(); | |||
| std::string spirv_source = buffer.str(); | |||
| VkShaderModuleCreateInfo create_info = {}; | |||
| create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; | |||
| create_info.codeSize = spirv_source.length(); | |||
| create_info.pCode = (const uint32_t*)spirv_source.c_str(); | |||
| VkShaderModule shader_module; | |||
| VkResult result = vkCreateShaderModule(device, &create_info, nullptr, &shader_module); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to create shader module for " << path << ": "); | |||
| } | |||
| return shader_module; | |||
| } | |||
| VkPipeline CreateVkPipeline(VkDevice device, VkRenderPass render_pass) { | |||
| VkShaderModule vertex_shader_module = CreateVkShaderModule(device, kVertexShaderPath); | |||
| VkShaderModule fragment_shader_module = CreateVkShaderModule(device, kFragmentShaderPath); | |||
| VkPipelineShaderStageCreateInfo vertex_shader_stage_info = {}; | |||
| vertex_shader_stage_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; | |||
| vertex_shader_stage_info.stage = VK_SHADER_STAGE_VERTEX_BIT; | |||
| vertex_shader_stage_info.module = vertex_shader_module; | |||
| vertex_shader_stage_info.pName = "main"; | |||
| VkPipelineShaderStageCreateInfo fragment_shader_stage_info = {}; | |||
| fragment_shader_stage_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; | |||
| fragment_shader_stage_info.stage = VK_SHADER_STAGE_FRAGMENT_BIT; | |||
| fragment_shader_stage_info.module = fragment_shader_module; | |||
| fragment_shader_stage_info.pName = "main"; | |||
| std::vector<VkPipelineShaderStageCreateInfo> shader_stages = | |||
| {vertex_shader_stage_info, fragment_shader_stage_info}; | |||
| VkPipelineVertexInputStateCreateInfo vertex_input_info = {}; | |||
| vertex_input_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; | |||
| vertex_input_info.vertexBindingDescriptionCount = 0; | |||
| vertex_input_info.pVertexBindingDescriptions = nullptr; | |||
| vertex_input_info.vertexAttributeDescriptionCount = 0; | |||
| vertex_input_info.pVertexAttributeDescriptions = nullptr; | |||
| VkPipelineInputAssemblyStateCreateInfo input_assembly_info = {}; | |||
| input_assembly_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; | |||
| input_assembly_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; | |||
| input_assembly_info.primitiveRestartEnable = VK_FALSE; | |||
| VkViewport viewport = {}; | |||
| viewport.x = 0.0f; | |||
| viewport.y = 0.0f; | |||
| viewport.width = (float)kWidth; | |||
| viewport.height = (float)kHeight; | |||
| viewport.minDepth = 0.0f; | |||
| viewport.maxDepth = 1.0f; | |||
| VkExtent2D extent = {}; | |||
| extent.width = kWidth; | |||
| extent.height = kHeight; | |||
| VkRect2D scissor = {}; | |||
| scissor.offset = {0, 0}; | |||
| scissor.extent = extent; | |||
| VkPipelineViewportStateCreateInfo viewport_state_info = {}; | |||
| viewport_state_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; | |||
| viewport_state_info.viewportCount = 1; | |||
| viewport_state_info.pViewports = &viewport; | |||
| viewport_state_info.scissorCount = 1; | |||
| viewport_state_info.pScissors = &scissor; | |||
| VkPipelineRasterizationStateCreateInfo rasterization_state_info = {}; | |||
| rasterization_state_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; | |||
| rasterization_state_info.depthClampEnable = VK_FALSE; | |||
| rasterization_state_info.rasterizerDiscardEnable = VK_FALSE; | |||
| rasterization_state_info.polygonMode = VK_POLYGON_MODE_FILL; | |||
| rasterization_state_info.lineWidth = 1.0f; | |||
| rasterization_state_info.cullMode = VK_CULL_MODE_BACK_BIT; | |||
| rasterization_state_info.frontFace = VK_FRONT_FACE_CLOCKWISE; | |||
| rasterization_state_info.depthBiasEnable = VK_FALSE; | |||
| VkPipelineMultisampleStateCreateInfo multisampling_state_info = {}; | |||
| multisampling_state_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; | |||
| multisampling_state_info.sampleShadingEnable = VK_FALSE; | |||
| multisampling_state_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; | |||
| VkPipelineColorBlendAttachmentState color_blend_attachment_state = {}; | |||
| color_blend_attachment_state.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | | |||
| VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; | |||
| color_blend_attachment_state.blendEnable = VK_FALSE; | |||
| VkPipelineColorBlendStateCreateInfo color_blend_state = {}; | |||
| color_blend_state.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; | |||
| color_blend_state.logicOpEnable = VK_FALSE; | |||
| color_blend_state.attachmentCount = 1; | |||
| color_blend_state.pAttachments = &color_blend_attachment_state; | |||
| VkPipelineLayoutCreateInfo pipeline_layout_create_info = {}; | |||
| pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; | |||
| VkPipelineLayout pipeline_layout; | |||
| VkResult result = vkCreatePipelineLayout(device, &pipeline_layout_create_info, nullptr, | |||
| &pipeline_layout); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to create VkPipelineLayout: " << result); | |||
| } | |||
| VkGraphicsPipelineCreateInfo pipeline_create_info = {}; | |||
| pipeline_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; | |||
| pipeline_create_info.stageCount = 2; | |||
| pipeline_create_info.pStages = shader_stages.data(); | |||
| pipeline_create_info.pVertexInputState = &vertex_input_info; | |||
| pipeline_create_info.pInputAssemblyState = &input_assembly_info; | |||
| pipeline_create_info.pViewportState = &viewport_state_info; | |||
| pipeline_create_info.pRasterizationState = &rasterization_state_info; | |||
| pipeline_create_info.pMultisampleState = &multisampling_state_info; | |||
| pipeline_create_info.pDepthStencilState = nullptr; | |||
| pipeline_create_info.pColorBlendState = &color_blend_state; | |||
| pipeline_create_info.pDynamicState = nullptr; | |||
| pipeline_create_info.layout = pipeline_layout; | |||
| pipeline_create_info.renderPass = render_pass; | |||
| pipeline_create_info.subpass = 0; | |||
| pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE; | |||
| pipeline_create_info.basePipelineIndex = -1; | |||
| VkPipeline pipeline; | |||
| result = vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipeline_create_info, nullptr, | |||
| &pipeline); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to create VkPipeline: " << result); | |||
| } | |||
| return pipeline; | |||
| } | |||
| VkImage CreateVkImage(VkDevice device, VkImageTiling image_tiling, VkImageUsageFlags usage) { | |||
| VkImageCreateInfo create_info = {}; | |||
| create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; | |||
| create_info.pNext = nullptr; | |||
| create_info.imageType = VK_IMAGE_TYPE_2D; | |||
| create_info.format = kVulkanFormat; | |||
| VkExtent3D extent = {}; | |||
| extent.width = kWidth; | |||
| extent.height = kHeight; | |||
| extent.depth = 1; | |||
| create_info.extent = extent; | |||
| create_info.mipLevels = 1; | |||
| create_info.arrayLayers = 1; | |||
| create_info.samples = VK_SAMPLE_COUNT_1_BIT; | |||
| create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; | |||
| create_info.tiling = image_tiling; | |||
| create_info.usage = usage; | |||
| create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; | |||
| VkImage image; | |||
| VkResult result = vkCreateImage(device, &create_info, nullptr, &image); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to create VkImage: " << result); | |||
| } | |||
| return image; | |||
| } | |||
| inline VkImage CreateRenderVkImage(VkDevice device) { | |||
| return CreateVkImage(device, VK_IMAGE_TILING_OPTIMAL, | |||
| VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT); | |||
| } | |||
| inline VkImage CreateScanoutVkImage(VkDevice device) { | |||
| return CreateVkImage(device, VK_IMAGE_TILING_LINEAR, | |||
| VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT); | |||
| } | |||
| uint32_t FindMemoryType(uint32_t valid_image_memory_types, | |||
| VkPhysicalDeviceMemoryProperties device_memory_properties, | |||
| VkMemoryPropertyFlags memory_property_flags) { | |||
| for (uint32_t i = 0; i < device_memory_properties.memoryTypeCount; i++) { | |||
| // We don't care about performance, so just choose the first mappable memory type. | |||
| if ((valid_image_memory_types & (1 << i)) && | |||
| ((device_memory_properties.memoryTypes[i].propertyFlags & memory_property_flags) == | |||
| memory_property_flags)) { | |||
| return i; | |||
| } | |||
| } | |||
| ERROR("Unable to find suitable memory type index"); | |||
| } | |||
| VkDeviceMemory AllocateAndBindMemory(VkPhysicalDevice physical_device, VkDevice device, | |||
| VkImage image, VkMemoryPropertyFlags memory_property_flags) { | |||
| VkMemoryRequirements image_memory_requirements; | |||
| vkGetImageMemoryRequirements(device, image, &image_memory_requirements); | |||
| VkPhysicalDeviceMemoryProperties device_memory_properties; | |||
| vkGetPhysicalDeviceMemoryProperties(physical_device, &device_memory_properties); | |||
| VkMemoryAllocateInfo memory_allocate_info = {}; | |||
| memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; | |||
| memory_allocate_info.allocationSize = image_memory_requirements.size; | |||
| memory_allocate_info.memoryTypeIndex = FindMemoryType( | |||
| image_memory_requirements.memoryTypeBits, device_memory_properties, | |||
| memory_property_flags); | |||
| VkDeviceMemory image_memory; | |||
| VkResult result = vkAllocateMemory(device, &memory_allocate_info, nullptr, &image_memory); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to allocate image memory: " << result); | |||
| } | |||
| result = vkBindImageMemory(device, image, image_memory, 0); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to bind image memory: " << result); | |||
| } | |||
| return image_memory; | |||
| } | |||
| inline VkDeviceMemory AllocateAndBindRenderMemory(VkPhysicalDevice physical_device, | |||
| VkDevice device, VkImage image) { | |||
| return AllocateAndBindMemory(physical_device, device, image, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); | |||
| } | |||
| inline VkDeviceMemory AllocateAndBindScanoutMemory(VkPhysicalDevice physical_device, | |||
| VkDevice device, VkImage image) { | |||
| return AllocateAndBindMemory(physical_device, device, image, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); | |||
| } | |||
| VkImageView CreateVkImageView(VkDevice device, VkImage image) { | |||
| VkImageViewCreateInfo create_info = {}; | |||
| create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; | |||
| create_info.image = image; | |||
| create_info.viewType = VK_IMAGE_VIEW_TYPE_2D; | |||
| create_info.format = kVulkanFormat; | |||
| VkComponentMapping component_mapping = {}; | |||
| component_mapping.r = VK_COMPONENT_SWIZZLE_IDENTITY; | |||
| component_mapping.b = VK_COMPONENT_SWIZZLE_IDENTITY; | |||
| component_mapping.g = VK_COMPONENT_SWIZZLE_IDENTITY; | |||
| component_mapping.a = VK_COMPONENT_SWIZZLE_IDENTITY; | |||
| create_info.components = component_mapping; | |||
| VkImageSubresourceRange subresource_range = {}; | |||
| subresource_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; | |||
| subresource_range.baseMipLevel = 0; | |||
| subresource_range.levelCount = 1; | |||
| subresource_range.baseArrayLayer = 0; | |||
| subresource_range.layerCount = 1; | |||
| create_info.subresourceRange = subresource_range; | |||
| VkImageView image_view; | |||
| VkResult result = vkCreateImageView(device, &create_info, nullptr, &image_view); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to create VkImageView: " << result); | |||
| } | |||
| return image_view; | |||
| } | |||
| VkFramebuffer CreateVkFramebuffer(VkDevice device, VkRenderPass render_pass, | |||
| VkImageView image_view) { | |||
| VkFramebufferCreateInfo create_info = {}; | |||
| create_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; | |||
| create_info.renderPass = render_pass; | |||
| create_info.attachmentCount = 1; | |||
| create_info.pAttachments = &image_view; | |||
| create_info.width = kWidth; | |||
| create_info.height = kHeight; | |||
| create_info.layers = 1; | |||
| VkFramebuffer framebuffer; | |||
| VkResult result = vkCreateFramebuffer(device, &create_info, nullptr, &framebuffer); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to create VkFramebuffer: " << result); | |||
| } | |||
| return framebuffer; | |||
| } | |||
| void BeginCommandBuffer(VkCommandBuffer command_buffer) { | |||
| VkCommandBufferBeginInfo command_buffer_begin_info = {}; | |||
| command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; | |||
| command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; | |||
| VkResult result = vkBeginCommandBuffer(command_buffer, &command_buffer_begin_info); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to begin command buffer recording: " << result); | |||
| } | |||
| } | |||
| void EndCommandBufferAndSubmit(VkCommandBuffer command_buffer, VkQueue queue) { | |||
| VkResult result = vkEndCommandBuffer(command_buffer); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to end command buffer recording: " << result); | |||
| } | |||
| VkSubmitInfo submit_info = {}; | |||
| submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; | |||
| submit_info.commandBufferCount = 1; | |||
| submit_info.pCommandBuffers = &command_buffer; | |||
| result = vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Error in submitting command buffer to queue: " << result); | |||
| } | |||
| } | |||
| void WaitForIdle(VkQueue queue) { | |||
| // In a real application, we should use real synchronization primitives to figure out when the | |||
| // command buffers have been executed. Waiting on an idle queue is simple, but it can cause | |||
| // deadlock if we continue to submit to the queue while we wait for idle. | |||
| VkResult result = vkQueueWaitIdle(queue); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Error in waiting for graphics queue to reach idle state: " << result); | |||
| } | |||
| } | |||
| void Draw(VkDevice device, VkQueue queue, VkRenderPass render_pass, VkPipeline pipeline, | |||
| VkFramebuffer framebuffer, VkCommandBuffer command_buffer) { | |||
| BeginCommandBuffer(command_buffer); | |||
| VkRenderPassBeginInfo render_pass_begin_info = {}; | |||
| render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; | |||
| render_pass_begin_info.renderPass = render_pass; | |||
| render_pass_begin_info.framebuffer = framebuffer; | |||
| VkRect2D render_area = {}; | |||
| render_area.offset = { 0, 0 }; | |||
| render_area.extent = { kWidth, kHeight }; | |||
| render_pass_begin_info.renderArea = render_area; | |||
| render_pass_begin_info.clearValueCount = 1; | |||
| VkClearValue clear_value = {}; | |||
| clear_value.color.float32[0] = 1.0f; | |||
| clear_value.color.float32[1] = 1.0f; | |||
| clear_value.color.float32[2] = 0.0f; | |||
| clear_value.color.float32[3] = 1.0f; | |||
| render_pass_begin_info.pClearValues = &clear_value; | |||
| vkCmdBeginRenderPass(command_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); | |||
| vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); | |||
| vkCmdDraw(command_buffer, 3, 1, 0, 0); | |||
| vkCmdEndRenderPass(command_buffer); | |||
| } | |||
| void BlitToScanoutImage(VkQueue queue, VkCommandBuffer command_buffer, VkImage source_image, | |||
| VkImage dest_image) { | |||
| // We need to make sure the writes of the render pass have executed before actually scanning out | |||
| // the rendered image. Also, we need to transition the layout of the scanout image to | |||
| // VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL. | |||
| VkImageMemoryBarrier image_memory_barrier = {}; | |||
| image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, | |||
| image_memory_barrier.pNext = nullptr; | |||
| image_memory_barrier.srcAccessMask = 0; | |||
| image_memory_barrier.dstAccessMask = 0; | |||
| image_memory_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; | |||
| image_memory_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; | |||
| image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; | |||
| image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; | |||
| image_memory_barrier.image = dest_image; | |||
| VkImageSubresourceRange subresource_range = {}; | |||
| subresource_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; | |||
| subresource_range.baseMipLevel = 0; | |||
| subresource_range.levelCount = 1; | |||
| subresource_range.baseArrayLayer = 0; | |||
| subresource_range.layerCount = 1; | |||
| image_memory_barrier.subresourceRange = subresource_range; | |||
| vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, | |||
| VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_memory_barrier); | |||
| VkOffset3D blit_start = {}; | |||
| blit_start.x = 0; | |||
| blit_start.y = 0; | |||
| blit_start.z = 0; | |||
| VkOffset3D blit_end = {}; | |||
| blit_end.x = kWidth; | |||
| blit_end.y = kHeight; | |||
| blit_end.z = 1; | |||
| VkImageSubresourceLayers subresource_layers = {}; | |||
| subresource_layers.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; | |||
| subresource_layers.mipLevel = 0; | |||
| subresource_layers.baseArrayLayer = 0; | |||
| subresource_layers.layerCount = 1; | |||
| VkImageBlit image_blit = {}; | |||
| image_blit.srcSubresource = subresource_layers; | |||
| image_blit.srcOffsets[0] = blit_start; | |||
| image_blit.srcOffsets[1] = blit_end; | |||
| image_blit.dstSubresource = subresource_layers; | |||
| image_blit.dstOffsets[0] = blit_start; | |||
| image_blit.dstOffsets[1] = blit_end; | |||
| // TODO(brkho): Support multi-planar formats. | |||
| vkCmdBlitImage(command_buffer, source_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dest_image, | |||
| VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &image_blit, VK_FILTER_NEAREST); | |||
| EndCommandBufferAndSubmit(command_buffer, queue); | |||
| } | |||
| uint8_t* MapVkDeviceMemory(VkDevice device, VkDeviceMemory image_memory) { | |||
| void* mapped_memory = nullptr; | |||
| VkResult result = vkMapMemory(device, image_memory, 0, kWidth * kHeight * 4, 0, &mapped_memory); | |||
| if (result != VK_SUCCESS) { | |||
| ERROR("Unable to map device memory: " << result); | |||
| } | |||
| return static_cast<uint8_t*>(mapped_memory); | |||
| } | |||
| void WriteImage(uint8_t* pixels) { | |||
| FILE *f = fopen("triangle.png", "wb"); | |||
| png_image image_info = {}; | |||
| image_info.version = PNG_IMAGE_VERSION; | |||
| image_info.width = kWidth; | |||
| image_info.height = kHeight; | |||
| image_info.format = PNG_FORMAT_RGBA; | |||
| if (png_image_write_to_stdio(&image_info, f, 0, pixels, kWidth * 4, nullptr) == 0) { | |||
| ERROR("Error writing PNG: " << image_info.message); | |||
| } | |||
| fclose(f); | |||
| } | |||
| int main() { | |||
| VkInstance instance = CreateVkInstance(); | |||
| VkPhysicalDevice physical_device = ChooseVkPhysicalDevice(instance); | |||
| uint32_t device_queue_family_index = ChooseDeviceQueueFamilyIndex(physical_device); | |||
| VkDevice device = CreateVkDevice(physical_device, device_queue_family_index); | |||
| VkQueue queue = GetVkQueue(device, device_queue_family_index); | |||
| VkCommandPool command_pool = CreateVkCommandPool(device, device_queue_family_index); | |||
| VkCommandBuffer command_buffer = CreateVkCommandBuffer(device, command_pool); | |||
| VkRenderPass render_pass = CreateVkRenderPass(device); | |||
| VkPipeline pipeline = CreateVkPipeline(device, render_pass); | |||
| VkImage render_image = CreateRenderVkImage(device); | |||
| AllocateAndBindRenderMemory(physical_device, device, render_image); | |||
| VkImageView render_image_view = CreateVkImageView(device, render_image); | |||
| VkFramebuffer framebuffer = CreateVkFramebuffer(device, render_pass, render_image_view); | |||
| VkImage scanout_image = CreateScanoutVkImage(device); | |||
| VkDeviceMemory scanout_image_memory = | |||
| AllocateAndBindScanoutMemory(physical_device, device, scanout_image); | |||
| Draw(device, queue, render_pass, pipeline, framebuffer, command_buffer); | |||
| // Since the render target is created with VK_IMAGE_TILING_OPTIMAL, we need to copy it to a linear | |||
| // format before scanning out. | |||
| BlitToScanoutImage(queue, command_buffer, render_image, scanout_image); | |||
| WaitForIdle(queue); | |||
| uint8_t* pixels = MapVkDeviceMemory(device, scanout_image_memory); | |||
| WriteImage(pixels); | |||
| return EXIT_SUCCESS; | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| #version 450 | |||
| #extension GL_ARB_separate_shader_objects : enable | |||
| layout(location = 0) in vec3 fragColor; | |||
| layout(location = 0) out vec4 outColor; | |||
| void main() { | |||
| outColor = vec4(fragColor, 1.0); | |||
| } | |||
| @@ -0,0 +1,21 @@ | |||
| #version 450 | |||
| #extension GL_ARB_separate_shader_objects : enable | |||
| layout(location = 0) out vec3 fragColor; | |||
| vec2 positions[3] = vec2[]( | |||
| vec2(0.0, -0.5), | |||
| vec2(0.5, 0.5), | |||
| vec2(-0.5, 0.5) | |||
| ); | |||
| vec3 colors[3] = vec3[]( | |||
| vec3(1.0, 0.0, 0.0), | |||
| vec3(0.0, 1.0, 0.0), | |||
| vec3(0.0, 0.0, 1.0) | |||
| ); | |||
| void main() { | |||
| gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); | |||
| fragColor = colors[gl_VertexIndex]; | |||
| } | |||