2
0

GXSL.AsmShader.pas 7.2 KB

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