openglcontrol: added Red,Green,Blue bits for target gtk

git-svn-id: trunk@40229 -
This commit is contained in:
mattias 2013-02-09 20:54:14 +00:00
parent 043dd66828
commit 14423ccd1a
2 changed files with 81 additions and 17 deletions

View File

@ -149,7 +149,8 @@ function LOpenGLMakeCurrent(Handle: HWND): boolean;
function LOpenGLCreateContext(AWinControl: TWinControl; function LOpenGLCreateContext(AWinControl: TWinControl;
WSPrivate: TWSPrivateClass; SharedControl: TWinControl; WSPrivate: TWSPrivateClass; SharedControl: TWinControl;
DoubleBuffered, RGBA: boolean; DoubleBuffered, RGBA: boolean;
const MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal; const RedBits, GreenBits, BlueBits,
MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal;
const AParams: TCreateParams): HWND; const AParams: TCreateParams): HWND;
procedure LOpenGLDestroyContextInfo(AWinControl: TWinControl); procedure LOpenGLDestroyContextInfo(AWinControl: TWinControl);
@ -157,8 +158,9 @@ procedure LOpenGLDestroyContextInfo(AWinControl: TWinControl);
Note that if MultiSampling is > 1, it is expected that caller Note that if MultiSampling is > 1, it is expected that caller
already checked that GLX_ARB_multisample is available. } already checked that GLX_ARB_multisample is available. }
function CreateOpenGLContextAttrList(DoubleBuffered: boolean; function CreateOpenGLContextAttrList(DoubleBuffered: boolean;
RGBA: boolean; RGBA: boolean;
const MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal): PInteger; const RedBits, GreenBits, BlueBits,
MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal): PInteger;
implementation implementation
@ -830,7 +832,8 @@ end;
function LOpenGLCreateContextCore(AWinControl: TWinControl; function LOpenGLCreateContextCore(AWinControl: TWinControl;
WSPrivate: TWSPrivateClass; SharedControl: TWinControl; WSPrivate: TWSPrivateClass; SharedControl: TWinControl;
DoubleBuffered, RGBA: boolean; DoubleBuffered, RGBA: boolean;
const MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal; const RedBits, GreenBits, BlueBits,
MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal;
const AParams: TCreateParams): HWND; const AParams: TCreateParams): HWND;
var var
NewWidget: PGtkWidget; NewWidget: PGtkWidget;
@ -838,8 +841,8 @@ var
AttrList: PInteger; AttrList: PInteger;
begin begin
if WSPrivate=nil then ; if WSPrivate=nil then ;
AttrList:=CreateOpenGLContextAttrList(DoubleBuffered,RGBA,MultiSampling, AttrList:=CreateOpenGLContextAttrList(DoubleBuffered,RGBA,RedBits,GreenBits,
AlphaBits,DepthBits,StencilBits,AUXBuffers); BlueBits,MultiSampling,AlphaBits,DepthBits,StencilBits,AUXBuffers);
try try
if SharedControl<>nil then begin if SharedControl<>nil then begin
SharedArea:={%H-}PGtkGLArea(PtrUInt(SharedControl.Handle)); SharedArea:={%H-}PGtkGLArea(PtrUInt(SharedControl.Handle));
@ -866,7 +869,8 @@ end;
function LOpenGLCreateContext(AWinControl: TWinControl; function LOpenGLCreateContext(AWinControl: TWinControl;
WSPrivate: TWSPrivateClass; SharedControl: TWinControl; WSPrivate: TWSPrivateClass; SharedControl: TWinControl;
DoubleBuffered, RGBA: boolean; DoubleBuffered, RGBA: boolean;
const MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal; const RedBits, GreenBits, BlueBits,
MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal;
const AParams: TCreateParams): HWND; const AParams: TCreateParams): HWND;
begin begin
if (MultiSampling > 1) and if (MultiSampling > 1) and
@ -879,16 +883,19 @@ begin
{$ENDIF} then {$ENDIF} then
try try
Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl, Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl,
DoubleBuffered, RGBA, MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers, AParams); DoubleBuffered, RGBA, RedBits, GreenBits, BlueBits, MultiSampling,
AlphaBits, DepthBits, StencilBits, AUXBuffers, AParams);
except except
{ retry without MultiSampling } { retry without MultiSampling }
Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl, Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl,
DoubleBuffered, RGBA, 1, AlphaBits, DepthBits, StencilBits, AUXBuffers, AParams); DoubleBuffered, RGBA, RedBits, GreenBits, BlueBits, 1, AlphaBits,
DepthBits, StencilBits, AUXBuffers, AParams);
end else end else
{ no multi-sampling requested (or GLX_ARB_multisample not available), { no multi-sampling requested (or GLX_ARB_multisample not available),
just pass to LOpenGLCreateContextCore } just pass to LOpenGLCreateContextCore }
Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl, Result := LOpenGLCreateContextCore(AWinControl, WSPrivate, SharedControl,
DoubleBuffered, RGBA, MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers, AParams); DoubleBuffered, RGBA, RedBits, GreenBits, BlueBits, MultiSampling,
AlphaBits, DepthBits, StencilBits, AUXBuffers, AParams);
end; end;
procedure LOpenGLDestroyContextInfo(AWinControl: TWinControl); procedure LOpenGLDestroyContextInfo(AWinControl: TWinControl);
@ -898,7 +905,8 @@ begin
end; end;
function CreateOpenGLContextAttrList(DoubleBuffered: boolean; RGBA: boolean; function CreateOpenGLContextAttrList(DoubleBuffered: boolean; RGBA: boolean;
const MultiSampling, AlphaBits, DepthBits, StencilBits, AUXBuffers: Cardinal): PInteger; const RedBits, GreenBits, BlueBits, MultiSampling, AlphaBits, DepthBits,
StencilBits, AUXBuffers: Cardinal): PInteger;
var var
p: integer; p: integer;
UseFBConfig: boolean; UseFBConfig: boolean;
@ -924,9 +932,9 @@ var
if not UseFBConfig then Add(GLX_RGBA); if not UseFBConfig then Add(GLX_RGBA);
{ For UseFBConfig, glXChooseFBConfig already defaults to RGBA } { For UseFBConfig, glXChooseFBConfig already defaults to RGBA }
end; end;
Add(GLX_RED_SIZE); Add(1); Add(GLX_RED_SIZE); Add(RedBits);
Add(GLX_GREEN_SIZE); Add(1); Add(GLX_GREEN_SIZE); Add(GreenBits);
Add(GLX_BLUE_SIZE); Add(1); Add(GLX_BLUE_SIZE); Add(BlueBits);
if AlphaBits>0 then if AlphaBits>0 then
begin begin
Add(GLX_ALPHA_SIZE); Add(AlphaBits); Add(GLX_ALPHA_SIZE); Add(AlphaBits);

