GLSLx.AsmShader.pas 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. //
  2. // The graphics platform GLArena https://github.com/glscene
  3. //
  4. unit GLSLx.AsmShader;
  5. (*
  6. TgxAsmShader is a wrapper for all ARB shaders
  7. This component is only a template and has to be replaced with a
  8. proper version by someone who uses ARB shaders.
  9. *)
  10. interface
  11. {$I Scena.inc}
  12. uses
  13. Winapi.OpenGL,
  14. System.Classes,
  15. System.SysUtils,
  16. GLX.Context,
  17. Scena.VectorGeometry,
  18. Scena.VectorTypes,
  19. GLX.Texture,
  20. GLSLx.CustomShader,
  21. GLX.RenderContextInfo;
  22. type
  23. TgxCustomAsmShader = class;
  24. TgxAsmShaderEvent = procedure(Shader: TgxCustomAsmShader) of object;
  25. TgxAsmShaderUnUplyEvent = procedure(Shader: TgxCustomAsmShader; var ThereAreMorePasses: Boolean) of object;
  26. TgxAsmShaderParameter = class(TgxCustomShaderParameter)
  27. protected
  28. {
  29. function GetAsVector1f: Single; override;
  30. function GetAsVector1i: Integer; override;
  31. function GetAsVector2f: TVector2f; override;
  32. function GetAsVector2i: TVector2i; override;
  33. function GetAsVector3f: TVector3f; override;
  34. function GetAsVector3i: TVector3i; override;
  35. function GetAsVector4f: TVector4f; override;
  36. function GetAsVector4i: TVector4i; override;
  37. procedure SetAsVector1f(const Value: Single); override;
  38. procedure SetAsVector1i(const Value: Integer); override;
  39. procedure SetAsVector2i(const Value: TVector2i); override;
  40. procedure SetAsVector3i(const Value: TVector3i); override;
  41. procedure SetAsVector4i(const Value: TVector4i); override;
  42. procedure SetAsVector2f(const Value: TVector2f); override;
  43. procedure SetAsVector3f(const Value: TVector3f); override;
  44. procedure SetAsVector4f(const Value: TVector4f); override;
  45. function GetAsMatrix2f: TMatrix2f; override;
  46. function GetAsMatrix3f: TMatrix3f; override;
  47. function GetAsMatrix4f: TMatrix4f; override;
  48. procedure SetAsMatrix2f(const Value: TMatrix2f); override;
  49. procedure SetAsMatrix3f(const Value: TMatrix3f); override;
  50. procedure SetAsMatrix4f(const Value: TMatrix4f); override;
  51. procedure SetAsTexture1D(const TextureIndex: Integer;
  52. const Value: TgxTexture);
  53. procedure SetAsTexture2D(const TextureIndex: Integer;
  54. const Value: TgxTexture);
  55. procedure SetAsTexture3D(const TextureIndex: Integer;
  56. const Value: TgxTexture);
  57. procedure SetAsTextureCube(const TextureIndex: Integer;
  58. const Value: TgxTexture);
  59. procedure SetAsTextureRect(const TextureIndex: Integer;
  60. const Value: TgxTexture);
  61. function GetAsCustomTexture(const TextureIndex: Integer;
  62. const TextureTarget: Word): Cardinal; override;
  63. procedure SetAsCustomTexture(const TextureIndex: Integer;
  64. const TextureTarget: Word; const Value: Cardinal); override;
  65. }
  66. end;
  67. TgxCustomAsmShader = class(TgxCustomShader)
  68. private
  69. FVPHandle: TgxVertexProgramHandle;
  70. FFPHandle: TgxFragmentProgramHandle;
  71. FGPHandle: TgxGeometryProgramHandle;
  72. FOnInitialize: TgxAsmShaderEvent;
  73. FOnApply: TgxAsmShaderEvent;
  74. FOnUnApply: TgxAsmShaderUnUplyEvent;
  75. protected
  76. procedure ApplyShaderPrograms;
  77. procedure UnApplyShaderPrograms;
  78. procedure DestroyARBPrograms; virtual;
  79. property OnApply: TgxAsmShaderEvent read FOnApply write FOnApply;
  80. property OnUnApply: TgxAsmShaderUnUplyEvent read FOnUnApply write FOnUnApply;
  81. property OnInitialize: TgxAsmShaderEvent read FOnInitialize write FOnInitialize;
  82. procedure DoInitialize(var rci: TgxRenderContextInfo; Sender: TObject); override;
  83. procedure DoApply(var rci: TgxRenderContextInfo; Sender: TObject); override;
  84. function DoUnApply(var rci: TgxRenderContextInfo): Boolean; override;
  85. procedure DoFinalize; override;
  86. public
  87. constructor Create(AOwner: TComponent); override;
  88. destructor Destroy; override;
  89. procedure Assign(Source: TPersistent); override;
  90. function ShaderSupported: Boolean; override;
  91. end;
  92. TgxAsmShader = class(TgxCustomAsmShader)
  93. published
  94. property FragmentProgram;
  95. property VertexProgram;
  96. property GeometryProgram;
  97. property OnApply;
  98. property OnUnApply;
  99. property OnInitialize;
  100. property ShaderStyle;
  101. property FailedInitAction;
  102. end;
  103. //==============================
  104. implementation
  105. //==============================
  106. //------------------------------
  107. // TgxCustomAsmShader
  108. //------------------------------
  109. procedure TgxCustomAsmShader.DoFinalize;
  110. begin
  111. inherited;
  112. DestroyARBPrograms;
  113. end;
  114. procedure TgxCustomAsmShader.Assign(Source: TPersistent);
  115. begin
  116. inherited Assign(Source);
  117. if Source is TgxCustomAsmShader then
  118. begin
  119. // Nothing here ...yet
  120. end;
  121. end;
  122. constructor TgxCustomAsmShader.Create(AOwner: TComponent);
  123. begin
  124. inherited Create(AOwner);
  125. end;
  126. destructor TgxCustomAsmShader.Destroy;
  127. begin
  128. DestroyARBPrograms;
  129. inherited Destroy;
  130. end;
  131. procedure TgxCustomAsmShader.DestroyARBPrograms;
  132. begin
  133. FVPHandle.Free;
  134. FVPHandle := nil;
  135. FFPHandle.Free;
  136. FFPHandle := nil;
  137. FGPHandle.Free;
  138. FGPHandle := nil;
  139. end;
  140. procedure TgxCustomAsmShader.DoApply(var rci: TgxRenderContextInfo; Sender: TObject);
  141. begin
  142. ApplyShaderPrograms();
  143. if Assigned(FOnApply) then
  144. FOnApply(Self);
  145. end;
  146. procedure TgxCustomAsmShader.DoInitialize(var rci: TgxRenderContextInfo; Sender: TObject);
  147. begin
  148. if not ShaderSupported then
  149. begin
  150. Enabled := False;
  151. HandleFailedInitialization;
  152. end
  153. else
  154. begin
  155. if VertexProgram.Enabled then
  156. begin
  157. if not Assigned(FVPHandle) then
  158. FVPHandle := TgxVertexProgramHandle.CreateAndAllocate;
  159. FVPHandle.LoadARBProgram(VertexProgram.Code.Text);
  160. VertexProgram.Enabled := FVPHandle.Ready;
  161. end;
  162. if FragmentProgram.Enabled then
  163. begin
  164. if not Assigned(FFPHandle) then
  165. FFPHandle := TgxFragmentProgramHandle.CreateAndAllocate;
  166. FFPHandle.LoadARBProgram(FragmentProgram.Code.Text);
  167. FragmentProgram.Enabled := FFPHandle.Ready;
  168. end;
  169. if GeometryProgram.Enabled then
  170. begin
  171. if not Assigned(FGPHandle) then
  172. FGPHandle := TgxGeometryProgramHandle.CreateAndAllocate;
  173. FGPHandle.LoadARBProgram(GeometryProgram.Code.Text);
  174. GeometryProgram.Enabled := FGPHandle.Ready;
  175. end;
  176. Enabled := (FragmentProgram.Enabled or VertexProgram.Enabled or GeometryProgram.Enabled);
  177. if Enabled then
  178. begin
  179. if Assigned(FOnInitialize) then
  180. FOnInitialize(Self)
  181. end;
  182. end;
  183. end;
  184. function TgxCustomAsmShader.DoUnApply(var rci: TgxRenderContextInfo): Boolean;
  185. begin
  186. if Assigned(FOnUnApply) then
  187. FOnUnApply(Self, Result)
  188. else
  189. Result := False;
  190. UnApplyShaderPrograms();
  191. end;
  192. function TgxCustomAsmShader.ShaderSupported: Boolean;
  193. begin
  194. Result :=
  195. (VertexProgram.Enabled) or
  196. (FragmentProgram.Enabled) or
  197. (GeometryProgram.Enabled);
  198. end;
  199. procedure TgxCustomAsmShader.ApplyShaderPrograms;
  200. begin
  201. if VertexProgram.Enabled then
  202. begin
  203. FVPHandle.Enable;
  204. FVPHandle.Bind;
  205. end;
  206. if FragmentProgram.Enabled then
  207. begin
  208. FFPHandle.Enable;
  209. FFPHandle.Bind;
  210. end;
  211. if GeometryProgram.Enabled then
  212. begin
  213. FGPHandle.Enable;
  214. FGPHandle.Bind;
  215. end;
  216. end;
  217. procedure TgxCustomAsmShader.UnApplyShaderPrograms;
  218. begin
  219. if VertexProgram.Enabled then
  220. FVPHandle.Disable;
  221. if FragmentProgram.Enabled then
  222. FFPHandle.Disable;
  223. if GeometryProgram.Enabled then
  224. FGPHandle.Disable;
  225. end;
  226. //-------------------------------------
  227. initialization
  228. //-------------------------------------
  229. RegisterClasses([TgxCustomAsmShader, TgxAsmShader]);
  230. end.