Path: blob/master/servers/rendering/rendering_device_commons.cpp
11351 views
/**************************************************************************/1/* rendering_device_commons.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "rendering_device_commons.h"3132/*****************/33/**** GENERIC ****/34/*****************/3536const char *const RenderingDeviceCommons::FORMAT_NAMES[DATA_FORMAT_MAX] = {37"R4G4_Unorm_Pack8",38"R4G4B4A4_Unorm_Pack16",39"B4G4R4A4_Unorm_Pack16",40"R5G6B5_Unorm_Pack16",41"B5G6R5_Unorm_Pack16",42"R5G5B5A1_Unorm_Pack16",43"B5G5R5A1_Unorm_Pack16",44"A1R5G5B5_Unorm_Pack16",45"R8_Unorm",46"R8_Snorm",47"R8_Uscaled",48"R8_Sscaled",49"R8_Uint",50"R8_Sint",51"R8_Srgb",52"R8G8_Unorm",53"R8G8_Snorm",54"R8G8_Uscaled",55"R8G8_Sscaled",56"R8G8_Uint",57"R8G8_Sint",58"R8G8_Srgb",59"R8G8B8_Unorm",60"R8G8B8_Snorm",61"R8G8B8_Uscaled",62"R8G8B8_Sscaled",63"R8G8B8_Uint",64"R8G8B8_Sint",65"R8G8B8_Srgb",66"B8G8R8_Unorm",67"B8G8R8_Snorm",68"B8G8R8_Uscaled",69"B8G8R8_Sscaled",70"B8G8R8_Uint",71"B8G8R8_Sint",72"B8G8R8_Srgb",73"R8G8B8A8_Unorm",74"R8G8B8A8_Snorm",75"R8G8B8A8_Uscaled",76"R8G8B8A8_Sscaled",77"R8G8B8A8_Uint",78"R8G8B8A8_Sint",79"R8G8B8A8_Srgb",80"B8G8R8A8_Unorm",81"B8G8R8A8_Snorm",82"B8G8R8A8_Uscaled",83"B8G8R8A8_Sscaled",84"B8G8R8A8_Uint",85"B8G8R8A8_Sint",86"B8G8R8A8_Srgb",87"A8B8G8R8_Unorm_Pack32",88"A8B8G8R8_Snorm_Pack32",89"A8B8G8R8_Uscaled_Pack32",90"A8B8G8R8_Sscaled_Pack32",91"A8B8G8R8_Uint_Pack32",92"A8B8G8R8_Sint_Pack32",93"A8B8G8R8_Srgb_Pack32",94"A2R10G10B10_Unorm_Pack32",95"A2R10G10B10_Snorm_Pack32",96"A2R10G10B10_Uscaled_Pack32",97"A2R10G10B10_Sscaled_Pack32",98"A2R10G10B10_Uint_Pack32",99"A2R10G10B10_Sint_Pack32",100"A2B10G10R10_Unorm_Pack32",101"A2B10G10R10_Snorm_Pack32",102"A2B10G10R10_Uscaled_Pack32",103"A2B10G10R10_Sscaled_Pack32",104"A2B10G10R10_Uint_Pack32",105"A2B10G10R10_Sint_Pack32",106"R16_Unorm",107"R16_Snorm",108"R16_Uscaled",109"R16_Sscaled",110"R16_Uint",111"R16_Sint",112"R16_Sfloat",113"R16G16_Unorm",114"R16G16_Snorm",115"R16G16_Uscaled",116"R16G16_Sscaled",117"R16G16_Uint",118"R16G16_Sint",119"R16G16_Sfloat",120"R16G16B16_Unorm",121"R16G16B16_Snorm",122"R16G16B16_Uscaled",123"R16G16B16_Sscaled",124"R16G16B16_Uint",125"R16G16B16_Sint",126"R16G16B16_Sfloat",127"R16G16B16A16_Unorm",128"R16G16B16A16_Snorm",129"R16G16B16A16_Uscaled",130"R16G16B16A16_Sscaled",131"R16G16B16A16_Uint",132"R16G16B16A16_Sint",133"R16G16B16A16_Sfloat",134"R32_Uint",135"R32_Sint",136"R32_Sfloat",137"R32G32_Uint",138"R32G32_Sint",139"R32G32_Sfloat",140"R32G32B32_Uint",141"R32G32B32_Sint",142"R32G32B32_Sfloat",143"R32G32B32A32_Uint",144"R32G32B32A32_Sint",145"R32G32B32A32_Sfloat",146"R64_Uint",147"R64_Sint",148"R64_Sfloat",149"R64G64_Uint",150"R64G64_Sint",151"R64G64_Sfloat",152"R64G64B64_Uint",153"R64G64B64_Sint",154"R64G64B64_Sfloat",155"R64G64B64A64_Uint",156"R64G64B64A64_Sint",157"R64G64B64A64_Sfloat",158"B10G11R11_Ufloat_Pack32",159"E5B9G9R9_Ufloat_Pack32",160"D16_Unorm",161"X8_D24_Unorm_Pack32",162"D32_Sfloat",163"S8_Uint",164"D16_Unorm_S8_Uint",165"D24_Unorm_S8_Uint",166"D32_Sfloat_S8_Uint",167"Bc1_Rgb_Unorm_Block",168"Bc1_Rgb_Srgb_Block",169"Bc1_Rgba_Unorm_Block",170"Bc1_Rgba_Srgb_Block",171"Bc2_Unorm_Block",172"Bc2_Srgb_Block",173"Bc3_Unorm_Block",174"Bc3_Srgb_Block",175"Bc4_Unorm_Block",176"Bc4_Snorm_Block",177"Bc5_Unorm_Block",178"Bc5_Snorm_Block",179"Bc6H_Ufloat_Block",180"Bc6H_Sfloat_Block",181"Bc7_Unorm_Block",182"Bc7_Srgb_Block",183"Etc2_R8G8B8_Unorm_Block",184"Etc2_R8G8B8_Srgb_Block",185"Etc2_R8G8B8A1_Unorm_Block",186"Etc2_R8G8B8A1_Srgb_Block",187"Etc2_R8G8B8A8_Unorm_Block",188"Etc2_R8G8B8A8_Srgb_Block",189"Eac_R11_Unorm_Block",190"Eac_R11_Snorm_Block",191"Eac_R11G11_Unorm_Block",192"Eac_R11G11_Snorm_Block",193"Astc_4X4_Unorm_Block",194"Astc_4X4_Srgb_Block",195"Astc_5X4_Unorm_Block",196"Astc_5X4_Srgb_Block",197"Astc_5X5_Unorm_Block",198"Astc_5X5_Srgb_Block",199"Astc_6X5_Unorm_Block",200"Astc_6X5_Srgb_Block",201"Astc_6X6_Unorm_Block",202"Astc_6X6_Srgb_Block",203"Astc_8X5_Unorm_Block",204"Astc_8X5_Srgb_Block",205"Astc_8X6_Unorm_Block",206"Astc_8X6_Srgb_Block",207"Astc_8X8_Unorm_Block",208"Astc_8X8_Srgb_Block",209"Astc_10X5_Unorm_Block",210"Astc_10X5_Srgb_Block",211"Astc_10X6_Unorm_Block",212"Astc_10X6_Srgb_Block",213"Astc_10X8_Unorm_Block",214"Astc_10X8_Srgb_Block",215"Astc_10X10_Unorm_Block",216"Astc_10X10_Srgb_Block",217"Astc_12X10_Unorm_Block",218"Astc_12X10_Srgb_Block",219"Astc_12X12_Unorm_Block",220"Astc_12X12_Srgb_Block",221"G8B8G8R8_422_Unorm",222"B8G8R8G8_422_Unorm",223"G8_B8_R8_3Plane_420_Unorm",224"G8_B8R8_2Plane_420_Unorm",225"G8_B8_R8_3Plane_422_Unorm",226"G8_B8R8_2Plane_422_Unorm",227"G8_B8_R8_3Plane_444_Unorm",228"R10X6_Unorm_Pack16",229"R10X6G10X6_Unorm_2Pack16",230"R10X6G10X6B10X6A10X6_Unorm_4Pack16",231"G10X6B10X6G10X6R10X6_422_Unorm_4Pack16",232"B10X6G10X6R10X6G10X6_422_Unorm_4Pack16",233"G10X6_B10X6_R10X6_3Plane_420_Unorm_3Pack16",234"G10X6_B10X6R10X6_2Plane_420_Unorm_3Pack16",235"G10X6_B10X6_R10X6_3Plane_422_Unorm_3Pack16",236"G10X6_B10X6R10X6_2Plane_422_Unorm_3Pack16",237"G10X6_B10X6_R10X6_3Plane_444_Unorm_3Pack16",238"R12X4_Unorm_Pack16",239"R12X4G12X4_Unorm_2Pack16",240"R12X4G12X4B12X4A12X4_Unorm_4Pack16",241"G12X4B12X4G12X4R12X4_422_Unorm_4Pack16",242"B12X4G12X4R12X4G12X4_422_Unorm_4Pack16",243"G12X4_B12X4_R12X4_3Plane_420_Unorm_3Pack16",244"G12X4_B12X4R12X4_2Plane_420_Unorm_3Pack16",245"G12X4_B12X4_R12X4_3Plane_422_Unorm_3Pack16",246"G12X4_B12X4R12X4_2Plane_422_Unorm_3Pack16",247"G12X4_B12X4_R12X4_3Plane_444_Unorm_3Pack16",248"G16B16G16R16_422_Unorm",249"B16G16R16G16_422_Unorm",250"G16_B16_R16_3Plane_420_Unorm",251"G16_B16R16_2Plane_420_Unorm",252"G16_B16_R16_3Plane_422_Unorm",253"G16_B16R16_2Plane_422_Unorm",254"G16_B16_R16_3Plane_444_Unorm",255"Astc_4X4_Sfloat_Block",256"Astc_5X4_Sfloat_Block",257"Astc_5X5_Sfloat_Block",258"Astc_6X5_Sfloat_Block",259"Astc_6X6_Sfloat_Block",260"Astc_8X5_Sfloat_Block",261"Astc_8X6_Sfloat_Block",262"Astc_8X8_Sfloat_Block",263"Astc_10X5_Sfloat_Block",264"Astc_10X6_Sfloat_Block",265"Astc_10X8_Sfloat_Block",266"Astc_10X10_Sfloat_Block",267"Astc_12X10_Sfloat_Block",268"Astc_12X12_Sfloat_Block",269};270271/*****************/272/**** TEXTURE ****/273/*****************/274275const uint32_t RenderingDeviceCommons::TEXTURE_SAMPLES_COUNT[TEXTURE_SAMPLES_MAX] = { 1, 2, 4, 8, 16, 32, 64 };276277uint32_t RenderingDeviceCommons::get_image_format_pixel_size(DataFormat p_format) {278switch (p_format) {279case DATA_FORMAT_R4G4_UNORM_PACK8:280return 1;281case DATA_FORMAT_R4G4B4A4_UNORM_PACK16:282case DATA_FORMAT_B4G4R4A4_UNORM_PACK16:283case DATA_FORMAT_R5G6B5_UNORM_PACK16:284case DATA_FORMAT_B5G6R5_UNORM_PACK16:285case DATA_FORMAT_R5G5B5A1_UNORM_PACK16:286case DATA_FORMAT_B5G5R5A1_UNORM_PACK16:287case DATA_FORMAT_A1R5G5B5_UNORM_PACK16:288return 2;289case DATA_FORMAT_R8_UNORM:290case DATA_FORMAT_R8_SNORM:291case DATA_FORMAT_R8_USCALED:292case DATA_FORMAT_R8_SSCALED:293case DATA_FORMAT_R8_UINT:294case DATA_FORMAT_R8_SINT:295case DATA_FORMAT_R8_SRGB:296return 1;297case DATA_FORMAT_R8G8_UNORM:298case DATA_FORMAT_R8G8_SNORM:299case DATA_FORMAT_R8G8_USCALED:300case DATA_FORMAT_R8G8_SSCALED:301case DATA_FORMAT_R8G8_UINT:302case DATA_FORMAT_R8G8_SINT:303case DATA_FORMAT_R8G8_SRGB:304return 2;305case DATA_FORMAT_R8G8B8_UNORM:306case DATA_FORMAT_R8G8B8_SNORM:307case DATA_FORMAT_R8G8B8_USCALED:308case DATA_FORMAT_R8G8B8_SSCALED:309case DATA_FORMAT_R8G8B8_UINT:310case DATA_FORMAT_R8G8B8_SINT:311case DATA_FORMAT_R8G8B8_SRGB:312case DATA_FORMAT_B8G8R8_UNORM:313case DATA_FORMAT_B8G8R8_SNORM:314case DATA_FORMAT_B8G8R8_USCALED:315case DATA_FORMAT_B8G8R8_SSCALED:316case DATA_FORMAT_B8G8R8_UINT:317case DATA_FORMAT_B8G8R8_SINT:318case DATA_FORMAT_B8G8R8_SRGB:319return 3;320case DATA_FORMAT_R8G8B8A8_UNORM:321case DATA_FORMAT_R8G8B8A8_SNORM:322case DATA_FORMAT_R8G8B8A8_USCALED:323case DATA_FORMAT_R8G8B8A8_SSCALED:324case DATA_FORMAT_R8G8B8A8_UINT:325case DATA_FORMAT_R8G8B8A8_SINT:326case DATA_FORMAT_R8G8B8A8_SRGB:327case DATA_FORMAT_B8G8R8A8_UNORM:328case DATA_FORMAT_B8G8R8A8_SNORM:329case DATA_FORMAT_B8G8R8A8_USCALED:330case DATA_FORMAT_B8G8R8A8_SSCALED:331case DATA_FORMAT_B8G8R8A8_UINT:332case DATA_FORMAT_B8G8R8A8_SINT:333case DATA_FORMAT_B8G8R8A8_SRGB:334return 4;335case DATA_FORMAT_A8B8G8R8_UNORM_PACK32:336case DATA_FORMAT_A8B8G8R8_SNORM_PACK32:337case DATA_FORMAT_A8B8G8R8_USCALED_PACK32:338case DATA_FORMAT_A8B8G8R8_SSCALED_PACK32:339case DATA_FORMAT_A8B8G8R8_UINT_PACK32:340case DATA_FORMAT_A8B8G8R8_SINT_PACK32:341case DATA_FORMAT_A8B8G8R8_SRGB_PACK32:342case DATA_FORMAT_A2R10G10B10_UNORM_PACK32:343case DATA_FORMAT_A2R10G10B10_SNORM_PACK32:344case DATA_FORMAT_A2R10G10B10_USCALED_PACK32:345case DATA_FORMAT_A2R10G10B10_SSCALED_PACK32:346case DATA_FORMAT_A2R10G10B10_UINT_PACK32:347case DATA_FORMAT_A2R10G10B10_SINT_PACK32:348case DATA_FORMAT_A2B10G10R10_UNORM_PACK32:349case DATA_FORMAT_A2B10G10R10_SNORM_PACK32:350case DATA_FORMAT_A2B10G10R10_USCALED_PACK32:351case DATA_FORMAT_A2B10G10R10_SSCALED_PACK32:352case DATA_FORMAT_A2B10G10R10_UINT_PACK32:353case DATA_FORMAT_A2B10G10R10_SINT_PACK32:354return 4;355case DATA_FORMAT_R16_UNORM:356case DATA_FORMAT_R16_SNORM:357case DATA_FORMAT_R16_USCALED:358case DATA_FORMAT_R16_SSCALED:359case DATA_FORMAT_R16_UINT:360case DATA_FORMAT_R16_SINT:361case DATA_FORMAT_R16_SFLOAT:362return 2;363case DATA_FORMAT_R16G16_UNORM:364case DATA_FORMAT_R16G16_SNORM:365case DATA_FORMAT_R16G16_USCALED:366case DATA_FORMAT_R16G16_SSCALED:367case DATA_FORMAT_R16G16_UINT:368case DATA_FORMAT_R16G16_SINT:369case DATA_FORMAT_R16G16_SFLOAT:370return 4;371case DATA_FORMAT_R16G16B16_UNORM:372case DATA_FORMAT_R16G16B16_SNORM:373case DATA_FORMAT_R16G16B16_USCALED:374case DATA_FORMAT_R16G16B16_SSCALED:375case DATA_FORMAT_R16G16B16_UINT:376case DATA_FORMAT_R16G16B16_SINT:377case DATA_FORMAT_R16G16B16_SFLOAT:378return 6;379case DATA_FORMAT_R16G16B16A16_UNORM:380case DATA_FORMAT_R16G16B16A16_SNORM:381case DATA_FORMAT_R16G16B16A16_USCALED:382case DATA_FORMAT_R16G16B16A16_SSCALED:383case DATA_FORMAT_R16G16B16A16_UINT:384case DATA_FORMAT_R16G16B16A16_SINT:385case DATA_FORMAT_R16G16B16A16_SFLOAT:386return 8;387case DATA_FORMAT_R32_UINT:388case DATA_FORMAT_R32_SINT:389case DATA_FORMAT_R32_SFLOAT:390return 4;391case DATA_FORMAT_R32G32_UINT:392case DATA_FORMAT_R32G32_SINT:393case DATA_FORMAT_R32G32_SFLOAT:394return 8;395case DATA_FORMAT_R32G32B32_UINT:396case DATA_FORMAT_R32G32B32_SINT:397case DATA_FORMAT_R32G32B32_SFLOAT:398return 12;399case DATA_FORMAT_R32G32B32A32_UINT:400case DATA_FORMAT_R32G32B32A32_SINT:401case DATA_FORMAT_R32G32B32A32_SFLOAT:402return 16;403case DATA_FORMAT_R64_UINT:404case DATA_FORMAT_R64_SINT:405case DATA_FORMAT_R64_SFLOAT:406return 8;407case DATA_FORMAT_R64G64_UINT:408case DATA_FORMAT_R64G64_SINT:409case DATA_FORMAT_R64G64_SFLOAT:410return 16;411case DATA_FORMAT_R64G64B64_UINT:412case DATA_FORMAT_R64G64B64_SINT:413case DATA_FORMAT_R64G64B64_SFLOAT:414return 24;415case DATA_FORMAT_R64G64B64A64_UINT:416case DATA_FORMAT_R64G64B64A64_SINT:417case DATA_FORMAT_R64G64B64A64_SFLOAT:418return 32;419case DATA_FORMAT_B10G11R11_UFLOAT_PACK32:420case DATA_FORMAT_E5B9G9R9_UFLOAT_PACK32:421return 4;422case DATA_FORMAT_D16_UNORM:423return 2;424case DATA_FORMAT_X8_D24_UNORM_PACK32:425return 4;426case DATA_FORMAT_D32_SFLOAT:427return 4;428case DATA_FORMAT_S8_UINT:429return 1;430case DATA_FORMAT_D16_UNORM_S8_UINT:431return 4;432case DATA_FORMAT_D24_UNORM_S8_UINT:433return 4;434case DATA_FORMAT_D32_SFLOAT_S8_UINT:435return 5; // ?436case DATA_FORMAT_BC1_RGB_UNORM_BLOCK:437case DATA_FORMAT_BC1_RGB_SRGB_BLOCK:438case DATA_FORMAT_BC1_RGBA_UNORM_BLOCK:439case DATA_FORMAT_BC1_RGBA_SRGB_BLOCK:440case DATA_FORMAT_BC2_UNORM_BLOCK:441case DATA_FORMAT_BC2_SRGB_BLOCK:442case DATA_FORMAT_BC3_UNORM_BLOCK:443case DATA_FORMAT_BC3_SRGB_BLOCK:444case DATA_FORMAT_BC4_UNORM_BLOCK:445case DATA_FORMAT_BC4_SNORM_BLOCK:446case DATA_FORMAT_BC5_UNORM_BLOCK:447case DATA_FORMAT_BC5_SNORM_BLOCK:448case DATA_FORMAT_BC6H_UFLOAT_BLOCK:449case DATA_FORMAT_BC6H_SFLOAT_BLOCK:450case DATA_FORMAT_BC7_UNORM_BLOCK:451case DATA_FORMAT_BC7_SRGB_BLOCK:452return 1;453case DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:454case DATA_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:455case DATA_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:456case DATA_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:457case DATA_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:458case DATA_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:459return 1;460case DATA_FORMAT_EAC_R11_UNORM_BLOCK:461case DATA_FORMAT_EAC_R11_SNORM_BLOCK:462case DATA_FORMAT_EAC_R11G11_UNORM_BLOCK:463case DATA_FORMAT_EAC_R11G11_SNORM_BLOCK:464return 1;465case DATA_FORMAT_ASTC_4x4_UNORM_BLOCK:466case DATA_FORMAT_ASTC_4x4_SRGB_BLOCK:467case DATA_FORMAT_ASTC_5x4_UNORM_BLOCK:468case DATA_FORMAT_ASTC_5x4_SRGB_BLOCK:469case DATA_FORMAT_ASTC_5x5_UNORM_BLOCK:470case DATA_FORMAT_ASTC_5x5_SRGB_BLOCK:471case DATA_FORMAT_ASTC_6x5_UNORM_BLOCK:472case DATA_FORMAT_ASTC_6x5_SRGB_BLOCK:473case DATA_FORMAT_ASTC_6x6_UNORM_BLOCK:474case DATA_FORMAT_ASTC_6x6_SRGB_BLOCK:475case DATA_FORMAT_ASTC_8x5_UNORM_BLOCK:476case DATA_FORMAT_ASTC_8x5_SRGB_BLOCK:477case DATA_FORMAT_ASTC_8x6_UNORM_BLOCK:478case DATA_FORMAT_ASTC_8x6_SRGB_BLOCK:479case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK:480case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK:481case DATA_FORMAT_ASTC_10x5_UNORM_BLOCK:482case DATA_FORMAT_ASTC_10x5_SRGB_BLOCK:483case DATA_FORMAT_ASTC_10x6_UNORM_BLOCK:484case DATA_FORMAT_ASTC_10x6_SRGB_BLOCK:485case DATA_FORMAT_ASTC_10x8_UNORM_BLOCK:486case DATA_FORMAT_ASTC_10x8_SRGB_BLOCK:487case DATA_FORMAT_ASTC_10x10_UNORM_BLOCK:488case DATA_FORMAT_ASTC_10x10_SRGB_BLOCK:489case DATA_FORMAT_ASTC_12x10_UNORM_BLOCK:490case DATA_FORMAT_ASTC_12x10_SRGB_BLOCK:491case DATA_FORMAT_ASTC_12x12_UNORM_BLOCK:492case DATA_FORMAT_ASTC_12x12_SRGB_BLOCK:493case DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK:494case DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK:495case DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK:496case DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK:497case DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK:498case DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK:499case DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK:500case DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK:501case DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK:502case DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK:503case DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK:504case DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK:505case DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK:506case DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK:507return 1;508case DATA_FORMAT_G8B8G8R8_422_UNORM:509case DATA_FORMAT_B8G8R8G8_422_UNORM:510return 4;511case DATA_FORMAT_G8_B8_R8_3PLANE_420_UNORM:512case DATA_FORMAT_G8_B8R8_2PLANE_420_UNORM:513case DATA_FORMAT_G8_B8_R8_3PLANE_422_UNORM:514case DATA_FORMAT_G8_B8R8_2PLANE_422_UNORM:515case DATA_FORMAT_G8_B8_R8_3PLANE_444_UNORM:516return 4;517case DATA_FORMAT_R10X6_UNORM_PACK16:518case DATA_FORMAT_R10X6G10X6_UNORM_2PACK16:519case DATA_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:520case DATA_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:521case DATA_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:522case DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:523case DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:524case DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:525case DATA_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:526case DATA_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:527case DATA_FORMAT_R12X4_UNORM_PACK16:528case DATA_FORMAT_R12X4G12X4_UNORM_2PACK16:529case DATA_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:530case DATA_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:531case DATA_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:532case DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:533case DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:534case DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:535case DATA_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:536case DATA_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:537return 2;538case DATA_FORMAT_G16B16G16R16_422_UNORM:539case DATA_FORMAT_B16G16R16G16_422_UNORM:540case DATA_FORMAT_G16_B16_R16_3PLANE_420_UNORM:541case DATA_FORMAT_G16_B16R16_2PLANE_420_UNORM:542case DATA_FORMAT_G16_B16_R16_3PLANE_422_UNORM:543case DATA_FORMAT_G16_B16R16_2PLANE_422_UNORM:544case DATA_FORMAT_G16_B16_R16_3PLANE_444_UNORM:545return 8;546default: {547ERR_PRINT("Format not handled, bug");548}549}550551return 1;552}553554// https://www.khronos.org/registry/DataFormat/specs/1.1/dataformat.1.1.pdf555void RenderingDeviceCommons::get_compressed_image_format_block_dimensions(DataFormat p_format, uint32_t &r_w, uint32_t &r_h) {556switch (p_format) {557case DATA_FORMAT_BC1_RGB_UNORM_BLOCK:558case DATA_FORMAT_BC1_RGB_SRGB_BLOCK:559case DATA_FORMAT_BC1_RGBA_UNORM_BLOCK:560case DATA_FORMAT_BC1_RGBA_SRGB_BLOCK:561case DATA_FORMAT_BC2_UNORM_BLOCK:562case DATA_FORMAT_BC2_SRGB_BLOCK:563case DATA_FORMAT_BC3_UNORM_BLOCK:564case DATA_FORMAT_BC3_SRGB_BLOCK:565case DATA_FORMAT_BC4_UNORM_BLOCK:566case DATA_FORMAT_BC4_SNORM_BLOCK:567case DATA_FORMAT_BC5_UNORM_BLOCK:568case DATA_FORMAT_BC5_SNORM_BLOCK:569case DATA_FORMAT_BC6H_UFLOAT_BLOCK:570case DATA_FORMAT_BC6H_SFLOAT_BLOCK:571case DATA_FORMAT_BC7_UNORM_BLOCK:572case DATA_FORMAT_BC7_SRGB_BLOCK:573case DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:574case DATA_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:575case DATA_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:576case DATA_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:577case DATA_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:578case DATA_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:579case DATA_FORMAT_EAC_R11_UNORM_BLOCK:580case DATA_FORMAT_EAC_R11_SNORM_BLOCK:581case DATA_FORMAT_EAC_R11G11_UNORM_BLOCK:582case DATA_FORMAT_EAC_R11G11_SNORM_BLOCK:583case DATA_FORMAT_ASTC_4x4_UNORM_BLOCK: // Again, not sure about astc.584case DATA_FORMAT_ASTC_4x4_SRGB_BLOCK:585case DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK: {586r_w = 4;587r_h = 4;588} break;589case DATA_FORMAT_ASTC_5x4_UNORM_BLOCK: // Unsupported590case DATA_FORMAT_ASTC_5x4_SRGB_BLOCK:591case DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK:592case DATA_FORMAT_ASTC_5x5_UNORM_BLOCK:593case DATA_FORMAT_ASTC_5x5_SRGB_BLOCK:594case DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK:595case DATA_FORMAT_ASTC_6x5_UNORM_BLOCK:596case DATA_FORMAT_ASTC_6x5_SRGB_BLOCK:597case DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK:598case DATA_FORMAT_ASTC_6x6_UNORM_BLOCK:599case DATA_FORMAT_ASTC_6x6_SRGB_BLOCK:600case DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK:601case DATA_FORMAT_ASTC_8x5_UNORM_BLOCK:602case DATA_FORMAT_ASTC_8x5_SRGB_BLOCK:603case DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK:604case DATA_FORMAT_ASTC_8x6_UNORM_BLOCK:605case DATA_FORMAT_ASTC_8x6_SRGB_BLOCK:606case DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK: {607r_w = 4;608r_h = 4;609} break;610case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK:611case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK:612case DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK: {613r_w = 8;614r_h = 8;615} break;616case DATA_FORMAT_ASTC_10x5_UNORM_BLOCK: // Unsupported617case DATA_FORMAT_ASTC_10x5_SRGB_BLOCK:618case DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK:619case DATA_FORMAT_ASTC_10x6_UNORM_BLOCK:620case DATA_FORMAT_ASTC_10x6_SRGB_BLOCK:621case DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK:622case DATA_FORMAT_ASTC_10x8_UNORM_BLOCK:623case DATA_FORMAT_ASTC_10x8_SRGB_BLOCK:624case DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK:625case DATA_FORMAT_ASTC_10x10_UNORM_BLOCK:626case DATA_FORMAT_ASTC_10x10_SRGB_BLOCK:627case DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK:628case DATA_FORMAT_ASTC_12x10_UNORM_BLOCK:629case DATA_FORMAT_ASTC_12x10_SRGB_BLOCK:630case DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK:631case DATA_FORMAT_ASTC_12x12_UNORM_BLOCK:632case DATA_FORMAT_ASTC_12x12_SRGB_BLOCK:633case DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK:634r_w = 4;635r_h = 4;636return;637default: {638r_w = 1;639r_h = 1;640}641}642}643644uint32_t RenderingDeviceCommons::get_compressed_image_format_block_byte_size(DataFormat p_format) const {645switch (p_format) {646case DATA_FORMAT_BC1_RGB_UNORM_BLOCK:647case DATA_FORMAT_BC1_RGB_SRGB_BLOCK:648case DATA_FORMAT_BC1_RGBA_UNORM_BLOCK:649case DATA_FORMAT_BC1_RGBA_SRGB_BLOCK:650return 8;651case DATA_FORMAT_BC2_UNORM_BLOCK:652case DATA_FORMAT_BC2_SRGB_BLOCK:653return 16;654case DATA_FORMAT_BC3_UNORM_BLOCK:655case DATA_FORMAT_BC3_SRGB_BLOCK:656return 16;657case DATA_FORMAT_BC4_UNORM_BLOCK:658case DATA_FORMAT_BC4_SNORM_BLOCK:659return 8;660case DATA_FORMAT_BC5_UNORM_BLOCK:661case DATA_FORMAT_BC5_SNORM_BLOCK:662return 16;663case DATA_FORMAT_BC6H_UFLOAT_BLOCK:664case DATA_FORMAT_BC6H_SFLOAT_BLOCK:665return 16;666case DATA_FORMAT_BC7_UNORM_BLOCK:667case DATA_FORMAT_BC7_SRGB_BLOCK:668return 16;669case DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:670case DATA_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:671return 8;672case DATA_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:673case DATA_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:674return 8;675case DATA_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:676case DATA_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:677return 16;678case DATA_FORMAT_EAC_R11_UNORM_BLOCK:679case DATA_FORMAT_EAC_R11_SNORM_BLOCK:680return 8;681case DATA_FORMAT_EAC_R11G11_UNORM_BLOCK:682case DATA_FORMAT_EAC_R11G11_SNORM_BLOCK:683return 16;684case DATA_FORMAT_ASTC_4x4_UNORM_BLOCK: // Again, not sure about astc.685case DATA_FORMAT_ASTC_4x4_SRGB_BLOCK:686case DATA_FORMAT_ASTC_4x4_SFLOAT_BLOCK:687case DATA_FORMAT_ASTC_5x4_UNORM_BLOCK:688case DATA_FORMAT_ASTC_5x4_SRGB_BLOCK:689case DATA_FORMAT_ASTC_5x4_SFLOAT_BLOCK:690case DATA_FORMAT_ASTC_5x5_UNORM_BLOCK:691case DATA_FORMAT_ASTC_5x5_SRGB_BLOCK:692case DATA_FORMAT_ASTC_5x5_SFLOAT_BLOCK:693case DATA_FORMAT_ASTC_6x5_UNORM_BLOCK:694case DATA_FORMAT_ASTC_6x5_SRGB_BLOCK:695case DATA_FORMAT_ASTC_6x5_SFLOAT_BLOCK:696case DATA_FORMAT_ASTC_6x6_UNORM_BLOCK:697case DATA_FORMAT_ASTC_6x6_SRGB_BLOCK:698case DATA_FORMAT_ASTC_6x6_SFLOAT_BLOCK:699case DATA_FORMAT_ASTC_8x5_UNORM_BLOCK:700case DATA_FORMAT_ASTC_8x5_SRGB_BLOCK:701case DATA_FORMAT_ASTC_8x5_SFLOAT_BLOCK:702case DATA_FORMAT_ASTC_8x6_UNORM_BLOCK:703case DATA_FORMAT_ASTC_8x6_SRGB_BLOCK:704case DATA_FORMAT_ASTC_8x6_SFLOAT_BLOCK:705case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK:706case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK:707case DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK:708case DATA_FORMAT_ASTC_10x5_UNORM_BLOCK:709case DATA_FORMAT_ASTC_10x5_SRGB_BLOCK:710case DATA_FORMAT_ASTC_10x5_SFLOAT_BLOCK:711case DATA_FORMAT_ASTC_10x6_UNORM_BLOCK:712case DATA_FORMAT_ASTC_10x6_SRGB_BLOCK:713case DATA_FORMAT_ASTC_10x6_SFLOAT_BLOCK:714case DATA_FORMAT_ASTC_10x8_UNORM_BLOCK:715case DATA_FORMAT_ASTC_10x8_SRGB_BLOCK:716case DATA_FORMAT_ASTC_10x8_SFLOAT_BLOCK:717case DATA_FORMAT_ASTC_10x10_UNORM_BLOCK:718case DATA_FORMAT_ASTC_10x10_SRGB_BLOCK:719case DATA_FORMAT_ASTC_10x10_SFLOAT_BLOCK:720case DATA_FORMAT_ASTC_12x10_UNORM_BLOCK:721case DATA_FORMAT_ASTC_12x10_SRGB_BLOCK:722case DATA_FORMAT_ASTC_12x10_SFLOAT_BLOCK:723case DATA_FORMAT_ASTC_12x12_UNORM_BLOCK:724case DATA_FORMAT_ASTC_12x12_SRGB_BLOCK:725case DATA_FORMAT_ASTC_12x12_SFLOAT_BLOCK:726return 16;727default: {728}729}730return 1;731}732733uint32_t RenderingDeviceCommons::get_compressed_image_format_pixel_rshift(DataFormat p_format) {734switch (p_format) {735case DATA_FORMAT_BC1_RGB_UNORM_BLOCK: // These formats are half byte size, so rshift is 1.736case DATA_FORMAT_BC1_RGB_SRGB_BLOCK:737case DATA_FORMAT_BC1_RGBA_UNORM_BLOCK:738case DATA_FORMAT_BC1_RGBA_SRGB_BLOCK:739case DATA_FORMAT_BC4_UNORM_BLOCK:740case DATA_FORMAT_BC4_SNORM_BLOCK:741case DATA_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:742case DATA_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:743case DATA_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:744case DATA_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:745case DATA_FORMAT_EAC_R11_UNORM_BLOCK:746case DATA_FORMAT_EAC_R11_SNORM_BLOCK:747return 1;748case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK:749case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK:750case DATA_FORMAT_ASTC_8x8_SFLOAT_BLOCK: {751return 2;752}753default: {754}755}756757return 0;758}759760uint32_t RenderingDeviceCommons::get_image_format_required_size(DataFormat p_format, uint32_t p_width, uint32_t p_height, uint32_t p_depth, uint32_t p_mipmaps, uint32_t *r_blockw, uint32_t *r_blockh, uint32_t *r_depth) {761ERR_FAIL_COND_V(p_mipmaps == 0, 0);762uint32_t w = p_width;763uint32_t h = p_height;764uint32_t d = p_depth;765766uint32_t size = 0;767768uint32_t pixel_size = get_image_format_pixel_size(p_format);769uint32_t pixel_rshift = get_compressed_image_format_pixel_rshift(p_format);770uint32_t blockw = 0;771uint32_t blockh = 0;772get_compressed_image_format_block_dimensions(p_format, blockw, blockh);773774for (uint32_t i = 0; i < p_mipmaps; i++) {775uint32_t bw = STEPIFY(w, blockw);776uint32_t bh = STEPIFY(h, blockh);777778uint32_t s = bw * bh;779780s *= pixel_size;781s >>= pixel_rshift;782size += s * d;783if (r_blockw) {784*r_blockw = bw;785}786if (r_blockh) {787*r_blockh = bh;788}789if (r_depth) {790*r_depth = d;791}792w = MAX(blockw, w >> 1);793h = MAX(blockh, h >> 1);794d = MAX(1u, d >> 1);795}796797return size;798}799800uint32_t RenderingDeviceCommons::get_image_required_mipmaps(uint32_t p_width, uint32_t p_height, uint32_t p_depth) {801// Formats and block size don't really matter here since they can all go down to 1px (even if block is larger).802uint32_t w = p_width;803uint32_t h = p_height;804uint32_t d = p_depth;805806uint32_t mipmaps = 1;807808while (true) {809if (w == 1 && h == 1 && d == 1) {810break;811}812813w = MAX(1u, w >> 1);814h = MAX(1u, h >> 1);815d = MAX(1u, d >> 1);816817mipmaps++;818}819820return mipmaps;821}822823bool RenderingDeviceCommons::format_has_stencil(DataFormat p_format) {824switch (p_format) {825case DATA_FORMAT_S8_UINT:826case DATA_FORMAT_D16_UNORM_S8_UINT:827case DATA_FORMAT_D24_UNORM_S8_UINT:828case DATA_FORMAT_D32_SFLOAT_S8_UINT: {829return true;830}831default: {832}833}834return false;835}836837uint32_t RenderingDeviceCommons::format_get_plane_count(DataFormat p_format) {838uint32_t planes = 1;839switch (p_format) {840case DATA_FORMAT_D16_UNORM_S8_UINT:841case DATA_FORMAT_D24_UNORM_S8_UINT:842case DATA_FORMAT_D32_SFLOAT_S8_UINT: {843planes = 2;844break;845}846default: {847}848}849DEV_ASSERT(planes <= MAX_IMAGE_FORMAT_PLANES);850return planes;851}852853/*****************/854/**** SAMPLER ****/855/*****************/856857const Color RenderingDeviceCommons::SAMPLER_BORDER_COLOR_VALUE[SAMPLER_BORDER_COLOR_MAX] = {858Color(0, 0, 0, 0),859Color(0, 0, 0, 0),860Color(0, 0, 0, 1),861Color(0, 0, 0, 1),862Color(1, 1, 1, 1),863Color(1, 1, 1, 1),864};865866/**********************/867/**** VERTEX ARRAY ****/868/**********************/869870uint32_t RenderingDeviceCommons::get_format_vertex_size(DataFormat p_format) {871switch (p_format) {872case DATA_FORMAT_R8_UNORM:873case DATA_FORMAT_R8_SNORM:874case DATA_FORMAT_R8_UINT:875case DATA_FORMAT_R8_SINT:876case DATA_FORMAT_R8G8_UNORM:877case DATA_FORMAT_R8G8_SNORM:878case DATA_FORMAT_R8G8_UINT:879case DATA_FORMAT_R8G8_SINT:880case DATA_FORMAT_R8G8B8_UNORM:881case DATA_FORMAT_R8G8B8_SNORM:882case DATA_FORMAT_R8G8B8_UINT:883case DATA_FORMAT_R8G8B8_SINT:884case DATA_FORMAT_B8G8R8_UNORM:885case DATA_FORMAT_B8G8R8_SNORM:886case DATA_FORMAT_B8G8R8_UINT:887case DATA_FORMAT_B8G8R8_SINT:888case DATA_FORMAT_R8G8B8A8_UNORM:889case DATA_FORMAT_R8G8B8A8_SNORM:890case DATA_FORMAT_R8G8B8A8_UINT:891case DATA_FORMAT_R8G8B8A8_SINT:892case DATA_FORMAT_B8G8R8A8_UNORM:893case DATA_FORMAT_B8G8R8A8_SNORM:894case DATA_FORMAT_B8G8R8A8_UINT:895case DATA_FORMAT_B8G8R8A8_SINT:896case DATA_FORMAT_A2B10G10R10_UNORM_PACK32:897return 4;898case DATA_FORMAT_R16_UNORM:899case DATA_FORMAT_R16_SNORM:900case DATA_FORMAT_R16_UINT:901case DATA_FORMAT_R16_SINT:902case DATA_FORMAT_R16_SFLOAT:903return 4;904case DATA_FORMAT_R16G16_UNORM:905case DATA_FORMAT_R16G16_SNORM:906case DATA_FORMAT_R16G16_UINT:907case DATA_FORMAT_R16G16_SINT:908case DATA_FORMAT_R16G16_SFLOAT:909return 4;910case DATA_FORMAT_R16G16B16_UNORM:911case DATA_FORMAT_R16G16B16_SNORM:912case DATA_FORMAT_R16G16B16_UINT:913case DATA_FORMAT_R16G16B16_SINT:914case DATA_FORMAT_R16G16B16_SFLOAT:915return 8;916case DATA_FORMAT_R16G16B16A16_UNORM:917case DATA_FORMAT_R16G16B16A16_SNORM:918case DATA_FORMAT_R16G16B16A16_UINT:919case DATA_FORMAT_R16G16B16A16_SINT:920case DATA_FORMAT_R16G16B16A16_SFLOAT:921return 8;922case DATA_FORMAT_R32_UINT:923case DATA_FORMAT_R32_SINT:924case DATA_FORMAT_R32_SFLOAT:925return 4;926case DATA_FORMAT_R32G32_UINT:927case DATA_FORMAT_R32G32_SINT:928case DATA_FORMAT_R32G32_SFLOAT:929return 8;930case DATA_FORMAT_R32G32B32_UINT:931case DATA_FORMAT_R32G32B32_SINT:932case DATA_FORMAT_R32G32B32_SFLOAT:933return 12;934case DATA_FORMAT_R32G32B32A32_UINT:935case DATA_FORMAT_R32G32B32A32_SINT:936case DATA_FORMAT_R32G32B32A32_SFLOAT:937return 16;938case DATA_FORMAT_R64_UINT:939case DATA_FORMAT_R64_SINT:940case DATA_FORMAT_R64_SFLOAT:941return 8;942case DATA_FORMAT_R64G64_UINT:943case DATA_FORMAT_R64G64_SINT:944case DATA_FORMAT_R64G64_SFLOAT:945return 16;946case DATA_FORMAT_R64G64B64_UINT:947case DATA_FORMAT_R64G64B64_SINT:948case DATA_FORMAT_R64G64B64_SFLOAT:949return 24;950case DATA_FORMAT_R64G64B64A64_UINT:951case DATA_FORMAT_R64G64B64A64_SINT:952case DATA_FORMAT_R64G64B64A64_SFLOAT:953return 32;954default:955return 0;956}957}958959/****************/960/**** SHADER ****/961/****************/962963const char *RenderingDeviceCommons::SHADER_STAGE_NAMES[SHADER_STAGE_MAX] = {964"Vertex",965"Fragment",966"TesselationControl",967"TesselationEvaluation",968"Compute",969};970971972