Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

170 Zeilen
6.5 KiB

  1. unit uvkuShaderModuleFactory;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils,
  6. Vulkan, uvkuFactoryBase, uvkuShaderModule;
  7. type
  8. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TvkuShaderModuleFactory = class(TvkuDeviceObjFactory)
  10. private
  11. fFlags: VkShaderModuleCreateFlags;
  12. fShaderCode: PVkVoid;
  13. fShaderCodeSize: VkSize;
  14. procedure ReallocShaderCode(const aSize: VkSize);
  15. procedure SetGlslCode(const aCode: PVkVoid; const aSize: VkSize; const aStage: VkShaderStageFlags);
  16. public
  17. property Flags: VkShaderModuleCreateFlags read fFlags write fFlags;
  18. procedure SetShaderCode(const aCode: PVkVoid; const aSize: VkSize);
  19. procedure LoadSpvCode(const aStream: TStream; aSize: VkSize = 0);
  20. procedure LoadSpvCode(const aFilename: String);
  21. procedure SetGlslCode(const aCode: String; const aStage: VkShaderStageFlags);
  22. procedure LoadGlslCode(const aStream: TStream; const aStage: VkShaderStageFlags; aSize: VkSize = 0);
  23. procedure LoadGlslCode(const aFilename: String; const aStage: VkShaderStageFlags);
  24. function GetStructure: TVkShaderModuleCreateInfo;
  25. procedure SetStructure(const aData: TVkShaderModuleCreateInfo);
  26. function CreateShaderModule: TvkuShaderModule;
  27. procedure BeforeDestruction; override;
  28. end;
  29. implementation
  30. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  31. //TvkuShaderModuleFactory////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  32. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. procedure TvkuShaderModuleFactory.ReallocShaderCode(const aSize: VkSize);
  34. begin
  35. if Assigned(fShaderCode) then
  36. Freememory(fShaderCode);
  37. fShaderCodeSize := aSize;
  38. if (fShaderCodeSize > 0) then
  39. fShaderCode := GetMemory(fShaderCodeSize);
  40. end;
  41. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42. procedure TvkuShaderModuleFactory.SetGlslCode(const aCode: PVkVoid; const aSize: VkSize; const aStage: VkShaderStageFlags);
  43. var p: PVkUint32;
  44. begin
  45. ReallocShaderCode(3 * SizeOf(VkUint32) + aSize + 1);
  46. p := fShaderCode;
  47. (p + 0)^ := $07230203;
  48. (p + 1)^ := 0;
  49. (p + 2)^ := VkUint32(aStage);
  50. Move(aCode^, (p + 3)^, aSize);
  51. PByte(fShaderCode + 3 * SizeOf(VkUint32) + aSize)^ := 0;
  52. end;
  53. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  54. procedure TvkuShaderModuleFactory.SetShaderCode(const aCode: PVkVoid; const aSize: VkSize);
  55. begin
  56. ReallocShaderCode(aSize);
  57. Move(aCode^, fShaderCode^, fShaderCodeSize);
  58. end;
  59. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. procedure TvkuShaderModuleFactory.LoadSpvCode(const aStream: TStream; aSize: VkSize);
  61. begin
  62. if (aSize = 0) then
  63. aSize := aStream.Size - aStream.Position;
  64. ReallocShaderCode(aSize);
  65. aStream.Read(fShaderCode^, aSize);
  66. end;
  67. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68. procedure TvkuShaderModuleFactory.LoadSpvCode(const aFilename: String);
  69. var fs: TFileStream;
  70. begin
  71. fs := TFileStream.Create(aFilename, fmOpenRead);
  72. try
  73. LoadSpvCode(fs);
  74. finally
  75. FreeAndNil(fs);
  76. end;
  77. end;
  78. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. procedure TvkuShaderModuleFactory.SetGlslCode(const aCode: String; const aStage: VkShaderStageFlags);
  80. begin
  81. SetGlslCode(PVkVoid(PAnsiChar(aCode)), Length(aCode), aStage);
  82. end;
  83. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. procedure TvkuShaderModuleFactory.LoadGlslCode(const aStream: TStream; const aStage: VkShaderStageFlags; aSize: VkSize);
  85. var mem: PVkVoid;
  86. begin
  87. if (aSize = 0) then
  88. aSize := aStream.Size - aStream.Position;
  89. mem := GetMemory(aSize);
  90. try
  91. aStream.Read(mem^, aSize);
  92. SetGlslCode(mem, aSize, aStage);
  93. finally
  94. FreeMemory(mem);
  95. end;
  96. end;
  97. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. procedure TvkuShaderModuleFactory.LoadGlslCode(const aFilename: String; const aStage: VkShaderStageFlags);
  99. var fs: TFileStream;
  100. begin
  101. fs := TFileStream.Create(aFilename, fmOpenRead);
  102. try
  103. LoadGlslCode(fs, aStage);
  104. finally
  105. FreeAndNil(fs);
  106. end;
  107. end;
  108. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  109. function TvkuShaderModuleFactory.GetStructure: TVkShaderModuleCreateInfo;
  110. begin
  111. FillByte(result, SizeOf(result), 0);
  112. result.sType := VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
  113. result.pNext := nil;
  114. result.flags := fFlags;
  115. result.codeSize := fShaderCodeSize;
  116. result.pCode := fShaderCode;
  117. end;
  118. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  119. procedure TvkuShaderModuleFactory.SetStructure(const aData: TVkShaderModuleCreateInfo);
  120. begin
  121. fFlags := aData.flags;
  122. SetShaderCode(aData.pCode, aData.codeSize);
  123. end;
  124. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125. function TvkuShaderModuleFactory.CreateShaderModule: TvkuShaderModule;
  126. var
  127. CreateInfo: TVkShaderModuleCreateInfo;
  128. begin
  129. FillByte(CreateInfo, SizeOf(CreateInfo), 0);
  130. CreateInfo.sType := VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
  131. CreateInfo.pNext := nil;
  132. CreateInfo.flags := fFlags;
  133. CreateInfo.codeSize := fShaderCodeSize;
  134. CreateInfo.pCode := fShaderCode;
  135. result := TvkuShaderModule.Create(CreateInfo, DeviceCommands, AllocCallbacks);
  136. end;
  137. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  138. procedure TvkuShaderModuleFactory.BeforeDestruction;
  139. begin
  140. inherited BeforeDestruction;
  141. ReallocShaderCode(0);
  142. end;
  143. end.