libs/ | |||||
obj/ | |||||
*.spv | |||||
*.png |
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) |
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 |
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}/* |
src | |||||
packages |
# 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) |
src | |||||
packages |
# 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) |
/* 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 */ |
/* 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 */ |
// | |||||
// 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 |
// | |||||
// 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 |
// | |||||
// 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 |
// | |||||
// 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 |
#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_ |
#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 |
#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 |
#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 |
#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 |
#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 |
#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 |
#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 |
#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 |
#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 |
#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 |
#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 |
#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 |
export NDK_PROJECT_PATH=`pwd` | |||||
export NDK_ROOT=/home/hob/android/ndk/ | |||||
/home/hob/android/ndk/ndk-build NDK_APPLICATION_MK=./Application.mk |
#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; | |||||
} |
#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); | |||||
} |
#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]; | |||||
} |