| 30 | } |
| 31 | |
| 32 | bool ShaderCompiler::Compile(ShaderCompilationContext* context) |
| 33 | { |
| 34 | // Clear cache |
| 35 | _globalMacros.Clear(); |
| 36 | _macros.Clear(); |
| 37 | _constantBuffers.Clear(); |
| 38 | _globalMacros.EnsureCapacity(32); |
| 39 | _macros.EnsureCapacity(32); |
| 40 | _context = context; |
| 41 | |
| 42 | // Prepare |
| 43 | auto output = context->Output; |
| 44 | auto meta = context->Meta; |
| 45 | const int32 shadersCount = meta->GetShadersCount(); |
| 46 | if (OnCompileBegin()) |
| 47 | return true; |
| 48 | _globalMacros.Add({ nullptr, nullptr }); |
| 49 | |
| 50 | // Setup constant buffers cache |
| 51 | _constantBuffers.EnsureCapacity(meta->CB.Count(), false); |
| 52 | for (int32 i = 0; i < meta->CB.Count(); i++) |
| 53 | _constantBuffers.Add({ meta->CB[i].Slot, false, 0 }); |
| 54 | |
| 55 | // [Output] Version number |
| 56 | output->WriteInt32(GPU_SHADER_CACHE_VERSION); |
| 57 | |
| 58 | // [Output] Additional data start |
| 59 | const int32 additionalDataStartPos = output->GetPosition(); |
| 60 | output->WriteInt32(-1); |
| 61 | |
| 62 | // [Output] Amount of shaders |
| 63 | output->WriteInt32(shadersCount); |
| 64 | |
| 65 | // Compile all shaders |
| 66 | if (CompileShaders()) |
| 67 | return true; |
| 68 | |
| 69 | // [Output] Constant Buffers |
| 70 | output->Write((byte)_constantBuffers.Count()); |
| 71 | for (const ShaderResourceBuffer& cb : _constantBuffers) |
| 72 | { |
| 73 | output->Write((byte)cb.Slot); |
| 74 | output->Write((uint32)cb.Size); |
| 75 | } |
| 76 | |
| 77 | // Additional Data Start |
| 78 | *(int32*)(output->GetHandle() + additionalDataStartPos) = output->GetPosition(); |
| 79 | |
| 80 | // [Output] Includes |
| 81 | output->WriteInt32(context->Includes.Count()); |
| 82 | for (auto& include : context->Includes) |
| 83 | { |
| 84 | String compactPath = ShadersCompilation::CompactShaderPath(include.Item); |
| 85 | output->Write(compactPath, 11); |
| 86 | const auto date = FileSystem::GetFileLastEditTime(include.Item); |
| 87 | output->Write(date); |
| 88 | } |
| 89 |
no test coverage detected