| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943 |
- /*
- -----------------------------------------------------------------------------
- This source file is part of OGRE
- (Object-oriented Graphics Rendering Engine)
- For the latest info, see http://www.ogre3d.org
- Copyright (c) 2000-2011 Torus Knot Software Ltd
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- -----------------------------------------------------------------------------
- */
- #include "CmGpuProgramParams.h"
- #include "CmMatrix4.h"
- #include "CmVector3.h"
- #include "CmVector4.h"
- #include "CmRenderSystemCapabilities.h"
- #include "CmException.h"
- namespace CamelotEngine
- {
- //---------------------------------------------------------------------
- GpuProgramParameters::AutoConstantDefinition GpuProgramParameters::AutoConstantDictionary[] = {
- AutoConstantDefinition(ACT_WORLD_MATRIX, "world_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_WORLD_MATRIX, "inverse_world_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_TRANSPOSE_WORLD_MATRIX, "transpose_world_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_TRANSPOSE_WORLD_MATRIX, "inverse_transpose_world_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_WORLD_MATRIX_ARRAY_3x4, "world_matrix_array_3x4", 12, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_WORLD_MATRIX_ARRAY, "world_matrix_array", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_VIEW_MATRIX, "view_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_VIEW_MATRIX, "inverse_view_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_TRANSPOSE_VIEW_MATRIX, "transpose_view_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_TRANSPOSE_VIEW_MATRIX, "inverse_transpose_view_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_PROJECTION_MATRIX, "projection_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_PROJECTION_MATRIX, "inverse_projection_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_TRANSPOSE_PROJECTION_MATRIX, "transpose_projection_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX, "inverse_transpose_projection_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_VIEWPROJ_MATRIX, "viewproj_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_VIEWPROJ_MATRIX, "inverse_viewproj_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_TRANSPOSE_VIEWPROJ_MATRIX, "transpose_viewproj_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX, "inverse_transpose_viewproj_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_WORLDVIEW_MATRIX, "worldview_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_WORLDVIEW_MATRIX, "inverse_worldview_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_TRANSPOSE_WORLDVIEW_MATRIX, "transpose_worldview_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX, "inverse_transpose_worldview_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_WORLDVIEWPROJ_MATRIX, "worldviewproj_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_WORLDVIEWPROJ_MATRIX, "inverse_worldviewproj_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX, "transpose_worldviewproj_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX, "inverse_transpose_worldviewproj_matrix", 16, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_RENDER_TARGET_FLIPPING, "render_target_flipping", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_VERTEX_WINDING, "vertex_winding", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_FOG_COLOUR, "fog_colour", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_FOG_PARAMS, "fog_params", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_SURFACE_AMBIENT_COLOUR, "surface_ambient_colour", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_SURFACE_DIFFUSE_COLOUR, "surface_diffuse_colour", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_SURFACE_SPECULAR_COLOUR, "surface_specular_colour", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_SURFACE_EMISSIVE_COLOUR, "surface_emissive_colour", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_SURFACE_SHININESS, "surface_shininess", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_LIGHT_COUNT, "light_count", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_AMBIENT_LIGHT_COLOUR, "ambient_light_colour", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_LIGHT_DIFFUSE_COLOUR, "light_diffuse_colour", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_SPECULAR_COLOUR, "light_specular_colour", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_ATTENUATION, "light_attenuation", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_SPOTLIGHT_PARAMS, "spotlight_params", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_POSITION, "light_position", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_POSITION_OBJECT_SPACE, "light_position_object_space", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_POSITION_VIEW_SPACE, "light_position_view_space", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DIRECTION, "light_direction", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DIRECTION_OBJECT_SPACE, "light_direction_object_space", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DIRECTION_VIEW_SPACE, "light_direction_view_space", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DISTANCE_OBJECT_SPACE, "light_distance_object_space", 1, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_POWER_SCALE, "light_power", 1, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED, "light_diffuse_colour_power_scaled", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED, "light_specular_colour_power_scaled", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DIFFUSE_COLOUR_ARRAY, "light_diffuse_colour_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_SPECULAR_COLOUR_ARRAY, "light_specular_colour_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY, "light_diffuse_colour_power_scaled_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY, "light_specular_colour_power_scaled_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_ATTENUATION_ARRAY, "light_attenuation_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_POSITION_ARRAY, "light_position_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY, "light_position_object_space_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY, "light_position_view_space_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DIRECTION_ARRAY, "light_direction_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY, "light_direction_object_space_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY, "light_direction_view_space_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY, "light_distance_object_space_array", 1, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_POWER_SCALE_ARRAY, "light_power_array", 1, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_SPOTLIGHT_PARAMS_ARRAY, "spotlight_params_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_DERIVED_AMBIENT_LIGHT_COLOUR, "derived_ambient_light_colour", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_DERIVED_SCENE_COLOUR, "derived_scene_colour", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_DERIVED_LIGHT_DIFFUSE_COLOUR, "derived_light_diffuse_colour", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_DERIVED_LIGHT_SPECULAR_COLOUR, "derived_light_specular_colour", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY, "derived_light_diffuse_colour_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY, "derived_light_specular_colour_array", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_NUMBER, "light_number", 1, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LIGHT_CASTS_SHADOWS, "light_casts_shadows", 1, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_SHADOW_EXTRUSION_DISTANCE, "shadow_extrusion_distance", 1, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_CAMERA_POSITION, "camera_position", 3, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_CAMERA_POSITION_OBJECT_SPACE, "camera_position_object_space", 3, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_TEXTURE_VIEWPROJ_MATRIX, "texture_viewproj_matrix", 16, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY, "texture_viewproj_matrix_array", 16, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_TEXTURE_WORLDVIEWPROJ_MATRIX, "texture_worldviewproj_matrix",16, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY, "texture_worldviewproj_matrix_array",16, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_SPOTLIGHT_VIEWPROJ_MATRIX, "spotlight_viewproj_matrix", 16, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_SPOTLIGHT_VIEWPROJ_MATRIX_ARRAY, "spotlight_viewproj_matrix_array", 16, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX, "spotlight_worldviewproj_matrix",16, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_CUSTOM, "custom", 4, ET_REAL, ACDT_INT), // *** needs to be tested
- AutoConstantDefinition(ACT_TIME, "time", 1, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_TIME_0_X, "time_0_x", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_COSTIME_0_X, "costime_0_x", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_SINTIME_0_X, "sintime_0_x", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_TANTIME_0_X, "tantime_0_x", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_TIME_0_X_PACKED, "time_0_x_packed", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_TIME_0_1, "time_0_1", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_COSTIME_0_1, "costime_0_1", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_SINTIME_0_1, "sintime_0_1", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_TANTIME_0_1, "tantime_0_1", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_TIME_0_1_PACKED, "time_0_1_packed", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_TIME_0_2PI, "time_0_2pi", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_COSTIME_0_2PI, "costime_0_2pi", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_SINTIME_0_2PI, "sintime_0_2pi", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_TANTIME_0_2PI, "tantime_0_2pi", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_TIME_0_2PI_PACKED, "time_0_2pi_packed", 4, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_FRAME_TIME, "frame_time", 1, ET_REAL, ACDT_REAL),
- AutoConstantDefinition(ACT_FPS, "fps", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_VIEWPORT_WIDTH, "viewport_width", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_VIEWPORT_HEIGHT, "viewport_height", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_VIEWPORT_WIDTH, "inverse_viewport_width", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_INVERSE_VIEWPORT_HEIGHT, "inverse_viewport_height", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_VIEWPORT_SIZE, "viewport_size", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_VIEW_DIRECTION, "view_direction", 3, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_VIEW_SIDE_VECTOR, "view_side_vector", 3, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_VIEW_UP_VECTOR, "view_up_vector", 3, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_FOV, "fov", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_NEAR_CLIP_DISTANCE, "near_clip_distance", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_FAR_CLIP_DISTANCE, "far_clip_distance", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_PASS_NUMBER, "pass_number", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_PASS_ITERATION_NUMBER, "pass_iteration_number", 1, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_ANIMATION_PARAMETRIC, "animation_parametric", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_TEXEL_OFFSETS, "texel_offsets", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_SCENE_DEPTH_RANGE, "scene_depth_range", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_SHADOW_SCENE_DEPTH_RANGE, "shadow_scene_depth_range", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_SHADOW_COLOUR, "shadow_colour", 4, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_TEXTURE_SIZE, "texture_size", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_INVERSE_TEXTURE_SIZE, "inverse_texture_size", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_PACKED_TEXTURE_SIZE, "packed_texture_size", 4, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_TEXTURE_MATRIX, "texture_matrix", 16, ET_REAL, ACDT_INT),
- AutoConstantDefinition(ACT_LOD_CAMERA_POSITION, "lod_camera_position", 3, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_LOD_CAMERA_POSITION_OBJECT_SPACE, "lod_camera_position_object_space", 3, ET_REAL, ACDT_NONE),
- AutoConstantDefinition(ACT_LIGHT_CUSTOM, "light_custom", 4, ET_REAL, ACDT_INT)
- };
- bool GpuNamedConstants::msGenerateAllConstantDefinitionArrayEntries = false;
- //---------------------------------------------------------------------
- void GpuNamedConstants::generateConstantDefinitionArrayEntries(
- const String& paramName, const GpuConstantDefinition& baseDef)
- {
- // Copy definition for use with arrays
- GpuConstantDefinition arrayDef = baseDef;
- arrayDef.arraySize = 1;
- String arrayName;
- // Add parameters for array accessors
- // [0] will refer to the same location, [1+] will increment
- // only populate others individually up to 16 array slots so as not to get out of hand,
- // unless the system has been explicitly configured to allow all the parameters to be added
- // paramName[0] version will always exist
- size_t maxArrayIndex = 1;
- if (baseDef.arraySize <= 16 || msGenerateAllConstantDefinitionArrayEntries)
- maxArrayIndex = baseDef.arraySize;
- for (size_t i = 0; i < maxArrayIndex; i++)
- {
- arrayName = paramName + "[" + toString(i) + "]";
- map.insert(GpuConstantDefinitionMap::value_type(arrayName, arrayDef));
- // increment location
- arrayDef.physicalIndex += arrayDef.elementSize;
- }
- // note no increment of buffer sizes since this is shared with main array def
- }
- //---------------------------------------------------------------------
- bool GpuNamedConstants::getGenerateAllConstantDefinitionArrayEntries()
- {
- return msGenerateAllConstantDefinitionArrayEntries;
- }
- //---------------------------------------------------------------------
- void GpuNamedConstants::setGenerateAllConstantDefinitionArrayEntries(bool generateAll)
- {
- msGenerateAllConstantDefinitionArrayEntries = generateAll;
- }
- //-----------------------------------------------------------------------------
- // GpuSharedParameters Methods
- //-----------------------------------------------------------------------------
- GpuSharedParameters::GpuSharedParameters(const String& name)
- :mName(name)
- // TODO PORT - Commented out because I don't have root in port. But I dont think this will be needed in final version
- /*, mFrameLastUpdated(Root::getSingleton().getNextFrameNumber())*/
- , mFrameLastUpdated(0)
- , mVersion(0)
- {
- }
- //---------------------------------------------------------------------
- GpuSharedParameters::~GpuSharedParameters()
- {
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::addConstantDefinition(const String& name, GpuConstantType constType, size_t arraySize)
- {
- if (mNamedConstants.map.find(name) != mNamedConstants.map.end())
- {
- CM_EXCEPT(InvalidParametersException,
- "Constant entry with name '" + name + "' already exists. ");
- }
- GpuConstantDefinition def;
- def.arraySize = arraySize;
- def.constType = constType;
- // for compatibility we do not pad values to multiples of 4
- // when it comes to arrays, user is responsible for creating matching defs
- def.elementSize = GpuConstantDefinition::getElementSize(constType, false);
- // not used
- def.logicalIndex = 0;
- def.variability = (UINT16)GPV_GLOBAL;
- if (def.isFloat())
- {
- def.physicalIndex = mFloatConstants.size();
- mFloatConstants.resize(mFloatConstants.size() + def.arraySize * def.elementSize);
- }
- else
- {
- def.physicalIndex = mIntConstants.size();
- mIntConstants.resize(mIntConstants.size() + def.arraySize * def.elementSize);
- }
- mNamedConstants.map[name] = def;
- ++mVersion;
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::removeConstantDefinition(const String& name)
- {
- GpuConstantDefinitionMap::iterator i = mNamedConstants.map.find(name);
- if (i != mNamedConstants.map.end())
- {
- GpuConstantDefinition& def = i->second;
- bool isFloat = def.isFloat();
- size_t numElems = def.elementSize * def.arraySize;
- for (GpuConstantDefinitionMap::iterator j = mNamedConstants.map.begin();
- j != mNamedConstants.map.end(); ++j)
- {
- GpuConstantDefinition& otherDef = j->second;
- bool otherIsFloat = otherDef.isFloat();
- // same type, and comes after in the buffer
- if ( ((isFloat && otherIsFloat) || (!isFloat && !otherIsFloat)) &&
- otherDef.physicalIndex > def.physicalIndex)
- {
- // adjust index
- otherDef.physicalIndex -= numElems;
- }
- }
- // remove floats and reduce buffer
- if (isFloat)
- {
- mNamedConstants.floatBufferSize -= numElems;
- FloatConstantList::iterator beg = mFloatConstants.begin();
- std::advance(beg, def.physicalIndex);
- FloatConstantList::iterator en = beg;
- std::advance(en, numElems);
- mFloatConstants.erase(beg, en);
- }
- else
- {
- mNamedConstants.intBufferSize -= numElems;
- IntConstantList::iterator beg = mIntConstants.begin();
- std::advance(beg, def.physicalIndex);
- IntConstantList::iterator en = beg;
- std::advance(en, numElems);
- mIntConstants.erase(beg, en);
- }
- ++mVersion;
-
- }
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::removeAllConstantDefinitions()
- {
- mNamedConstants.map.clear();
- mNamedConstants.floatBufferSize = 0;
- mNamedConstants.intBufferSize = 0;
- mFloatConstants.clear();
- mIntConstants.clear();
- }
- //---------------------------------------------------------------------
- GpuConstantDefinitionIterator GpuSharedParameters::getConstantDefinitionIterator(void) const
- {
- return mNamedConstants.map.begin();
- }
- //---------------------------------------------------------------------
- const GpuConstantDefinition& GpuSharedParameters::getConstantDefinition(const String& name) const
- {
- GpuConstantDefinitionMap::const_iterator i = mNamedConstants.map.find(name);
- if (i == mNamedConstants.map.end())
- {
- CM_EXCEPT(InvalidParametersException,
- "Constant entry with name '" + name + "' does not exist. ");
- }
- return i->second;
- }
- //---------------------------------------------------------------------
- const GpuNamedConstants& GpuSharedParameters::getConstantDefinitions() const
- {
- return mNamedConstants;
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::setNamedConstant(const String& name, float val)
- {
- setNamedConstant(name, &val, 1);
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::setNamedConstant(const String& name, int val)
- {
- setNamedConstant(name, &val, 1);
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::setNamedConstant(const String& name, const Vector4& vec)
- {
- setNamedConstant(name, vec.ptr(), 4);
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::setNamedConstant(const String& name, const Vector3& vec)
- {
- setNamedConstant(name, vec.ptr(), 3);
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::setNamedConstant(const String& name, const Matrix4& m)
- {
- setNamedConstant(name, m[0], 16);
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::setNamedConstant(const String& name, const Matrix4* m, size_t numEntries)
- {
- setNamedConstant(name, m[0][0], 16 * numEntries);
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::setNamedConstant(const String& name, const float *val, size_t count)
- {
- GpuConstantDefinitionMap::const_iterator i = mNamedConstants.map.find(name);
- if (i != mNamedConstants.map.end())
- {
- const GpuConstantDefinition& def = i->second;
- memcpy(&mFloatConstants[def.physicalIndex], val,
- sizeof(float) * std::min(count, def.elementSize * def.arraySize));
- }
- _markDirty();
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::setNamedConstant(const String& name, const double *val, size_t count)
- {
- GpuConstantDefinitionMap::const_iterator i = mNamedConstants.map.find(name);
- if (i != mNamedConstants.map.end())
- {
- const GpuConstantDefinition& def = i->second;
- count = std::min(count, def.elementSize * def.arraySize);
- const double* src = val;
- float* dst = &mFloatConstants[def.physicalIndex];
- for (size_t v = 0; v < count; ++v)
- {
- *dst++ = static_cast<float>(*src++);
- }
- }
- _markDirty();
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::setNamedConstant(const String& name, const Color& colour)
- {
- setNamedConstant(name, colour.ptr(), 4);
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::setNamedConstant(const String& name, const int *val, size_t count)
- {
- GpuConstantDefinitionMap::const_iterator i = mNamedConstants.map.find(name);
- if (i != mNamedConstants.map.end())
- {
- const GpuConstantDefinition& def = i->second;
- memcpy(&mIntConstants[def.physicalIndex], val,
- sizeof(int) * std::min(count, def.elementSize * def.arraySize));
- }
- _markDirty();
- }
- //---------------------------------------------------------------------
- void GpuSharedParameters::_markDirty()
- {
- // TODO PORT - Don't have access to Root in port. Set it to 0 for now. Will probably be able to remove this completely
- mFrameLastUpdated = 0;
- /*mFrameLastUpdated = Root::getSingleton().getNextFrameNumber();*/
- }
- //-----------------------------------------------------------------------------
- // GpuSharedParametersUsage Methods
- //-----------------------------------------------------------------------------
- GpuSharedParametersUsage::GpuSharedParametersUsage(GpuSharedParametersPtr sharedParams,
- GpuProgramParameters* params)
- : mSharedParams(sharedParams)
- , mParams(params)
- {
- initCopyData();
- }
- //---------------------------------------------------------------------
- void GpuSharedParametersUsage::initCopyData()
- {
- mCopyDataList.clear();
- const GpuConstantDefinitionMap& sharedmap = mSharedParams->getConstantDefinitions().map;
- for (GpuConstantDefinitionMap::const_iterator i = sharedmap.begin(); i != sharedmap.end(); ++i)
- {
- const String& pName = i->first;
- const GpuConstantDefinition& shareddef = i->second;
- const GpuConstantDefinition* instdef = mParams->_findNamedConstantDefinition(pName, false);
- if (instdef)
- {
- // Check that the definitions are the same
- if (instdef->constType == shareddef.constType &&
- instdef->arraySize == shareddef.arraySize)
- {
- CopyDataEntry e;
- e.srcDefinition = &shareddef;
- e.dstDefinition = instdef;
- mCopyDataList.push_back(e);
- }
- }
- }
- mCopyDataVersion = mSharedParams->getVersion();
- }
- //---------------------------------------------------------------------
- void GpuSharedParametersUsage::_copySharedParamsToTargetParams()
- {
- // check copy data version
- if (mCopyDataVersion != mSharedParams->getVersion())
- initCopyData();
- for (CopyDataList::iterator i = mCopyDataList.begin(); i != mCopyDataList.end(); ++i)
- {
- CopyDataEntry& e = *i;
- if (e.dstDefinition->isFloat())
- {
- const float* pSrc = mSharedParams->getFloatPointer(e.srcDefinition->physicalIndex);
- float* pDst = mParams->getFloatPointer(e.dstDefinition->physicalIndex);
- // Deal with matrix transposition here!!!
- // transposition is specific to the dest param set, shared params don't do it
- if (mParams->getTransposeMatrices() && e.dstDefinition->constType == GCT_MATRIX_4X4)
- {
- for (int row = 0; row < 4; ++row)
- for (int col = 0; col < 4; ++col)
- pDst[row * 4 + col] = pSrc[col * 4 + row];
- }
- else
- {
- if (e.dstDefinition->elementSize == e.srcDefinition->elementSize)
- {
- // simple copy
- memcpy(pDst, pSrc, sizeof(float) * e.dstDefinition->elementSize * e.dstDefinition->arraySize);
- }
- else
- {
- // target params may be padded to 4 elements, shared params are packed
- assert(e.dstDefinition->elementSize % 4 == 0);
- size_t iterations = e.dstDefinition->elementSize / 4
- * e.dstDefinition->arraySize;
- size_t valsPerIteration = e.srcDefinition->elementSize / iterations;
- for (size_t l = 0; l < iterations; ++l)
- {
- memcpy(pDst, pSrc, sizeof(float) * valsPerIteration);
- pSrc += valsPerIteration;
- pDst += 4;
- }
- }
- }
- }
- else
- {
- const int* pSrc = mSharedParams->getIntPointer(e.srcDefinition->physicalIndex);
- int* pDst = mParams->getIntPointer(e.dstDefinition->physicalIndex);
- if (e.dstDefinition->elementSize == e.srcDefinition->elementSize)
- {
- // simple copy
- memcpy(pDst, pSrc, sizeof(int) * e.dstDefinition->elementSize * e.dstDefinition->arraySize);
- }
- else
- {
- // target params may be padded to 4 elements, shared params are packed
- assert(e.dstDefinition->elementSize % 4 == 0);
- size_t iterations = (e.dstDefinition->elementSize / 4)
- * e.dstDefinition->arraySize;
- size_t valsPerIteration = e.srcDefinition->elementSize / iterations;
- for (size_t l = 0; l < iterations; ++l)
- {
- memcpy(pDst, pSrc, sizeof(int) * valsPerIteration);
- pSrc += valsPerIteration;
- pDst += 4;
- }
- }
- }
- }
- }
- //-----------------------------------------------------------------------------
- // GpuProgramParameters Methods
- //-----------------------------------------------------------------------------
- GpuProgramParameters::GpuProgramParameters() :
- mCombinedVariability(GPV_GLOBAL)
- , mTransposeMatrices(false)
- , mIgnoreMissingParams(false)
- , mActivePassIterationIndex(std::numeric_limits<size_t>::max())
- {
- }
- //-----------------------------------------------------------------------------
- GpuProgramParameters::GpuProgramParameters(const GpuProgramParameters& oth)
- {
- *this = oth;
- }
- //-----------------------------------------------------------------------------
- GpuProgramParameters& GpuProgramParameters::operator=(const GpuProgramParameters& oth)
- {
- // let compiler perform shallow copies of structures
- // AutoConstantEntry, RealConstantEntry, IntConstantEntry
- mFloatConstants = oth.mFloatConstants;
- mIntConstants = oth.mIntConstants;
- mAutoConstants = oth.mAutoConstants;
- mFloatLogicalToPhysical = oth.mFloatLogicalToPhysical;
- mIntLogicalToPhysical = oth.mIntLogicalToPhysical;
- mNamedConstants = oth.mNamedConstants;
- copySharedParamSetUsage(oth.mSharedParamSets);
- mCombinedVariability = oth.mCombinedVariability;
- mTransposeMatrices = oth.mTransposeMatrices;
- mIgnoreMissingParams = oth.mIgnoreMissingParams;
- mActivePassIterationIndex = oth.mActivePassIterationIndex;
- return *this;
- }
- //---------------------------------------------------------------------
- void GpuProgramParameters::copySharedParamSetUsage(const GpuSharedParamUsageList& srcList)
- {
- mSharedParamSets.clear();
- for (GpuSharedParamUsageList::const_iterator i = srcList.begin(); i != srcList.end(); ++i)
- {
- mSharedParamSets.push_back(GpuSharedParametersUsage(i->getSharedParams(), this));
- }
- }
- //---------------------------------------------------------------------
- void GpuProgramParameters::_setNamedConstants(
- const GpuNamedConstantsPtr& namedConstants)
- {
- mNamedConstants = namedConstants;
- // Determine any extension to local buffers
- // Size and reset buffer (fill with zero to make comparison later ok)
- if (namedConstants->floatBufferSize > mFloatConstants.size())
- {
- mFloatConstants.insert(mFloatConstants.end(),
- namedConstants->floatBufferSize - mFloatConstants.size(), 0.0f);
- }
- if (namedConstants->intBufferSize > mIntConstants.size())
- {
- mIntConstants.insert(mIntConstants.end(),
- namedConstants->intBufferSize - mIntConstants.size(), 0);
- }
- }
- //---------------------------------------------------------------------
- void GpuProgramParameters::_setLogicalIndexes(
- const GpuLogicalBufferStructPtr& floatIndexMap,
- const GpuLogicalBufferStructPtr& intIndexMap)
- {
- mFloatLogicalToPhysical = floatIndexMap;
- mIntLogicalToPhysical = intIndexMap;
- // resize the internal buffers
- // Note that these will only contain something after the first parameter
- // set has set some parameters
- // Size and reset buffer (fill with zero to make comparison later ok)
- if ((floatIndexMap != nullptr) && floatIndexMap->bufferSize > mFloatConstants.size())
- {
- mFloatConstants.insert(mFloatConstants.end(),
- floatIndexMap->bufferSize - mFloatConstants.size(), 0.0f);
- }
- if ((intIndexMap != nullptr) && intIndexMap->bufferSize > mIntConstants.size())
- {
- mIntConstants.insert(mIntConstants.end(),
- intIndexMap->bufferSize - mIntConstants.size(), 0);
- }
- }
- //---------------------------------------------------------------------()
- void GpuProgramParameters::setConstant(size_t index, const Vector4& vec)
- {
- setConstant(index, vec.ptr(), 1);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setConstant(size_t index, float val)
- {
- setConstant(index, Vector4(val, 0.0f, 0.0f, 0.0f));
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setConstant(size_t index, const Vector3& vec)
- {
- setConstant(index, Vector4(vec.x, vec.y, vec.z, 1.0f));
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setConstant(size_t index, const Matrix4& m)
- {
- // set as 4x 4-element floats
- if (mTransposeMatrices)
- {
- Matrix4 t = m.transpose();
- GpuProgramParameters::setConstant(index, t[0], 4);
- }
- else
- {
- GpuProgramParameters::setConstant(index, m[0], 4);
- }
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setConstant(size_t index, const Matrix4* pMatrix,
- size_t numEntries)
- {
- if (mTransposeMatrices)
- {
- for (size_t i = 0; i < numEntries; ++i)
- {
- Matrix4 t = pMatrix[i].transpose();
- GpuProgramParameters::setConstant(index, t[0], 4);
- index += 4;
- }
- }
- else
- {
- GpuProgramParameters::setConstant(index, pMatrix[0][0], 4 * numEntries);
- }
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setConstant(size_t index, const Color& colour)
- {
- setConstant(index, colour.ptr(), 1);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setConstant(size_t index, const float *val, size_t count)
- {
- // Raw buffer size is 4x count
- size_t rawCount = count * 4;
- // get physical index
- assert((mFloatLogicalToPhysical != nullptr) && "GpuProgram hasn't set up the logical -> physical map!");
- size_t physicalIndex = _getFloatConstantPhysicalIndex(index, rawCount, GPV_GLOBAL);
- // Copy
- _writeRawConstants(physicalIndex, val, rawCount);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setConstant(size_t index, const double *val, size_t count)
- {
- // Raw buffer size is 4x count
- size_t rawCount = count * 4;
- // get physical index
- assert((mFloatLogicalToPhysical != nullptr) && "GpuProgram hasn't set up the logical -> physical map!");
- size_t physicalIndex = _getFloatConstantPhysicalIndex(index, rawCount, GPV_GLOBAL);
- assert(physicalIndex + rawCount <= mFloatConstants.size());
- // Copy manually since cast required
- for (size_t i = 0; i < rawCount; ++i)
- {
- mFloatConstants[physicalIndex + i] =
- static_cast<float>(val[i]);
- }
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setConstant(size_t index, const int *val, size_t count)
- {
- // Raw buffer size is 4x count
- size_t rawCount = count * 4;
- // get physical index
- assert((mIntLogicalToPhysical != nullptr) && "GpuProgram hasn't set up the logical -> physical map!");
- size_t physicalIndex = _getIntConstantPhysicalIndex(index, rawCount, GPV_GLOBAL);
- // Copy
- _writeRawConstants(physicalIndex, val, rawCount);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_writeRawConstant(size_t physicalIndex, const Vector4& vec,
- size_t count)
- {
- // remember, raw content access uses raw float count rather than float4
- // write either the number requested (for packed types) or up to 4
- _writeRawConstants(physicalIndex, vec.ptr(), std::min(count, (size_t)4));
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_writeRawConstant(size_t physicalIndex, float val)
- {
- _writeRawConstants(physicalIndex, &val, 1);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_writeRawConstant(size_t physicalIndex, int val)
- {
- _writeRawConstants(physicalIndex, &val, 1);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_writeRawConstant(size_t physicalIndex, const Vector3& vec)
- {
- _writeRawConstants(physicalIndex, vec.ptr(), 3);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_writeRawConstant(size_t physicalIndex, const Matrix4& m,size_t elementCount)
- {
- // remember, raw content access uses raw float count rather than float4
- if (mTransposeMatrices)
- {
- Matrix4 t = m.transpose();
- _writeRawConstants(physicalIndex, t[0], elementCount>16?16:elementCount);
- }
- else
- {
- _writeRawConstants(physicalIndex, m[0], elementCount>16?16:elementCount);
- }
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_writeRawConstant(size_t physicalIndex, const Matrix4* pMatrix, size_t numEntries)
- {
- // remember, raw content access uses raw float count rather than float4
- if (mTransposeMatrices)
- {
- for (size_t i = 0; i < numEntries; ++i)
- {
- Matrix4 t = pMatrix[i].transpose();
- _writeRawConstants(physicalIndex, t[0], 16);
- physicalIndex += 16;
- }
- }
- else
- {
- _writeRawConstants(physicalIndex, pMatrix[0][0], 16 * numEntries);
- }
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_writeRawConstant(size_t physicalIndex,
- const Color& colour, size_t count)
- {
- // write either the number requested (for packed types) or up to 4
- _writeRawConstants(physicalIndex, colour.ptr(), std::min(count, (size_t)4));
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_writeRawConstants(size_t physicalIndex, const double* val, size_t count)
- {
- assert(physicalIndex + count <= mFloatConstants.size());
- for (size_t i = 0; i < count; ++i)
- {
- mFloatConstants[physicalIndex+i] = static_cast<float>(val[i]);
- }
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_writeRawConstants(size_t physicalIndex, const float* val, size_t count)
- {
- assert(physicalIndex + count <= mFloatConstants.size());
- memcpy(&mFloatConstants[physicalIndex], val, sizeof(float) * count);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_writeRawConstants(size_t physicalIndex, const int* val, size_t count)
- {
- assert(physicalIndex + count <= mIntConstants.size());
- memcpy(&mIntConstants[physicalIndex], val, sizeof(int) * count);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_readRawConstants(size_t physicalIndex, size_t count, float* dest)
- {
- assert(physicalIndex + count <= mFloatConstants.size());
- memcpy(dest, &mFloatConstants[physicalIndex], sizeof(float) * count);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_readRawConstants(size_t physicalIndex, size_t count, int* dest)
- {
- assert(physicalIndex + count <= mIntConstants.size());
- memcpy(dest, &mIntConstants[physicalIndex], sizeof(int) * count);
- }
- //---------------------------------------------------------------------
- UINT16 GpuProgramParameters::deriveVariability(GpuProgramParameters::AutoConstantType act)
- {
- switch(act)
- {
- case ACT_VIEW_MATRIX:
- case ACT_INVERSE_VIEW_MATRIX:
- case ACT_TRANSPOSE_VIEW_MATRIX:
- case ACT_INVERSE_TRANSPOSE_VIEW_MATRIX:
- case ACT_PROJECTION_MATRIX:
- case ACT_INVERSE_PROJECTION_MATRIX:
- case ACT_TRANSPOSE_PROJECTION_MATRIX:
- case ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX:
- case ACT_VIEWPROJ_MATRIX:
- case ACT_INVERSE_VIEWPROJ_MATRIX:
- case ACT_TRANSPOSE_VIEWPROJ_MATRIX:
- case ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX:
- case ACT_RENDER_TARGET_FLIPPING:
- case ACT_VERTEX_WINDING:
- case ACT_AMBIENT_LIGHT_COLOUR:
- case ACT_DERIVED_AMBIENT_LIGHT_COLOUR:
- case ACT_DERIVED_SCENE_COLOUR:
- case ACT_FOG_COLOUR:
- case ACT_FOG_PARAMS:
- case ACT_SURFACE_AMBIENT_COLOUR:
- case ACT_SURFACE_DIFFUSE_COLOUR:
- case ACT_SURFACE_SPECULAR_COLOUR:
- case ACT_SURFACE_EMISSIVE_COLOUR:
- case ACT_SURFACE_SHININESS:
- case ACT_CAMERA_POSITION:
- case ACT_TIME:
- case ACT_TIME_0_X:
- case ACT_COSTIME_0_X:
- case ACT_SINTIME_0_X:
- case ACT_TANTIME_0_X:
- case ACT_TIME_0_X_PACKED:
- case ACT_TIME_0_1:
- case ACT_COSTIME_0_1:
- case ACT_SINTIME_0_1:
- case ACT_TANTIME_0_1:
- case ACT_TIME_0_1_PACKED:
- case ACT_TIME_0_2PI:
- case ACT_COSTIME_0_2PI:
- case ACT_SINTIME_0_2PI:
- case ACT_TANTIME_0_2PI:
- case ACT_TIME_0_2PI_PACKED:
- case ACT_FRAME_TIME:
- case ACT_FPS:
- case ACT_VIEWPORT_WIDTH:
- case ACT_VIEWPORT_HEIGHT:
- case ACT_INVERSE_VIEWPORT_WIDTH:
- case ACT_INVERSE_VIEWPORT_HEIGHT:
- case ACT_VIEWPORT_SIZE:
- case ACT_TEXEL_OFFSETS:
- case ACT_TEXTURE_SIZE:
- case ACT_INVERSE_TEXTURE_SIZE:
- case ACT_PACKED_TEXTURE_SIZE:
- case ACT_SCENE_DEPTH_RANGE:
- case ACT_VIEW_DIRECTION:
- case ACT_VIEW_SIDE_VECTOR:
- case ACT_VIEW_UP_VECTOR:
- case ACT_FOV:
- case ACT_NEAR_CLIP_DISTANCE:
- case ACT_FAR_CLIP_DISTANCE:
- case ACT_PASS_NUMBER:
- case ACT_TEXTURE_MATRIX:
- case ACT_LOD_CAMERA_POSITION:
- return (UINT16)GPV_GLOBAL;
- case ACT_WORLD_MATRIX:
- case ACT_INVERSE_WORLD_MATRIX:
- case ACT_TRANSPOSE_WORLD_MATRIX:
- case ACT_INVERSE_TRANSPOSE_WORLD_MATRIX:
- case ACT_WORLD_MATRIX_ARRAY_3x4:
- case ACT_WORLD_MATRIX_ARRAY:
- case ACT_WORLDVIEW_MATRIX:
- case ACT_INVERSE_WORLDVIEW_MATRIX:
- case ACT_TRANSPOSE_WORLDVIEW_MATRIX:
- case ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX:
- case ACT_WORLDVIEWPROJ_MATRIX:
- case ACT_INVERSE_WORLDVIEWPROJ_MATRIX:
- case ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX:
- case ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX:
- case ACT_CAMERA_POSITION_OBJECT_SPACE:
- case ACT_LOD_CAMERA_POSITION_OBJECT_SPACE:
- case ACT_CUSTOM:
- case ACT_ANIMATION_PARAMETRIC:
- return (UINT16)GPV_PER_OBJECT;
- case ACT_LIGHT_POSITION_OBJECT_SPACE:
- case ACT_LIGHT_DIRECTION_OBJECT_SPACE:
- case ACT_LIGHT_DISTANCE_OBJECT_SPACE:
- case ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY:
- case ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY:
- case ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY:
- case ACT_TEXTURE_WORLDVIEWPROJ_MATRIX:
- case ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY:
- case ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX:
- // These depend on BOTH lights and objects
- return ((UINT16)GPV_PER_OBJECT) | ((UINT16)GPV_LIGHTS);
- case ACT_LIGHT_COUNT:
- case ACT_LIGHT_DIFFUSE_COLOUR:
- case ACT_LIGHT_SPECULAR_COLOUR:
- case ACT_LIGHT_POSITION:
- case ACT_LIGHT_DIRECTION:
- case ACT_LIGHT_POSITION_VIEW_SPACE:
- case ACT_LIGHT_DIRECTION_VIEW_SPACE:
- case ACT_SHADOW_EXTRUSION_DISTANCE:
- case ACT_SHADOW_SCENE_DEPTH_RANGE:
- case ACT_SHADOW_COLOUR:
- case ACT_LIGHT_POWER_SCALE:
- case ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED:
- case ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED:
- case ACT_LIGHT_NUMBER:
- case ACT_LIGHT_CASTS_SHADOWS:
- case ACT_LIGHT_ATTENUATION:
- case ACT_SPOTLIGHT_PARAMS:
- case ACT_LIGHT_DIFFUSE_COLOUR_ARRAY:
- case ACT_LIGHT_SPECULAR_COLOUR_ARRAY:
- case ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY:
- case ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY:
- case ACT_LIGHT_POSITION_ARRAY:
- case ACT_LIGHT_DIRECTION_ARRAY:
- case ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY:
- case ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY:
- case ACT_LIGHT_POWER_SCALE_ARRAY:
- case ACT_LIGHT_ATTENUATION_ARRAY:
- case ACT_SPOTLIGHT_PARAMS_ARRAY:
- case ACT_TEXTURE_VIEWPROJ_MATRIX:
- case ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY:
- case ACT_SPOTLIGHT_VIEWPROJ_MATRIX:
- case ACT_SPOTLIGHT_VIEWPROJ_MATRIX_ARRAY:
- case ACT_LIGHT_CUSTOM:
- return (UINT16)GPV_LIGHTS;
- case ACT_DERIVED_LIGHT_DIFFUSE_COLOUR:
- case ACT_DERIVED_LIGHT_SPECULAR_COLOUR:
- case ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY:
- case ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY:
- return ((UINT16)GPV_GLOBAL | (UINT16)GPV_LIGHTS);
- case ACT_PASS_ITERATION_NUMBER:
- return (UINT16)GPV_PASS_ITERATION_NUMBER;
- default:
- return (UINT16)GPV_GLOBAL;
- };
- }
- //---------------------------------------------------------------------
- GpuLogicalIndexUse* GpuProgramParameters::_getFloatConstantLogicalIndexUse(
- size_t logicalIndex, size_t requestedSize, UINT16 variability)
- {
- if (mFloatLogicalToPhysical == nullptr)
- return 0;
- GpuLogicalIndexUse* indexUse = 0;
- CM_LOCK_MUTEX(mFloatLogicalToPhysical->mutex)
- GpuLogicalIndexUseMap::iterator logi = mFloatLogicalToPhysical->map.find(logicalIndex);
- if (logi == mFloatLogicalToPhysical->map.end())
- {
- if (requestedSize)
- {
- size_t physicalIndex = mFloatConstants.size();
- // Expand at buffer end
- mFloatConstants.insert(mFloatConstants.end(), requestedSize, 0.0f);
- // Record extended size for future GPU params re-using this information
- mFloatLogicalToPhysical->bufferSize = mFloatConstants.size();
- // low-level programs will not know about mapping ahead of time, so
- // populate it. Other params objects will be able to just use this
- // accepted mapping since the constant structure will be the same
- // Set up a mapping for all items in the count
- size_t currPhys = physicalIndex;
- size_t count = requestedSize / 4;
- GpuLogicalIndexUseMap::iterator insertedIterator;
- for (size_t logicalNum = 0; logicalNum < count; ++logicalNum)
- {
- GpuLogicalIndexUseMap::iterator it =
- mFloatLogicalToPhysical->map.insert(
- GpuLogicalIndexUseMap::value_type(
- logicalIndex + logicalNum,
- GpuLogicalIndexUse(currPhys, requestedSize, variability))).first;
- currPhys += 4;
- if (logicalNum == 0)
- insertedIterator = it;
- }
- indexUse = &(insertedIterator->second);
- }
- else
- {
- // no match & ignore
- return 0;
- }
- }
- else
- {
- size_t physicalIndex = logi->second.physicalIndex;
- indexUse = &(logi->second);
- // check size
- if (logi->second.currentSize < requestedSize)
- {
- // init buffer entry wasn't big enough; could be a mistake on the part
- // of the original use, or perhaps a variable length we can't predict
- // until first actual runtime use e.g. world matrix array
- size_t insertCount = requestedSize - logi->second.currentSize;
- FloatConstantList::iterator insertPos = mFloatConstants.begin();
- std::advance(insertPos, physicalIndex);
- mFloatConstants.insert(insertPos, insertCount, 0.0f);
- // shift all physical positions after this one
- for (GpuLogicalIndexUseMap::iterator i = mFloatLogicalToPhysical->map.begin();
- i != mFloatLogicalToPhysical->map.end(); ++i)
- {
- if (i->second.physicalIndex > physicalIndex)
- i->second.physicalIndex += insertCount;
- }
- mFloatLogicalToPhysical->bufferSize += insertCount;
- for (AutoConstantList::iterator i = mAutoConstants.begin();
- i != mAutoConstants.end(); ++i)
- {
- if (i->physicalIndex > physicalIndex &&
- getAutoConstantDefinition(i->paramType)->elementType == ET_REAL)
- {
- i->physicalIndex += insertCount;
- }
- }
- if (mNamedConstants != nullptr)
- {
- for (GpuConstantDefinitionMap::iterator i = mNamedConstants->map.begin();
- i != mNamedConstants->map.end(); ++i)
- {
- if (i->second.isFloat() && i->second.physicalIndex > physicalIndex)
- i->second.physicalIndex += insertCount;
- }
- mNamedConstants->floatBufferSize += insertCount;
- }
- logi->second.currentSize += insertCount;
- }
- }
- if (indexUse)
- indexUse->variability = variability;
- return indexUse;
- }
- //---------------------------------------------------------------------()
- GpuLogicalIndexUse* GpuProgramParameters::_getIntConstantLogicalIndexUse(size_t logicalIndex, size_t requestedSize, UINT16 variability)
- {
- if (mIntLogicalToPhysical == nullptr)
- {
- CM_EXCEPT(InvalidParametersException,
- "This is not a low-level parameter parameter object");
- }
- GpuLogicalIndexUse* indexUse = 0;
- CM_LOCK_MUTEX(mIntLogicalToPhysical->mutex)
- GpuLogicalIndexUseMap::iterator logi = mIntLogicalToPhysical->map.find(logicalIndex);
- if (logi == mIntLogicalToPhysical->map.end())
- {
- if (requestedSize)
- {
- size_t physicalIndex = mIntConstants.size();
- // Expand at buffer end
- mIntConstants.insert(mIntConstants.end(), requestedSize, 0);
- // Record extended size for future GPU params re-using this information
- mIntLogicalToPhysical->bufferSize = mIntConstants.size();
- // low-level programs will not know about mapping ahead of time, so
- // populate it. Other params objects will be able to just use this
- // accepted mapping since the constant structure will be the same
- // Set up a mapping for all items in the count
- size_t currPhys = physicalIndex;
- size_t count = requestedSize / 4;
- GpuLogicalIndexUseMap::iterator insertedIterator;
- for (size_t logicalNum = 0; logicalNum < count; ++logicalNum)
- {
- GpuLogicalIndexUseMap::iterator it =
- mIntLogicalToPhysical->map.insert(
- GpuLogicalIndexUseMap::value_type(
- logicalIndex + logicalNum,
- GpuLogicalIndexUse(currPhys, requestedSize, variability))).first;
- if (logicalNum == 0)
- insertedIterator = it;
- currPhys += 4;
- }
- indexUse = &(insertedIterator->second);
- }
- else
- {
- // no match
- return 0;
- }
- }
- else
- {
- size_t physicalIndex = logi->second.physicalIndex;
- indexUse = &(logi->second);
- // check size
- if (logi->second.currentSize < requestedSize)
- {
- // init buffer entry wasn't big enough; could be a mistake on the part
- // of the original use, or perhaps a variable length we can't predict
- // until first actual runtime use e.g. world matrix array
- size_t insertCount = requestedSize - logi->second.currentSize;
- IntConstantList::iterator insertPos = mIntConstants.begin();
- std::advance(insertPos, physicalIndex);
- mIntConstants.insert(insertPos, insertCount, 0);
- // shift all physical positions after this one
- for (GpuLogicalIndexUseMap::iterator i = mIntLogicalToPhysical->map.begin();
- i != mIntLogicalToPhysical->map.end(); ++i)
- {
- if (i->second.physicalIndex > physicalIndex)
- i->second.physicalIndex += insertCount;
- }
- mIntLogicalToPhysical->bufferSize += insertCount;
- for (AutoConstantList::iterator i = mAutoConstants.begin();
- i != mAutoConstants.end(); ++i)
- {
- if (i->physicalIndex > physicalIndex &&
- getAutoConstantDefinition(i->paramType)->elementType == ET_INT)
- {
- i->physicalIndex += insertCount;
- }
- }
- if (mNamedConstants != nullptr)
- {
- for (GpuConstantDefinitionMap::iterator i = mNamedConstants->map.begin();
- i != mNamedConstants->map.end(); ++i)
- {
- if (!i->second.isFloat() && i->second.physicalIndex > physicalIndex)
- i->second.physicalIndex += insertCount;
- }
- mNamedConstants->intBufferSize += insertCount;
- }
- logi->second.currentSize += insertCount;
- }
- }
- if (indexUse)
- indexUse->variability = variability;
- return indexUse;
- }
- //-----------------------------------------------------------------------------
- size_t GpuProgramParameters::_getFloatConstantPhysicalIndex(
- size_t logicalIndex, size_t requestedSize, UINT16 variability)
- {
- GpuLogicalIndexUse* indexUse = _getFloatConstantLogicalIndexUse(logicalIndex, requestedSize, variability);
- return indexUse ? indexUse->physicalIndex : 0;
- }
- //-----------------------------------------------------------------------------
- size_t GpuProgramParameters::_getIntConstantPhysicalIndex(
- size_t logicalIndex, size_t requestedSize, UINT16 variability)
- {
- GpuLogicalIndexUse* indexUse = _getIntConstantLogicalIndexUse(logicalIndex, requestedSize, variability);
- return indexUse ? indexUse->physicalIndex : 0;
- }
- //-----------------------------------------------------------------------------
- size_t GpuProgramParameters::getFloatLogicalIndexForPhysicalIndex(size_t physicalIndex)
- {
- // perhaps build a reverse map of this sometime (shared in GpuProgram)
- for (GpuLogicalIndexUseMap::iterator i = mFloatLogicalToPhysical->map.begin();
- i != mFloatLogicalToPhysical->map.end(); ++i)
- {
- if (i->second.physicalIndex == physicalIndex)
- return i->first;
- }
- return std::numeric_limits<size_t>::max();
- }
- //-----------------------------------------------------------------------------
- size_t GpuProgramParameters::getIntLogicalIndexForPhysicalIndex(size_t physicalIndex)
- {
- // perhaps build a reverse map of this sometime (shared in GpuProgram)
- for (GpuLogicalIndexUseMap::iterator i = mIntLogicalToPhysical->map.begin();
- i != mIntLogicalToPhysical->map.end(); ++i)
- {
- if (i->second.physicalIndex == physicalIndex)
- return i->first;
- }
- return std::numeric_limits<size_t>::max();
- }
- //-----------------------------------------------------------------------------
- GpuConstantDefinitionIterator GpuProgramParameters::getConstantDefinitionIterator(void) const
- {
- if (mNamedConstants == nullptr)
- {
- CM_EXCEPT(InvalidParametersException,
- "This params object is not based on a program with named parameters.");
- }
- return mNamedConstants->map.begin();
- }
- //-----------------------------------------------------------------------------
- const GpuNamedConstants& GpuProgramParameters::getConstantDefinitions() const
- {
- if (mNamedConstants == nullptr)
- {
- CM_EXCEPT(InvalidParametersException,
- "This params object is not based on a program with named parameters.");
- }
- return *mNamedConstants;
- }
- //-----------------------------------------------------------------------------
- const GpuConstantDefinition& GpuProgramParameters::getConstantDefinition(const String& name) const
- {
- if (mNamedConstants == nullptr)
- {
- CM_EXCEPT(InvalidParametersException,
- "This params object is not based on a program with named parameters.");
- }
- // locate, and throw exception if not found
- const GpuConstantDefinition* def = _findNamedConstantDefinition(name, true);
- return *def;
- }
- //-----------------------------------------------------------------------------
- const GpuConstantDefinition*
- GpuProgramParameters::_findNamedConstantDefinition(const String& name,
- bool throwExceptionIfNotFound) const
- {
- if (mNamedConstants == nullptr)
- {
- if (throwExceptionIfNotFound)
- {
- CM_EXCEPT(InvalidParametersException,
- "Named constants have not been initialised, perhaps a compile error.");
- }
- return 0;
- }
- GpuConstantDefinitionMap::const_iterator i = mNamedConstants->map.find(name);
- if (i == mNamedConstants->map.end())
- {
- if (throwExceptionIfNotFound)
- {
- CM_EXCEPT(InvalidParametersException,
- "Parameter called " + name + " does not exist. ");
- }
- return 0;
- }
- else
- {
- return &(i->second);
- }
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setAutoConstant(size_t index, AutoConstantType acType, size_t extraInfo)
- {
- // Get auto constant definition for sizing
- const AutoConstantDefinition* autoDef = getAutoConstantDefinition(acType);
- // round up to nearest multiple of 4
- size_t sz = autoDef->elementCount;
- if (sz % 4 > 0)
- {
- sz += 4 - (sz % 4);
- }
- GpuLogicalIndexUse* indexUse = _getFloatConstantLogicalIndexUse(index, sz, deriveVariability(acType));
- _setRawAutoConstant(indexUse->physicalIndex, acType, extraInfo, indexUse->variability, sz);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_setRawAutoConstant(size_t physicalIndex,
- AutoConstantType acType, size_t extraInfo, UINT16 variability, size_t elementSize)
- {
- // update existing index if it exists
- bool found = false;
- for (AutoConstantList::iterator i = mAutoConstants.begin();
- i != mAutoConstants.end(); ++i)
- {
- if (i->physicalIndex == physicalIndex)
- {
- i->paramType = acType;
- i->data = extraInfo;
- i->elementCount = elementSize;
- i->variability = variability;
- found = true;
- break;
- }
- }
- if (!found)
- mAutoConstants.push_back(AutoConstantEntry(acType, physicalIndex, extraInfo, variability, elementSize));
- mCombinedVariability |= variability;
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setAutoConstant(size_t index, AutoConstantType acType, UINT16 extraInfo1, UINT16 extraInfo2)
- {
- size_t extraInfo = (size_t)extraInfo1 | ((size_t)extraInfo2) << 16;
- // Get auto constant definition for sizing
- const AutoConstantDefinition* autoDef = getAutoConstantDefinition(acType);
- // round up to nearest multiple of 4
- size_t sz = autoDef->elementCount;
- if (sz % 4 > 0)
- {
- sz += 4 - (sz % 4);
- }
- GpuLogicalIndexUse* indexUse = _getFloatConstantLogicalIndexUse(index, sz, deriveVariability(acType));
- _setRawAutoConstant(indexUse->physicalIndex, acType, extraInfo, indexUse->variability, sz);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::_setRawAutoConstantReal(size_t physicalIndex,
- AutoConstantType acType, float rData, UINT16 variability, size_t elementSize)
- {
- // update existing index if it exists
- bool found = false;
- for (AutoConstantList::iterator i = mAutoConstants.begin();
- i != mAutoConstants.end(); ++i)
- {
- if (i->physicalIndex == physicalIndex)
- {
- i->paramType = acType;
- i->fData = rData;
- i->elementCount = elementSize;
- i->variability = variability;
- found = true;
- break;
- }
- }
- if (!found)
- mAutoConstants.push_back(AutoConstantEntry(acType, physicalIndex, rData, variability, elementSize));
- mCombinedVariability |= variability;
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::clearAutoConstant(size_t index)
- {
- GpuLogicalIndexUse* indexUse = _getFloatConstantLogicalIndexUse(index, 0, GPV_GLOBAL);
- if (indexUse)
- {
- indexUse->variability = GPV_GLOBAL;
- size_t physicalIndex = indexUse->physicalIndex;
- // update existing index if it exists
- for (AutoConstantList::iterator i = mAutoConstants.begin();
- i != mAutoConstants.end(); ++i)
- {
- if (i->physicalIndex == physicalIndex)
- {
- mAutoConstants.erase(i);
- break;
- }
- }
- }
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::clearNamedAutoConstant(const String& name)
- {
- const GpuConstantDefinition* def = _findNamedConstantDefinition(name);
- if (def)
- {
- def->variability = GPV_GLOBAL;
- // Autos are always floating point
- if (def->isFloat())
- {
- for (AutoConstantList::iterator i = mAutoConstants.begin();
- i != mAutoConstants.end(); ++i)
- {
- if (i->physicalIndex == def->physicalIndex)
- {
- mAutoConstants.erase(i);
- break;
- }
- }
- }
- }
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::clearAutoConstants(void)
- {
- mAutoConstants.clear();
- mCombinedVariability = GPV_GLOBAL;
- }
- //-----------------------------------------------------------------------------
- GpuProgramParameters::AutoConstantIterator GpuProgramParameters::getAutoConstantIterator(void) const
- {
- return mAutoConstants.begin();
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setAutoConstantReal(size_t index, AutoConstantType acType, float rData)
- {
- // Get auto constant definition for sizing
- const AutoConstantDefinition* autoDef = getAutoConstantDefinition(acType);
- // round up to nearest multiple of 4
- size_t sz = autoDef->elementCount;
- if (sz % 4 > 0)
- {
- sz += 4 - (sz % 4);
- }
- GpuLogicalIndexUse* indexUse = _getFloatConstantLogicalIndexUse(index, sz, deriveVariability(acType));
- _setRawAutoConstantReal(indexUse->physicalIndex, acType, rData, indexUse->variability, sz);
- }
- //-----------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstant(const String& name, float val)
- {
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- _writeRawConstant(def->physicalIndex, val);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstant(const String& name, int val)
- {
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- _writeRawConstant(def->physicalIndex, val);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstant(const String& name, const Vector4& vec)
- {
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- _writeRawConstant(def->physicalIndex, vec, def->elementSize);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstant(const String& name, const Vector3& vec)
- {
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- _writeRawConstant(def->physicalIndex, vec);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstant(const String& name, const Matrix4& m)
- {
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- _writeRawConstant(def->physicalIndex, m, def->elementSize);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstant(const String& name, const Matrix4* m,
- size_t numEntries)
- {
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- _writeRawConstant(def->physicalIndex, m, numEntries);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstant(const String& name,
- const float *val, size_t count, size_t multiple)
- {
- size_t rawCount = count * multiple;
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- _writeRawConstants(def->physicalIndex, val, rawCount);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstant(const String& name,
- const double *val, size_t count, size_t multiple)
- {
- size_t rawCount = count * multiple;
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- _writeRawConstants(def->physicalIndex, val, rawCount);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstant(const String& name, const Color& colour)
- {
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- _writeRawConstant(def->physicalIndex, colour, def->elementSize);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstant(const String& name,
- const int *val, size_t count, size_t multiple)
- {
- size_t rawCount = count * multiple;
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- _writeRawConstants(def->physicalIndex, val, rawCount);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedAutoConstant(const String& name,
- AutoConstantType acType, size_t extraInfo)
- {
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- {
- def->variability = deriveVariability(acType);
- // make sure we also set variability on the logical index map
- GpuLogicalIndexUse* indexUse = _getFloatConstantLogicalIndexUse(def->logicalIndex, def->elementSize * def->arraySize, def->variability);
- if (indexUse)
- indexUse->variability = def->variability;
- _setRawAutoConstant(def->physicalIndex, acType, extraInfo, def->variability, def->elementSize);
- }
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedAutoConstantReal(const String& name,
- AutoConstantType acType, float rData)
- {
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- {
- def->variability = deriveVariability(acType);
- // make sure we also set variability on the logical index map
- GpuLogicalIndexUse* indexUse = _getFloatConstantLogicalIndexUse(def->logicalIndex, def->elementSize * def->arraySize, def->variability);
- if (indexUse)
- indexUse->variability = def->variability;
- _setRawAutoConstantReal(def->physicalIndex, acType, rData, def->variability, def->elementSize);
- }
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedAutoConstant(const String& name,
- AutoConstantType acType, UINT16 extraInfo1, UINT16 extraInfo2)
- {
- size_t extraInfo = (size_t)extraInfo1 | ((size_t)extraInfo2) << 16;
- // look up, and throw an exception if we're not ignoring missing
- const GpuConstantDefinition* def =
- _findNamedConstantDefinition(name, !mIgnoreMissingParams);
- if (def)
- {
- def->variability = deriveVariability(acType);
- // make sure we also set variability on the logical index map
- GpuLogicalIndexUse* indexUse = _getFloatConstantLogicalIndexUse(def->logicalIndex, def->elementSize * def->arraySize, def->variability);
- if (indexUse)
- indexUse->variability = def->variability;
- _setRawAutoConstant(def->physicalIndex, acType, extraInfo, def->variability, def->elementSize);
- }
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setConstantFromTime(size_t index, float factor)
- {
- setAutoConstantReal(index, ACT_TIME, factor);
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::setNamedConstantFromTime(const String& name, float factor)
- {
- setNamedAutoConstantReal(name, ACT_TIME, factor);
- }
- //---------------------------------------------------------------------------
- GpuProgramParameters::AutoConstantEntry* GpuProgramParameters::getAutoConstantEntry(const size_t index)
- {
- if (index < mAutoConstants.size())
- {
- return &(mAutoConstants[index]);
- }
- else
- {
- return NULL;
- }
- }
- //---------------------------------------------------------------------------
- const GpuProgramParameters::AutoConstantEntry*
- GpuProgramParameters::findFloatAutoConstantEntry(size_t logicalIndex)
- {
- if (mFloatLogicalToPhysical == nullptr)
- {
- CM_EXCEPT(InvalidParametersException,
- "This is not a low-level parameter parameter object");
- }
- return _findRawAutoConstantEntryFloat(
- _getFloatConstantPhysicalIndex(logicalIndex, 0, GPV_GLOBAL));
- }
- //---------------------------------------------------------------------------
- const GpuProgramParameters::AutoConstantEntry*
- GpuProgramParameters::findIntAutoConstantEntry(size_t logicalIndex)
- {
- if (mIntLogicalToPhysical == nullptr)
- {
- CM_EXCEPT(InvalidParametersException,
- "This is not a low-level parameter parameter object");
- }
- return _findRawAutoConstantEntryInt(
- _getIntConstantPhysicalIndex(logicalIndex, 0, GPV_GLOBAL));
- }
- //---------------------------------------------------------------------------
- const GpuProgramParameters::AutoConstantEntry*
- GpuProgramParameters::findAutoConstantEntry(const String& paramName)
- {
- if (mNamedConstants == nullptr)
- {
- CM_EXCEPT(InvalidParametersException,
- "This params object is not based on a program with named parameters.");
- }
- const GpuConstantDefinition& def = getConstantDefinition(paramName);
- if (def.isFloat())
- {
- return _findRawAutoConstantEntryFloat(def.physicalIndex);
- }
- else
- {
- return _findRawAutoConstantEntryInt(def.physicalIndex);
- }
- }
- //---------------------------------------------------------------------------
- const GpuProgramParameters::AutoConstantEntry*
- GpuProgramParameters::_findRawAutoConstantEntryFloat(size_t physicalIndex)
- {
- for(AutoConstantList::iterator i = mAutoConstants.begin();
- i != mAutoConstants.end(); ++i)
- {
- AutoConstantEntry& ac = *i;
- // should check that auto is float and not int so that physicalIndex
- // doesn't have any ambiguity
- // However, all autos are float I think so no need
- if (ac.physicalIndex == physicalIndex)
- return ∾
- }
- return 0;
- }
- //---------------------------------------------------------------------------
- const GpuProgramParameters::AutoConstantEntry*
- GpuProgramParameters::_findRawAutoConstantEntryInt(size_t physicalIndex)
- {
- // No autos are float?
- return 0;
- }
- //---------------------------------------------------------------------------
- void GpuProgramParameters::copyConstantsFrom(const GpuProgramParameters& source)
- {
- // Pull buffers & auto constant list over directly
- mFloatConstants = source.getFloatConstantList();
- mIntConstants = source.getIntConstantList();
- mAutoConstants = source.getAutoConstantList();
- mCombinedVariability = source.mCombinedVariability;
- copySharedParamSetUsage(source.mSharedParamSets);
- }
- //---------------------------------------------------------------------
- void GpuProgramParameters::copyMatchingNamedConstantsFrom(const GpuProgramParameters& source)
- {
- if ((mNamedConstants != nullptr) && (source.mNamedConstants != nullptr))
- {
- std::map<size_t, String> srcToDestNamedMap;
- for (GpuConstantDefinitionMap::const_iterator i = source.mNamedConstants->map.begin();
- i != source.mNamedConstants->map.end(); ++i)
- {
- const String& paramName = i->first;
- const GpuConstantDefinition& olddef = i->second;
- const GpuConstantDefinition* newdef = _findNamedConstantDefinition(paramName, false);
- if (newdef)
- {
- // Copy data across, based on smallest common definition size
- size_t srcsz = olddef.elementSize * olddef.arraySize;
- size_t destsz = newdef->elementSize * newdef->arraySize;
- size_t sz = std::min(srcsz, destsz);
- if (newdef->isFloat())
- {
- memcpy(getFloatPointer(newdef->physicalIndex),
- source.getFloatPointer(olddef.physicalIndex),
- sz * sizeof(float));
- }
- else
- {
- memcpy(getIntPointer(newdef->physicalIndex),
- source.getIntPointer(olddef.physicalIndex),
- sz * sizeof(int));
- }
- // we'll use this map to resolve autos later
- // ignore the [0] aliases
- if (!StringUtil::endsWith(paramName, "[0]"))
- srcToDestNamedMap[olddef.physicalIndex] = paramName;
- }
- }
- for (AutoConstantList::const_iterator i = source.mAutoConstants.begin();
- i != source.mAutoConstants.end(); ++i)
- {
- const GpuProgramParameters::AutoConstantEntry& autoEntry = *i;
- // find dest physical index
- std::map<size_t, String>::iterator mi = srcToDestNamedMap.find(autoEntry.physicalIndex);
- if (mi != srcToDestNamedMap.end())
- {
- if (autoEntry.fData)
- {
- setNamedAutoConstantReal(mi->second, autoEntry.paramType, autoEntry.fData);
- }
- else
- {
- setNamedAutoConstant(mi->second, autoEntry.paramType, autoEntry.data);
- }
- }
- }
- // Copy shared param sets
- for (GpuSharedParamUsageList::const_iterator i = source.mSharedParamSets.begin();
- i != source.mSharedParamSets.end(); ++i)
- {
- const GpuSharedParametersUsage& usage = *i;
- if (!isUsingSharedParameters(usage.getName()))
- {
- addSharedParameters(usage.getSharedParams());
- }
- }
- }
- }
- //-----------------------------------------------------------------------
- const GpuProgramParameters::AutoConstantDefinition*
- GpuProgramParameters::getAutoConstantDefinition(const String& name)
- {
- // find a constant definition that matches name by iterating through the
- // constant definition array
- bool nameFound = false;
- size_t i = 0;
- const size_t numDefs = getNumAutoConstantDefinitions();
- while (!nameFound && (i < numDefs))
- {
- if (name == AutoConstantDictionary[i].name)
- nameFound = true;
- else
- ++i;
- }
- if (nameFound)
- return &AutoConstantDictionary[i];
- else
- return 0;
- }
- //-----------------------------------------------------------------------
- const GpuProgramParameters::AutoConstantDefinition*
- GpuProgramParameters::getAutoConstantDefinition(const size_t idx)
- {
- if (idx < getNumAutoConstantDefinitions())
- {
- // verify index is equal to acType
- // if they are not equal then the dictionary was not setup properly
- assert(idx == static_cast<size_t>(AutoConstantDictionary[idx].acType));
- return &AutoConstantDictionary[idx];
- }
- else
- return 0;
- }
- //-----------------------------------------------------------------------
- size_t GpuProgramParameters::getNumAutoConstantDefinitions(void)
- {
- return sizeof(AutoConstantDictionary)/sizeof(AutoConstantDefinition);
- }
- //-----------------------------------------------------------------------
- void GpuProgramParameters::incPassIterationNumber(void)
- {
- if (mActivePassIterationIndex != std::numeric_limits<size_t>::max())
- {
- // This is a physical index
- ++mFloatConstants[mActivePassIterationIndex];
- }
- }
- //---------------------------------------------------------------------
- void GpuProgramParameters::addSharedParameters(GpuSharedParametersPtr sharedParams)
- {
- if (!isUsingSharedParameters(sharedParams->getName()))
- {
- mSharedParamSets.push_back(GpuSharedParametersUsage(sharedParams, this));
- }
- }
- //---------------------------------------------------------------------
- void GpuProgramParameters::addSharedParameters(const String& sharedParamsName)
- {
- // TODO PORT - I don't think I'll be needing this. I dont plan on including GpuProgramManager in the port
- //addSharedParameters(GpuProgramManager::getSingleton().getSharedParameters(sharedParamsName));
- }
- //---------------------------------------------------------------------
- bool GpuProgramParameters::isUsingSharedParameters(const String& sharedParamsName) const
- {
- for (GpuSharedParamUsageList::const_iterator i = mSharedParamSets.begin();
- i != mSharedParamSets.end(); ++i)
- {
- if (i->getName() == sharedParamsName)
- return true;
- }
- return false;
- }
- //---------------------------------------------------------------------
- void GpuProgramParameters::removeSharedParameters(const String& sharedParamsName)
- {
- for (GpuSharedParamUsageList::iterator i = mSharedParamSets.begin();
- i != mSharedParamSets.end(); ++i)
- {
- if (i->getName() == sharedParamsName)
- {
- mSharedParamSets.erase(i);
- break;
- }
- }
- }
- //---------------------------------------------------------------------
- void GpuProgramParameters::removeAllSharedParameters()
- {
- mSharedParamSets.clear();
- }
- //---------------------------------------------------------------------
- const GpuProgramParameters::GpuSharedParamUsageList&
- GpuProgramParameters::getSharedParameters() const
- {
- return mSharedParamSets;
- }
- //---------------------------------------------------------------------
- void GpuProgramParameters::_copySharedParams()
- {
- for (GpuSharedParamUsageList::iterator i = mSharedParamSets.begin();
- i != mSharedParamSets.end(); ++i )
- {
- i->_copySharedParamsToTargetParams();
- }
- }
- }
|