| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
synchronized and secure [1/2]
GLBufferSizeTracker becomes GLBufferObjectTracker
and tracks the buffer's data store, GLBufferStorage, accurately, synchronized and secure.
Synchronization is required, since the GLBufferStorage can be
shared across many GLContext on multiple threads.
This requires all GLBufferStorage lifecycle affecting GL functions
to utilize synchronized GLBufferObjectTracker methods
while passing a native GL-func callback.
These GL functions are:
- glBufferData, glBufferStorage (GL 4.4), glNamedBufferDataEXT
Creating the GLBufferStorage object
- glMapBuffer, glMapBufferRange, and their *Named*EXT variants
- glUnmapBuffer, glUnmapNamedBufferEXT
'glDeleteBuffers' can simply notify the GLBufferObjectTracker
No more HashMap is required to associate the mapped buffer address
to the mapped ByteBuffer.
GLBufferObjectTracker simply utilizes a
buffer-name (int) -> GLBufferStorage
map.
+++
The security aspect shall be implemented by validating all arguments
whether they match the required GL constraints,
as well as validating tracked states like 'size'.
The following functions will throw an GLException accordingly:
- glBufferData, glNamedBufferDataEXT
* @throws GLException if size is less-than zero
* @throws GLException if a native GL-Error occurs
- glBufferStorage (GL 4.4)
* @throws GLException if size is less-or-eqaul zero
* @throws GLException if a native GL-Error occurs
- glMapBuffer, and it's *Named*EXT variant
* @throws GLException if buffer is not bound to target
* @throws GLException if buffer is not tracked
* @throws GLException if buffer is already mapped
* @throws GLException if buffer has invalid store size, i.e. less-than zero
- glMapBufferRange, and it's *Named*EXT variant
* @throws GLException if buffer is not bound to target
* @throws GLException if buffer is not tracked
* @throws GLException if buffer is already mapped
* @throws GLException if buffer has invalid store size, i.e. less-than zero
* @throws GLException if buffer mapping range does not fit, incl. offset
- glMapBufferRange, and it's *Named*EXT variant
Only clear mapped buffer reference of GLBufferStorage
if native unmap was successful.
Further more special error handling shall be applied to:
- glMapBuffer, and it's *Named*EXT variant,
glMapBuffer, and it's *Named*EXT variant
- A zero GLBufferStorage size will avoid a native call and
returns null
- A null native mapping result indicating an error will
not cause a GLException but returns null
This allows the user to handle this case.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Simplify JAWTComponentListener's HierarchyListener:
- Don't interfere w/ Component's visibility anymore!
This shall reduce sideeffects.
Utilize 'isShowing' in each Component specialization, i.e. GLCanvas.
- On SHOWING_CHANGED if a parent caused a change
of the tracked components showing state,
propagate it to the offscreen-layer!
- Remove all other complicated states!
GLCanvas, GLJPanel:
- Instead of 'isVisible()' use 'showing state',
since only the 'showing state' reflects 'true' visibility
throughout the hierarchy.
- Add HierarchyListener and track volatile showing state
to be used instead of 'isVisible'.
Using a cached showing state is more efficient
than quering 'isShowing()' all the time!
NewtCanvasAWT:
- Use 'isShowing()' instead of 'isVisible(), see above
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
GL4NeedsGL3Request not set
GL3 core version validation failed due to missing braces around 'isES' _and_ term,
where the latter consist out of 2 _or_ terms testing version mismatch.
On OSX we validate a GL3 core context first and expect it to return a GL4 version if available,
which in turn triggers the quirk GL4NeedsGL3Request.
This behavior was disabled due to above mentioned bug, where the unqual major version caused
the validation to fail.
TestGLProfile01NEWT: Fixed 'GL4ES3' test, where 'GL4ES3' is only available
if extension <code>GL_ARB_ES3_compatibility</code> is available as well.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Map ES2 -> ES3 GLProfile, if available
- EGLDrawableFactory: Don't query ES2 if ES3 is available
- Fix queries and get methods (GL, GLContext and GLProfile):
- glES3.isGLES2()==true and glES3.getGLES2()!=null
- ctxES3.isGLES2()==true,
- glES3Profile.isGLES2()==true
- Enhance Unit test: TestGLProfile01NEWT
- Test all GLProfile availability combinations
based on implementing GLProfile
- Test all GLProfile's isGL*()
based on highest GLProfile identity
- Test all GL's isGL*()
based on highest GL identity.
|
|
|
|
| |
considered in AWTTilePainter: 'Origin of GL image is still on Bottom'
|
|
|
|
|
|
|
| |
907 impl. DummyDispatchThread (DDT)
Bug 907 implemented DDT used to create and destroy offscreen surface's dummy drawable on Windows.
This enables offscreen initialization on Windows running from a short lived arbitrary thread.
|
| |
|
|
|
|
| |
implementation
|
|
|
|
|
|
|
|
|
|
|
|
| |
AWTGLPixelBuffer
GLJPanel must validate whether it's local BufferedImage's DataBuffer is sourced
by the current singleton AWTGLPixelBuffer.
Case:
GLJPanel-B has created a new singleton AWTGLPixelBuffer w/ increased size.
Previous created GLJPanel-A's local BufferedImage's DataBuffer is no more sourced
by the singleton AWTGLPixelBuffer and hence must be re-created.
|
|
|
|
|
|
|
|
|
|
| |
JAWTWindow.destroy() - GLCanvas Recreation Case
In case a JAWTWindow owner recreates itself, destroying JAWTWindow must detach the
Component- and HierarchyListener from the AWT component!
Test TestBug816GLCanvasFrameHoppingB849B889AWT
shows properly detaching listener at jawtWindow destruction.
|
|
|
|
|
|
| |
by default (2/2)
Property 'jogl.gljpanel.noverticalflip' will set the skipGLOrientationVerticalFlip default to true - intended for perf. testing of existing applications
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
offscreen backend
Add new GLJPanel method 'setSkipGLOrientationVerticalFlip(..)':
/**
* Set skipping {@link #isGLOriented()} based vertical flip,
* which usually is required by the offscreen backend,
* see details about <a href="#verticalFlip">vertical flip</a>
* and <a href="#fboGLSLVerticalFlip">FBO / GLSL vertical flip</a>.
* <p>
* If set to <code>true</code>, user needs to flip the OpenGL rendered scene
* <i>if {@link #isGLOriented()} == true</i>, e.g. via the PMV matrix.<br/>
* See constraints of {@link #isGLOriented()}.
* </p>
*/
public final void setSkipGLOrientationVerticalFlip(boolean v) {
GearsES2: Handles 'flipVerticalInGLOrientation'
Unit test 'TestPerf001GLJPanelInit02AWT' validates and measures performance.
|
| |
|
|
|
|
| |
GLSharedContextSetter (remove <> in links, more details on Immersion.16.
|
|
|
|
| |
passed, this allows native GLCaps/config query to follow fast-path
|
|
|
|
| |
initializeBackendImpl(), already tested before function entry!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Validate isGLES*() usage and definition ; Add and use ShaderCode.createExtensionDirective(..)
- Fix GLES3 Profile Mapping, i.e. GL2ES2 queries and mappings
- GLProfile: Add GL2ES2 -> ES3 mapping
- EGLContext: Reuqest major '3' for ES3
- EGLGLCapabilities/EGLGraphicsConfiguration: Consider EGLExt.EGL_OPENGL_ES3_BIT_KHR
- Validate isGLES*() usage and definition
- Fix BuildComposablePipeline's isGLES() code
- For GLSL related queries use isGLES() instead of isGLES2(),
which would exclude ES3
- Add and use ShaderCode.createExtensionDirective(..)
- Supporting creating GLSL extension directives while reusing strings from GLExtensions
- Minor cleanup of GLContextImpl.setGLFuncAvail(..)
|
|
|
|
|
|
| |
user to trigger backend initialization eagerly and offthread (optional, !WINDOWS)
TestPerf001GLJPanelInit02AWT compares all variations: no-gl, glcanvas, gljpanel and gljpanel-initMT (offthread)
|
|
|
|
| |
device does _not_ require locking on global shared device.
|
|
|
|
|
|
|
|
|
| |
Even though the test case itself cannot show the proper initialization time,
it can be used w/ an attached profiler i.e.
Test w/ 50 X11GLXGraphicsConfigurationFactory.chooseGraphicsConfigurationFBConfig() invocations:
- pre change: 1.708 ms
- post change: 650 ms (613e33ee8ffc1f2b9c5db1e1b5bb5253a159ed6d)
|
|
|
|
| |
GLCapabilitiesChooser instead of GLProfile, allowing using same or similar caps - important for sharing ctx
|
|
|
|
| |
to lifecycle considerations ; GearsES2: Add glFinish() after init().
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
stability constraints' ; Fixing Test cases: Enable all, GearsObject*: Check VBO
- GLSharedContextSetter API Doc: No 'Driver stability constraints'
- No driver issues ..
- Use 'Lifecycle Considerations' to describe usage issues ..
- Fixing Test cases: Enable all, GearsObject*: Check VBO
- GearsObject* needs to check whether VBO is 'still alive'
if sharing is enabled.
- Enable all unit tests.
|
|
|
|
| |
field usage; GLDrawableImpl: Make read-only fields final.
|
|
|
|
|
|
|
| |
convenience
Added:
GLAutoDrawable createDummyAutoDrawable(AbstractGraphicsDevice deviceReq, boolean createNewDevice, GLProfile glp)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
order) ; Fix unit tests (Shared Gears, wait for created context and destruction order)
- Add note about driver stability (destruction order)
- See GLSharedContextSetter: Don't destroy master context before slaves!
- Fix spec-overview.html#SHARED links, add link to GLSharedContextSetter in SHARED subsection.
- Fix unit tests (Shared Gears, wait for created context and destruction order)
- The GearsObject sharing was completly bogus!
It simply used the _same_ GLArrayDataServer instance for sharing,
but it should use a _copy_ of the shared GLArrayDataServer while
only preserving the VBO object!
Fixed, while adding required methods to GLArrayDataServer.
- Waiting for the created GLContext of a GLAutoDrawable required us
to pass the latter _and_ check whether it's GLContext exists and is natively created.
- Accomodated the destruction order - see above!
|
| |
|
|
|
|
|
|
| |
local shared ctx fields.
Regression of 7f7a23dd0ddf106e6f0c69fc2a05ff92ac56200e
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
; Fix GLContext memory contract (volatile)
(Unit test remarks see below)
- Add shared GLContext queries
- Refined GLContextShareSet:
- Use IdentityHashMap since GLContext's can only be identical w/ same reference (footprint, performance)
- Add API doc for clarification
- Add methods:
- ArrayList<GLContext> getCreatedShares(final GLContext context)
- ArrayList<GLContext> getDestroyedShares(final GLContext context)
- Use 'final' where possible
- Add GLContext methods:
- boolean isShared()
- List<GLContext> getCreatedShares()
- List<GLContext> getDestroyedShares()
- Add GLSharedContextSetter interface defining setting a shared GLContext
directly (GLContext) or via a GLAutoDrawable:
- setSharedContext(GLContext)
- setSharedAutoDrawable(GLAutoDrawable)
Both cause initialization/creation of GLAutoDrawable's drawable/context to be postponed,
if the shared GLContext is not yet created natively or
the shared GLAutoDrawable's GLContext does not yet exist.
Most of impl. resides in GLDrawableHelper
Implemented in:
- GLAutoDrawableBase, GLOffscreenAutoDrawable
- GLWindow
- AWT GLCanvas
TODO:
- GLJPanel
- SWT GLCanvas
- GLDrawableFactory:
- Add 'GLOffscreenAutoDrawable createOffscreenAutoDrawable(..)' variant w/o passing the
optional shared GLContext _and_ specifying lazy GLContext
creation. This allows to benefit from GLSharedContextSetter contract.
Lazy GLContext creation is performed at 2st display() call at the latest.
All JOGL code and unit tests use this new method now.
- Mark 'createOffscreenAutoDrawable(..)' w/ shared GLContext argument
and immediate GLContext creation deprecated - shall be removed in 2.2.0
- Make reference to GLContext and it's native handle volatile
Since we rely on the query 'GLContext.isCreated()' to properly allow GLAutoDrawable's to query whether
a shared GLContext is natively created (already), the handle must be volatile
since such query and the actual creation may operate on different threads.
+++++
- Add/Refine shared GLContext unit tests demonstrating diff. sharing methods.
All variants of using shared GLContext:
com.jogamp.opengl.test.junit.jogl.acore.TestSharedContextVBO*
Most convenient way to share via setSharedAutoDrawable(GLAutoDrawable):
com.jogamp.opengl.test.junit.jogl.acore.TestSharedContextVBOES2[NEWT|AWT]3
AWT use w/ JTabbedPane using setSharedAutoDrawable(GLAutoDrawable):
com.jogamp.opengl.test.junit.jogl.acore.TestSharedContextWithJTabbedPaneAWT
|
|
|
|
| |
GLDrawable (Shared Context)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
GLContext:
- Proper API doc for Version* fields
- getStaticGLSLVersionNumber(): ES3 -> Version300
- hasGLSL(): Add ES3
ShaderCode:
- addDefaultShaderPrecision():
- ES2 default precision: Don't 'tune up' default precision for fragment shader, use 'mediump'
- Add ES3 default precision (equal to ES2 default precision)
- requiresDefaultPrecision(): Shall returns 'true' for ES3 as well!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
as detected and mapped by GLContext ; Enhance glAvailabilityToString(..)
We shall not map profile == profile-impl, i.e. GL3 -> GL3,
but use GLContext.getAvailableGLProfileName(device, reqMajor, reqProfileBits).
The latter reflects the actual mapped context as detected.
glAvailabilityToString(..)
- Partition result in [Natives, Common and Mappings]
- Mappings dumps mapped keys to profiles, while excluding default.
Default is added at last.
- Add count.
|
|
|
|
| |
getAvailableGLProfile(device, ..) shall use GLProfile.get(device, ..)
|
|
|
|
| |
CTX_IMPL_FP32_COMPAT_API: "FP32 compat-api" -> "FP32 compat"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Linux - No compatibility GLProfile (GL2, >= GL3bc)
Fix GL Version Validation:
We shall not rely on our known good versions when validating a queried GL context version,
but allow some 'room' for a higher version post JOGL release while still
cutting off 'odd versions'.
While GL version detection, we always iterate from the highest known version
down to the lowest. Hence 'GLContext.isValidGLVersion(..)' is satisfied
by validating the lowest version number but allowing a higher than known one.
Now we would return 'invalid' for a version >= 6.
It is enough to clip to the maximum known version when iterating,
allowing the highest unknown version to be available.
GLContext.isValidGLVersion(..):
Returns true, if the major.minor is not inferior to the lowest
valid version and does not exceed the highest known major number by more than one.
The minor version number is ignored by the upper limit validation
and the major version number may exceed by one.
The upper limit check is relaxed since we don't want to cut-off
unforseen new GL version since the release of JOGL.
Hence it is important to iterate through GL version from the upper limit
and 'decrementGLVersion(..)' until invalid.
Add GL Version 4.4 to valid known versions.
Remove ES3 desktop detection, which is impossible
Regression of commit 3a0d7703da32e9a5ddf08a334f18588a78038d88 (ES3 support)
|
|
|
|
| |
Signed-off-by: Harvey Harrison <[email protected]>
|
|
|
|
| |
Signed-off-by: Harvey Harrison <[email protected]>
|
|
|
|
|
|
|
|
|
|
|
|
| |
a05b87a369441d9ef38f97929f866b3d4ced0e57: NULL printGLAD of GLCanvas and NewtCanvasAWT
We have to pre-init printGLAD w/ current GLAD (similiar w/ GLJPanel).
Also properly define reqNewGLAD:
reqNewGLAD = !caps.getSampleBuffers() && ( reqNewGLADOnscrn || reqNewGLADSamples || reqNewGLADSize );
where '!caps.getSampleBuffers() && ( .. )' is due to Bug 830,
swapGLContextAndAllGLEventListener and onscreen MSAA w/ NV/GLX does not work.
|
|
|
|
| |
allowing user to set custom tile size for performance evaluation/tweak
|
|
|
|
| |
beginTile() throws an EOT IllegalStateException to avoid division by zero
|
|
|
|
| |
GLContext: isCPUSourcedAvail() -> isCPUDataSourcingAvail()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
core >= 3.0) ; GL2 cfg: Ignore GL2ES3 symbols (super)
Remove CPU sourced data API entries via new config 'BufferObjectOnly <name>',
listed in 'gl-common-gpubufferonly.cfg' and included in ES3 and all GL core >= 3 interfaces.
If BufferObjectOnly is defined for a function, only the 'long offset' variant is being emitted.
Due to limitations of GlueGen's 'ExtendedInterfaceSymbolsIgnore A.java', which only
identifies the function name and not the signature - all CPU sourced variants
are manually added to the compatibility and ES2 GL profiles via '*-common-cpubufferJavaCode.java' files.
GLContext: Added 'isCPUSourcedAvail()' to determine whether context allows CPU sourced data,
i.e. for GL2ES1 and GLES2 ctx.
GLContext/GLProfile/GL: isGLES2() now returns false if having a ES3 context due to 'CPU sourced'
incompatibility!
+++
GL2 cfg: Added ignore GL2ES3 symbols of it's superclass, removing duplicated symbols.
|
|
|
|
| |
GLJPanel: Don't use GLSL flip if quirk GLSLNonCompliant is present.
|
|
|
|
| |
trusted before ..
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
row-stride (regression of b33bdf41cf53f37203643a8551bf5d94b42a8fab)
SingleAWTGLPixelBufferProvider w/ allowing row-stride reuses the AWTGLPixelBuffer and it's BufferedImage
even w/ different width.
This leads to distortion if using the BufferedImage unhandled.
GLJPanel also set GL_PACK_ROW_LENGTH to pixelBuffer.width, which leads to an 'out-of-bounds'
exception if ReadPixels is used w/ panelwidth and panelHeight.
++
Introduce AWTGLPixelBuffer.getAlignedImage(width, height) which returns an aligned
BufferedImage while reusing the DataBuffer.
GLJPanel fetches a new alignedImage if required.
This allows a more efficient single buffer usage as intended, w/o the need of copying data.
|
|
|
|
|
|
|
| |
resized; Add unit test for resize while printing.
Perform immediatly reshape at releasePrint on AWT-EDT:
- sendReshape = handleReshape(); // reshapeSize -> panelSize, backend reshape w/ GL reshape
|
|
|
|
| |
commit fe284b515d984198fdbe702837809f181625a457)
|
|
|
|
| |
'handleReshape' if panelSize/awtSize mismatch, otherwise 'sendReshape' and exception if offscreen size doesn't match panelSize.
|
|
|
|
|
|
|
|
|
| |
AWT-GLAD's size, since the latter uses AWT's component size.
.. the AWT component size could have been modified after setupPrinting(..).
The AWT-GLAD getWidth() and getHeight() is implemented by AWT's component
and hence may not reflect the actual GLDrawable size while printing.
|