View File

@ -65,9 +65,11 @@ uses
Graphics, LMessages, WSLCLClasses, WSControls, Graphics, LMessages, WSLCLClasses, WSControls,
{$IFDEF UseGtkGLX} {$IFDEF UseGtkGLX}
GLGtkGlxContext; GLGtkGlxContext;
{$DEFINE HasRGBBits}
{$ENDIF} {$ENDIF}
{$IFDEF UseGtk2GLX} {$IFDEF UseGtk2GLX}
GLGtkGlxContext; GLGtkGlxContext;
{$DEFINE HasRGBBits}
{$ENDIF} {$ENDIF}
{$IFDEF UseCarbonAGL} {$IFDEF UseCarbonAGL}
GLCarbonAGLContext; GLCarbonAGLContext;
@ -79,6 +81,8 @@ uses
GLQTContext; GLQTContext;
{$ENDIF} {$ENDIF}
const
DefaultDepthBits = 16;
type type
TOpenGlCtrlMakeCurrentEvent = procedure(Sender: TObject; TOpenGlCtrlMakeCurrentEvent = procedure(Sender: TObject;
@ -109,6 +113,9 @@ type
FCurrentFrameTime: integer; // in msec FCurrentFrameTime: integer; // in msec
FLastFrameTime: integer; // in msec FLastFrameTime: integer; // in msec
FRGBA: boolean; FRGBA: boolean;
{$IFDEF HasRGBBits}
FRedBits, FGreenBits, FBlueBits,
{$ENDIF}
FMultiSampling, FAlphaBits, FDepthBits, FStencilBits, FAUXBuffers: Cardinal; FMultiSampling, FAlphaBits, FDepthBits, FStencilBits, FAUXBuffers: Cardinal;
FSharedOpenGLControl: TCustomOpenGLControl; FSharedOpenGLControl: TCustomOpenGLControl;
FSharingOpenGlControls: TList; FSharingOpenGlControls: TList;
@ -116,6 +123,11 @@ type
procedure SetAutoResizeViewport(const AValue: boolean); procedure SetAutoResizeViewport(const AValue: boolean);
procedure SetDoubleBuffered(const AValue: boolean); procedure SetDoubleBuffered(const AValue: boolean);
procedure SetRGBA(const AValue: boolean); procedure SetRGBA(const AValue: boolean);
{$IFDEF HasRGBBits}
procedure SetRedBits(const AValue: Cardinal);
procedure SetGreenBits(const AValue: Cardinal);
procedure SetBlueBits(const AValue: Cardinal);
{$ENDIF}
procedure SetMultiSampling(const AMultiSampling: Cardinal); procedure SetMultiSampling(const AMultiSampling: Cardinal);
procedure SetAlphaBits(const AValue: Cardinal); procedure SetAlphaBits(const AValue: Cardinal);
procedure SetDepthBits(const AValue: Cardinal); procedure SetDepthBits(const AValue: Cardinal);
@ -151,7 +163,11 @@ type
write SetAutoResizeViewport default false; write SetAutoResizeViewport default false;
property DoubleBuffered: boolean read FDoubleBuffered write SetDoubleBuffered default true; property DoubleBuffered: boolean read FDoubleBuffered write SetDoubleBuffered default true;
property RGBA: boolean read FRGBA write SetRGBA default true; property RGBA: boolean read FRGBA write SetRGBA default true;
{$IFDEF HasRGBBits}
property RedBits: Cardinal read FRedBits write SetRedBits default 8;
property GreenBits: Cardinal read FGreenBits write SetGreenBits default 8;
property BlueBits: Cardinal read FBlueBits write SetBlueBits default 8;
{$ENDIF}
{ Number of samples per pixel, for OpenGL multi-sampling (anti-aliasing). { Number of samples per pixel, for OpenGL multi-sampling (anti-aliasing).
Value <= 1 means that we use 1 sample per pixel, which means no anti-aliasing. Value <= 1 means that we use 1 sample per pixel, which means no anti-aliasing.
@ -166,7 +182,7 @@ type
property MultiSampling: Cardinal read FMultiSampling write SetMultiSampling default 1; property MultiSampling: Cardinal read FMultiSampling write SetMultiSampling default 1;
property AlphaBits: Cardinal read FAlphaBits write SetAlphaBits default 0; property AlphaBits: Cardinal read FAlphaBits write SetAlphaBits default 0;
property DepthBits: Cardinal read FDepthBits write SetDepthBits default 16; property DepthBits: Cardinal read FDepthBits write SetDepthBits default DefaultDepthBits;
property StencilBits: Cardinal read FStencilBits write SetStencilBits default 0; property StencilBits: Cardinal read FStencilBits write SetStencilBits default 0;
property AUXBuffers: Cardinal read FAUXBuffers write SetAUXBuffers default 0; property AUXBuffers: Cardinal read FAUXBuffers write SetAUXBuffers default 0;
end; end;
@ -180,6 +196,11 @@ type
property AutoResizeViewport; property AutoResizeViewport;
property BorderSpacing; property BorderSpacing;
property Enabled; property Enabled;
{$IFDEF HasRGBBits}
property RedBits;
property GreenBits;
property BlueBits;
{$ENDIF}
property MultiSampling; property MultiSampling;
property AlphaBits; property AlphaBits;
property DepthBits; property DepthBits;
@ -270,6 +291,29 @@ begin
OpenGLAttributesChanged; OpenGLAttributesChanged;
end; end;
{$IFDEF HasRGBBits}
procedure TCustomOpenGLControl.SetRedBits(const AValue: Cardinal);
begin
if FRedBits=AValue then exit;
FRedBits:=AValue;
OpenGLAttributesChanged;
end;
procedure TCustomOpenGLControl.SetGreenBits(const AValue: Cardinal);
begin
if FGreenBits=AValue then exit;
FGreenBits:=AValue;
OpenGLAttributesChanged;
end;
procedure TCustomOpenGLControl.SetBlueBits(const AValue: Cardinal);
begin
if FBlueBits=AValue then exit;
FBlueBits:=AValue;
OpenGLAttributesChanged;
end;
{$ENDIF}
procedure TCustomOpenGLControl.SetMultiSampling(const AMultiSampling: Cardinal); procedure TCustomOpenGLControl.SetMultiSampling(const AMultiSampling: Cardinal);
begin begin
if FMultiSampling=AMultiSampling then exit; if FMultiSampling=AMultiSampling then exit;
@ -297,12 +341,14 @@ begin
FStencilBits:=AValue; FStencilBits:=AValue;
OpenGLAttributesChanged; OpenGLAttributesChanged;
end; end;
procedure TCustomOpenGLControl.SetAUXBuffers(const AValue: Cardinal); procedure TCustomOpenGLControl.SetAUXBuffers(const AValue: Cardinal);
begin begin
if FAUXBuffers=AValue then exit; if FAUXBuffers=AValue then exit;
FAUXBuffers:=AValue; FAUXBuffers:=AValue;
OpenGLAttributesChanged; OpenGLAttributesChanged;
end; end;
procedure TCustomOpenGLControl.SetSharedControl( procedure TCustomOpenGLControl.SetSharedControl(
const AValue: TCustomOpenGLControl); const AValue: TCustomOpenGLControl);
begin begin
@ -391,8 +437,13 @@ begin
inherited Create(TheOwner); inherited Create(TheOwner);
FDoubleBuffered:=true; FDoubleBuffered:=true;
FRGBA:=true; FRGBA:=true;
{$IFDEF HasRGBBits}
FRedBits:=8;
FGreenBits:=8;
FBlueBits:=8;
{$ENDIF}
FMultiSampling:=1; FMultiSampling:=1;
FDepthBits:=16; FDepthBits:=DefaultDepthBits;
ControlStyle:=ControlStyle-[csSetCaption]; ControlStyle:=ControlStyle-[csSetCaption];
if (csDesigning in ComponentState) then begin if (csDesigning in ComponentState) then begin
FCanvas := TControlCanvas.Create; FCanvas := TControlCanvas.Create;
@ -534,6 +585,11 @@ begin
Result:=LOpenGLCreateContext(OpenGlControl,WSPrivate, Result:=LOpenGLCreateContext(OpenGlControl,WSPrivate,
OpenGlControl.SharedControl, OpenGlControl.SharedControl,
AttrControl.DoubleBuffered,AttrControl.RGBA, AttrControl.DoubleBuffered,AttrControl.RGBA,
{$IFDEF HasRGBBits}
AttrControl.RedBits,
AttrControl.GreenBits,
AttrControl.BlueBits,
{$ENDIF}
AttrControl.MultiSampling, AttrControl.MultiSampling,
AttrControl.AlphaBits, AttrControl.AlphaBits,
AttrControl.DepthBits, AttrControl.DepthBits,