@@ -150,6 +150,7 @@ struct Shader {
150150 uint32_t bufferMask ;
151151 uint32_t textureMask ;
152152 uint32_t samplerMask ;
153+ uint32_t raytracerMask ;
153154 uint32_t storageMask ;
154155 uint32_t pushConstantSize ;
155156 uint32_t uniformSize ;
@@ -299,10 +300,11 @@ struct Model {
299300
300301struct Raytracer {
301302 uint32_t ref ;
303+ uint32_t count ;
302304 RaytracerInfo info ;
305+ Sync sync ;
303306 gpu_tree * gpu ;
304307 gpu_tree_instance * instances ;
305- uint32_t count ;
306308 bool canUpdate ;
307309};
308310
@@ -414,8 +416,8 @@ typedef struct {
414416 void * next ;
415417 uint64_t count ;
416418 uint64_t textureMask ;
417- uint64_t padding ;
418- Access list [41 ];
419+ uint64_t raytracerMask ;
420+ Access list [41 ]; // 1024 bytes total
419421} AccessBlock ;
420422
421423typedef struct {
@@ -621,10 +623,11 @@ static uint32_t measureTexture(TextureFormat format, uint32_t w, uint32_t h, uin
621623static bool checkTextureBounds (const TextureInfo * info , uint32_t offset [4 ], uint32_t extent [3 ]);
622624static void mipmapTexture (gpu_stream * stream , Texture * texture , uint32_t base , uint32_t count );
623625static ShaderResource * findShaderResource (Shader * shader , const char * name , size_t length );
624- static Access * getNextAccess (Pass * pass , int type , bool texture );
626+ static Access * getNextAccess (Pass * pass , int type , bool texture , bool raytracer );
625627static void trackBuffer (Pass * pass , Buffer * buffer , gpu_phase phase , gpu_cache cache );
626628static void trackTexture (Pass * pass , Texture * texture , gpu_phase phase , gpu_cache cache );
627629static void trackMaterial (Pass * pass , Material * material );
630+ static void trackRaytracer (Pass * pass , Raytracer * raytracer , gpu_phase phase , gpu_cache cache );
628631static bool syncResource (Access * access , gpu_barrier * barrier );
629632static gpu_barrier syncTransfer (Sync * sync , gpu_phase phase , gpu_cache cache );
630633static void updateModelTransforms (Model * model , uint32_t nodeIndex , float * parent );
@@ -950,6 +953,7 @@ void lovrGraphicsGetFeatures(GraphicsFeatures* features) {
950953 features -> wireframe = state .features .wireframe ;
951954 features -> depthClamp = state .features .depthClamp ;
952955 features -> depthResolve = state .features .depthResolve ;
956+ features -> raytracing = state .features .rayQuery ;
953957 features -> indirectDrawFirstInstance = state .features .indirectDrawFirstInstance ;
954958 features -> packedBuffers = state .features .packedBuffers ;
955959 features -> float64 = state .features .float64 ;
@@ -3542,11 +3546,13 @@ Shader* lovrShaderCreate(const ShaderInfo* info) {
35423546 bool buffer = resource -> type == SPV_UNIFORM_BUFFER || resource -> type == SPV_STORAGE_BUFFER ;
35433547 bool texture = resource -> type == SPV_SAMPLED_TEXTURE || resource -> type == SPV_STORAGE_TEXTURE || resource -> type == SPV_COMBINED_TEXTURE_SAMPLER ;
35443548 bool sampler = resource -> type == SPV_SAMPLER ;
3549+ bool raytracer = resource -> type == SPV_ACCELERATION_STRUCTURE ;
35453550 bool storage = resource -> type == SPV_STORAGE_BUFFER || resource -> type == SPV_STORAGE_TEXTURE ;
35463551
35473552 shader -> bufferMask |= (buffer << * binding );
35483553 shader -> textureMask |= (texture << * binding );
35493554 shader -> samplerMask |= (sampler << * binding );
3555+ shader -> raytracerMask |= (raytracer << * binding );
35503556 shader -> storageMask |= (storage << * binding );
35513557
35523558 gpu_cache cache ;
@@ -5967,8 +5973,13 @@ static void lovrPassRelease(Pass* pass) {
59675973 for (uint32_t i = 0 ; i < COUNTOF (pass -> access ); i ++ ) {
59685974 for (AccessBlock * block = pass -> access [i ]; block != NULL ; block = block -> next ) {
59695975 for (uint32_t j = 0 ; j < block -> count ; j ++ ) {
5970- bool texture = block -> textureMask & (1ull << j );
5971- lovrRelease (block -> list [j ].object , texture ? lovrTextureDestroy : lovrBufferDestroy );
5976+ if (block -> textureMask & (1ull << j )) {
5977+ lovrRelease (block -> list [j ].object , lovrTextureDestroy );
5978+ } else if (block -> raytracerMask & (1ull << j )) {
5979+ lovrRelease (block -> list [j ].object , lovrRaytracerDestroy );
5980+ } else {
5981+ lovrRelease (block -> list [j ].object , lovrBufferDestroy );
5982+ }
59725983 }
59735984 }
59745985 }
@@ -6979,6 +6990,22 @@ bool lovrPassSendSampler(Pass* pass, const char* name, size_t length, Sampler* s
69796990 return true;
69806991}
69816992
6993+ bool lovrPassSendRaytracer (Pass * pass , const char * name , size_t length , Raytracer * raytracer ) {
6994+ Shader * shader = pass -> pipeline -> shader ;
6995+ lovrCheck (shader , "A Shader must be active to send resources" );
6996+
6997+ ShaderResource * resource = findShaderResource (shader , name , length );
6998+ lovrCheck (resource , "Shader has no variable named '%s'" , name );
6999+ uint32_t slot = resource -> binding ;
7000+
7001+ lovrCheck (shader -> raytracerMask & (1u << slot ), "Trying to send a Raytracer to '%s', but the shader variable isn't a Raytracer" , name );
7002+
7003+ trackRaytracer (pass , raytracer , resource -> phase , resource -> cache );
7004+ pass -> bindings [slot ].tree = raytracer -> gpu ;
7005+ pass -> flags |= DIRTY_BINDINGS ;
7006+ return true;
7007+ }
7008+
69827009bool lovrPassSendData (Pass * pass , const char * name , size_t length , void * * data , DataField * * format ) {
69837010 Shader * shader = pass -> pipeline -> shader ;
69847011 lovrCheck (shader , "A Shader must be active to send data to it" );
@@ -8976,7 +9003,7 @@ static ShaderResource* findShaderResource(Shader* shader, const char* name, size
89769003 return NULL ;
89779004}
89789005
8979- static Access * getNextAccess (Pass * pass , int type , bool texture ) {
9006+ static Access * getNextAccess (Pass * pass , int type , bool texture , bool raytracer ) {
89809007 AccessBlock * block = pass -> access [type ];
89819008
89829009 if (!block || block -> count >= COUNTOF (block -> list )) {
@@ -8985,16 +9012,18 @@ static Access* getNextAccess(Pass* pass, int type, bool texture) {
89859012 new -> next = block ;
89869013 new -> count = 0 ;
89879014 new -> textureMask = 0 ;
9015+ new -> raytracerMask = 0 ;
89889016 block = new ;
89899017 }
89909018
89919019 block -> textureMask |= (uint64_t ) texture << block -> count ;
9020+ block -> raytracerMask |= (uint64_t ) raytracer << block -> count ;
89929021 return & block -> list [block -> count ++ ];
89939022}
89949023
89959024static void trackBuffer (Pass * pass , Buffer * buffer , gpu_phase phase , gpu_cache cache ) {
89969025 if (!buffer ) return ;
8997- Access * access = getNextAccess (pass , phase == GPU_PHASE_SHADER_COMPUTE ? ACCESS_COMPUTE : ACCESS_RENDER , false);
9026+ Access * access = getNextAccess (pass , phase == GPU_PHASE_SHADER_COMPUTE ? ACCESS_COMPUTE : ACCESS_RENDER , false, false );
89989027 access -> sync = buffer -> sync ;
89999028 access -> object = buffer ;
90009029 access -> phase = phase ;
@@ -9011,7 +9040,7 @@ static void trackTexture(Pass* pass, Texture* texture, gpu_phase phase, gpu_cach
90119040 cache = 0 ;
90129041 }
90139042
9014- Access * access = getNextAccess (pass , phase == GPU_PHASE_SHADER_COMPUTE ? ACCESS_COMPUTE : ACCESS_RENDER , true);
9043+ Access * access = getNextAccess (pass , phase == GPU_PHASE_SHADER_COMPUTE ? ACCESS_COMPUTE : ACCESS_RENDER , true, false );
90159044 access -> sync = texture -> sync ;
90169045 access -> object = texture ;
90179046 access -> phase = phase ;
@@ -9036,6 +9065,15 @@ static void trackMaterial(Pass* pass, Material* material) {
90369065 trackTexture (pass , material -> info .normalTexture , phase , cache );
90379066}
90389067
9068+ static void trackRaytracer (Pass * pass , Raytracer * raytracer , gpu_phase phase , gpu_cache cache ) {
9069+ Access * access = getNextAccess (pass , phase == GPU_PHASE_SHADER_COMPUTE ? ACCESS_COMPUTE : ACCESS_RENDER , false, true);
9070+ access -> sync = & raytracer -> sync ;
9071+ access -> object = raytracer ;
9072+ access -> phase = phase ;
9073+ access -> cache = cache ;
9074+ lovrRetain (raytracer );
9075+ }
9076+
90399077static bool syncResource (Access * access , gpu_barrier * barrier ) {
90409078 // There are 4 types of access patterns:
90419079 // - read after read:
0 commit comments