2012-11-26 18:58:24 +00:00
|
|
|
/*
|
|
|
|
===========================================================================
|
|
|
|
|
|
|
|
Doom 3 BFG Edition GPL Source Code
|
2012-11-28 15:47:07 +00:00
|
|
|
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
|
2018-10-28 14:46:14 +00:00
|
|
|
Copyright (C) 2013-2018 Robert Beckebans
|
2012-11-26 18:58:24 +00:00
|
|
|
|
2012-11-28 15:47:07 +00:00
|
|
|
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
|
2012-11-26 18:58:24 +00:00
|
|
|
|
|
|
|
Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
|
|
|
|
|
|
|
|
If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
|
|
|
|
|
|
|
|
===========================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma hdrstop
|
2012-12-22 15:18:19 +00:00
|
|
|
#include "precompiled.h"
|
2012-11-26 18:58:24 +00:00
|
|
|
|
2017-09-03 08:22:36 +00:00
|
|
|
#include "RenderCommon.h"
|
2012-11-26 18:58:24 +00:00
|
|
|
|
|
|
|
|
2018-10-28 12:22:36 +00:00
|
|
|
#if defined(USE_VULKAN)
|
|
|
|
|
2019-11-11 19:27:44 +00:00
|
|
|
extern idUniformBuffer emptyUBO;
|
2018-10-28 12:22:36 +00:00
|
|
|
|
2019-11-11 19:27:44 +00:00
|
|
|
void CreateVertexDescriptions();
|
2018-10-28 12:22:36 +00:00
|
|
|
|
2019-11-11 19:27:44 +00:00
|
|
|
void CreateDescriptorPools( VkDescriptorPool( &pools )[ NUM_FRAME_DATA ] );
|
2018-10-28 12:22:36 +00:00
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2012-11-26 18:58:24 +00:00
|
|
|
|
|
|
|
idRenderProgManager renderProgManager;
|
|
|
|
|
|
|
|
/*
|
|
|
|
================================================================================================
|
|
|
|
idRenderProgManager::idRenderProgManager()
|
|
|
|
================================================================================================
|
|
|
|
*/
|
2012-11-28 15:47:07 +00:00
|
|
|
idRenderProgManager::idRenderProgManager()
|
|
|
|
{
|
2012-11-26 18:58:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================================================================================================
|
|
|
|
idRenderProgManager::~idRenderProgManager()
|
|
|
|
================================================================================================
|
|
|
|
*/
|
2012-11-28 15:47:07 +00:00
|
|
|
idRenderProgManager::~idRenderProgManager()
|
|
|
|
{
|
2012-11-26 18:58:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================================================================================================
|
|
|
|
R_ReloadShaders
|
|
|
|
================================================================================================
|
|
|
|
*/
|
2012-11-28 15:47:07 +00:00
|
|
|
static void R_ReloadShaders( const idCmdArgs& args )
|
|
|
|
{
|
2012-11-26 18:58:24 +00:00
|
|
|
renderProgManager.KillAllShaders();
|
|
|
|
renderProgManager.LoadAllShaders();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================================================================================================
|
|
|
|
idRenderProgManager::Init()
|
|
|
|
================================================================================================
|
|
|
|
*/
|
2012-11-28 15:47:07 +00:00
|
|
|
void idRenderProgManager::Init()
|
|
|
|
{
|
2012-11-26 18:58:24 +00:00
|
|
|
common->Printf( "----- Initializing Render Shaders -----\n" );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
|
|
|
|
2012-11-28 15:47:07 +00:00
|
|
|
for( int i = 0; i < MAX_BUILTINS; i++ )
|
|
|
|
{
|
2012-11-26 18:58:24 +00:00
|
|
|
builtinShaders[i] = -1;
|
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2014-04-20 14:29:58 +00:00
|
|
|
// RB: added checks for GPU skinning
|
2012-11-28 15:47:07 +00:00
|
|
|
struct builtinShaders_t
|
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
int index;
|
|
|
|
const char* name;
|
|
|
|
const char* nameOutSuffix;
|
|
|
|
uint32 shaderFeatures;
|
|
|
|
bool requireGPUSkinningSupport;
|
|
|
|
rpStage_t stages;
|
|
|
|
vertexLayoutType_t layout;
|
2012-11-28 15:47:07 +00:00
|
|
|
} builtins[] =
|
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_GUI, "gui.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_COLOR, "color.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2014-05-10 12:40:01 +00:00
|
|
|
// RB begin
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_COLOR_SKINNED, "color", "_skinned", BIT( USE_GPU_SKINNING ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_VERTEX_COLOR, "vertex_color.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_AMBIENT_LIGHTING, "ambient_lighting", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_AMBIENT_LIGHTING_SKINNED, "ambient_lighting", "_skinned", BIT( USE_GPU_SKINNING ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2019-10-19 20:51:14 +00:00
|
|
|
{ BUILTIN_AMBIENT_LIGHTING_IBL, "ambient_lighting_IBL", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_AMBIENT_LIGHTING_IBL_SKINNED, "ambient_lighting_IBL", "_skinned", BIT( USE_GPU_SKINNING ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2019-10-30 17:08:37 +00:00
|
|
|
{ BUILTIN_AMBIENT_LIGHTING_IBL_PBR, "ambient_lighting_IBL", "_PBR", BIT( USE_PBR ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_AMBIENT_LIGHTING_IBL_PBR_SKINNED, "ambient_lighting_IBL", "_PBR_skinned", BIT( USE_GPU_SKINNING | USE_PBR ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_SMALL_GEOMETRY_BUFFER, "gbuffer", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_SMALL_GEOMETRY_BUFFER_SKINNED, "gbuffer", "_skinned", BIT( USE_GPU_SKINNING ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2014-05-10 12:40:01 +00:00
|
|
|
// RB end
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_TEXTURED, "texture.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_TEXTURE_VERTEXCOLOR, "texture_color.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_TEXTURE_VERTEXCOLOR_SRGB, "texture_color.vfp", "", BIT( USE_SRGB ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_TEXTURE_VERTEXCOLOR_SKINNED, "texture_color_skinned.vfp", "", 0, true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_TEXTURE_TEXGEN_VERTEXCOLOR, "texture_color_texgen.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2020-04-16 16:08:50 +00:00
|
|
|
|
2014-05-10 12:40:01 +00:00
|
|
|
// RB begin
|
2020-04-16 16:08:50 +00:00
|
|
|
{ BUILTIN_INTERACTION, "interaction", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_INTERACTION_SKINNED, "interaction", "_skinned", BIT( USE_GPU_SKINNING ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2020-04-16 16:08:50 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_INTERACTION_AMBIENT, "interactionAmbient.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_INTERACTION_AMBIENT_SKINNED, "interactionAmbient_skinned.vfp", "", 0, true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2020-04-16 16:08:50 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_INTERACTION_SHADOW_MAPPING_SPOT, "interactionSM", "_spot", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_INTERACTION_SHADOW_MAPPING_SPOT_SKINNED, "interactionSM", "_spot_skinned", BIT( USE_GPU_SKINNING ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2020-04-16 16:08:50 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_INTERACTION_SHADOW_MAPPING_POINT, "interactionSM", "_point", BIT( LIGHT_POINT ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_INTERACTION_SHADOW_MAPPING_POINT_SKINNED, "interactionSM", "_point_skinned", BIT( USE_GPU_SKINNING ) | BIT( LIGHT_POINT ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2020-04-16 16:08:50 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_INTERACTION_SHADOW_MAPPING_PARALLEL, "interactionSM", "_parallel", BIT( LIGHT_PARALLEL ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_INTERACTION_SHADOW_MAPPING_PARALLEL_SKINNED, "interactionSM", "_parallel_skinned", BIT( USE_GPU_SKINNING ) | BIT( LIGHT_PARALLEL ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2020-04-16 16:08:50 +00:00
|
|
|
|
|
|
|
// PBR variants
|
|
|
|
{ BUILTIN_PBR_INTERACTION, "interaction", "_PBR", BIT( USE_PBR ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_PBR_INTERACTION_SKINNED, "interaction", "_skinned_PBR", BIT( USE_GPU_SKINNING ) | BIT( USE_PBR ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
|
|
|
|
{ BUILTIN_PBR_INTERACTION_AMBIENT, "interactionAmbient", "_PBR", BIT( USE_PBR ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_PBR_INTERACTION_AMBIENT_SKINNED, "interactionAmbient_skinned", "_PBR", BIT( USE_PBR ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
|
|
|
|
{ BUILTIN_PBR_INTERACTION_SHADOW_MAPPING_SPOT, "interactionSM", "_spot_PBR", BIT( USE_PBR ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_PBR_INTERACTION_SHADOW_MAPPING_SPOT_SKINNED, "interactionSM", "_spot_skinned_PBR", BIT( USE_GPU_SKINNING ) | BIT( USE_PBR ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
|
|
|
|
{ BUILTIN_PBR_INTERACTION_SHADOW_MAPPING_POINT, "interactionSM", "_point_PBR", BIT( LIGHT_POINT ) | BIT( USE_PBR ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_PBR_INTERACTION_SHADOW_MAPPING_POINT_SKINNED, "interactionSM", "_point_skinned_PBR", BIT( USE_GPU_SKINNING ) | BIT( LIGHT_POINT ) | BIT( USE_PBR ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
|
|
|
|
{ BUILTIN_PBR_INTERACTION_SHADOW_MAPPING_PARALLEL, "interactionSM", "_parallel_PBR", BIT( LIGHT_PARALLEL ) | BIT( USE_PBR ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_PBR_INTERACTION_SHADOW_MAPPING_PARALLEL_SKINNED, "interactionSM", "_parallel_skinned_PBR", BIT( USE_GPU_SKINNING ) | BIT( LIGHT_PARALLEL ) | BIT( USE_PBR ), true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2014-05-10 12:40:01 +00:00
|
|
|
// RB end
|
2020-04-16 16:08:50 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_ENVIRONMENT, "environment.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_ENVIRONMENT_SKINNED, "environment_skinned.vfp", "", 0, true , SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT},
|
|
|
|
{ BUILTIN_BUMPY_ENVIRONMENT, "bumpyenvironment.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_BUMPY_ENVIRONMENT_SKINNED, "bumpyenvironment_skinned.vfp", "", 0, true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_DEPTH, "depth.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_DEPTH_SKINNED, "depth_skinned.vfp", "", 0, true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_SHADOW, "shadow.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_SHADOW_VERT },
|
|
|
|
{ BUILTIN_SHADOW_SKINNED, "shadow_skinned.vfp", "", 0, true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_SHADOW_VERT_SKINNED },
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_SHADOW_DEBUG, "shadowDebug.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_SHADOW_DEBUG_SKINNED, "shadowDebug_skinned.vfp", "", 0, true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_BLENDLIGHT, "blendlight.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_FOG, "fog.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_FOG_SKINNED, "fog_skinned.vfp", "", 0, true, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_SKYBOX, "skybox.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_WOBBLESKY, "wobblesky.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_POSTPROCESS, "postprocess.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2015-12-20 11:28:46 +00:00
|
|
|
// RB begin
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_SCREEN, "screen", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_TONEMAP, "tonemap", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_BRIGHTPASS, "tonemap", "_brightpass", BIT( BRIGHTPASS ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_HDR_GLARE_CHROMATIC, "hdr_glare_chromatic", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_HDR_DEBUG, "tonemap", "_debug", BIT( HDR_DEBUG ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_SMAA_EDGE_DETECTION, "SMAA_edge_detection", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_SMAA_BLENDING_WEIGHT_CALCULATION, "SMAA_blending_weight_calc", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_SMAA_NEIGHBORHOOD_BLENDING, "SMAA_final", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_AMBIENT_OCCLUSION, "AmbientOcclusion_AO", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_AMBIENT_OCCLUSION_AND_OUTPUT, "AmbientOcclusion_AO", "_write", BIT( BRIGHTPASS ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_AMBIENT_OCCLUSION_BLUR, "AmbientOcclusion_blur", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_AMBIENT_OCCLUSION_BLUR_AND_OUTPUT, "AmbientOcclusion_blur", "_write", BIT( BRIGHTPASS ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_AMBIENT_OCCLUSION_MINIFY, "AmbientOcclusion_minify", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_AMBIENT_OCCLUSION_RECONSTRUCT_CSZ, "AmbientOcclusion_minify", "_mip0", BIT( BRIGHTPASS ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_DEEP_GBUFFER_RADIOSITY_SSGI, "DeepGBufferRadiosity_radiosity", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_DEEP_GBUFFER_RADIOSITY_BLUR, "DeepGBufferRadiosity_blur", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_DEEP_GBUFFER_RADIOSITY_BLUR_AND_OUTPUT, "DeepGBufferRadiosity_blur", "_write", BIT( BRIGHTPASS ), false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2015-12-20 11:28:46 +00:00
|
|
|
// RB end
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_STEREO_DEGHOST, "stereoDeGhost.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_STEREO_WARP, "stereoWarp.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_BINK, "bink.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_BINK_GUI, "bink_gui.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_STEREO_INTERLACE, "stereoInterlace.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
|
|
|
{ BUILTIN_MOTION_BLUR, "motionBlur.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2014-05-10 12:40:01 +00:00
|
|
|
// RB begin
|
2018-10-13 16:34:29 +00:00
|
|
|
{ BUILTIN_DEBUG_SHADOWMAP, "debug_shadowmap.vfp", "", 0, false, SHADER_STAGE_DEFAULT, LAYOUT_DRAW_VERT },
|
2014-05-10 12:40:01 +00:00
|
|
|
// RB end
|
2012-11-26 18:58:24 +00:00
|
|
|
};
|
|
|
|
int numBuiltins = sizeof( builtins ) / sizeof( builtins[0] );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
renderProgs.SetNum( numBuiltins );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2012-11-28 15:47:07 +00:00
|
|
|
for( int i = 0; i < numBuiltins; i++ )
|
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
renderProg_t& prog = renderProgs[ i ];
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
prog.name = builtins[i].name;
|
|
|
|
prog.builtin = true;
|
2018-11-01 11:50:40 +00:00
|
|
|
prog.vertexLayout = builtins[i].layout;
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2012-11-26 18:58:24 +00:00
|
|
|
builtinShaders[builtins[i].index] = i;
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2014-04-20 14:29:58 +00:00
|
|
|
if( builtins[i].requireGPUSkinningSupport && !glConfig.gpuSkinningAvailable )
|
|
|
|
{
|
|
|
|
// RB: don't try to load shaders that would break the GLSL compiler in the OpenGL driver
|
|
|
|
continue;
|
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2019-01-20 12:32:22 +00:00
|
|
|
uint32 shaderFeatures = builtins[i].shaderFeatures;
|
|
|
|
if( builtins[i].requireGPUSkinningSupport )
|
|
|
|
{
|
|
|
|
shaderFeatures |= BIT( USE_GPU_SKINNING );
|
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
int vIndex = -1;
|
|
|
|
if( builtins[ i ].stages & SHADER_STAGE_VERTEX )
|
|
|
|
{
|
2019-11-11 19:07:33 +00:00
|
|
|
vIndex = FindShader( builtins[ i ].name, SHADER_STAGE_VERTEX, builtins[i].nameOutSuffix, shaderFeatures, true, builtins[i].layout );
|
2018-10-13 16:34:29 +00:00
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
int fIndex = -1;
|
|
|
|
if( builtins[ i ].stages & SHADER_STAGE_FRAGMENT )
|
|
|
|
{
|
2019-11-11 19:07:33 +00:00
|
|
|
fIndex = FindShader( builtins[ i ].name, SHADER_STAGE_FRAGMENT, builtins[i].nameOutSuffix, shaderFeatures, true, builtins[i].layout );
|
2018-10-13 16:34:29 +00:00
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-28 10:39:05 +00:00
|
|
|
//idLib::Printf( "Loading GLSL program %i %i %i\n", i, vIndex, fIndex );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
LoadGLSLProgram( i, vIndex, fIndex );
|
2012-11-26 18:58:24 +00:00
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2016-10-24 23:08:27 +00:00
|
|
|
r_useHalfLambertLighting.ClearModified();
|
|
|
|
r_useHDR.ClearModified();
|
2020-03-22 12:46:58 +00:00
|
|
|
r_useIBL.ClearModified();
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
uniforms.SetNum( RENDERPARM_TOTAL, vec4_zero );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2014-04-20 14:29:58 +00:00
|
|
|
if( glConfig.gpuSkinningAvailable )
|
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
renderProgs[builtinShaders[BUILTIN_TEXTURE_VERTEXCOLOR_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_INTERACTION_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_INTERACTION_AMBIENT_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_ENVIRONMENT_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_BUMPY_ENVIRONMENT_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_DEPTH_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_SHADOW_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_SHADOW_DEBUG_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_FOG_SKINNED]].usesJoints = true;
|
2014-05-10 12:40:01 +00:00
|
|
|
// RB begin
|
2018-10-13 16:34:29 +00:00
|
|
|
renderProgs[builtinShaders[BUILTIN_AMBIENT_LIGHTING_SKINNED]].usesJoints = true;
|
2016-07-07 01:17:33 +00:00
|
|
|
renderProgs[builtinShaders[BUILTIN_AMBIENT_LIGHTING_IBL_SKINNED]].usesJoints = true;
|
2016-07-10 21:46:24 +00:00
|
|
|
renderProgs[builtinShaders[BUILTIN_AMBIENT_LIGHTING_IBL_PBR_SKINNED]].usesJoints = true;
|
2018-10-13 16:34:29 +00:00
|
|
|
renderProgs[builtinShaders[BUILTIN_SMALL_GEOMETRY_BUFFER_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_INTERACTION_SHADOW_MAPPING_SPOT_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_INTERACTION_SHADOW_MAPPING_POINT_SKINNED]].usesJoints = true;
|
|
|
|
renderProgs[builtinShaders[BUILTIN_INTERACTION_SHADOW_MAPPING_PARALLEL_SKINNED]].usesJoints = true;
|
2014-05-10 12:40:01 +00:00
|
|
|
// RB end
|
2014-04-20 14:29:58 +00:00
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2012-11-26 18:58:24 +00:00
|
|
|
cmdSystem->AddCommand( "reloadShaders", R_ReloadShaders, CMD_FL_RENDERER, "reloads shaders" );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-28 10:39:05 +00:00
|
|
|
#if defined(USE_VULKAN)
|
2018-10-28 14:46:14 +00:00
|
|
|
counter = 0;
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-28 10:39:05 +00:00
|
|
|
// Create Vertex Descriptions
|
|
|
|
CreateVertexDescriptions();
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-28 10:39:05 +00:00
|
|
|
// Create Descriptor Pools
|
|
|
|
CreateDescriptorPools( descriptorPools );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-28 10:39:05 +00:00
|
|
|
for( int i = 0; i < NUM_FRAME_DATA; ++i )
|
|
|
|
{
|
|
|
|
parmBuffers[ i ] = new idUniformBuffer();
|
|
|
|
parmBuffers[ i ]->AllocBufferObject( NULL, MAX_DESC_SETS * MAX_DESC_SET_UNIFORMS * sizeof( idVec4 ), BU_DYNAMIC );
|
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-28 10:39:05 +00:00
|
|
|
// Placeholder: mainly for optionalSkinning
|
|
|
|
emptyUBO.AllocBufferObject( NULL, sizeof( idVec4 ), BU_DYNAMIC );
|
|
|
|
#endif
|
2012-11-26 18:58:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================================================================================================
|
|
|
|
idRenderProgManager::LoadAllShaders()
|
|
|
|
================================================================================================
|
|
|
|
*/
|
2012-11-28 15:47:07 +00:00
|
|
|
void idRenderProgManager::LoadAllShaders()
|
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
for( int i = 0; i < shaders.Num(); i++ )
|
2012-11-28 15:47:07 +00:00
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
LoadShader( i, shaders[i].stage );
|
2012-11-26 18:58:24 +00:00
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
for( int i = 0; i < renderProgs.Num(); ++i )
|
2012-11-28 15:47:07 +00:00
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
if( renderProgs[i].vertexShaderIndex == -1 || renderProgs[i].fragmentShaderIndex == -1 )
|
2014-05-10 12:40:01 +00:00
|
|
|
{
|
|
|
|
// RB: skip reloading because we didn't load it initially
|
|
|
|
continue;
|
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
LoadGLSLProgram( i, renderProgs[i].vertexShaderIndex, renderProgs[i].fragmentShaderIndex );
|
2012-11-26 18:58:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-03 11:01:03 +00:00
|
|
|
|
2012-11-26 18:58:24 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
================================================================================================
|
|
|
|
idRenderProgManager::Shutdown()
|
|
|
|
================================================================================================
|
|
|
|
*/
|
2012-11-28 15:47:07 +00:00
|
|
|
void idRenderProgManager::Shutdown()
|
|
|
|
{
|
2012-11-26 18:58:24 +00:00
|
|
|
KillAllShaders();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================================================================================================
|
|
|
|
idRenderProgManager::FindVertexShader
|
|
|
|
================================================================================================
|
|
|
|
*/
|
2019-11-11 19:07:33 +00:00
|
|
|
int idRenderProgManager::FindShader( const char* name, rpStage_t stage, const char* nameOutSuffix, uint32 features, bool builtin, vertexLayoutType_t vertexLayout )
|
2012-11-28 15:47:07 +00:00
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
idStr shaderName( name );
|
|
|
|
shaderName.StripFileExtension();
|
|
|
|
//shaderName += nameOutSuffix;
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
for( int i = 0; i < shaders.Num(); i++ )
|
2012-11-28 15:47:07 +00:00
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
shader_t& shader = shaders[ i ];
|
|
|
|
if( shader.name.Icmp( shaderName.c_str() ) == 0 && shader.stage == stage && shader.nameOutSuffix.Icmp( nameOutSuffix ) == 0 )
|
2012-11-28 15:47:07 +00:00
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
LoadShader( i, stage );
|
2012-11-26 18:58:24 +00:00
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
shader_t shader;
|
|
|
|
shader.name = shaderName;
|
|
|
|
shader.nameOutSuffix = nameOutSuffix;
|
|
|
|
shader.shaderFeatures = features;
|
|
|
|
shader.builtin = builtin;
|
|
|
|
shader.stage = stage;
|
2019-11-11 19:07:33 +00:00
|
|
|
shader.vertexLayout = vertexLayout;
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-10-13 16:34:29 +00:00
|
|
|
int index = shaders.Append( shader );
|
|
|
|
LoadShader( index, stage );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2012-11-26 18:58:24 +00:00
|
|
|
return index;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-04-20 14:29:58 +00:00
|
|
|
// RB begin
|
|
|
|
bool idRenderProgManager::IsShaderBound() const
|
|
|
|
{
|
2018-10-13 16:34:29 +00:00
|
|
|
return ( current != -1 );
|
2014-04-20 14:29:58 +00:00
|
|
|
}
|
|
|
|
// RB end
|
|
|
|
|
2012-11-26 18:58:24 +00:00
|
|
|
/*
|
|
|
|
================================================================================================
|
|
|
|
idRenderProgManager::SetRenderParms
|
|
|
|
================================================================================================
|
|
|
|
*/
|
2012-11-28 15:47:07 +00:00
|
|
|
void idRenderProgManager::SetRenderParms( renderParm_t rp, const float* value, int num )
|
|
|
|
{
|
|
|
|
for( int i = 0; i < num; i++ )
|
|
|
|
{
|
|
|
|
SetRenderParm( ( renderParm_t )( rp + i ), value + ( i * 4 ) );
|
2012-11-26 18:58:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
================================================================================================
|
|
|
|
idRenderProgManager::SetRenderParm
|
|
|
|
================================================================================================
|
|
|
|
*/
|
2012-11-28 15:47:07 +00:00
|
|
|
void idRenderProgManager::SetRenderParm( renderParm_t rp, const float* value )
|
|
|
|
{
|
2012-11-26 18:58:24 +00:00
|
|
|
SetUniformValue( rp, value );
|
|
|
|
}
|
|
|
|
|
2018-11-02 21:13:15 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
========================
|
|
|
|
RpPrintState
|
|
|
|
========================
|
|
|
|
*/
|
2019-11-08 17:12:37 +00:00
|
|
|
void RpPrintState( uint64 stateBits )
|
2018-11-02 21:13:15 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
// culling
|
|
|
|
idLib::Printf( "Culling: " );
|
|
|
|
switch( stateBits & GLS_CULL_BITS )
|
|
|
|
{
|
|
|
|
case GLS_CULL_FRONTSIDED:
|
|
|
|
idLib::Printf( "FRONTSIDED -> BACK" );
|
|
|
|
break;
|
|
|
|
case GLS_CULL_BACKSIDED:
|
|
|
|
idLib::Printf( "BACKSIDED -> FRONT" );
|
|
|
|
break;
|
|
|
|
case GLS_CULL_TWOSIDED:
|
|
|
|
idLib::Printf( "TWOSIDED" );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
idLib::Printf( "NA" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
idLib::Printf( "\n" );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-11-02 21:13:15 +00:00
|
|
|
// polygon mode
|
|
|
|
idLib::Printf( "PolygonMode: %s\n", ( stateBits & GLS_POLYMODE_LINE ) ? "LINE" : "FILL" );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-11-02 21:13:15 +00:00
|
|
|
// color mask
|
|
|
|
idLib::Printf( "ColorMask: " );
|
|
|
|
idLib::Printf( ( stateBits & GLS_REDMASK ) ? "_" : "R" );
|
|
|
|
idLib::Printf( ( stateBits & GLS_GREENMASK ) ? "_" : "G" );
|
|
|
|
idLib::Printf( ( stateBits & GLS_BLUEMASK ) ? "_" : "B" );
|
|
|
|
idLib::Printf( ( stateBits & GLS_ALPHAMASK ) ? "_" : "A" );
|
|
|
|
idLib::Printf( "\n" );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-11-02 21:13:15 +00:00
|
|
|
// blend
|
|
|
|
idLib::Printf( "Blend: src=" );
|
|
|
|
switch( stateBits & GLS_SRCBLEND_BITS )
|
|
|
|
{
|
|
|
|
case GLS_SRCBLEND_ZERO:
|
|
|
|
idLib::Printf( "ZERO" );
|
|
|
|
break;
|
|
|
|
case GLS_SRCBLEND_ONE:
|
|
|
|
idLib::Printf( "ONE" );
|
|
|
|
break;
|
|
|
|
case GLS_SRCBLEND_DST_COLOR:
|
|
|
|
idLib::Printf( "DST_COLOR" );
|
|
|
|
break;
|
|
|
|
case GLS_SRCBLEND_ONE_MINUS_DST_COLOR:
|
|
|
|
idLib::Printf( "ONE_MINUS_DST_COLOR" );
|
|
|
|
break;
|
|
|
|
case GLS_SRCBLEND_SRC_ALPHA:
|
|
|
|
idLib::Printf( "SRC_ALPHA" );
|
|
|
|
break;
|
|
|
|
case GLS_SRCBLEND_ONE_MINUS_SRC_ALPHA:
|
|
|
|
idLib::Printf( "ONE_MINUS_SRC_ALPHA" );
|
|
|
|
break;
|
|
|
|
case GLS_SRCBLEND_DST_ALPHA:
|
|
|
|
idLib::Printf( "DST_ALPHA" );
|
|
|
|
break;
|
|
|
|
case GLS_SRCBLEND_ONE_MINUS_DST_ALPHA:
|
|
|
|
idLib::Printf( "ONE_MINUS_DST_ALPHA" );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
idLib::Printf( "NA" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
idLib::Printf( ", dst=" );
|
|
|
|
switch( stateBits & GLS_DSTBLEND_BITS )
|
|
|
|
{
|
|
|
|
case GLS_DSTBLEND_ZERO:
|
|
|
|
idLib::Printf( "ZERO" );
|
|
|
|
break;
|
|
|
|
case GLS_DSTBLEND_ONE:
|
|
|
|
idLib::Printf( "ONE" );
|
|
|
|
break;
|
|
|
|
case GLS_DSTBLEND_SRC_COLOR:
|
|
|
|
idLib::Printf( "SRC_COLOR" );
|
|
|
|
break;
|
|
|
|
case GLS_DSTBLEND_ONE_MINUS_SRC_COLOR:
|
|
|
|
idLib::Printf( "ONE_MINUS_SRC_COLOR" );
|
|
|
|
break;
|
|
|
|
case GLS_DSTBLEND_SRC_ALPHA:
|
|
|
|
idLib::Printf( "SRC_ALPHA" );
|
|
|
|
break;
|
|
|
|
case GLS_DSTBLEND_ONE_MINUS_SRC_ALPHA:
|
|
|
|
idLib::Printf( "ONE_MINUS_SRC_ALPHA" );
|
|
|
|
break;
|
|
|
|
case GLS_DSTBLEND_DST_ALPHA:
|
|
|
|
idLib::Printf( "DST_ALPHA" );
|
|
|
|
break;
|
|
|
|
case GLS_DSTBLEND_ONE_MINUS_DST_ALPHA:
|
|
|
|
idLib::Printf( "ONE_MINUS_DST_ALPHA" );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
idLib::Printf( "NA" );
|
|
|
|
}
|
|
|
|
idLib::Printf( "\n" );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-11-02 21:13:15 +00:00
|
|
|
// depth func
|
|
|
|
idLib::Printf( "DepthFunc: " );
|
|
|
|
switch( stateBits & GLS_DEPTHFUNC_BITS )
|
|
|
|
{
|
|
|
|
case GLS_DEPTHFUNC_EQUAL:
|
|
|
|
idLib::Printf( "EQUAL" );
|
|
|
|
break;
|
|
|
|
case GLS_DEPTHFUNC_ALWAYS:
|
|
|
|
idLib::Printf( "ALWAYS" );
|
|
|
|
break;
|
|
|
|
case GLS_DEPTHFUNC_LESS:
|
|
|
|
idLib::Printf( "LEQUAL" );
|
|
|
|
break;
|
|
|
|
case GLS_DEPTHFUNC_GREATER:
|
|
|
|
idLib::Printf( "GEQUAL" );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
idLib::Printf( "NA" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
idLib::Printf( "\n" );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-11-02 21:13:15 +00:00
|
|
|
// depth mask
|
|
|
|
idLib::Printf( "DepthWrite: %s\n", ( stateBits & GLS_DEPTHMASK ) ? "FALSE" : "TRUE" );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-11-02 21:13:15 +00:00
|
|
|
// depth bounds
|
|
|
|
idLib::Printf( "DepthBounds: %s\n", ( stateBits & GLS_DEPTH_TEST_MASK ) ? "TRUE" : "FALSE" );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-11-02 21:13:15 +00:00
|
|
|
// depth bias
|
|
|
|
idLib::Printf( "DepthBias: %s\n", ( stateBits & GLS_POLYGON_OFFSET ) ? "TRUE" : "FALSE" );
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-11-02 21:13:15 +00:00
|
|
|
// stencil
|
|
|
|
auto printStencil = [&]( stencilFace_t face, uint64 bits, uint64 mask, uint64 ref )
|
|
|
|
{
|
|
|
|
idLib::Printf( "Stencil: %s, ", ( bits & ( GLS_STENCIL_FUNC_BITS | GLS_STENCIL_OP_BITS ) ) ? "ON" : "OFF" );
|
|
|
|
idLib::Printf( "Face=" );
|
|
|
|
switch( face )
|
|
|
|
{
|
|
|
|
case STENCIL_FACE_FRONT:
|
|
|
|
idLib::Printf( "FRONT" );
|
|
|
|
break;
|
|
|
|
case STENCIL_FACE_BACK:
|
|
|
|
idLib::Printf( "BACK" );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
idLib::Printf( "BOTH" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
idLib::Printf( ", Func=" );
|
|
|
|
switch( bits & GLS_STENCIL_FUNC_BITS )
|
|
|
|
{
|
|
|
|
case GLS_STENCIL_FUNC_NEVER:
|
|
|
|
idLib::Printf( "NEVER" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_FUNC_LESS:
|
|
|
|
idLib::Printf( "LESS" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_FUNC_EQUAL:
|
|
|
|
idLib::Printf( "EQUAL" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_FUNC_LEQUAL:
|
|
|
|
idLib::Printf( "LEQUAL" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_FUNC_GREATER:
|
|
|
|
idLib::Printf( "GREATER" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_FUNC_NOTEQUAL:
|
|
|
|
idLib::Printf( "NOTEQUAL" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_FUNC_GEQUAL:
|
|
|
|
idLib::Printf( "GEQUAL" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_FUNC_ALWAYS:
|
|
|
|
idLib::Printf( "ALWAYS" );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
idLib::Printf( "NA" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
idLib::Printf( ", OpFail=" );
|
|
|
|
switch( bits & GLS_STENCIL_OP_FAIL_BITS )
|
|
|
|
{
|
|
|
|
case GLS_STENCIL_OP_FAIL_KEEP:
|
|
|
|
idLib::Printf( "KEEP" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_FAIL_ZERO:
|
|
|
|
idLib::Printf( "ZERO" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_FAIL_REPLACE:
|
|
|
|
idLib::Printf( "REPLACE" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_FAIL_INCR:
|
|
|
|
idLib::Printf( "INCR" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_FAIL_DECR:
|
|
|
|
idLib::Printf( "DECR" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_FAIL_INVERT:
|
|
|
|
idLib::Printf( "INVERT" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_FAIL_INCR_WRAP:
|
|
|
|
idLib::Printf( "INCR_WRAP" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_FAIL_DECR_WRAP:
|
|
|
|
idLib::Printf( "DECR_WRAP" );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
idLib::Printf( "NA" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
idLib::Printf( ", ZFail=" );
|
|
|
|
switch( bits & GLS_STENCIL_OP_ZFAIL_BITS )
|
|
|
|
{
|
|
|
|
case GLS_STENCIL_OP_ZFAIL_KEEP:
|
|
|
|
idLib::Printf( "KEEP" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_ZFAIL_ZERO:
|
|
|
|
idLib::Printf( "ZERO" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_ZFAIL_REPLACE:
|
|
|
|
idLib::Printf( "REPLACE" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_ZFAIL_INCR:
|
|
|
|
idLib::Printf( "INCR" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_ZFAIL_DECR:
|
|
|
|
idLib::Printf( "DECR" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_ZFAIL_INVERT:
|
|
|
|
idLib::Printf( "INVERT" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_ZFAIL_INCR_WRAP:
|
|
|
|
idLib::Printf( "INCR_WRAP" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_ZFAIL_DECR_WRAP:
|
|
|
|
idLib::Printf( "DECR_WRAP" );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
idLib::Printf( "NA" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
idLib::Printf( ", OpPass=" );
|
|
|
|
switch( bits & GLS_STENCIL_OP_PASS_BITS )
|
|
|
|
{
|
|
|
|
case GLS_STENCIL_OP_PASS_KEEP:
|
|
|
|
idLib::Printf( "KEEP" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_PASS_ZERO:
|
|
|
|
idLib::Printf( "ZERO" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_PASS_REPLACE:
|
|
|
|
idLib::Printf( "REPLACE" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_PASS_INCR:
|
|
|
|
idLib::Printf( "INCR" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_PASS_DECR:
|
|
|
|
idLib::Printf( "DECR" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_PASS_INVERT:
|
|
|
|
idLib::Printf( "INVERT" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_PASS_INCR_WRAP:
|
|
|
|
idLib::Printf( "INCR_WRAP" );
|
|
|
|
break;
|
|
|
|
case GLS_STENCIL_OP_PASS_DECR_WRAP:
|
|
|
|
idLib::Printf( "DECR_WRAP" );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
idLib::Printf( "NA" );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
idLib::Printf( ", mask=%llu, ref=%llu\n", mask, ref );
|
|
|
|
};
|
2019-11-11 19:27:44 +00:00
|
|
|
|
2018-11-02 21:13:15 +00:00
|
|
|
uint32 mask = uint32( ( stateBits & GLS_STENCIL_FUNC_MASK_BITS ) >> GLS_STENCIL_FUNC_MASK_SHIFT );
|
|
|
|
uint32 ref = uint32( ( stateBits & GLS_STENCIL_FUNC_REF_BITS ) >> GLS_STENCIL_FUNC_REF_SHIFT );
|
|
|
|
if( stateBits & GLS_SEPARATE_STENCIL )
|
|
|
|
{
|
2019-11-08 17:12:37 +00:00
|
|
|
printStencil( STENCIL_FACE_FRONT, ( stateBits & GLS_STENCIL_FRONT_OPS ), mask, ref );
|
|
|
|
printStencil( STENCIL_FACE_BACK, ( ( stateBits & GLS_STENCIL_BACK_OPS ) >> 12 ), mask, ref );
|
2018-11-02 21:13:15 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printStencil( STENCIL_FACE_NUM, stateBits, mask, ref );
|
|
|
|
}
|
2019-10-19 20:51:14 +00:00
|
|
|
}
|