From 91e67f8d5d0e12d3862a9a81d287a3c1b0511012 Mon Sep 17 00:00:00 2001 From: Jason Mitchell Date: Mon, 26 Oct 2026 21:11:49 -0700 Subject: [PATCH] Split up GLStateManager and add public GLState API (#2305) --- .../experimental/surround/Surround.java | 4 +- .../angelica/glsm/CompatUniformManager.java | 26 +- .../angelica/glsm/DisplayListManager.java | 12 +- .../angelica/glsm/ExitStateCapture.java | 62 +- .../gtnewhorizons/angelica/glsm/Feature.java | 326 +- .../angelica/glsm/FeedbackManager.java | 8 +- .../angelica/glsm/GLContextState.java | 14 +- .../angelica/glsm/GLSMAttribStack.java | 667 ++ .../angelica/glsm/GLSMBlend.java | 335 + .../angelica/glsm/GLSMBuffers.java | 628 ++ .../angelica/glsm/GLSMCurrentAttribs.java | 524 + .../angelica/glsm/GLSMDepthStencilAlpha.java | 427 + .../angelica/glsm/GLSMDraws.java | 713 ++ .../angelica/glsm/GLSMEnable.java | 302 + .../gtnewhorizons/angelica/glsm/GLSMFog.java | 169 + .../angelica/glsm/GLSMFramebuffer.java | 344 + .../angelica/glsm/GLSMLighting.java | 781 ++ .../angelica/glsm/GLSMMatrices.java | 504 + .../angelica/glsm/GLSMPrograms.java | 613 ++ .../angelica/glsm/GLSMQueries.java | 594 + .../angelica/glsm/GLSMRasterizer.java | 700 ++ .../angelica/glsm/GLSMTexEnvGen.java | 366 + .../angelica/glsm/GLSMTextureLifetime.java | 360 + .../angelica/glsm/GLSMTextures.java | 1334 +++ .../angelica/glsm/GLSMVertexInput.java | 654 ++ .../angelica/glsm/GLStateManager.java | 9665 +---------------- .../angelica/glsm/LTWWorkaround.java | 8 +- .../angelica/glsm/LegacyQueries.java | 16 +- .../angelica/glsm/QuadConverter.java | 4 +- .../angelica/glsm/RenderSystem.java | 106 +- .../gtnewhorizons/angelica/glsm/StateSet.java | 68 +- .../angelica/glsm/backend/RenderBackend.java | 3 +- .../glsm/compat/lwjgl/AngelicaCylinder.java | 47 +- .../glsm/compat/lwjgl/AngelicaDisk.java | 53 +- .../compat/lwjgl/AngelicaPartialDisk.java | 88 +- .../glsm/compat/lwjgl/AngelicaSphere.java | 61 +- .../angelica/glsm/dsa/DSAARB.java | 31 +- .../angelica/glsm/dsa/DSAUnsupported.java | 61 +- .../angelica/glsm/ffp/CombinedGlint.java | 18 +- .../glsm/ffp/CubeInstancedAttribs.java | 6 +- .../angelica/glsm/ffp/FFPVertexLighting.java | 25 +- .../angelica/glsm/ffp/FfpExtendedAttribs.java | 59 +- .../angelica/glsm/ffp/InstancedAttribs.java | 16 +- .../glsm/ffp/ParticleInstancedAttribs.java | 10 +- .../angelica/glsm/ffp/ParticleQuadMesh.java | 37 +- .../angelica/glsm/ffp/Program.java | 5 +- .../angelica/glsm/ffp/ShaderManager.java | 7 +- .../angelica/glsm/ffp/Uniforms.java | 3 +- .../angelica/glsm/ffp/UnitCubeMesh.java | 29 +- .../angelica/glsm/ffp/VAOManager.java | 7 +- .../angelica/glsm/ffp/VertexKey.java | 6 +- .../glsm/ffp/WeatherInstancedAttribs.java | 8 +- .../angelica/glsm/ffp/WeatherQuadMesh.java | 33 +- .../angelica/glsm/hooks/FrameHooks.java | 3 +- .../hooks/ImmediateExtendedAttribHandler.java | 12 +- .../angelica/glsm/hooks/TextureUtilHooks.java | 19 +- .../angelica/glsm/loading/ModRedirector.java | 9 + .../glsm/recording/AttribSnapshot.java | 11 +- .../glsm/recording/CommandBufferExecutor.java | 153 +- .../glsm/recording/CompiledDisplayList.java | 7 +- .../glsm/recording/DisplayListVBO.java | 11 +- .../glsm/recording/DisplayListVBOBuilder.java | 12 +- .../glsm/recording/ImmediateModeRecorder.java | 5 +- .../commands/BatchedIndexedDrawCmd.java | 4 +- .../recording/commands/IndexedDrawBatch.java | 26 +- .../commands/IndexedDrawBatchBuilder.java | 29 +- .../commands/IndexedDrawCapture.java | 16 +- .../recording/commands/MultMatrixCmd.java | 4 +- .../recording/commands/TexImage2DCmd.java | 10 +- .../recording/commands/TexSubImage2DCmd.java | 10 +- .../angelica/glsm/redirect/GLSMOwners.java | 174 + .../glsm/redirect/GLSMRedirector.java | 133 +- .../glsm/redirect/LegacyRewriter.java | 10 + .../glsm/shader/ProgramBinaryCache.java | 16 +- .../glsm/stacks/BooleanStateStack.java | 3 +- .../angelica/glsm/stacks/CowStateStack.java | 4 +- .../stacks/TextureUnitBooleanStateStack.java | 3 +- .../angelica/glsm/states/BooleanState.java | 3 +- .../angelica/glsm/states/LightModelState.java | 2 +- .../angelica/glsm/states/LightState.java | 19 +- .../angelica/glsm/states/MaterialState.java | 2 +- .../glsm/streaming/GlStreamingRing.java | 31 +- .../angelica/glsm/streaming/LineQuads.java | 7 +- .../glsm/streaming/OrphanStreamingBuffer.java | 14 +- .../glsm/streaming/StreamingUploader.java | 15 +- .../streaming/TessellatorStreamingDrawer.java | 60 +- .../glsm/streaming/UniformRingBuffer.java | 22 +- .../angelica/glsm/texture/TextureInfo.java | 6 +- .../glsm/texture/TextureInfoCache.java | 11 +- .../glsm/ArrayUniformUploadGLTest.java | 8 +- .../glsm/CompatUniformManagerTest.java | 2 +- .../DisplayListCompilationParityTest.java | 44 +- .../glsm/DisplayListCompilationTest.java | 56 +- .../DisplayListMatrixRestorationTest.java | 226 +- .../angelica/glsm/DisplayListTestHelper.java | 24 +- .../angelica/glsm/FeedbackManagerTest.java | 22 +- .../GLSM_BlendFuncUnknownState_GLTest.java | 36 +- .../glsm/GLSM_BlendUnknownState_UnitTest.java | 14 +- .../glsm/GLSM_ClientArrays_GLTest.java | 590 +- .../glsm/GLSM_CoreRemovedCaps_GLTest.java | 76 +- .../GLSM_DeferredTextureDelete_GLTest.java | 228 +- .../GLSM_DeletedBufferBinding_GLTest.java | 24 +- .../glsm/GLSM_DirtyTracking_UnitTest.java | 124 +- .../glsm/GLSM_DisplayList_Batching_Test.java | 12 +- ...ayList_CompileAndExecuteArrays_GLTest.java | 82 +- ...M_DisplayList_FormatOptimization_Test.java | 96 +- .../glsm/GLSM_DisplayList_Nesting_Test.java | 78 +- .../GLSM_DisplayList_PixelStore_Test.java | 76 +- ...playList_RawTessellatorTransform_Test.java | 24 +- .../GLSM_DisplayList_StateSet_GLTest.java | 246 +- .../glsm/GLSM_DisplayList_Stress_Test.java | 94 +- ..._DisplayList_TransformCollapsing_Test.java | 314 +- .../glsm/GLSM_DisplayList_UnitTest.java | 50 +- .../GLSM_ExitCaptureCoverage_UnitTest.java | 53 +- .../angelica/glsm/GLSM_ExitState_GLTest.java | 382 +- .../glsm/GLSM_ExitTextureFilter_GLTest.java | 44 +- .../angelica/glsm/GLSM_GLU_UnitTest.java | 54 +- .../angelica/glsm/GLSM_Groups_UnitTest.java | 126 + .../GLSM_HudCacheBlendOverride_GLTest.java | 46 +- .../GLSM_ImageUnitBindingCache_UnitTest.java | 128 +- .../glsm/GLSM_LegacyStackQueries_GLTest.java | 862 +- .../angelica/glsm/GLSM_Lighting_UnitTest.java | 212 +- .../glsm/GLSM_LineStipple_GLTest.java | 84 +- .../glsm/GLSM_MatrixStack_UnitTest.java | 22 +- .../GLSM_MaxBoundTextureUnit_UnitTest.java | 28 +- .../glsm/GLSM_OffContextCreation_GLTest.java | 40 +- .../glsm/GLSM_PerThread_UnitTest.java | 40 +- .../GLSM_PolygonOffsetClamp_UnitTest.java | 8 +- .../GLSM_PopAttribMaskFidelity_GLTest.java | 112 +- .../angelica/glsm/GLSM_PushPop_UnitTest.java | 528 +- .../glsm/GLSM_RetainedState_GLTest.java | 176 +- .../glsm/GLSM_SamplerBinding_GLTest.java | 86 +- .../glsm/GLSM_ServerSideState_UnitTest.java | 124 +- .../GLSM_SharedDrawableContext_GLTest.java | 188 +- .../GLSM_SplashCachingCoverage_UnitTest.java | 34 +- .../GLSM_StateQueryRoundTrip_UnitTest.java | 134 +- .../angelica/glsm/GLSM_StateSet_GLTest.java | 802 +- ...SM_TextureBindingTargetCache_UnitTest.java | 74 +- .../glsm/GLSM_TextureInfoCache_UnitTest.java | 18 +- .../GLSM_TextureUploadGeneration_GLTest.java | 30 +- .../angelica/glsm/GLSM_VAO_UnitTest.java | 54 +- .../glsm/GLSM_ValueStackCow_GLTest.java | 138 +- .../glsm/GLSM_WorkerContextStacks_GLTest.java | 46 +- .../ImmediateModeThreadIsolationTest.java | 32 +- .../glsm/InstancedQuadDrawGLTest.java | 40 +- .../glsm/VertexAttribDefaultBridgeTest.java | 36 +- .../glsm/dsa/DSAUnsupportedBindingTest.java | 42 +- .../glsm/ffp/FFPCombineShaderTest.java | 111 +- .../glsm/ffp/FFPUnboundTextureUnitTest.java | 36 +- .../glsm/ffp/FFPUniformValuesTest.java | 50 +- .../glsm/ffp/FFPVertexLightingGLTest.java | 147 +- .../glsm/ffp/FfpUniformBlockDedupTest.java | 95 +- .../glsm/ffp/InstancedFFPDrawGLTest.java | 148 +- .../angelica/glsm/ffp/LogicOpGLTest.java | 31 +- .../glsm/ffp/ProgramUniformTrackingTest.java | 32 +- .../glsm/ffp/TextureSupersamplingGLTest.java | 161 +- .../glsm/ffp/VertexKeyTexMatrixMaskTest.java | 80 +- .../angelica/glsm/ffp/WideLineClipGLTest.java | 80 +- .../IndexedDrawBatchBuilderTest.java | 181 +- .../IndexedDrawDeleteSafetyTest.java | 67 +- .../glsm/recording/IndexedDrawReplayTest.java | 64 +- .../RecordingDataStructuresTest.java | 4 +- .../support/DisplayListTestFixture.java | 70 +- .../glsm/redirect/GLSMRedirectorTest.java | 118 +- .../StreamingBindingCacheGLTest.java | 29 +- .../StreamingDrawVAOBindingTest.java | 6 +- .../streaming/TessellatorEntityIdsGLTest.java | 27 +- .../gtnewhorizons/angelica/util/GLSMUtil.java | 165 +- .../angelica/glsm/EntityIdsOnlyHandler.java | 2 +- .../angelica/glsm/GLSMExtension.java | 2 +- .../angelica/glsm/GlTestSupport.java | 26 +- .../angelica/glsm/LegacyQueryFixture.java | 32 +- .../angelica/glsm/ReadbackFixture.java | 108 +- .../angelica/glsm/ffp/CubeParityFixture.java | 147 +- .../angelica/glsm/ffp/FfpFixture.java | 115 +- .../angelica/glsm/ffp/LogicOpFixture.java | 46 +- .../glsm/ffp/ParticleParityFixture.java | 100 +- .../TessellatorEntityIdsFixture.java | 14 +- .../glsm/testutil/DefiningClassLoader.java | 31 + .../angelica/glsm/testutil/GlsmClasses.java | 96 + .../angelica/sdlgpu/SDLGPULWJGLService.java | 205 +- .../angelica/sdlgpu/SDLGPURenderBackend.java | 8 +- .../sdlgpu/compat/AwareGLDebugShim.java | 6 +- .../compute/VoxelizationDispatcher.java | 10 +- .../angelica/sdlgpu/pipeline/FFPTrace.java | 4 +- .../sdlgpu/pipeline/PipelineApplier.java | 11 +- .../sdlgpu/resource/Image3DClear.java | 46 +- .../glsm/GlsmSdlAttachmentClearTest.java | 327 +- .../sdlgpu/glsm/GlsmSdlAttribBindingTest.java | 26 +- .../glsm/GlsmSdlBlendConstantsTest.java | 21 +- .../GlsmSdlBufferMappingLifetimeTest.java | 286 +- .../sdlgpu/glsm/GlsmSdlCopyBlitTest.java | 172 +- .../glsm/GlsmSdlDegenerateDrawTest.java | 4 +- .../glsm/GlsmSdlEmptyBufferTransferTest.java | 26 +- .../glsm/GlsmSdlExternalUboPushTest.java | 27 +- .../sdlgpu/glsm/GlsmSdlFbo0ViewportTest.java | 76 +- .../angelica/sdlgpu/glsm/GlsmSdlFfpTest.java | 69 +- .../sdlgpu/glsm/GlsmSdlHeadlessRig.java | 284 +- .../glsm/GlsmSdlIndexedBlendRestoreTest.java | 8 +- .../glsm/GlsmSdlInstancedConstantTest.java | 40 +- .../glsm/GlsmSdlLWJGLServiceRoutingTest.java | 17 +- .../sdlgpu/glsm/GlsmSdlLegacyQueryTest.java | 175 +- .../sdlgpu/glsm/GlsmSdlLogicOpTest.java | 79 +- .../sdlgpu/glsm/GlsmSdlMipAttachmentTest.java | 33 +- .../glsm/GlsmSdlOffContextCreationTest.java | 4 +- .../glsm/GlsmSdlOutOfFrameReadbackTest.java | 22 +- .../glsm/GlsmSdlProxyTextureProbeTest.java | 36 +- .../glsm/GlsmSdlReadbackMatrixTest.java | 72 +- .../sdlgpu/glsm/GlsmSdlReadbackTest.java | 30 +- .../glsm/GlsmSdlSamplerBindingTest.java | 67 +- .../glsm/GlsmSdlSamplerOverflowTest.java | 271 +- .../sdlgpu/glsm/GlsmSdlSplashTargetTest.java | 10 +- .../sdlgpu/glsm/GlsmSdlStreamingRingTest.java | 10 +- .../glsm/GlsmSdlTessellatorEntityIdsTest.java | 10 +- .../glsm/GlsmSdlTextureBindingQueryTest.java | 14 +- .../glsm/GlsmSdlTextureStagingTest.java | 37 +- .../glsm/GlsmSdlUnalignedAttribTest.java | 33 +- .../glsm/GlsmSdlVanillaTextureTest.java | 139 +- .../glsm/GlsmSdlVoxelRegionBindTest.java | 16 +- .../sdlgpu/glsm/GlsmSdlWideLineTest.java | 62 +- .../angelica/api/GLRedirects.java | 79 +- .../angelica/api/glstate/GLState.java | 73 + .../angelica/api/glstate/package-info.java | 4 + .../angelica/api/tesr/TesrMeshProvider.java | 4 +- .../client/font/BatchingFontRenderer.java | 173 +- .../client/font/FontProviderCustom.java | 18 +- .../angelica/client/font/FontStrategist.java | 3 +- .../client/font/RetainedTextStore.java | 17 +- .../angelica/client/font/TextDrawState.java | 23 +- .../angelica/client/gui/SliderClone.java | 4 +- .../client/rendering/AngelicaFogService.java | 14 +- .../client/rendering/DeferredDrawBatcher.java | 37 +- .../client/rendering/GlUniformFloat2v.java | 6 +- .../rendering/GlUniformFloat3Array.java | 4 +- .../rendering/GlUniformFloat4Array.java | 4 +- .../client/rendering/ModelViewDelta.java | 6 +- .../compat/DriverCompatabilityCheck.java | 10 +- .../compat/debug/BotaniaDebugEntry.java | 7 +- .../PlacedItemRenderCompat.java | 18 +- .../mojang/AutoClosableAbstractTexture.java | 4 +- .../angelica/compat/mojang/NativeImage.java | 6 +- .../angelica/compat/mojang/RenderLayer.java | 6 +- .../compat/thaumcraft/PortalDrawer.java | 111 +- .../compat/thaumcraft/PortalRenderer.java | 99 +- .../compat/thaumcraft/Tc4JarMeshes.java | 11 +- .../compat/thaumcraft/ThaumometerScreen.java | 108 +- .../angelica/config/CompatConfig.java | 5 + .../angelica/debug/ChunkDebugMinimap.java | 4 +- .../angelica/debug/F3Direction.java | 34 +- .../gtnewhorizons/angelica/debug/F3Graph.java | 62 +- .../angelica/debug/render/DebugDrawScope.java | 53 +- .../angelica/debug/render/DebugGeometry.java | 9 +- .../angelica/debug/render/DebugProgram.java | 16 +- .../debug/screen/DebugOptionsScreen.java | 4 +- .../debug/screen/DebugScreenOverlay.java | 11 +- .../angelica/debug/screen/DebugText.java | 8 +- .../debug/screen/entries/AngelicaEntries.java | 6 +- .../screen/entries/SystemSpecsEntry.java | 6 +- .../screen/renderers/DebugLabelBatch.java | 36 +- .../debug/screen/renderers/DebugMesh.java | 41 +- .../renderers/DebugWorldRenderHandler.java | 16 +- .../angelica/hudcaching/HUDCaching.java | 120 +- .../iris/ImmediateExtendedAttribs.java | 13 +- .../angelica/iris/IrisGLSMBridge.java | 6 +- .../loading/AngelicaClientTweaker.java | 1 + .../loading/fml/compat/CompatHandlers.java | 4 +- .../handlers/KaizPatchXCompatHandler.java | 14 + .../specific/KaizPatchXTransformer.java | 61 + .../EarlyRedirectorTransformer.java | 7 + .../transformers/AngelicaRedirector.java | 7 +- .../shared/transformers/GLSMApiRedirects.java | 59 + .../mixins/hooks/TextHighlightHooks.java | 23 +- .../angelica/profiling/TracyFramePlots.java | 24 +- .../angelica/render/CloudFaceMesh.java | 54 +- .../angelica/render/CloudLayerRenderer.java | 99 +- .../angelica/render/CloudRenderResources.java | 25 +- .../angelica/render/CloudRenderer.java | 7 +- .../angelica/render/CloudVertexMesh.java | 34 +- .../angelica/render/PanoramaRenderer.java | 152 +- .../angelica/render/SelectionBoxRenderer.java | 24 +- .../angelica/render/WeatherRenderer.java | 71 +- .../rendering/BlockMaterialAttribute.java | 6 +- .../rendering/DeferredEntityOverlay.java | 25 +- .../angelica/rendering/FramePacer.java | 3 +- .../angelica/rendering/GlintClock.java | 8 +- .../rendering/GuiBlockSupersampling.java | 6 +- .../rendering/PlayerReflectionCapture.java | 91 +- .../angelica/rendering/SkippedGlintBlock.java | 33 +- .../celeritas/AngelicaChunkRenderer.java | 7 +- .../AngelicaRenderPassConfiguration.java | 19 +- .../celeritas/CeleritasWorldRenderer.java | 12 +- .../culling/GpuDrivenChunkCuller.java | 39 +- .../rendering/culling/GpuTerrainCuller.java | 31 +- .../items/BlockRenderListManager.java | 20 +- .../rendering/items/DroppedItemInstancer.java | 23 +- .../angelica/rendering/items/ItemGlint.java | 10 +- .../items/ItemRenderListManager.java | 23 +- .../particles/BopParticleDescriptors.java | 6 +- .../particles/ParticleCaptureTessellator.java | 4 +- .../particles/ParticleInstancer.java | 31 +- .../particles/ParticleRenderState.java | 23 +- .../rendering/tesr/BakedTransformCapture.java | 4 +- .../rendering/tesr/BatchDrawDefaults.java | 27 +- .../rendering/tesr/BatchStateFallback.java | 17 +- .../rendering/tesr/BeaconBeamMeshes.java | 40 +- .../angelica/rendering/tesr/DrawState.java | 77 +- .../rendering/tesr/EntityMaterials.java | 31 +- .../rendering/tesr/EntityShadowBatcher.java | 18 +- .../rendering/tesr/EntityShadowReplay.java | 15 +- .../rendering/tesr/EntityTextureAtlas.java | 61 +- .../angelica/rendering/tesr/GlintCapture.java | 39 +- .../tesr/InstancedTemplateRenderer.java | 104 +- .../angelica/rendering/tesr/MeshBuffer.java | 10 +- .../rendering/tesr/ModelPartBatcher.java | 94 +- .../rendering/tesr/PassRebindGate.java | 11 +- .../rendering/tesr/RetainedTesrGroups.java | 39 +- .../rendering/tesr/TesrBatchRenderer.java | 41 +- .../rendering/tesr/TesrProviderDispatch.java | 6 +- .../rendering/tesr/TesrShaderPrograms.java | 60 +- .../rendering/tesr/VanillaModelMeshes.java | 18 +- .../SdlShadowVoxelizationSink.java | 10 +- .../angelica/shadercompat/ShaderGlint.java | 33 +- .../textures/atlas/AtlasAssembler.java | 10 +- .../com/prupe/mcpatcher/cc/ColorizeBlock.java | 4 +- .../com/prupe/mcpatcher/cit/Enchantment.java | 113 +- .../prupe/mcpatcher/hd/CustomAnimation.java | 11 +- .../com/prupe/mcpatcher/hd/FancyDial.java | 147 +- .../com/prupe/mcpatcher/hd/MipmapHelper.java | 27 +- .../mcpatcher/mal/resource/BlendMethod.java | 26 +- .../prupe/mcpatcher/mal/resource/GLAPI.java | 8 +- .../com/prupe/mcpatcher/mob/LineRenderer.java | 9 +- .../mcpatcher/renderpass/RenderPass.java | 30 +- .../com/prupe/mcpatcher/sky/SkyRenderer.java | 40 +- .../java/jss/notfine/render/RenderStars.java | 6 +- .../client/gui/frame/AbstractFrame.java | 8 +- .../client/gui/widgets/AbstractWidget.java | 13 +- .../impl/AngelicaBufferSource.java | 21 +- .../IrisCeleritasChunkShaderInterface.java | 15 +- .../iris/compat/dh/DHCompatInternal.java | 6 +- .../iris/compat/dh/DhFrameBufferWrapper.java | 4 +- .../compat/dh/IrisGenericRenderProgram.java | 78 +- .../iris/compat/dh/IrisLodRenderProgram.java | 47 +- .../iris/compat/dh/LodRendererEvents.java | 22 +- .../matching/TranslucentBlendMatcher.java | 6 +- .../iris/gl/blending/AlphaTestStorage.java | 18 +- .../iris/gl/blending/BlendModeStorage.java | 18 +- .../iris/gl/blending/DepthColorStorage.java | 15 +- .../iris/gl/buffer/ShaderStorageBuffer.java | 6 +- .../gl/buffer/ShaderStorageBufferHolder.java | 6 +- .../iris/gl/framebuffer/GlFramebuffer.java | 17 +- .../net/coderbot/iris/gl/image/GlImage.java | 12 +- .../iris/gl/program/ComputeProgram.java | 8 +- .../net/coderbot/iris/gl/program/Program.java | 7 +- .../iris/gl/program/ProgramBuilder.java | 14 +- .../iris/gl/program/ProgramImages.java | 6 +- .../iris/gl/program/ProgramSamplers.java | 6 +- .../iris/gl/program/ProgramUniforms.java | 8 +- .../iris/gl/program/RetainedPrograms.java | 4 +- .../iris/gl/sampler/SamplerLimits.java | 8 +- .../net/coderbot/iris/gl/shader/GlShader.java | 12 +- .../iris/gl/shader/ProgramCreator.java | 10 +- .../iris/gl/shader/StandardMacros.java | 12 +- .../iris/gl/texture/DepthCopyStrategy.java | 3 +- .../coderbot/iris/gl/texture/GlTexture.java | 8 +- .../iris/gl/texture/TextureUploadHelper.java | 10 +- .../java/net/coderbot/iris/gui/GuiUtil.java | 23 +- .../iris/gui/element/IrisGuiSlot.java | 25 +- .../element/shaderoptions/HeaderEntry.java | 4 +- .../gui/element/widget/IrisImageButton.java | 9 +- .../iris/gui/screen/ShaderPackScreen.java | 6 +- .../coderbot/iris/layer/GbufferPrograms.java | 22 +- .../net/coderbot/iris/pipeline/ClearPass.java | 10 +- .../iris/pipeline/ClearPassCreator.java | 6 +- .../iris/pipeline/CustomTextureManager.java | 9 +- .../DeferredWorldRenderingPipeline.java | 69 +- .../FixedFunctionWorldRenderingPipeline.java | 4 +- .../coderbot/iris/pipeline/HandRenderer.java | 59 +- .../iris/pipeline/HorizonRenderer.java | 10 +- .../iris/pipeline/PipelineManager.java | 8 +- .../iris/pipeline/ShadowRenderer.java | 53 +- .../transform/PreRasterComputeDispatcher.java | 13 +- .../iris/postprocess/CenterDepthSampler.java | 14 +- .../iris/postprocess/CompositeRenderer.java | 24 +- .../iris/postprocess/FinalPassRenderer.java | 34 +- .../postprocess/FullScreenQuadRenderer.java | 69 +- .../iris/rendertarget/ColorTexture.java | 7 +- .../iris/rendertarget/DepthTexture.java | 6 +- .../iris/rendertarget/NoiseTexture.java | 10 +- .../iris/rendertarget/RenderTarget.java | 8 +- .../iris/rendertarget/RenderTargets.java | 8 +- .../iris/rendertarget/SingleColorTexture.java | 4 +- .../iris/shadows/ShadowCompositeRenderer.java | 15 +- .../iris/shadows/ShadowRenderTargets.java | 9 +- .../iris/texture/pbr/PBRTextureManager.java | 7 +- .../iris/texture/util/TextureExporter.java | 4 +- .../texture/util/TextureManipulationUtil.java | 36 +- .../iris/uniforms/CommonUniforms.java | 16 +- .../coderbot/iris/uniforms/FogUniforms.java | 12 +- .../iris/uniforms/IrisInternalUniforms.java | 30 +- .../coderbot/iris/uniforms/ItemIdManager.java | 6 +- .../custom/cached/BooleanCachedUniform.java | 4 +- .../cached/Float2VectorCachedUniform.java | 4 +- .../cached/Float3VectorCachedUniform.java | 4 +- .../cached/Float4MatrixCachedUniform.java | 4 +- .../cached/Float4VectorCachedUniform.java | 4 +- .../custom/cached/FloatCachedUniform.java | 4 +- .../cached/Int2VectorCachedUniform.java | 4 +- .../cached/Int3VectorCachedUniform.java | 4 +- .../custom/cached/IntCachedUniform.java | 4 +- .../MixinForgeHooksClient_CoreProfile.java | 10 +- .../mixins/early/angelica/MixinMinecraft.java | 3 +- .../angelica/animation/MixinTextureMap.java | 4 +- .../archaic/MixinSplashProgress$3.java | 12 +- .../bugfixes/MixinItemRenderer_EdgeDepth.java | 40 +- .../MixinRenderGlobal_DestroyBlock.java | 12 +- .../MixinRenderMooshroom_MushroomTint.java | 6 +- .../MixinRendererLivingEntity_EyeDepth.java | 11 +- ...MixinRendererLivingEntity_OverlayTint.java | 29 +- .../angelica/debug/MixinTextureManager.java | 8 +- .../angelica/entity/MixinModelRenderer.java | 8 +- .../entity/MixinRenderItem_Instanced.java | 6 +- .../MixinRenderManager_BatchEligibility.java | 6 +- .../entity/MixinRender_NameTagDraws.java | 6 +- ...xinRendererLivingEntity_EquippedDraws.java | 6 +- .../MixinRendererLivingEntity_GlintClock.java | 19 +- ...inRendererLivingEntity_ModelPassDraws.java | 6 +- .../angelica/entity/MixinTextureManager.java | 4 +- .../fontrenderer/MixinFontRenderer.java | 9 +- .../fontrenderer/MixinGuiIngameForge.java | 14 +- .../angelica/hudcaching/MixinRenderItem.java | 4 +- .../optimizations/MixinGLAllocation.java | 8 +- .../MixinTileEntityRendererDispatcher.java | 6 +- .../textures/MixinRenderItem_GuiSampler.java | 4 +- .../early/angelica/vbo/MixinFramebuffer.java | 44 +- .../features/textures/MixinTextureMap.java | 4 +- .../celeritas/terrain/MixinRenderGlobal.java | 13 +- .../MixinShaderRegistry_ParseError.java | 4 +- .../base/MixinAbstractTexture.java | 4 +- .../renderer/entity/MixinRenderWolf.java | 4 +- .../entity/MixinRenderEntityLiving.java | 111 +- .../renderer/entity/MixinRenderItem.java | 30 +- .../mcpatcherforge/mob/MixinRenderFish.java | 27 +- .../mcpatcherforge/mob/MixinRenderLiving.java | 14 +- .../notfine/clouds/MixinRenderGlobal.java | 35 +- .../early/shaders/MixinEntityRenderer.java | 16 +- .../early/shaders/MixinFramebuffer.java | 22 +- .../early/shaders/MixinGuiIngameForge.java | 4 +- .../early/shaders/MixinRenderDragon.java | 6 +- .../early/shaders/MixinRenderEndPortal.java | 4 +- .../early/shaders/MixinRenderGlobal.java | 4 +- .../MixinTileEntityRendererDispatcher.java | 6 +- .../chisel/MixinRenderCarvableBeacon.java | 6 +- .../ntmSpace/MixinSkyProviderCelestial.java | 15 +- .../ntmSpace/MixinSkyProviderOrbit.java | 12 +- .../toggle/biomesoplenty/MixinFogHandler.java | 14 +- .../angelica/api/GLRedirectsTest.java | 54 +- .../angelica/api/glstate/GLState_GLTest.java | 109 + .../client/font/FontFilterLightmapGLTest.java | 107 +- .../client/font/FontProviderCustomGLTest.java | 6 +- .../angelica/client/font/FontTestFixture.java | 8 +- .../client/font/TextDrawStateGLTest.java | 49 +- .../angelica/client/font/TextMeshGLTest.java | 62 +- .../PlacedItemRenderCompatTest.java | 50 +- .../compat/thaumcraft/PortalDrawerTest.java | 265 +- .../screen/DebugOptionsScreenGLTest.java | 15 +- .../screen/DebugOverlayFallbackGLTest.java | 21 +- .../screen/renderers/DebugMeshGLTest.java | 154 +- .../iris/IrisDisplayListStateTest.java | 302 +- .../loading/GLSMApiRedirectsTest.java | 130 + .../fml/compat/KaizPatchXTransformerTest.java | 69 + .../PlayerReflectionSsboMappingTest.java | 53 +- .../celeritas/TerrainShaderLinkTest.java | 24 +- .../culling/CullingShaderCompileTest.java | 4 +- .../culling/IndirectCullDrawParityTest.java | 83 +- .../culling/MultiDrawCompatStompTest.java | 58 +- .../culling/ShadowSnapshotBlitTest.java | 98 +- .../items/ItemTemplateCaptureGLTest.java | 34 +- .../particles/ParticleInstancingGLTest.java | 12 +- .../particles/ParticleRenderStateGLTest.java | 23 +- .../rendering/tesr/BatchStateGuardGLTest.java | 220 +- .../tesr/EntityShadowReplayGLTest.java | 296 +- .../tesr/EntityTextureAtlasGLTest.java | 93 +- .../tesr/RetainedTesrGroupsGLTest.java | 358 +- .../tesr/StateSetOverrideGLTest.java | 238 +- .../rendering/tesr/TesrLayerStateTest.java | 316 +- .../tesr/TesrShaderProgramsGLTest.java | 91 +- .../rendering/tesr/VanillaLayerRig.java | 27 +- .../DisplayListTextureAnimationTest.java | 14 +- .../program/ProgramBindingRegressionTest.java | 97 +- .../AttributeTransformerLinkGLTest.java | 26 +- .../iris/pipeline/IrisInstancingGLTest.java | 152 +- .../pipeline/PbrSamplerBindingGLTest.java | 33 +- .../early/glsm/MixinMinecraft_FrameHook.java | 3 +- .../glsm/MixinWorldRenderer_VertexState.java | 7 +- 494 files changed, 22968 insertions(+), 20523 deletions(-) create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMAttribStack.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBlend.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBuffers.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMCurrentAttribs.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDepthStencilAlpha.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDraws.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMEnable.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFog.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFramebuffer.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMLighting.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMMatrices.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMPrograms.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMQueries.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMRasterizer.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTexEnvGen.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextureLifetime.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextures.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMVertexInput.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMOwners.java create mode 100644 glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/LegacyRewriter.java create mode 100644 glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Groups_UnitTest.java create mode 100644 glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/DefiningClassLoader.java create mode 100644 glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/GlsmClasses.java create mode 100644 src/main/java/com/gtnewhorizons/angelica/api/glstate/GLState.java create mode 100644 src/main/java/com/gtnewhorizons/angelica/api/glstate/package-info.java create mode 100644 src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/handlers/KaizPatchXCompatHandler.java create mode 100644 src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/transformers/specific/KaizPatchXTransformer.java create mode 100644 src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/GLSMApiRedirects.java create mode 100644 src/test/java/com/gtnewhorizons/angelica/api/glstate/GLState_GLTest.java create mode 100644 src/test/java/com/gtnewhorizons/angelica/loading/GLSMApiRedirectsTest.java create mode 100644 src/test/java/com/gtnewhorizons/angelica/loading/fml/compat/KaizPatchXTransformerTest.java diff --git a/experimental-surround/runtime/src/main/java/com/gtnewhorizons/angelica/experimental/surround/Surround.java b/experimental-surround/runtime/src/main/java/com/gtnewhorizons/angelica/experimental/surround/Surround.java index e50c14c40..97230b120 100644 --- a/experimental-surround/runtime/src/main/java/com/gtnewhorizons/angelica/experimental/surround/Surround.java +++ b/experimental-surround/runtime/src/main/java/com/gtnewhorizons/angelica/experimental/surround/Surround.java @@ -78,8 +78,8 @@ import java.lang.annotation.Target; *
  * @Surround(method = ..., at = @At(value = "INVOKE", target = ...))
  * private void enter() {
- *     @Surround.Carry("depth") int depth = GLStateManager.pushState(StateSet.BLEND);
- *     @Surround.Carry("prev") int prevProgram = GLStateManager.getActiveProgram();
+ *     @Surround.Carry("depth") int depth = GLSMAttribStack.pushState(StateSet.BLEND);
+ *     @Surround.Carry("prev") int prevProgram = GLSMPrograms.getActiveProgram();
  *     @Surround.Carry Class<?> prevRenderable = TesrAttribution.currentRenderable;
  * }
  *
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
index e2d51f88e..e5e539f62 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/CompatUniformManager.java
@@ -257,8 +257,8 @@ public class CompatUniformManager {
     }
 
     private static void uploadMatrices(int[] locs, boolean mvChanged, boolean mvLinearChanged, boolean projChanged, boolean texMatChanged) {
-        final Matrix4f mv = GLStateManager.getModelViewMatrix();
-        final Matrix4f proj = GLStateManager.getProjectionMatrix();
+        final Matrix4f mv = GLSMMatrices.getModelViewMatrix();
+        final Matrix4f proj = GLSMMatrices.getProjectionMatrix();
 
         if (mvChanged) {
             // ModelView
@@ -340,13 +340,13 @@ public class CompatUniformManager {
 
             // angelica_LightmapTextureMatrix — actual GLSM texture unit 1 matrix (set by enableLightmap())
             if (locs[LOC_LIGHTMAP_TEXTURE_MATRIX] != -1) {
-                GLStateManager.getTextures().getTextureUnitMatrix(1).get(mat4Buf);
+                GLSMTextures.getTextures().getTextureUnitMatrix(1).get(mat4Buf);
                 RENDER_BACKEND.uniformMatrix4(locs[LOC_LIGHTMAP_TEXTURE_MATRIX], false, mat4Buf);
             }
 
             // iris_TextureMatrix — texture unit 0 matrix (animated by glints, etc.)
             if (locs[LOC_IRIS_TEXTURE_MATRIX] != -1) {
-                GLStateManager.getTextures().getTextureUnitMatrix(0).get(mat4Buf);
+                GLSMTextures.getTextures().getTextureUnitMatrix(0).get(mat4Buf);
                 RENDER_BACKEND.uniformMatrix4(locs[LOC_IRIS_TEXTURE_MATRIX], false, mat4Buf);
             }
         }
@@ -359,7 +359,7 @@ public class CompatUniformManager {
 
     private static void uploadFragmentUniforms(int[] locs) {
         // Fog uniforms
-        FogStateStack fog = GLStateManager.getFogState();
+        FogStateStack fog = GLSMFog.getFogState();
         if (locs[LOC_FOG_DENSITY] != -1) {
             RENDER_BACKEND.uniform1f(locs[LOC_FOG_DENSITY], Math.max(0.0f, fog.getDensity()));
         }
@@ -383,10 +383,10 @@ public class CompatUniformManager {
         // Return -1.0f for ALWAYS or disabled so `alpha <= ref` never discards.
         if (locs[LOC_ALPHA_TEST_REF] != -1) {
             final float ref;
-            if (!GLStateManager.getAlphaTest().isEnabled() || GLStateManager.getAlphaState().getFunction() == GL11.GL_ALWAYS) {
+            if (!GLSMDepthStencilAlpha.getAlphaTest().isEnabled() || GLSMDepthStencilAlpha.getAlphaState().getFunction() == GL11.GL_ALWAYS) {
                 ref = -1.0f;
             } else {
-                ref = GLStateManager.getAlphaState().getReference();
+                ref = GLSMDepthStencilAlpha.getAlphaState().getReference();
             }
             RENDER_BACKEND.uniform1f(locs[LOC_ALPHA_TEST_REF], ref);
         }
@@ -396,8 +396,8 @@ public class CompatUniformManager {
      * Scene color = emission + ambient * lightModel.ambient, alpha = diffuse.a Same computation as {@code Uniforms.uploadLightingPreComputed()}.
      */
     private static void uploadSceneColor(int[] locs) {
-        final MaterialState mat = GLStateManager.getFrontMaterial();
-        final LightModelState lm = GLStateManager.getLightModel();
+        final MaterialState mat = GLSMLighting.getFrontMaterial();
+        final LightModelState lm = GLSMLighting.getLightModel();
         vec4Buf.clear();
         vec4Buf.put(mat.emission.x + mat.ambient.x * lm.ambient.x)
                .put(mat.emission.y + mat.ambient.y * lm.ambient.y)
@@ -408,7 +408,7 @@ public class CompatUniformManager {
     }
 
     private static void uploadLightSources(int[] locs) {
-        final LightStateStack[] lights = GLStateManager.getLightDataStates();
+        final LightStateStack[] lights = GLSMLighting.getLightDataStates();
         for (int li = 0; li < 2; li++) {
             final int base = LOC_LIGHT_BASE + li * LIGHT_FIELDS;
             final LightState light = lights[li];
@@ -455,7 +455,7 @@ public class CompatUniformManager {
     private static void uploadMaterial(int[] locs) {
         // Early exit: if the first material field isn't present, no material uniforms exist
         if (locs[LOC_MAT_BASE] == -1) return;
-        final MaterialState mat = GLStateManager.getFrontMaterial();
+        final MaterialState mat = GLSMLighting.getFrontMaterial();
         if (locs[LOC_MAT_BASE + MF_EMISSION] != -1)
             RENDER_BACKEND.uniform4f(locs[LOC_MAT_BASE + MF_EMISSION], mat.emission.x, mat.emission.y, mat.emission.z, mat.emission.w);
         if (locs[LOC_MAT_BASE + MF_AMBIENT] != -1)
@@ -470,10 +470,10 @@ public class CompatUniformManager {
 
     private static void uploadClipPlanes(int[] locs) {
         if (locs[LOC_CLIP_PLANES_ENABLED] != -1) {
-            RENDER_BACKEND.uniform1i(locs[LOC_CLIP_PLANES_ENABLED], GLStateManager.anyClipPlaneEnabled() ? 1 : 0);
+            RENDER_BACKEND.uniform1i(locs[LOC_CLIP_PLANES_ENABLED], GLSMRasterizer.anyClipPlaneEnabled() ? 1 : 0);
         }
         if (locs[LOC_CLIP_PLANES] != -1) {
-            final ClipPlaneState cps = GLStateManager.getClipPlaneState();
+            final ClipPlaneState cps = GLSMRasterizer.getClipPlaneState();
             clipPlaneBuf.clear();
             for (int i = 0; i < GLStateManager.MAX_CLIP_PLANES; i++) {
                 cps.putEyePlane(i, clipPlaneBuf);
diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
index 4ec89f1b5..614325293 100644
--- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
+++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/DisplayListManager.java
@@ -80,7 +80,7 @@ public class DisplayListManager {
     private static int glListMode = 0;
     private static int glListId = -1;
     private static int recordedStatePushes;
-    private static final DisplayListCommand POP_STATE = GLStateManager::popState;
+    private static final DisplayListCommand POP_STATE = GLSMAttribStack::popState;
     private static CommandRecorder currentRecorder = null;  // Command recorder (null when not recording)
     private static volatile Thread recordingThread = null;  // Thread that started recording (for thread-safety)
     private static List accumulatedDraws = null;  // Accumulates quad draws for batching
@@ -237,7 +237,7 @@ public class DisplayListManager {
             currentRecorder.writeMultMatrix(pending);
         }
         if (glListMode == GL11.GL_COMPILE_AND_EXECUTE) {
-            GLStateManager.applyMultMatrix(pending);
+            GLSMMatrices.applyMultMatrix(pending);
         }
 
 
@@ -722,7 +722,7 @@ public class DisplayListManager {
 
     /**
      * Add an immediate mode draw to the current display list compilation.
-     * Called by GLStateManager.glEnd() when immediate mode geometry is ready.
+     * Called by GLSMDraws.glEnd() when immediate mode geometry is ready.
      *
      * 

This method captures the current transform and command position, creating * an AccumulatedDraw that will be interleaved correctly with other commands @@ -781,7 +781,7 @@ public class DisplayListManager { /** * Update the relative transform with a matrix multiplication during display list compilation. - * Called by GLStateManager.glMultMatrix(). + * Called by GLSMMatrices.glMultMatrix(). * *

In normal mode: accumulates transforms, emits collapsed MultMatrix at barriers. *

In debug mode: emits MultMatrix immediately (no collapsing). @@ -833,7 +833,7 @@ public class DisplayListManager { /** * Reset the relative transform to identity during display list compilation. - * Called by GLStateManager.glLoadMatrix() - after loading an absolute matrix, + * Called by GLSMMatrices.glLoadMatrix() - after loading an absolute matrix, * subsequent transforms are relative to that loaded matrix (i.e., start from identity). */ static void resetRelativeTransform() { @@ -1147,7 +1147,7 @@ public class DisplayListManager { } if (pendingDraw.drawMode != tessellator.drawMode || pendingDraw.format != tessellator.getVertexFormat() - || GLStateManager.isContinuousDraw(tessellator.drawMode) + || GLSMDraws.isContinuousDraw(tessellator.drawMode) ) { drawBarrier(); createNewDraw(tessellator, copyLast); diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ExitStateCapture.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ExitStateCapture.java index ff64e1b26..e6b5192b8 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ExitStateCapture.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ExitStateCapture.java @@ -160,8 +160,8 @@ final class ExitStateCapture { textureInherited = true; modelView.set(context.modelViewMatrix); attribDepth = context.attribDepth; - modelViewDepth = GLStateManager.getMatrixStackDepth(context.modelViewMatrix); - textureDepth = GLStateManager.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0)); + modelViewDepth = GLSMMatrices.getMatrixStackDepth(context.modelViewMatrix); + textureDepth = GLSMMatrices.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0)); entryOverrides = overridesInControl(); } @@ -185,8 +185,8 @@ final class ExitStateCapture { } private boolean stacksMatchEntry() { - return context.attribDepth == attribDepth && GLStateManager.getMatrixStackDepth(context.modelViewMatrix) == modelViewDepth - && GLStateManager.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0)) == textureDepth && modelView.equals(context.modelViewMatrix); + return context.attribDepth == attribDepth && GLSMMatrices.getMatrixStackDepth(context.modelViewMatrix) == modelViewDepth + && GLSMMatrices.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0)) == textureDepth && modelView.equals(context.modelViewMatrix); } void cancel() { @@ -448,7 +448,7 @@ final class ExitStateCapture { if (result == null) return; final int mode = context.matrixMode.getMode(); if (mode == GL11.GL_TEXTURE && context.activeTextureUnit.getValue() == 0) { - final int depth = GLStateManager.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0)); + final int depth = GLSMMatrices.getMatrixStackDepth(context.textures.getTextureUnitMatrix(0)); if (depth < matrixWrites.length) { matrixWrites[depth] = result.writes; matrixInherited[depth] = textureInherited; @@ -476,7 +476,7 @@ final class ExitStateCapture { reject(); return; } - final int depth = GLStateManager.getMatrixStackDepth(matrix); + final int depth = GLSMMatrices.getMatrixStackDepth(matrix); if (depth <= entryDepth) { result.valid = false; return; @@ -549,34 +549,34 @@ final class ExitStateCapture { // Capabilities go first so the glColor4f below bakes into the material only if color material is on at exit. for (int field = 0; field < CAPS.length; field++) { if (!has(fields, field)) continue; - if (field == TEXTURE0 || field == TEXTURE1) GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + field - TEXTURE0); + if (field == TEXTURE0 || field == TEXTURE1) GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + field - TEXTURE0); // glEnable would bake the live color, not the exit color, into the material. if (field == COLOR_MATERIAL) { context.colorMaterial.setEnabled((in.enabled & (1L << field)) != 0); - } else if ((in.enabled & (1L << field)) != 0) GLStateManager.glEnable(CAPS[field]); - else GLStateManager.glDisable(CAPS[field]); + } else if ((in.enabled & (1L << field)) != 0) GLSMEnable.glEnable(CAPS[field]); + else GLSMEnable.glDisable(CAPS[field]); } - if (has(fields, COLOR)) GLStateManager.glColor4f(in.color.getRed(), in.color.getGreen(), in.color.getBlue(), in.color.getAlpha()); - if (has(fields, NORMAL)) GLStateManager.glNormal3f(in.normal.x, in.normal.y, in.normal.z); - if (has(fields, TEXCOORD)) GLStateManager.glTexCoord4f(in.texCoord.x, in.texCoord.y, in.texCoord.z, in.texCoord.w); - if (has(fields, LIGHTMAP)) GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, in.lightmapX, in.lightmapY); - if (has(fields, SHADER_COLOR)) GLStateManager.setShaderColor(in.shaderColor.x, in.shaderColor.y, in.shaderColor.z, in.shaderColor.w); - if (has(fields, OVERLAY_COLOR)) GLStateManager.setOverlayColor(in.overlayColor.x, in.overlayColor.y, in.overlayColor.z, in.overlayColor.w); - if (has(fields, BLEND_FUNC)) GLStateManager.tryBlendFuncSeparate(in.blend.getSrcRgb(), in.blend.getDstRgb(), in.blend.getSrcAlpha(), in.blend.getDstAlpha()); - if (has(fields, ALPHA_FUNC)) GLStateManager.glAlphaFunc(in.alpha.getFunction(), in.alpha.getReference()); - if (has(fields, DEPTH_FUNC)) GLStateManager.glDepthFunc(in.depthFunction); - if (has(fields, DEPTH_MASK)) GLStateManager.glDepthMask(in.depthMask); - if (has(fields, COLOR_MASK)) GLStateManager.glColorMask(in.colorMask.red, in.colorMask.green, in.colorMask.blue, in.colorMask.alpha); - if (has(fields, CULL_FACE)) GLStateManager.glCullFace(in.cullFace); - if (has(fields, FRONT_FACE)) GLStateManager.glFrontFace(in.frontFace); - if (has(fields, SHADE_MODEL)) GLStateManager.glShadeModel(in.shadeModel); - if (has(fields, OFFSET_VALUES)) GLStateManager.glPolygonOffsetClamp(in.offsetFactor, in.offsetUnits, in.offsetClamp); + if (has(fields, COLOR)) GLSMCurrentAttribs.glColor4f(in.color.getRed(), in.color.getGreen(), in.color.getBlue(), in.color.getAlpha()); + if (has(fields, NORMAL)) GLSMCurrentAttribs.glNormal3f(in.normal.x, in.normal.y, in.normal.z); + if (has(fields, TEXCOORD)) GLSMCurrentAttribs.glTexCoord4f(in.texCoord.x, in.texCoord.y, in.texCoord.z, in.texCoord.w); + if (has(fields, LIGHTMAP)) GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, in.lightmapX, in.lightmapY); + if (has(fields, SHADER_COLOR)) GLSMCurrentAttribs.setShaderColor(in.shaderColor.x, in.shaderColor.y, in.shaderColor.z, in.shaderColor.w); + if (has(fields, OVERLAY_COLOR)) GLSMCurrentAttribs.setOverlayColor(in.overlayColor.x, in.overlayColor.y, in.overlayColor.z, in.overlayColor.w); + if (has(fields, BLEND_FUNC)) GLSMBlend.tryBlendFuncSeparate(in.blend.getSrcRgb(), in.blend.getDstRgb(), in.blend.getSrcAlpha(), in.blend.getDstAlpha()); + if (has(fields, ALPHA_FUNC)) GLSMDepthStencilAlpha.glAlphaFunc(in.alpha.getFunction(), in.alpha.getReference()); + if (has(fields, DEPTH_FUNC)) GLSMDepthStencilAlpha.glDepthFunc(in.depthFunction); + if (has(fields, DEPTH_MASK)) GLSMDepthStencilAlpha.glDepthMask(in.depthMask); + if (has(fields, COLOR_MASK)) GLSMBlend.glColorMask(in.colorMask.red, in.colorMask.green, in.colorMask.blue, in.colorMask.alpha); + if (has(fields, CULL_FACE)) GLSMRasterizer.glCullFace(in.cullFace); + if (has(fields, FRONT_FACE)) GLSMRasterizer.glFrontFace(in.frontFace); + if (has(fields, SHADE_MODEL)) GLSMRasterizer.glShadeModel(in.shadeModel); + if (has(fields, OFFSET_VALUES)) GLSMRasterizer.glPolygonOffsetClamp(in.offsetFactor, in.offsetUnits, in.offsetClamp); if (has(fields, TEXTURE_BINDING)) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, in.texture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, in.texture); } - if (has(fields, TEXTURE_MATRIX)) GLStateManager.setTextureMatrix(0, in.textureMatrix); - if (has(fields, COLOR_MATERIAL_SETTINGS)) GLStateManager.glColorMaterial(in.materialFace, in.materialParameter); + if (has(fields, TEXTURE_MATRIX)) GLSMMatrices.setTextureMatrix(0, in.textureMatrix); + if (has(fields, COLOR_MATERIAL_SETTINGS)) GLSMLighting.glColorMaterial(in.materialFace, in.materialParameter); boolean materialChanged = false; for (int field = FRONT_AMBIENT; field <= BACK_EMISSION; field++) { if (!has(fields, field)) continue; @@ -590,8 +590,8 @@ final class ExitStateCapture { materialChanged = true; } if (materialChanged) context.lightingGeneration++; - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + (has(fields, ACTIVE_UNIT) ? in.activeUnit : liveUnit)); - if (has(fields, CLIENT_ACTIVE_UNIT)) GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0 + in.clientActiveUnit); - if (has(fields, MATRIX_MODE)) GLStateManager.glMatrixMode(in.matrixMode); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + (has(fields, ACTIVE_UNIT) ? in.activeUnit : liveUnit)); + if (has(fields, CLIENT_ACTIVE_UNIT)) GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0 + in.clientActiveUnit); + if (has(fields, MATRIX_MODE)) GLSMMatrices.glMatrixMode(in.matrixMode); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java index 614374918..6a56399f5 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/Feature.java @@ -68,10 +68,10 @@ public class Feature { */ private static void addTextureGenStates(Set> collection) { for(int i = 0 ; i < GLStateManager.MAX_TEXTURE_UNITS; i++) { - collection.add(GLStateManager.getTextures().getTexGenSStates(i)); - collection.add(GLStateManager.getTextures().getTexGenTStates(i)); - collection.add(GLStateManager.getTextures().getTexGenRStates(i)); - collection.add(GLStateManager.getTextures().getTexGenQStates(i)); + collection.add(GLSMTextures.getTextures().getTexGenSStates(i)); + collection.add(GLSMTextures.getTextures().getTexGenTStates(i)); + collection.add(GLSMTextures.getTextures().getTexGenRStates(i)); + collection.add(GLSMTextures.getTextures().getTexGenQStates(i)); } } @@ -79,24 +79,24 @@ public class Feature { final Int2ObjectMap>> attribToFeatures = new Int2ObjectOpenHashMap<>(); attribToFeatures.put(GL11.GL_COLOR_BUFFER_BIT, ImmutableSet.of( - GLStateManager.getAlphaTest() - , GLStateManager.getAlphaState() - , GLStateManager.getBlendMode() - , GLStateManager.getBlendState() - , GLStateManager.getColorLogicOpState() - , GLStateManager.getDitherState() - , GLStateManager.getDrawBuffer() - , GLStateManager.getIndexLogicOpState() - , GLStateManager.getLogicOpMode() - , GLStateManager.getColorMask() - , GLStateManager.getClearColor() + GLSMDepthStencilAlpha.getAlphaTest() + , GLSMDepthStencilAlpha.getAlphaState() + , GLSMBlend.getBlendMode() + , GLSMBlend.getBlendState() + , GLSMBlend.getColorLogicOpState() + , GLSMRasterizer.getDitherState() + , GLSMFramebuffer.getDrawBuffer() + , GLSMBlend.getIndexLogicOpState() + , GLSMBlend.getLogicOpMode() + , GLSMBlend.getColorMask() + , GLSMBlend.getClearColor() )); attribToFeatures.put(GL11.GL_CURRENT_BIT, ImmutableSet.of( - GLStateManager.getColor() - , GLStateManager.getSecondaryColor() // Current secondary color + GLSMCurrentAttribs.getColor() + , GLSMCurrentAttribs.getSecondaryColor() // Current secondary color , ShaderManager.getNormalStack() // Current normal vector , ShaderManager.getTexCoordStack() // Current texture coordinates - , GLStateManager.getEdgeFlagState() + , GLSMRasterizer.getEdgeFlagState() // Current color index // Current raster position // GL_CURRENT_RASTER_POSITION_VALID flag @@ -106,82 +106,82 @@ public class Feature { // GL_EDGE_FLAG flag )); attribToFeatures.put(GL11.GL_DEPTH_BUFFER_BIT, ImmutableSet.of( - GLStateManager.getDepthTest() - , GLStateManager.getDepthState() + GLSMDepthStencilAlpha.getDepthTest() + , GLSMDepthStencilAlpha.getDepthState() // Depth buffer clear value // GL_DEPTH_WRITEMASK enable bit )); final HashSet> enableBits = new HashSet<>(ImmutableSet.of( - GLStateManager.getAlphaTest() - , GLStateManager.getAutoNormalState() - , GLStateManager.getBlendMode() - , GLStateManager.getColorLogicOpState() - , GLStateManager.getColorMaterial() - , GLStateManager.getColorSumState() - , GLStateManager.getCullState() - , GLStateManager.getDepthTest() - , GLStateManager.getDitherState() - , GLStateManager.getFogMode() - , GLStateManager.getIndexLogicOpState() - , GLStateManager.getLightStates()[0] // GL_LIGHT0 - , GLStateManager.getLightStates()[1] // GL_LIGHT1 - , GLStateManager.getLightStates()[2] // GL_LIGHT2 - , GLStateManager.getLightStates()[3] // GL_LIGHT3 - , GLStateManager.getLightStates()[4] // GL_LIGHT4 - , GLStateManager.getLightStates()[5] // GL_LIGHT5 - , GLStateManager.getLightStates()[6] // GL_LIGHT6 - , GLStateManager.getLightStates()[7] // GL_LIGHT7 - , GLStateManager.getLightingState() - , GLStateManager.getLineSmoothState() - , GLStateManager.getLineStippleState() - , GLStateManager.getMap1Color4State() - , GLStateManager.getMap1IndexState() - , GLStateManager.getMap1NormalState() - , GLStateManager.getMap1TextureCoord1State() - , GLStateManager.getMap1TextureCoord2State() - , GLStateManager.getMap1TextureCoord3State() - , GLStateManager.getMap1TextureCoord4State() - , GLStateManager.getMap1Vertex3State() - , GLStateManager.getMap1Vertex4State() - , GLStateManager.getMap2Color4State() - , GLStateManager.getMap2IndexState() - , GLStateManager.getMap2NormalState() - , GLStateManager.getMap2TextureCoord1State() - , GLStateManager.getMap2TextureCoord2State() - , GLStateManager.getMap2TextureCoord3State() - , GLStateManager.getMap2TextureCoord4State() - , GLStateManager.getMap2Vertex3State() - , GLStateManager.getMap2Vertex4State() - , GLStateManager.getMultisampleState() - , GLStateManager.getNormalizeState() - , GLStateManager.getPointSmoothState() - , GLStateManager.getPolygonOffsetPointState() - , GLStateManager.getPolygonOffsetLineState() - , GLStateManager.getPolygonOffsetFillState() - , GLStateManager.getPointSpriteState() - , GLStateManager.getVertexProgramTwoSideState() - , GLStateManager.getPolygonSmoothState() - , GLStateManager.getPolygonStippleState() - , GLStateManager.getRescaleNormalState() - , GLStateManager.getSampleAlphaToCoverageState() - , GLStateManager.getSampleAlphaToOneState() - , GLStateManager.getSampleCoverageState() - , GLStateManager.getScissorTest() - , GLStateManager.getStencilTest() + GLSMDepthStencilAlpha.getAlphaTest() + , GLSMRasterizer.getAutoNormalState() + , GLSMBlend.getBlendMode() + , GLSMBlend.getColorLogicOpState() + , GLSMLighting.getColorMaterial() + , GLSMCurrentAttribs.getColorSumState() + , GLSMRasterizer.getCullState() + , GLSMDepthStencilAlpha.getDepthTest() + , GLSMRasterizer.getDitherState() + , GLSMFog.getFogMode() + , GLSMBlend.getIndexLogicOpState() + , GLSMLighting.getLightStates()[0] // GL_LIGHT0 + , GLSMLighting.getLightStates()[1] // GL_LIGHT1 + , GLSMLighting.getLightStates()[2] // GL_LIGHT2 + , GLSMLighting.getLightStates()[3] // GL_LIGHT3 + , GLSMLighting.getLightStates()[4] // GL_LIGHT4 + , GLSMLighting.getLightStates()[5] // GL_LIGHT5 + , GLSMLighting.getLightStates()[6] // GL_LIGHT6 + , GLSMLighting.getLightStates()[7] // GL_LIGHT7 + , GLSMLighting.getLightingState() + , GLSMRasterizer.getLineSmoothState() + , GLSMRasterizer.getLineStippleState() + , GLSMRasterizer.getMap1Color4State() + , GLSMRasterizer.getMap1IndexState() + , GLSMRasterizer.getMap1NormalState() + , GLSMRasterizer.getMap1TextureCoord1State() + , GLSMRasterizer.getMap1TextureCoord2State() + , GLSMRasterizer.getMap1TextureCoord3State() + , GLSMRasterizer.getMap1TextureCoord4State() + , GLSMRasterizer.getMap1Vertex3State() + , GLSMRasterizer.getMap1Vertex4State() + , GLSMRasterizer.getMap2Color4State() + , GLSMRasterizer.getMap2IndexState() + , GLSMRasterizer.getMap2NormalState() + , GLSMRasterizer.getMap2TextureCoord1State() + , GLSMRasterizer.getMap2TextureCoord2State() + , GLSMRasterizer.getMap2TextureCoord3State() + , GLSMRasterizer.getMap2TextureCoord4State() + , GLSMRasterizer.getMap2Vertex3State() + , GLSMRasterizer.getMap2Vertex4State() + , GLSMRasterizer.getMultisampleState() + , GLSMLighting.getNormalizeState() + , GLSMRasterizer.getPointSmoothState() + , GLSMRasterizer.getPolygonOffsetPointState() + , GLSMRasterizer.getPolygonOffsetLineState() + , GLSMRasterizer.getPolygonOffsetFillState() + , GLSMRasterizer.getPointSpriteState() + , GLSMPrograms.getVertexProgramTwoSideState() + , GLSMRasterizer.getPolygonSmoothState() + , GLSMRasterizer.getPolygonStippleState() + , GLSMLighting.getRescaleNormalState() + , GLSMRasterizer.getSampleAlphaToCoverageState() + , GLSMRasterizer.getSampleAlphaToOneState() + , GLSMRasterizer.getSampleCoverageState() + , GLSMRasterizer.getScissorTest() + , GLSMDepthStencilAlpha.getStencilTest() )); // Enable bits for the user-definable clipping planes - for(int i = 0; i < GLStateManager.getClipPlaneStates().length; i++) { - enableBits.add(GLStateManager.getClipPlaneStates()[i]); + for(int i = 0; i < GLSMRasterizer.getClipPlaneStates().length; i++) { + enableBits.add(GLSMRasterizer.getClipPlaneStates()[i]); } // GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D flags for(int i = 0 ; i < GLStateManager.MAX_TEXTURE_UNITS; i++) { - enableBits.add(GLStateManager.getTextures().getTexture1DStates(i)); - enableBits.add(GLStateManager.getTextures().getTextureUnitStates(i)); - enableBits.add(GLStateManager.getTextures().getTexture3DStates(i)); - enableBits.add(GLStateManager.getTextures().getTextureCubeMapStates(i)); + enableBits.add(GLSMTextures.getTextures().getTexture1DStates(i)); + enableBits.add(GLSMTextures.getTextures().getTextureUnitStates(i)); + enableBits.add(GLSMTextures.getTextures().getTexture3DStates(i)); + enableBits.add(GLSMTextures.getTextures().getTextureCubeMapStates(i)); } // Flags GL_TEXTURE_GEN_x where x is S, T, R, or Q @@ -189,30 +189,30 @@ public class Feature { attribToFeatures.put(GL11.GL_ENABLE_BIT, enableBits); attribToFeatures.put(GL11.GL_EVAL_BIT, ImmutableSet.of( - GLStateManager.getAutoNormalState() - , GLStateManager.getMap1Color4State() - , GLStateManager.getMap1IndexState() - , GLStateManager.getMap1NormalState() - , GLStateManager.getMap1TextureCoord1State() - , GLStateManager.getMap1TextureCoord2State() - , GLStateManager.getMap1TextureCoord3State() - , GLStateManager.getMap1TextureCoord4State() - , GLStateManager.getMap1Vertex3State() - , GLStateManager.getMap1Vertex4State() - , GLStateManager.getMap2Color4State() - , GLStateManager.getMap2IndexState() - , GLStateManager.getMap2NormalState() - , GLStateManager.getMap2TextureCoord1State() - , GLStateManager.getMap2TextureCoord2State() - , GLStateManager.getMap2TextureCoord3State() - , GLStateManager.getMap2TextureCoord4State() - , GLStateManager.getMap2Vertex3State() - , GLStateManager.getMap2Vertex4State() + GLSMRasterizer.getAutoNormalState() + , GLSMRasterizer.getMap1Color4State() + , GLSMRasterizer.getMap1IndexState() + , GLSMRasterizer.getMap1NormalState() + , GLSMRasterizer.getMap1TextureCoord1State() + , GLSMRasterizer.getMap1TextureCoord2State() + , GLSMRasterizer.getMap1TextureCoord3State() + , GLSMRasterizer.getMap1TextureCoord4State() + , GLSMRasterizer.getMap1Vertex3State() + , GLSMRasterizer.getMap1Vertex4State() + , GLSMRasterizer.getMap2Color4State() + , GLSMRasterizer.getMap2IndexState() + , GLSMRasterizer.getMap2NormalState() + , GLSMRasterizer.getMap2TextureCoord1State() + , GLSMRasterizer.getMap2TextureCoord2State() + , GLSMRasterizer.getMap2TextureCoord3State() + , GLSMRasterizer.getMap2TextureCoord4State() + , GLSMRasterizer.getMap2Vertex3State() + , GLSMRasterizer.getMap2Vertex4State() )); attribToFeatures.put(GL11.GL_FOG_BIT, ImmutableSet.of( - GLStateManager.getFogMode() - , GLStateManager.getColorSumState() - , GLStateManager.getFogState() + GLSMFog.getFogMode() + , GLSMCurrentAttribs.getColorSumState() + , GLSMFog.getFogState() // ^^ Fog density // ^^ Linear fog start // ^^ Linear fog end @@ -220,54 +220,54 @@ public class Feature { // ^^ GL_FOG_MODE value )); attribToFeatures.put(GL11.GL_HINT_BIT, ImmutableSet.of( - GLStateManager.getHintState() + GLSMRasterizer.getHintState() )); attribToFeatures.put(GL11.GL_LIGHTING_BIT, ImmutableSet.of( - GLStateManager.getColorMaterial() - , GLStateManager.getColorMaterialFace() - , GLStateManager.getColorMaterialParameter() - , GLStateManager.getLightModel() - , GLStateManager.getLightingState() + GLSMLighting.getColorMaterial() + , GLSMLighting.getColorMaterialFace() + , GLSMLighting.getColorMaterialParameter() + , GLSMLighting.getLightModel() + , GLSMLighting.getLightingState() // Enable bit for each light - , GLStateManager.getLightStates()[0] // GL_LIGHT0 - , GLStateManager.getLightStates()[1] // GL_LIGHT1 - , GLStateManager.getLightStates()[2] // GL_LIGHT2 - , GLStateManager.getLightStates()[3] // GL_LIGHT3 - , GLStateManager.getLightStates()[4] // GL_LIGHT4 - , GLStateManager.getLightStates()[5] // GL_LIGHT5 - , GLStateManager.getLightStates()[6] // GL_LIGHT6 - , GLStateManager.getLightStates()[7] // GL_LIGHT7 + , GLSMLighting.getLightStates()[0] // GL_LIGHT0 + , GLSMLighting.getLightStates()[1] // GL_LIGHT1 + , GLSMLighting.getLightStates()[2] // GL_LIGHT2 + , GLSMLighting.getLightStates()[3] // GL_LIGHT3 + , GLSMLighting.getLightStates()[4] // GL_LIGHT4 + , GLSMLighting.getLightStates()[5] // GL_LIGHT5 + , GLSMLighting.getLightStates()[6] // GL_LIGHT6 + , GLSMLighting.getLightStates()[7] // GL_LIGHT7 // Ambient, diffuse, and specular intensity for each light // Direction, position, exponent, and cutoff angle for each light // Constant, linear, and quadratic attenuation factors for each light - , GLStateManager.getLightDataStates()[0] - , GLStateManager.getLightDataStates()[1] - , GLStateManager.getLightDataStates()[2] - , GLStateManager.getLightDataStates()[3] - , GLStateManager.getLightDataStates()[4] - , GLStateManager.getLightDataStates()[5] - , GLStateManager.getLightDataStates()[6] - , GLStateManager.getLightDataStates()[7] + , GLSMLighting.getLightDataStates()[0] + , GLSMLighting.getLightDataStates()[1] + , GLSMLighting.getLightDataStates()[2] + , GLSMLighting.getLightDataStates()[3] + , GLSMLighting.getLightDataStates()[4] + , GLSMLighting.getLightDataStates()[5] + , GLSMLighting.getLightDataStates()[6] + , GLSMLighting.getLightDataStates()[7] // Ambient, diffuse, specular, and emissive color for each material // Ambient, diffuse, and specular color indices for each material // Specular exponent for each material - , GLStateManager.getFrontMaterial() - , GLStateManager.getBackMaterial() - , GLStateManager.getShadeModelState() + , GLSMLighting.getFrontMaterial() + , GLSMLighting.getBackMaterial() + , GLSMRasterizer.getShadeModelState() )); attribToFeatures.put(GL11.GL_LINE_BIT, ImmutableSet.of( - GLStateManager.getLineSmoothState() - , GLStateManager.getLineStippleState() - , GLStateManager.getLineState() + GLSMRasterizer.getLineSmoothState() + , GLSMRasterizer.getLineStippleState() + , GLSMRasterizer.getLineState() )); attribToFeatures.put(GL11.GL_LIST_BIT, ImmutableSet.of( // GL_LIST_BASE setting )); attribToFeatures.put(GL13.GL_MULTISAMPLE_BIT, ImmutableSet.of( - GLStateManager.getMultisampleState() - , GLStateManager.getSampleAlphaToCoverageState() - , GLStateManager.getSampleAlphaToOneState() - , GLStateManager.getSampleCoverageState() + GLSMRasterizer.getMultisampleState() + , GLSMRasterizer.getSampleAlphaToCoverageState() + , GLSMRasterizer.getSampleAlphaToOneState() + , GLSMRasterizer.getSampleCoverageState() // GL_SAMPLE_COVERAGE_VALUE value // GL_SAMPLE_COVERAGE_INVERT value )); @@ -283,32 +283,32 @@ public class Feature { // GL_READ_BUFFER setting )); attribToFeatures.put(GL11.GL_POINT_BIT, ImmutableSet.of( - GLStateManager.getPointSmoothState() - , GLStateManager.getPointSpriteState() - , GLStateManager.getPointState() + GLSMRasterizer.getPointSmoothState() + , GLSMRasterizer.getPointSpriteState() + , GLSMRasterizer.getPointState() )); attribToFeatures.put(GL11.GL_POLYGON_BIT, ImmutableSet.of( - GLStateManager.getCullState() - , GLStateManager.getPolygonSmoothState() - , GLStateManager.getPolygonStippleState() - , GLStateManager.getPolygonOffsetFillState() - , GLStateManager.getPolygonOffsetLineState() - , GLStateManager.getPolygonOffsetPointState() - , GLStateManager.getPolygonState() + GLSMRasterizer.getCullState() + , GLSMRasterizer.getPolygonSmoothState() + , GLSMRasterizer.getPolygonStippleState() + , GLSMRasterizer.getPolygonOffsetFillState() + , GLSMRasterizer.getPolygonOffsetLineState() + , GLSMRasterizer.getPolygonOffsetPointState() + , GLSMRasterizer.getPolygonState() )); attribToFeatures.put(GL11.GL_POLYGON_STIPPLE_BIT, ImmutableSet.of( // Polygon stipple pattern )); attribToFeatures.put(GL11.GL_SCISSOR_BIT, ImmutableSet.of( - GLStateManager.getScissorTest() - , GLStateManager.getScissorState() + GLSMRasterizer.getScissorTest() + , GLSMRasterizer.getScissorState() )); attribToFeatures.put(GL11.GL_STENCIL_BUFFER_BIT, ImmutableSet.of( - GLStateManager.getStencilTest() - , GLStateManager.getStencilState() + GLSMDepthStencilAlpha.getStencilTest() + , GLSMDepthStencilAlpha.getStencilState() )); final Set> textureAttribs = new HashSet<>(ImmutableSet.of( - GLStateManager.getActiveTextureUnitStack() + GLSMTextures.getActiveTextureUnitStack() // GL_TEXTURE_ENV_MODE + GL_TEXTURE_ENV_COLOR — now per-unit in TexEnvState (added below) // Enable bits for the four texture coordinates @@ -325,12 +325,12 @@ public class Feature { // Current Texture Bindings - GL_TEXTURE_BINDING_2D + per-unit TexEnvState for(int i = 0 ; i < GLStateManager.MAX_TEXTURE_UNITS; i++) { - textureAttribs.add(GLStateManager.getTextures().getTextureUnitBindings(i)); - textureAttribs.add(GLStateManager.getTextures().getTexEnvState(i)); - textureAttribs.add(GLStateManager.getTextures().getTexture1DStates(i)); - textureAttribs.add(GLStateManager.getTextures().getTextureUnitStates(i)); - textureAttribs.add(GLStateManager.getTextures().getTexture3DStates(i)); - textureAttribs.add(GLStateManager.getTextures().getTextureCubeMapStates(i)); + textureAttribs.add(GLSMTextures.getTextures().getTextureUnitBindings(i)); + textureAttribs.add(GLSMTextures.getTextures().getTexEnvState(i)); + textureAttribs.add(GLSMTextures.getTextures().getTexture1DStates(i)); + textureAttribs.add(GLSMTextures.getTextures().getTextureUnitStates(i)); + textureAttribs.add(GLSMTextures.getTextures().getTexture3DStates(i)); + textureAttribs.add(GLSMTextures.getTextures().getTextureCubeMapStates(i)); } // Enable bits GL_TEXTURE_GEN_x where x is S, T, R, or Q @@ -341,17 +341,17 @@ public class Feature { final Set> transformAttribs = new HashSet<>(ImmutableSet.of( // Coefficients of the six clipping planes - GLStateManager.getMatrixMode() - , GLStateManager.getNormalizeState() - , GLStateManager.getRescaleNormalState() + GLSMMatrices.getMatrixMode() + , GLSMLighting.getNormalizeState() + , GLSMLighting.getRescaleNormalState() )); - for(int i = 0; i < GLStateManager.getClipPlaneStates().length; i++) { - transformAttribs.add(GLStateManager.getClipPlaneStates()[i]); + for(int i = 0; i < GLSMRasterizer.getClipPlaneStates().length; i++) { + transformAttribs.add(GLSMRasterizer.getClipPlaneStates()[i]); } attribToFeatures.put(GL11.GL_TRANSFORM_BIT, transformAttribs); attribToFeatures.put(GL11.GL_VIEWPORT_BIT, ImmutableSet.of( - GLStateManager.getViewportState() + GLSMRasterizer.getViewportState() )); for (Int2ObjectMap.Entry>> entry : attribToFeatures.int2ObjectEntrySet()) { diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java index 86b91f89a..ba1ca4ce3 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/FeedbackManager.java @@ -121,7 +121,7 @@ public class FeedbackManager { final float ndcY = clipVec.y / w; final float ndcZ = clipVec.z / w; - final ViewportState vp = GLStateManager.getViewportState(); + final ViewportState vp = GLSMRasterizer.getViewportState(); final float winX = vp.x + vp.width * (ndcX + 1.0f) * 0.5f; final float winY = vp.y + vp.height * (ndcY + 1.0f) * 0.5f; final float winZ = (float) ((vp.depthRangeFar - vp.depthRangeNear) * ndcZ + (vp.depthRangeFar + vp.depthRangeNear)) * 0.5f; @@ -229,7 +229,7 @@ public class FeedbackManager { } private static void computeMVP() { - mvpMatrix.set(GLStateManager.getProjectionMatrix()).mul(GLStateManager.getModelViewMatrix()); + mvpMatrix.set(GLSMMatrices.getProjectionMatrix()).mul(GLSMMatrices.getModelViewMatrix()); } private static int computeMask(int type) { @@ -277,13 +277,13 @@ public class FeedbackManager { final int previousVbo = glCtx.boundVBO; if (positionVbo != 0 && positionVbo != previousVbo) { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, positionVbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, positionVbo); } try { RENDER_BACKEND.getBufferSubData(GL15.GL_ARRAY_BUFFER, offset, destination); } finally { if (positionVbo != 0 && positionVbo != previousVbo) { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, previousVbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, previousVbo); } } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLContextState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLContextState.java index fed79c546..d8e3383e0 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLContextState.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLContextState.java @@ -161,7 +161,7 @@ public class GLContextState { public final BooleanStateStack colorSumState = track(new BooleanStateStack(GL14.GL_COLOR_SUM, false, true)); public final Color4Stack clearColor = member(new Color4Stack(StackIdAllocator.nextId(), new Color4(0.0F, 0.0F, 0.0F, 0.0F)).restoreBit(StateSet.R_CLEAR_COLOR)); public final ColorMaskStack colorMask = member(new ColorMaskStack(StackIdAllocator.nextId())); - public final IntegerStateStack drawBuffer = member(new IntegerStateStack(GLStateManager.DEFAULT_DRAW_BUFFER, StackIdAllocator.nextId()).restoreBit(StateSet.R_DRAW_BUFFER)); + public final IntegerStateStack drawBuffer = member(new IntegerStateStack(GLSMFramebuffer.DEFAULT_DRAW_BUFFER, StackIdAllocator.nextId()).restoreBit(StateSet.R_DRAW_BUFFER)); public final IntegerStateStack logicOpMode = member(new IntegerStateStack(GL11.GL_COPY, StackIdAllocator.nextId()).restoreBit(StateSet.R_LOGIC_OP)); public final BooleanStateStack cullState = track(new BooleanStateStack(GL11.GL_CULL_FACE)); public final AlphaState restoredAlphaScratch = new AlphaState(); @@ -245,12 +245,12 @@ public class GLContextState { public final int[] storageBufferBindings = new int[GLStateManager.INDEXED_BUFFER_SLOTS]; public PixelStoreState pixelUnpackState = PixelStoreState.DEFAULT; public PixelStoreState pixelPackState = PixelStoreState.DEFAULT; - public final int[] clientAttribSavedMask = new int[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH]; - public final PixelStoreState[] clientAttribSavedPixelUnpack = new PixelStoreState[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH]; - public final PixelStoreState[] clientAttribSavedPixelPack = new PixelStoreState[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH]; - public final int[] clientAttribSavedUnpackBuffer = new int[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH]; - public final int[] clientAttribSavedPackBuffer = new int[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH]; - public final VAOManager.ClientArrays[] clientAttribSavedArrays = new VAOManager.ClientArrays[GLStateManager.CLIENT_ATTRIB_STACK_DEPTH]; + public final int[] clientAttribSavedMask = new int[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH]; + public final PixelStoreState[] clientAttribSavedPixelUnpack = new PixelStoreState[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH]; + public final PixelStoreState[] clientAttribSavedPixelPack = new PixelStoreState[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH]; + public final int[] clientAttribSavedUnpackBuffer = new int[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH]; + public final int[] clientAttribSavedPackBuffer = new int[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH]; + public final VAOManager.ClientArrays[] clientAttribSavedArrays = new VAOManager.ClientArrays[GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH]; public int clientAttribStackPointer = 0; public int restoreChangedMask; public long restoreUnitChangedMask; diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMAttribStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMAttribStack.java new file mode 100644 index 000000000..e9655bc1b --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMAttribStack.java @@ -0,0 +1,667 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.ffp.VAOManager; +import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler; +import com.gtnewhorizons.angelica.glsm.hooks.DeferredDepthColorHandler; +import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; +import com.gtnewhorizons.angelica.glsm.stacks.BlendStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.CowDepths; +import com.gtnewhorizons.angelica.glsm.stacks.CowDispatch; +import com.gtnewhorizons.angelica.glsm.stacks.CowStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.RetainedState; +import com.gtnewhorizons.angelica.glsm.states.AlphaState; +import com.gtnewhorizons.angelica.glsm.states.PixelStoreState; +import com.gtnewhorizons.angelica.glsm.states.SamplerUnitArray; +import com.gtnewhorizons.angelica.glsm.states.TextureBinding; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL21; +import org.lwjgl.opengl.GL30; +import java.util.List; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_ATTRIB_STACK_DEPTH; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_TEXTURE_UNITS; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.RETAINED_SLOT; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.primaryContext; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnce; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMAttribStack { + + private GLSMAttribStack() {} + + public static long attribPushes; + public static long attribSlotsSaved; + public static long attribValueRestores; + public static long attribBackendCalls; + public static long attribDiscards; + + /** Register a state stack id as modified at the current depth (called from beforeModify). */ + public static void registerModifiedState(GLContextState c, int id) { + if (c.attribDepth > 0) { + final int depth = c.attribDepth - 1; + c.modifiedIds[depth][c.modifiedCount[depth]++] = id; + if (!c.poppingAttributes) { + attribSlotsSaved++; + } + } + } + + static final int CLIENT_ATTRIB_STACK_DEPTH = 16; + public static void glPushClientAttrib(int mask) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final int sp = glCtx.clientAttribStackPointer; + if (sp < CLIENT_ATTRIB_STACK_DEPTH) { + glCtx.clientAttribSavedMask[sp] = mask; + if ((mask & GL11.GL_CLIENT_PIXEL_STORE_BIT) != 0) { + glCtx.clientAttribSavedPixelPack[sp] = glCtx.pixelPackState; + glCtx.clientAttribSavedPixelUnpack[sp] = glCtx.pixelUnpackState; + glCtx.clientAttribSavedPackBuffer[sp] = glCtx.boundPixelPackBuffer; + glCtx.clientAttribSavedUnpackBuffer[sp] = glCtx.boundPixelUnpackBuffer; + } + if ((mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0) { + VAOManager.ClientArrays saved = glCtx.clientAttribSavedArrays[sp]; + if (saved == null) glCtx.clientAttribSavedArrays[sp] = saved = new VAOManager.ClientArrays(); + saved.boundVAO = glCtx.boundVAO; + saved.boundVBO = glCtx.boundVBO; + saved.boundEBO = glCtx.vaos.boundEBO; + saved.clientActiveTextureUnit = glCtx.clientActiveTextureUnit; + glCtx.vaos.saveClientArrays(saved); + } + glCtx.clientAttribStackPointer = sp + 1; + } + } + + public static void glPopClientAttrib() { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (glCtx.clientAttribStackPointer > 0) { + final int sp = --glCtx.clientAttribStackPointer; + final int mask = glCtx.clientAttribSavedMask[sp]; + if ((mask & GL11.GL_CLIENT_PIXEL_STORE_BIT) != 0) { + final PixelStoreState pack = glCtx.clientAttribSavedPixelPack[sp]; + final PixelStoreState unpack = glCtx.clientAttribSavedPixelUnpack[sp]; + glCtx.clientAttribSavedPixelPack[sp] = null; + glCtx.clientAttribSavedPixelUnpack[sp] = null; + PixelStoreState.applyDiff(glCtx.pixelPackState, pack, true); + glCtx.pixelPackState = pack; + PixelStoreState.applyDiff(glCtx.pixelUnpackState, unpack, false); + glCtx.pixelUnpackState = unpack; + final int packBuffer = glCtx.clientAttribSavedPackBuffer[sp]; + if (glCtx.boundPixelPackBuffer != packBuffer) GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer); + final int unpackBuffer = glCtx.clientAttribSavedUnpackBuffer[sp]; + if (glCtx.boundPixelUnpackBuffer != unpackBuffer) GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer); + } + if ((mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0) { + restoreClientArrays(glCtx, glCtx.clientAttribSavedArrays[sp]); + } + } + } + + private static void restoreClientArrays(GLContextState glCtx, VAOManager.ClientArrays saved) { + final VAOManager vaos = glCtx.vaos; + if (!vaos.vaoMap.containsKey(saved.boundVAO)) return; + GLSMVertexInput.bindVertexArrayInternal(glCtx, saved.boundVAO); + glCtx.clientActiveTextureUnit = saved.clientActiveTextureUnit; + if (vaos.isBufferLive(saved.boundVBO, saved)) { + final int changed = vaos.restoreClientArrays(saved); + for (int pointers = changed & 0xFFFF; pointers != 0; pointers &= pointers - 1) { + GLSMVertexInput.pointAttrib(glCtx, Integer.numberOfTrailingZeros(pointers)); + } + for (int enables = changed >>> 16; enables != 0; enables &= enables - 1) { + GLSMVertexInput.syncAttribEnable(glCtx, Integer.numberOfTrailingZeros(enables)); + } + if (glCtx.boundVBO != saved.boundVBO) GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, saved.boundVBO); + } + if (vaos.boundEBO != saved.boundEBO && vaos.isBufferLive(saved.boundEBO, saved)) GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, saved.boundEBO); + } + + public static void pushState(int mask) { + pushStateLive(StateSet.forMask(mask)); + } + + public static int pushState(StateSet set) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + final int token = ctx().attribDepth + DisplayListManager.virtualStateDepth(mode); + if (token >= MAX_ATTRIB_STACK_DEPTH) { + throw new IllegalStateException("Attrib stack overflow: max depth " + MAX_ATTRIB_STACK_DEPTH + " reached"); + } + DisplayListManager.recordPushState(set); + if (mode == RecordMode.COMPILE) { + return token; + } + } + return pushStateLive(set); + } + + static int pushStateLive(StateSet set) { + attribPushes++; + final GLContextState glCtx = ctx(); + glCtx.exitCapture.pushAttrib(); + if (glCtx.attribDepth >= MAX_ATTRIB_STACK_DEPTH) { + throw new IllegalStateException("Attrib stack overflow: max depth " + MAX_ATTRIB_STACK_DEPTH + " reached"); + } + final int depthBefore = glCtx.attribDepth; + glCtx.attribSets[depthBefore] = set; + glCtx.savedBatchStateGen[depthBefore] = glCtx.batchStateGeneration; + + snapshotGenerations(glCtx, set.bump); + + glCtx.modifiedCount[depthBefore] = 0; + + if ((set.restore & StateSet.R_PROGRAM) != 0) { + glCtx.programStack.setValue(glCtx.activeProgram); + glCtx.programStack.push(); + attribSlotsSaved++; + } + + glCtx.attribDepth++; + return depthBefore; + } + + private static void snapshotGenerations(GLContextState glCtx, int bump) { + final int depth = glCtx.attribDepth; + if ((bump & StateSet.B_LIGHTING) != 0) { + glCtx.savedLightingGen[depth] = glCtx.lightingGeneration; + } + if ((bump & (StateSet.B_FRAG_COLORBUF | StateSet.B_FRAG_TEXTURE | StateSet.B_FRAG_FOG)) != 0) { + glCtx.savedFragmentGen[depth] = glCtx.fragmentGeneration; + } + if ((bump & StateSet.B_TRANSFORM) != 0) { + glCtx.savedMvGen[depth] = glCtx.mvGeneration; + glCtx.savedMvLinearGen[depth] = glCtx.mvLinearGeneration; + glCtx.savedProjGen[depth] = glCtx.projGeneration; + glCtx.savedTexMatGen[depth] = glCtx.texMatrixGeneration; + } + if ((bump & StateSet.B_CURRENT) != 0) { + glCtx.savedColorGen[depth] = glCtx.colorGeneration; + glCtx.savedNormalGen[depth] = glCtx.ffp.normalGeneration; + glCtx.savedTexCoordGen[depth] = glCtx.ffp.texCoordGeneration; + } + } + + public static void popStateTo(int depth) { + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + while (glCtx.attribDepth + DisplayListManager.virtualStateDepth(mode) > depth) { + if (mode == RecordMode.COMPILE && DisplayListManager.recordPopStateIfPending()) continue; + if (mode == RecordMode.COMPILE_AND_EXECUTE) DisplayListManager.recordPopStateIfPending(); + popState(); + } + } + + public static void popState() { + final GLContextState glCtx = ctx(); + if (glCtx.attribDepth > 0 && glCtx.savedBatchStateGen[glCtx.attribDepth - 1] != glCtx.batchStateGeneration) { + beforeUncapturedStateChange(); + } + final int poppedDepth = glCtx.attribDepth; + final StateSet set = glCtx.attribSets[poppedDepth - 1]; + glCtx.exitCapture.popAttrib(set); + final boolean inspectAlpha = GLSMHooks.ALPHA_STATE_CHANGE.hasListeners() + && ((glCtx.alphaState.cowDepths().claimedAt(poppedDepth) && set.contains(glCtx.alphaState.stackId())) + || (glCtx.alphaTest.cowDepths().claimedAt(poppedDepth) && set.contains(glCtx.alphaTest.stackId()))); + final AlphaState effectiveAlpha = inspectAlpha ? glCtx.alphaState.readEffective(glCtx.restoredAlphaScratch) : null; + final boolean effectiveEnabled = inspectAlpha && glCtx.alphaTest.isEffectivelyEnabled(); + final int effectiveFunction = inspectAlpha ? effectiveAlpha.getFunction() : 0; + final float effectiveReference = inspectAlpha ? effectiveAlpha.getReference() : 0.0f; + final boolean liveEnabled = inspectAlpha && glCtx.alphaTest.isEnabled(); + final int liveFunction = inspectAlpha ? glCtx.alphaState.getFunction() : 0; + final float liveReference = inspectAlpha ? glCtx.alphaState.getReference() : 0.0f; + final boolean prevPoppingAttributes = glCtx.poppingAttributes; + glCtx.poppingAttributes = true; + try { + glCtx.attribDepth--; + final int restore = set.restore; + + final boolean blendSnapshotted = set.blendSnapshot + && (glCtx.blendState.cowDepths().claimedAt(poppedDepth) || glCtx.blendMode.cowDepths().claimedAt(poppedDepth)) + && GLSMBlend.snapshotVanillaBlendFunc(); + + int changed = 0; + long unitsChanged = 0L; + + if ((restore & StateSet.R_PROGRAM) != 0) { + glCtx.programStack.setValue(glCtx.activeProgram); + if (glCtx.programStack.topSlotChanged()) changed |= StateSet.R_PROGRAM; + glCtx.programStack.pop(); + } + + final int depth = glCtx.attribDepth; + final int count = glCtx.modifiedCount[depth]; + final int[] ids = glCtx.modifiedIds[depth]; + final CowStateStack[] stackById = glCtx.stackById; + final CowDepths[] depthsById = glCtx.depthsById; + final int[] restoreBitById = glCtx.restoreBitById; + final int[] restoreUnitById = glCtx.restoreUnitById; + final byte[] kindById = glCtx.kindById; + + for (int i = 0; i < count; i++) { + final int id = ids[i]; + final CowStateStack cow = stackById[id]; + final byte kind = kindById[id]; + if (set.contains(id)) { + final int bit = restoreBitById[id]; + if (bit != 0 && CowDispatch.topSlotChanged(kind, cow)) { + changed |= bit; + final int unit = restoreUnitById[id]; + if (unit >= 0) unitsChanged |= 1L << Math.min(unit, 63); + } + final int slot = depthsById[id].pop(); + if (slot >= 0) CowDispatch.restoreSlot(kind, cow, slot); + if (bit == 0 + && (kind == CowDispatch.BOOLEAN + || kind == CowDispatch.CLIP_PLANE_BOOLEAN + || kind == CowDispatch.TEXTURE_UNIT_BOOLEAN)) attribValueRestores++; + } else { + if (depthsById[id].discard(poppedDepth) >= 0) registerModifiedState(glCtx, id); + attribDiscards++; + } + } + glCtx.modifiedCount[depth] = 0; + + glCtx.restoreChangedMask = changed; + glCtx.restoreUnitChangedMask = unitsChanged; + + applyRestoredState(set, blendSnapshotted); + } finally { + glCtx.poppingAttributes = prevPoppingAttributes; + } + if (inspectAlpha) { + glCtx.alphaState.readEffective(glCtx.restoredAlphaScratch); + if (effectiveEnabled != glCtx.alphaTest.isEffectivelyEnabled() + || effectiveFunction != effectiveAlpha.getFunction() + || Float.compare(effectiveReference, effectiveAlpha.getReference()) != 0 + || liveEnabled != glCtx.alphaTest.isEnabled() + || liveFunction != glCtx.alphaState.getFunction() + || Float.compare(liveReference, glCtx.alphaState.getReference()) != 0) { + GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); + } + } + } + + public static void retainModifiedState(int depth, RetainedState out) { + final GLContextState glCtx = ctx(); + if (depth < 0 || depth != glCtx.attribDepth - 1) { + throw new IllegalStateException("retainModifiedState: depth " + depth + " is not the open push (attrib depth " + glCtx.attribDepth + ")"); + } + glCtx.retainedOwner = out; + final int count = glCtx.modifiedCount[depth]; + final int[] ids = glCtx.modifiedIds[depth]; + final CowStateStack[] stackById = glCtx.stackById; + out.ensureCapacity(count); + for (int i = 0; i < count; i++) { + final int id = ids[i]; + stackById[id].captureSlot(RETAINED_SLOT); + out.ids[i] = id; + } + out.count = count; + out.program = glCtx.activeProgram; + out.programGen = GLSMPrograms.programLifetimeGeneration; + } + + public static void applyRetainedState(RetainedState in) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (glCtx.retainedOwner != in) return; + final CowStateStack[] stackById = glCtx.stackById; + final byte[] kindById = glCtx.kindById; + final int[] ids = in.ids; + final int count = in.count; + int first = 0; + while (first < count && !CowDispatch.slotChanged(kindById[ids[first]], stackById[ids[first]], RETAINED_SLOT)) first++; + if (first < count) applyRetainedChanges(glCtx, in, first); + if (in.program != glCtx.activeProgram && (in.program == 0 || in.programGen == GLSMPrograms.programLifetimeGeneration)) GLSMPrograms.glUseProgram(in.program); + } + + private static void applyRetainedChanges(GLContextState glCtx, RetainedState in, int first) { + beforeUncapturedStateChange(); + final boolean blendSnapshotted = GLSMBlend.snapshotVanillaBlendFunc(); + final int alphaFuncId = glCtx.alphaState.stackId(); + final int alphaTestId = glCtx.alphaTest.stackId(); + boolean alphaChanged = false; + final boolean prevPoppingAttributes = glCtx.poppingAttributes; + glCtx.poppingAttributes = true; + try { + final CowStateStack[] stackById = glCtx.stackById; + final int[] restoreBitById = glCtx.restoreBitById; + final int[] restoreUnitById = glCtx.restoreUnitById; + final byte[] kindById = glCtx.kindById; + int changed = 0; + long unitsChanged = 0L; + for (int i = first; i < in.count; i++) { + final int id = in.ids[i]; + final CowStateStack cow = stackById[id]; + final byte kind = kindById[id]; + if (!CowDispatch.slotChanged(kind, cow, RETAINED_SLOT)) continue; + cow.beforeModify(); + final int bit = restoreBitById[id]; + if (bit != 0) { + changed |= bit; + final int unit = restoreUnitById[id]; + if (unit >= 0) unitsChanged |= 1L << Math.min(unit, 63); + } + CowDispatch.restoreSlot(kind, cow, RETAINED_SLOT); + if (id == alphaFuncId || id == alphaTestId) alphaChanged = true; + } + glCtx.restoreChangedMask = changed; + glCtx.restoreUnitChangedMask = unitsChanged; + issueRestoredBackendState(glCtx, -1); + glCtx.lightingGeneration++; + glCtx.fragmentGeneration++; + glCtx.colorGeneration++; + glCtx.ffp.normalGeneration++; + glCtx.ffp.texCoordGeneration++; + glCtx.dirtyColorAttrib = true; + glCtx.dirtyNormalAttrib = true; + glCtx.dirtyTexCoordAttrib = true; + GLSMBlend.postVanillaBlendChangeIfMoved(blendSnapshotted); + } finally { + glCtx.poppingAttributes = prevPoppingAttributes; + } + if (alphaChanged && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { + GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); + } + } + + private static boolean isDepthColorOverridden() { + final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler; + return dch != null && dch.isOverrideHeld(); + } + + public static void replayStateToBackend() { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (RENDER_BACKEND == null) return; + + final List booleanStates = glCtx.allBooleanStates; + for (int i = 0; i < booleanStates.size(); i++) { + booleanStates.get(i).applyToBackend(); + } + + RENDER_BACKEND.depthFunc(glCtx.depthState.getFunc()); + RENDER_BACKEND.depthMask(glCtx.depthState.isEnabled()); + RENDER_BACKEND.clearDepth(glCtx.depthState.getClearValue()); + + GLSMBlend.issueBlendFunc(glCtx.blendState); + glCtx.blendState.clearFuncUnknownState(); + RENDER_BACKEND.blendEquationSeparate(glCtx.blendState.getEquationRgb(), glCtx.blendState.getEquationAlpha()); + RENDER_BACKEND.blendColor(glCtx.blendState.getBlendColorR(), glCtx.blendState.getBlendColorG(), glCtx.blendState.getBlendColorB(), glCtx.blendState.getBlendColorA()); + RENDER_BACKEND.colorMask(glCtx.colorMask.red, glCtx.colorMask.green, glCtx.colorMask.blue, glCtx.colorMask.alpha); + RENDER_BACKEND.clearColor(glCtx.clearColor.getRed(), glCtx.clearColor.getGreen(), glCtx.clearColor.getBlue(), glCtx.clearColor.getAlpha()); + RENDER_BACKEND.logicOp(glCtx.logicOpMode.getValue()); + + RENDER_BACKEND.stencilFuncSeparate(GL11.GL_FRONT, glCtx.stencilState.getFuncFront(), glCtx.stencilState.getRefFront(), glCtx.stencilState.getValueMaskFront()); + RENDER_BACKEND.stencilFuncSeparate(GL11.GL_BACK, glCtx.stencilState.getFuncBack(), glCtx.stencilState.getRefBack(), glCtx.stencilState.getValueMaskBack()); + RENDER_BACKEND.stencilOpSeparate(GL11.GL_FRONT, glCtx.stencilState.getFailOpFront(), glCtx.stencilState.getZFailOpFront(), glCtx.stencilState.getZPassOpFront()); + RENDER_BACKEND.stencilOpSeparate(GL11.GL_BACK, glCtx.stencilState.getFailOpBack(), glCtx.stencilState.getZFailOpBack(), glCtx.stencilState.getZPassOpBack()); + RENDER_BACKEND.stencilMaskSeparate(GL11.GL_FRONT, glCtx.stencilState.getWriteMaskFront()); + RENDER_BACKEND.stencilMaskSeparate(GL11.GL_BACK, glCtx.stencilState.getWriteMaskBack()); + RENDER_BACKEND.clearStencil(glCtx.stencilState.getClearValue()); + + RENDER_BACKEND.viewport(glCtx.viewportState.x, glCtx.viewportState.y, glCtx.viewportState.width, glCtx.viewportState.height); + RENDER_BACKEND.depthRange(glCtx.viewportState.depthRangeNear, glCtx.viewportState.depthRangeFar); + RENDER_BACKEND.scissor(glCtx.scissorState.x, glCtx.scissorState.y, glCtx.scissorState.width, glCtx.scissorState.height); + RENDER_BACKEND.lineWidth(Math.clamp(glCtx.lineState.getWidth(), GLSMRasterizer.lineWidthMin, GLSMRasterizer.lineWidthMax)); + GLSMRasterizer.applyPointState(glCtx); + GLSMRasterizer.applyHintState(glCtx); + + RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, glCtx.polygonState.getFrontMode()); + applyPolygonOffset(glCtx); + RENDER_BACKEND.cullFace(glCtx.polygonState.getCullFaceMode()); + RENDER_BACKEND.frontFace(glCtx.polygonState.getFrontFace()); + + final SamplerUnitArray samplerUnits = glCtx.samplerUnits; + for (int i = 0; i <= samplerUnits.getHighestBoundUnit(); i++) { + final int sampler = samplerUnits.get(i); + if (sampler != 0) RENDER_BACKEND.bindSampler(i, sampler); + } + + for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) { + final TextureBinding b = glCtx.textures.getTextureUnitBindings(i); + RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i); + RENDER_BACKEND.bindTexture(b.getTarget() == 0 ? GL11.GL_TEXTURE_2D : b.getTarget(), b.getBinding()); + } + RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + GLSMTextures.getActiveTextureUnit()); + if (glCtx.defaultVAO == 0 && primaryContext().defaultVAO != 0) glCtx.defaultVAO = RENDER_BACKEND.genVertexArrays(); + if (!glCtx.vaos.isInitialized()) glCtx.vaos.init(glCtx.defaultVAO); + RENDER_BACKEND.bindVertexArray(glCtx.boundVAO != 0 ? glCtx.boundVAO : glCtx.defaultVAO); + RENDER_BACKEND.useProgram(glCtx.activeProgram); + glCtx.ffp.invalidateProgram(); + RENDER_BACKEND.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, glCtx.drawFramebuffer); + RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, glCtx.readFramebuffer); + glCtx.dirtyColorAttrib = true; + glCtx.dirtyNormalAttrib = true; + glCtx.dirtyTexCoordAttrib = true; + glCtx.dirtyLightmapAttrib = true; + glCtx.dirtyEntityIdsAttrib = true; + } + + private static void applyPolygonOffset(GLContextState glCtx) { + final float clamp = glCtx.polygonState.getOffsetClamp(); + if (clamp == 0.0f) { + RENDER_BACKEND.polygonOffset(glCtx.polygonState.getOffsetFactor(), glCtx.polygonState.getOffsetUnits()); + } else { + RENDER_BACKEND.polygonOffsetClamp(glCtx.polygonState.getOffsetFactor(), glCtx.polygonState.getOffsetUnits(), clamp); + } + } + + private static void issueRestoredBackendState(GLContextState glCtx, int restore) { + final int changed = glCtx.restoreChangedMask; + if ((restore & StateSet.R_DEPTH) != 0 && (changed & StateSet.R_DEPTH) != 0) { + attribValueRestores++; + RENDER_BACKEND.depthFunc(glCtx.depthState.getFunc()); + attribBackendCalls++; + if (!isDepthColorOverridden()) { + RENDER_BACKEND.depthMask(glCtx.depthState.isEnabled()); + attribBackendCalls++; + } + RENDER_BACKEND.clearDepth(glCtx.depthState.getClearValue()); + attribBackendCalls++; + } + if ((restore & StateSet.R_BLEND) != 0) { + final BlendStateStack blend = glCtx.blendState; + if ((changed & StateSet.R_BLEND) != 0 || blend.isFuncUnknown()) { + attribValueRestores++; + final DeferredBlendHandler restoreBlendHandler = GLSMHooks.blendHandler; + if (restoreBlendHandler == null || !restoreBlendHandler.isOverrideHeld()) { + GLSMBlend.issueBlendFunc(blend); + attribBackendCalls++; + blend.clearFuncUnknownState(); + } + if ((changed & StateSet.R_BLEND) != 0) { + RENDER_BACKEND.blendEquationSeparate(blend.getEquationRgb(), blend.getEquationAlpha()); + attribBackendCalls++; + RENDER_BACKEND.blendColor( + blend.getBlendColorR(), blend.getBlendColorG(), blend.getBlendColorB(), blend.getBlendColorA()); + attribBackendCalls++; + } + } + } + if ((restore & StateSet.R_COLOR_MASK) != 0 && (changed & StateSet.R_COLOR_MASK) != 0 && !isDepthColorOverridden()) { + attribValueRestores++; + RENDER_BACKEND.colorMask(glCtx.colorMask.red, glCtx.colorMask.green, glCtx.colorMask.blue, glCtx.colorMask.alpha); + attribBackendCalls++; + } + if ((restore & StateSet.R_CLEAR_COLOR) != 0 && (changed & StateSet.R_CLEAR_COLOR) != 0) { + attribValueRestores++; + RENDER_BACKEND.clearColor(glCtx.clearColor.getRed(), glCtx.clearColor.getGreen(), glCtx.clearColor.getBlue(), glCtx.clearColor.getAlpha()); + attribBackendCalls++; + } + if ((restore & StateSet.R_DRAW_BUFFER) != 0 && (changed & StateSet.R_DRAW_BUFFER) != 0 && glCtx.drawFramebuffer == 0) { + attribValueRestores++; + RENDER_BACKEND.drawBuffer(glCtx.drawBuffer.getValue()); + attribBackendCalls++; + } + if ((restore & StateSet.R_LOGIC_OP) != 0 && (changed & StateSet.R_LOGIC_OP) != 0) { + attribValueRestores++; + RENDER_BACKEND.logicOp(glCtx.logicOpMode.getValue()); + attribBackendCalls++; + } + if ((restore & StateSet.R_STENCIL) != 0 && (changed & StateSet.R_STENCIL) != 0) { + attribValueRestores++; + RENDER_BACKEND.stencilFuncSeparate(GL11.GL_FRONT, glCtx.stencilState.getFuncFront(), glCtx.stencilState.getRefFront(), glCtx.stencilState.getValueMaskFront()); + RENDER_BACKEND.stencilFuncSeparate(GL11.GL_BACK, glCtx.stencilState.getFuncBack(), glCtx.stencilState.getRefBack(), glCtx.stencilState.getValueMaskBack()); + RENDER_BACKEND.stencilOpSeparate(GL11.GL_FRONT, glCtx.stencilState.getFailOpFront(), glCtx.stencilState.getZFailOpFront(), glCtx.stencilState.getZPassOpFront()); + RENDER_BACKEND.stencilOpSeparate(GL11.GL_BACK, glCtx.stencilState.getFailOpBack(), glCtx.stencilState.getZFailOpBack(), glCtx.stencilState.getZPassOpBack()); + RENDER_BACKEND.stencilMaskSeparate(GL11.GL_FRONT, glCtx.stencilState.getWriteMaskFront()); + RENDER_BACKEND.stencilMaskSeparate(GL11.GL_BACK, glCtx.stencilState.getWriteMaskBack()); + RENDER_BACKEND.clearStencil(glCtx.stencilState.getClearValue()); + attribBackendCalls += 7; + } + if ((restore & StateSet.R_VIEWPORT) != 0 && (changed & StateSet.R_VIEWPORT) != 0) { + attribValueRestores++; + RENDER_BACKEND.viewport(glCtx.viewportState.x, glCtx.viewportState.y, glCtx.viewportState.width, glCtx.viewportState.height); + RENDER_BACKEND.depthRange(glCtx.viewportState.depthRangeNear, glCtx.viewportState.depthRangeFar); + attribBackendCalls += 2; + } + if ((restore & StateSet.R_SCISSOR) != 0 && (changed & StateSet.R_SCISSOR) != 0) { + attribValueRestores++; + RENDER_BACKEND.scissor(glCtx.scissorState.x, glCtx.scissorState.y, glCtx.scissorState.width, glCtx.scissorState.height); + attribBackendCalls++; + } + if ((restore & StateSet.R_LINE) != 0 && (changed & StateSet.R_LINE) != 0) { + attribValueRestores++; + RENDER_BACKEND.lineWidth(Math.clamp(glCtx.lineState.getWidth(), GLSMRasterizer.lineWidthMin, GLSMRasterizer.lineWidthMax)); + attribBackendCalls++; + } + if ((restore & StateSet.R_POINT) != 0 && (changed & StateSet.R_POINT) != 0) { + attribValueRestores++; + GLSMRasterizer.applyPointState(glCtx); + attribBackendCalls++; + } + if ((restore & StateSet.R_HINT) != 0 && (changed & StateSet.R_HINT) != 0) { + attribValueRestores++; + GLSMRasterizer.applyHintState(glCtx); + attribBackendCalls++; + } + if ((restore & StateSet.R_POLYGON) != 0 && (changed & StateSet.R_POLYGON) != 0) { + attribValueRestores++; + RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, glCtx.polygonState.getFrontMode()); + applyPolygonOffset(glCtx); + RENDER_BACKEND.cullFace(glCtx.polygonState.getCullFaceMode()); + RENDER_BACKEND.frontFace(glCtx.polygonState.getFrontFace()); + attribBackendCalls += 4; + } + final boolean textureBitSet = (restore & StateSet.R_TEXTURE) != 0 && (changed & StateSet.R_TEXTURE) != 0; + final boolean activeUnitBitSet = (restore & StateSet.R_ACTIVE_UNIT) != 0; + if (textureBitSet || activeUnitBitSet) { + boolean unitTouched = false; + if (textureBitSet) { + final long unitsChanged = glCtx.restoreUnitChangedMask; + for (int i = 0; i < MAX_TEXTURE_UNITS; i++) { + if ((unitsChanged & (1L << Math.min(i, 63))) != 0) { + final TextureBinding restored = glCtx.textures.getTextureUnitBindings(i); + final int restoredTarget = restored.getTarget() != 0 ? restored.getTarget() : GL11.GL_TEXTURE_2D; + RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i); + RENDER_BACKEND.bindTexture(restoredTarget, restored.getBinding()); + attribValueRestores++; + attribBackendCalls += 2; + unitTouched = true; + } + } + } + if (unitTouched || (activeUnitBitSet && (changed & StateSet.R_ACTIVE_UNIT) != 0)) { + RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + glCtx.activeTextureUnit.getValue()); + attribValueRestores++; + attribBackendCalls++; + } + } + } + + /** + * After popping GLSM stacks, apply restored state to the GL driver. + */ + private static void applyRestoredState(StateSet set, boolean blendSnapshotted) { + final GLContextState glCtx = ctx(); + final int restore = set.restore; + final int changed = glCtx.restoreChangedMask; + issueRestoredBackendState(glCtx, restore); + + final int bump = set.bump; + final int depth = glCtx.attribDepth; + if ((bump & StateSet.B_LIGHTING) != 0 && glCtx.lightingGeneration != glCtx.savedLightingGen[depth]) glCtx.lightingGeneration++; + if ((bump & StateSet.B_FRAG_FOG) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++; + if ((bump & StateSet.B_FRAG_COLORBUF) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++; + if ((bump & StateSet.B_FRAG_TEXTURE) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++; + if ((bump & StateSet.B_TRANSFORM) != 0) { + if (glCtx.mvGeneration != glCtx.savedMvGen[depth]) glCtx.mvGeneration++; + if (glCtx.mvLinearGeneration != glCtx.savedMvLinearGen[depth]) glCtx.mvLinearGeneration++; + if (glCtx.projGeneration != glCtx.savedProjGen[depth]) glCtx.projGeneration++; + if (glCtx.texMatrixGeneration != glCtx.savedTexMatGen[depth]) glCtx.texMatrixGeneration++; + } + if ((bump & StateSet.B_CURRENT) != 0) { + if (glCtx.colorGeneration != glCtx.savedColorGen[depth]) { + glCtx.colorGeneration++; + glCtx.dirtyColorAttrib = true; + } + if (glCtx.ffp.normalGeneration != glCtx.savedNormalGen[depth]) { + glCtx.ffp.normalGeneration++; + glCtx.dirtyNormalAttrib = true; + } + if (glCtx.ffp.texCoordGeneration != glCtx.savedTexCoordGen[depth]) { + glCtx.ffp.texCoordGeneration++; + glCtx.dirtyTexCoordAttrib = true; + } + if ((restore & StateSet.R_SECONDARY_COLOR) != 0 && (changed & StateSet.R_SECONDARY_COLOR) != 0) glCtx.fragmentGeneration++; + } + + GLSMBlend.postVanillaBlendChangeIfMoved(blendSnapshotted); + + if ((restore & StateSet.R_PROGRAM) != 0 && (changed & StateSet.R_PROGRAM) != 0) { + GLSMPrograms.glUseProgram(glCtx.programStack.getValue()); + attribValueRestores++; + attribBackendCalls++; + } + } + + public static void glPushAttrib(int mask) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordPushAttrib(mask); + if (mode == RecordMode.COMPILE) { + return; + } + } + GLDebug.pushGroup("pushState"); + pushState(mask); + } + + public static void glPopAttrib() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordPopAttrib(); + if (mode == RecordMode.COMPILE) { + return; + } + } + if (ctx().attribDepth == 0) { + rejectExitCapture(); + warnOnce("popattrib-underflow", "glPopAttrib called with an empty attrib stack; ignoring"); + return; + } + GLDebug.popGroup(); + GLDebug.pushGroup("popState"); + try { + popState(); + } finally { + GLDebug.popGroup(); + } + } + + public static boolean isPoppingAttributes() { + return ctx().poppingAttributes; + } + + public static int getAttribDepth() { + return ctx().attribDepth; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBlend.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBlend.java new file mode 100644 index 000000000..003e58f14 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBlend.java @@ -0,0 +1,335 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler; +import com.gtnewhorizons.angelica.glsm.hooks.DeferredDepthColorHandler; +import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig; +import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; +import com.gtnewhorizons.angelica.glsm.stacks.BlendStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.Color4Stack; +import com.gtnewhorizons.angelica.glsm.stacks.ColorMaskStack; +import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack; +import com.gtnewhorizons.angelica.glsm.states.BlendState; +import com.gtnewhorizons.angelica.glsm.states.ColorMask; +import org.lwjgl.opengl.GL11; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMBlend { + + private GLSMBlend() {} + + public static void glBlendColor(float red, float green, float blue, float alpha) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordBlendColor(red, green, blue, alpha); + if (mode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + final boolean bypass = !caching; + if (bypass || red != glCtx.blendState.getBlendColorR() || green != glCtx.blendState.getBlendColorG() || blue != glCtx.blendState.getBlendColorB() || alpha != glCtx.blendState.getBlendColorA()) { + mod(glCtx.blendState); + beforeUncapturedStateChange(); + glCtx.blendState.setBlendColorR(red); + glCtx.blendState.setBlendColorG(green); + glCtx.blendState.setBlendColorB(blue); + glCtx.blendState.setBlendColorA(alpha); + RENDER_BACKEND.blendColor(red, green, blue, alpha); + } + } + + public static void glBlendFuncSeparatei(int buf, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { + rejectExitCapture(); + RENDER_BACKEND.blendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); + ctx().blendState.setFuncUnknownState(); + } + + public static void enableBlend() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL11.GL_BLEND); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableBlend(ctx()); + } + + static void enableBlend(GLContextState glCtx) { + final BooleanStateStack blend = glCtx.blendMode; + final boolean wasEnabled = blend.isEffectivelyEnabled(); + final DeferredBlendHandler bh = GLSMHooks.blendHandler; + if (bh != null && bh.isBlendLocked()) { + glCtx.exitCapture.capability(GL11.GL_BLEND, -1); + blend.beforeModify(); + bh.deferBlendModeToggle(true); + } else { + blend.enable(); + } + if (!wasEnabled && blend.isEffectivelyEnabled()) postVanillaBlendChange(); + } + + public static void disableBlend() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL11.GL_BLEND); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableBlend(ctx()); + } + + static void disableBlend(GLContextState glCtx) { + final BooleanStateStack blend = glCtx.blendMode; + final boolean wasEnabled = blend.isEffectivelyEnabled(); + final DeferredBlendHandler bh = GLSMHooks.blendHandler; + if (bh != null && bh.isBlendLocked()) { + glCtx.exitCapture.capability(GL11.GL_BLEND, -1); + blend.beforeModify(); + bh.deferBlendModeToggle(false); + } else { + blend.disable(); + } + if (wasEnabled && !blend.isEffectivelyEnabled()) postVanillaBlendChange(); + } + + private static void postVanillaBlendChange() { + if (GLSMHooks.VANILLA_BLEND_CHANGE.hasListeners()) { + GLSMHooks.VANILLA_BLEND_CHANGE.post(GLSMHooks.vanillaBlendChangeEvent); + } + } + + static boolean snapshotVanillaBlendFunc() { + if (!GLSMHooks.VANILLA_BLEND_CHANGE.hasListeners()) return false; + final GLContextState glCtx = ctx(); + glCtx.blendState.readEffective(glCtx.vanillaBlendBefore); + glCtx.vanillaBlendEnabledBefore = glCtx.blendMode.isEffectivelyEnabled(); + return true; + } + + static void postVanillaBlendChangeIfMoved(boolean snapshotted) { + if (!snapshotted) return; + final GLContextState glCtx = ctx(); + final BlendState before = glCtx.vanillaBlendBefore; + final BlendState after = glCtx.blendState.readEffective(glCtx.vanillaBlendAfter); + if (glCtx.blendMode.isEffectivelyEnabled() != glCtx.vanillaBlendEnabledBefore + || after.getSrcRgb() != before.getSrcRgb() + || after.getDstRgb() != before.getDstRgb() + || after.getSrcAlpha() != before.getSrcAlpha() + || after.getDstAlpha() != before.getDstAlpha()) { + postVanillaBlendChange(); + } + } + + public static boolean isEffectiveBlendEnabled() { + return ctx().blendMode.isEffectivelyEnabled(); + } + + public static BlendState getEffectiveBlendState(BlendState out) { + return ctx().blendState.readEffective(out); + } + + public static ColorMask getEffectiveColorMask(ColorMask out) { + return ctx().colorMask.readEffective(out); + } + + public static void glBlendFunc(int srcFactor, int dstFactor) { + tryBlendFuncSeparate(srcFactor, dstFactor, srcFactor, dstFactor); + } + + static void issueBlendFunc(BlendStateStack blend) { + if (GLSMConfig.hudCacheOverride) { + RENDER_BACKEND.blendFuncSeparate(blend.getSrcRgb(), blend.getDstRgb(), GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); + } else { + RENDER_BACKEND.blendFuncSeparate(blend.getSrcRgb(), blend.getDstRgb(), blend.getSrcAlpha(), blend.getDstAlpha()); + } + } + + public static void setHudCacheOverride(boolean enabled) { + if (GLSMConfig.hudCacheOverride == enabled) return; + GLSMConfig.hudCacheOverride = enabled; + final DeferredBlendHandler bh = GLSMHooks.blendHandler; + if (bh != null && bh.isOverrideHeld()) return; + final BlendStateStack blend = ctx().blendState; + issueBlendFunc(blend); + blend.clearFuncUnknownState(); + } + + public static void glBlendEquation(int mode) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glBlendEquation"); + } + final boolean caching = isCachingEnabled(); + final boolean bypass = !caching; + if (bypass || glCtx.blendState.getEquationRgb() != mode || glCtx.blendState.getEquationAlpha() != mode) { + mod(glCtx.blendState); + beforeUncapturedStateChange(); + glCtx.blendState.setEquationRgb(mode); + glCtx.blendState.setEquationAlpha(mode); + RENDER_BACKEND.blendEquation(mode); + } + } + + public static void glBlendEquationSeparate(int modeRGB, int modeAlpha) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glBlendEquationSeparate"); + } + final boolean caching = isCachingEnabled(); + final boolean bypass = !caching; + if (bypass || glCtx.blendState.getEquationRgb() != modeRGB || glCtx.blendState.getEquationAlpha() != modeAlpha) { + mod(glCtx.blendState); + beforeUncapturedStateChange(); + glCtx.blendState.setEquationRgb(modeRGB); + glCtx.blendState.setEquationAlpha(modeAlpha); + RENDER_BACKEND.blendEquationSeparate(modeRGB, modeAlpha); + } + } + + public static void tryBlendFuncSeparate(int srcRgb, int dstRgb, int srcAlpha, int dstAlpha) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.writeBlend(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha); + if (mode == RecordMode.COMPILE) { + return; + } + } + final boolean snapshotted = snapshotVanillaBlendFunc(); + final DeferredBlendHandler bh = GLSMHooks.blendHandler; + if (bh != null && bh.isBlendLocked()) { + mod(glCtx.blendState); + bh.deferBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha); + postVanillaBlendChangeIfMoved(snapshotted); + return; + } + final boolean caching = isCachingEnabled(); + final boolean bypass = !caching; + if (bypass || glCtx.blendState.getSrcRgb() != srcRgb || glCtx.blendState.getDstRgb() != dstRgb || glCtx.blendState.getSrcAlpha() != srcAlpha || glCtx.blendState.getDstAlpha() != dstAlpha || glCtx.blendState.isFuncUnknown()) { + mod(glCtx.blendState); + glCtx.blendState.setAll(srcRgb, dstRgb, srcAlpha, dstAlpha); + glCtx.blendState.clearFuncUnknownState(); + issueBlendFunc(glCtx.blendState); + if (GLSMHooks.BLEND_FUNC_CHANGE.hasListeners()) { + final boolean hudCache = GLSMConfig.hudCacheOverride; + GLSMHooks.blendFuncChangeEvent.srcRgb = srcRgb; + GLSMHooks.blendFuncChangeEvent.dstRgb = dstRgb; + GLSMHooks.blendFuncChangeEvent.srcAlpha = hudCache ? GL11.GL_ONE : srcAlpha; + GLSMHooks.blendFuncChangeEvent.dstAlpha = hudCache ? GL11.GL_ONE_MINUS_SRC_ALPHA : dstAlpha; + GLSMHooks.BLEND_FUNC_CHANGE.post(GLSMHooks.blendFuncChangeEvent); + } + } + postVanillaBlendChangeIfMoved(snapshotted); + } + + public static void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { + tryBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); + } + + public static void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.writeDepthColor(ExitStateCapture.COLOR_MASK); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordColorMask(red, green, blue, alpha); + if (mode == RecordMode.COMPILE) { + return; + } + } + final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler; + if (dch != null && dch.isDepthColorLocked()) { + mod(glCtx.colorMask); + dch.deferColorMask(red, green, blue, alpha); + return; + } + final boolean caching = isCachingEnabled(); + final boolean bypass = !caching; + if (bypass || red != glCtx.colorMask.red || green != glCtx.colorMask.green || blue != glCtx.colorMask.blue || alpha != glCtx.colorMask.alpha) { + mod(glCtx.colorMask); + glCtx.colorMask.setAll(red, green, blue, alpha); + RENDER_BACKEND.colorMask(red, green, blue, alpha); + } + } + + public static void glClearColor(float red, float green, float blue, float alpha) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordClearColor(red, green, blue, alpha); + if (mode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + if (!caching || red != glCtx.clearColor.getRed() || green != glCtx.clearColor.getGreen() || blue != glCtx.clearColor.getBlue() || alpha != glCtx.clearColor.getAlpha()) { + mod(glCtx.clearColor); + glCtx.clearColor.setRed(red); + glCtx.clearColor.setGreen(green); + glCtx.clearColor.setBlue(blue); + glCtx.clearColor.setAlpha(alpha); + RENDER_BACKEND.clearColor(red, green, blue, alpha); + } + } + + public static void glLogicOp(int opcode) { + rejectExitCapture(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordLogicOp(opcode); + if (mode == RecordMode.COMPILE) { + return; + } + } + if (!isCachingEnabled() || ctx().logicOpMode.getValue() != opcode) beforeUncapturedStateChange(); + if (isCachingEnabled()) mod(ctx().logicOpMode).setValue(opcode); + RENDER_BACKEND.logicOp(opcode); + } + + public static void defaultBlendFunc() { + tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + } + + public static BlendStateStack getBlendState() { + return ctx().blendState; + } + + public static BooleanStateStack getBlendMode() { + return ctx().blendMode; + } + + public static Color4Stack getClearColor() { + return ctx().clearColor; + } + + public static ColorMaskStack getColorMask() { + return ctx().colorMask; + } + + public static IntegerStateStack getLogicOpMode() { + return ctx().logicOpMode; + } + + public static BooleanStateStack getColorLogicOpState() { + return ctx().colorLogicOpState; + } + + public static BooleanStateStack getIndexLogicOpState() { + return ctx().indexLogicOpState; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBuffers.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBuffers.java new file mode 100644 index 000000000..6f799d662 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMBuffers.java @@ -0,0 +1,628 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; +import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs; +import it.unimi.dsi.fastutil.ints.Int2IntMap; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL21; +import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GL31; +import org.lwjgl.opengl.GL43; +import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; +import java.nio.ShortBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.INDEXED_BUFFER_SLOTS; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.acquireDrawLock; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.initConfig; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.releaseDrawLock; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMBuffers { + + private GLSMBuffers() {} + + private static final IntOpenHashSet writeMappedBuffers = new IntOpenHashSet(); + + public static void glDeleteBuffers(int buffer) { + rejectExitCapture(); + if (buffer == 0) return; + invalidateDeletedBuffer(buffer); + RENDER_BACKEND.deleteBuffers(buffer); + } + + public static void glDeleteSync(long sync) { + rejectExitCapture(); + RENDER_BACKEND.deleteSync(sync); + } + + public static long glFenceSync(int condition, int flags) { rejectExitCapture(); return RENDER_BACKEND.fenceSync(condition, flags); } + public static int glClientWaitSync(long sync, int flags, long timeout) { rejectExitCapture(); return RENDER_BACKEND.clientWaitSync(sync, flags, timeout); } + public static void glWaitSync(long sync, int flags, long timeout) { rejectExitCapture(); RENDER_BACKEND.waitSync(sync, flags, timeout); } + public static int glGetSynci(long sync, int pname, IntBuffer length) { rejectExitCapture(); return RENDER_BACKEND.getSynci(sync, pname, length); } + + public static void glDeleteBuffers(IntBuffer buffers) { + rejectExitCapture(); + for (int i = buffers.position(); i < buffers.limit(); i++) { + invalidateDeletedBuffer(buffers.get(i)); + } + RENDER_BACKEND.deleteBuffers(buffers); + } + + public static void glDeleteBuffers(int[] buffers) { + for (int buffer : buffers) { + glDeleteBuffers(buffer); + } + } + + private static void invalidateDeletedBuffer(int buffer) { + final GLContextState glCtx = ctx(); + if (buffer == 0) return; + final boolean locked = acquireDrawLock(); + try { + FfpExtendedAttribs.onDeleteBuffer(glCtx, buffer); + if (glCtx.boundVBO == buffer) glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + if (glCtx.vaos.boundEBO == buffer) glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + if (glCtx.boundPixelUnpackBuffer == buffer) glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); + if (glCtx.boundPixelPackBuffer == buffer) glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); + if (glCtx.boundCopyReadBuffer == buffer) glBindBuffer(GL31.GL_COPY_READ_BUFFER, 0); + if (glCtx.boundCopyWriteBuffer == buffer) glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, 0); + for (Int2IntMap.Entry e : glCtx.boundOtherBuffers.int2IntEntrySet()) { + if (e.getIntValue() != buffer) continue; + e.setValue(0); + RENDER_BACKEND.bindBuffer(e.getIntKey(), 0); + } + for (int i = 0; i < INDEXED_BUFFER_SLOTS; i++) { + if (glCtx.uniformBufferBindings[i] == buffer) glCtx.uniformBufferBindings[i] = 0; + if (glCtx.storageBufferBindings[i] == buffer) glCtx.storageBufferBindings[i] = 0; + } + writeMappedBuffers.remove(buffer); + + glCtx.vaos.onDeleteBuffer(buffer); + } finally { + if (locked) releaseDrawLock(); + } + } + + /** glBindBufferBase/Range also set the generic binding point, so they share this. */ + private static void trackBufferBinding(GLContextState glCtx, int target, int buffer) { + if (target == GL15.GL_ARRAY_BUFFER) { + // if (boundVBO == buffer) return; TODO figure out why this breaks switching async occlusion mode + glCtx.boundVBO = buffer; + } else if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) { + glCtx.vaos.onBindEBO(buffer); + } else if (target == GL21.GL_PIXEL_UNPACK_BUFFER) { + glCtx.boundPixelUnpackBuffer = buffer; + } else if (target == GL21.GL_PIXEL_PACK_BUFFER) { + glCtx.boundPixelPackBuffer = buffer; + } else if (target == GL31.GL_COPY_READ_BUFFER) { + glCtx.boundCopyReadBuffer = buffer; + } else if (target == GL31.GL_COPY_WRITE_BUFFER) { + glCtx.boundCopyWriteBuffer = buffer; + } else { + glCtx.boundOtherBuffers.put(target, buffer); + } + } + + public static void glBindBuffer(int target, int buffer) { + rejectExitCapture(); + final boolean locked = acquireDrawLock(); + try { + trackBufferBinding(ctx(), target, buffer); + RENDER_BACKEND.bindBuffer(target, buffer); + } finally { + if (locked) releaseDrawLock(); + } + } + + private static boolean warnedUntrackedPixelBuffer; + + private static void warnUntrackedPixelBuffer(int binding, String name) { + if (warnedUntrackedPixelBuffer || initConfig == null || !initConfig.isLwjglDebug()) return; + final int actual = RENDER_BACKEND.getInteger(binding); + if (actual == 0) return; + warnedUntrackedPixelBuffer = true; + LOGGER.warn("{} is bound to {} but GLSM's cache says 0; a call site bypassed GLSMBuffers.glBindBuffer", name, actual, new Throwable()); + } + + static void suspendPixelUnpackBuffer() { + if (ctx().boundPixelUnpackBuffer != 0) { + RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); + } else { + warnUntrackedPixelBuffer(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING, "GL_PIXEL_UNPACK_BUFFER"); + } + } + + static void restorePixelUnpackBuffer() { + final GLContextState glCtx = ctx(); + if (glCtx.boundPixelUnpackBuffer != 0) { + RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, glCtx.boundPixelUnpackBuffer); + } + } + + static void suspendPixelPackBuffer() { + if (ctx().boundPixelPackBuffer != 0) { + RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); + } else { + warnUntrackedPixelBuffer(GL21.GL_PIXEL_PACK_BUFFER_BINDING, "GL_PIXEL_PACK_BUFFER"); + } + } + + static void restorePixelPackBuffer() { + final GLContextState glCtx = ctx(); + if (glCtx.boundPixelPackBuffer != 0) { + RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_PACK_BUFFER, glCtx.boundPixelPackBuffer); + } + } + + public static int glGenBuffers() { + requireContext("glGenBuffers"); + return RENDER_BACKEND.genBuffers(); + } + + public static void glGenBuffers(IntBuffer buffers) { + requireContext("glGenBuffers"); + for (int i = buffers.position(); i < buffers.limit(); i++) buffers.put(i, RENDER_BACKEND.genBuffers()); + } + + public static void glGenBuffers(int[] buffers) { + requireContext("glGenBuffers"); + for (int i = 0; i < buffers.length; i++) buffers[i] = RENDER_BACKEND.genBuffers(); + } + + public static int glCreateBuffers() { + requireContext("glCreateBuffers"); + return RENDER_BACKEND.createBuffers(); + } + + public static void glCreateBuffers(IntBuffer buffers) { + requireContext("glCreateBuffers"); + for (int i = buffers.position(); i < buffers.limit(); i++) buffers.put(i, RENDER_BACKEND.createBuffers()); + } + + public static void glCreateBuffers(int[] buffers) { + requireContext("glCreateBuffers"); + for (int i = 0; i < buffers.length; i++) buffers[i] = RENDER_BACKEND.createBuffers(); + } + + private static final int MAP_PERSISTENT_BIT = 0x40; + + private static int bufferForTarget(GLContextState glCtx, int target) { + if (target == GL15.GL_ARRAY_BUFFER) return glCtx.boundVBO; + if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) return glCtx.vaos.boundEBO; + if (target == GL31.GL_COPY_READ_BUFFER) return glCtx.boundCopyReadBuffer; + if (target == GL31.GL_COPY_WRITE_BUFFER) return glCtx.boundCopyWriteBuffer; + if (target == GL21.GL_PIXEL_UNPACK_BUFFER) return glCtx.boundPixelUnpackBuffer; + if (target == GL21.GL_PIXEL_PACK_BUFFER) return glCtx.boundPixelPackBuffer; + return glCtx.boundOtherBuffers.get(target); + } + + private static void onBufferRespec(int target) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final int buffer = bufferForTarget(glCtx, target); + if (buffer != 0) onNamedBufferRespec(glCtx, buffer); + } + + private static void onNamedBufferRespec(GLContextState glCtx, int buffer) { + rejectExitCapture(); + final boolean locked = acquireDrawLock(); + try { + if (!FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer); + } finally { + if (locked) releaseDrawLock(); + } + } + + private static void onBufferMap(int target, int access) { + if (access == GL15.GL_READ_ONLY) return; + onBufferWriteMap(target); + } + + private static void onBufferMapRange(int target, int access) { + if ((access & GL30.GL_MAP_WRITE_BIT) == 0) return; + if ((access & MAP_PERSISTENT_BIT) != 0) { + markPersistentlyMapped(target); + return; + } + onBufferWriteMap(target); + } + + private static void onBufferWriteMap(int target) { + final GLContextState glCtx = ctx(); + final int buffer = bufferForTarget(glCtx, target); + if (buffer == 0) return; + final boolean locked = acquireDrawLock(); + try { + writeMappedBuffers.add(buffer); + if (!FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer); + } finally { + if (locked) releaseDrawLock(); + } + } + + private static void onBufferUnmap(int target) { + final GLContextState glCtx = ctx(); + final int buffer = bufferForTarget(glCtx, target); + if (buffer == 0) return; + final boolean locked = acquireDrawLock(); + try { + if (writeMappedBuffers.remove(buffer) && !FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer); + } finally { + if (locked) releaseDrawLock(); + } + } + + private static void onBufferStorage(int target, int flags) { + rejectExitCapture(); + if ((flags & MAP_PERSISTENT_BIT) != 0) { + if (!RENDER_BACKEND.isBufferImmutable(bufferForTarget(ctx(), target))) markPersistentlyMapped(target); + return; + } + onBufferRespec(target); + } + + private static void markPersistentlyMapped(int target) { + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + FfpExtendedAttribs.markPersistent(glCtx, bufferForTarget(glCtx, target)); + } finally { + if (locked) releaseDrawLock(); + } + } + + public static void glBufferData(int target, long size, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, size, usage); } + public static void glBufferData(int target, ByteBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } + public static void glBufferData(int target, ShortBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } + public static void glBufferData(int target, IntBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } + public static void glBufferData(int target, FloatBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } + public static void glBufferData(int target, DoubleBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } + public static void glBufferData(int target, LongBuffer data, int usage) { glBufferData(target, MemoryUtilities.memByteBuffer(data), usage); } + public static void glBufferData(int target, int[] data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } + public static void glBufferData(int target, float[] data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } + public static void glBufferData(int target, short[] data, int usage) { + final ByteBuffer copy = copyOf(data); + glBufferData(target, copy, usage); + MemoryUtilities.memFree(copy); + } + public static void glBufferData(int target, long[] data, int usage) { + final ByteBuffer copy = copyOf(data); + glBufferData(target, copy, usage); + MemoryUtilities.memFree(copy); + } + public static void glBufferData(int target, double[] data, int usage) { + final ByteBuffer copy = copyOf(data); + glBufferData(target, copy, usage); + MemoryUtilities.memFree(copy); + } + + public static void nglBufferData(int target, long size, long data, int usage) { + if (data == 0L) { + glBufferData(target, size, usage); + return; + } + glBufferData(target, MemoryUtilities.memByteBuffer(data, checkedSize(size)), usage); + } + + public static void glBufferSubData(int target, long offset, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); } + public static void glBufferSubData(int target, long offset, ShortBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); } + public static void glBufferSubData(int target, long offset, IntBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); } + public static void glBufferSubData(int target, long offset, FloatBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); } + public static void glBufferSubData(int target, long offset, DoubleBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); } + public static void glBufferSubData(int target, long offset, LongBuffer data) { glBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data)); } + public static void glBufferSubData(int target, long offset, short[] data) { + final ByteBuffer copy = copyOf(data); + glBufferSubData(target, offset, copy); + MemoryUtilities.memFree(copy); + } + public static void glBufferSubData(int target, long offset, int[] data) { + final ByteBuffer copy = copyOf(data); + glBufferSubData(target, offset, copy); + MemoryUtilities.memFree(copy); + } + public static void glBufferSubData(int target, long offset, long[] data) { + final ByteBuffer copy = copyOf(data); + glBufferSubData(target, offset, copy); + MemoryUtilities.memFree(copy); + } + public static void glBufferSubData(int target, long offset, float[] data) { + final ByteBuffer copy = copyOf(data); + glBufferSubData(target, offset, copy); + MemoryUtilities.memFree(copy); + } + public static void glBufferSubData(int target, long offset, double[] data) { + final ByteBuffer copy = copyOf(data); + glBufferSubData(target, offset, copy); + MemoryUtilities.memFree(copy); + } + + public static void nglBufferSubData(int target, long offset, long size, long data) { glBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data, checkedSize(size))); } + + public static ByteBuffer glMapBuffer(int target, int access) { + rejectExitCapture(); + final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access); + if (buf != null) onBufferMap(target, access); + return buf; + } + public static ByteBuffer glMapBuffer(int target, int access, ByteBuffer old_buffer) { return glMapBuffer(target, access); } + public static ByteBuffer glMapBuffer(int target, int access, long length, ByteBuffer old_buffer) { + rejectExitCapture(); + final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access, length, old_buffer); + if (buf != null) onBufferMap(target, access); + return buf; + } + public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access) { + rejectExitCapture(); + final ByteBuffer buf = RENDER_BACKEND.mapBufferRange(target, offset, length, access); + if (buf != null) onBufferMapRange(target, access); + return buf; + } + public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access, ByteBuffer old_buffer) { return glMapBufferRange(target, offset, length, access); } + public static long glMapBufferRangeAddress(int target, long offset, long length, int access) { + rejectExitCapture(); + final long address = RENDER_BACKEND.mapBufferRangeAddress(target, offset, length, access); + if (address != 0L) onBufferMapRange(target, access); + return address; + } + public static void glFlushMappedBufferRange(int target, long offset, long length) { rejectExitCapture(); RENDER_BACKEND.flushMappedBufferRange(target, offset, length); } + public static boolean glUnmapBuffer(int target) { + rejectExitCapture(); + onBufferUnmap(target); + return RENDER_BACKEND.unmapBuffer(target); + } + + public static void glGetBufferSubData(int target, long offset, ByteBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); } + public static void glGetBufferSubData(int target, long offset, ShortBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); } + public static void glGetBufferSubData(int target, long offset, IntBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); } + public static void glGetBufferSubData(int target, long offset, FloatBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); } + public static void glGetBufferSubData(int target, long offset, DoubleBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); } + public static void glGetBufferSubData(int target, long offset, LongBuffer data) { glGetBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data)); } + public static void glGetBufferSubData(int target, long offset, short[] data) { + final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 1); + glGetBufferSubData(target, offset, copy); + copy.asShortBuffer().get(data); + MemoryUtilities.memFree(copy); + } + public static void glGetBufferSubData(int target, long offset, int[] data) { + final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 2); + glGetBufferSubData(target, offset, copy); + copy.asIntBuffer().get(data); + MemoryUtilities.memFree(copy); + } + public static void glGetBufferSubData(int target, long offset, long[] data) { + final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 3); + glGetBufferSubData(target, offset, copy); + copy.asLongBuffer().get(data); + MemoryUtilities.memFree(copy); + } + public static void glGetBufferSubData(int target, long offset, float[] data) { + final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 2); + glGetBufferSubData(target, offset, copy); + copy.asFloatBuffer().get(data); + MemoryUtilities.memFree(copy); + } + public static void glGetBufferSubData(int target, long offset, double[] data) { + final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 3); + glGetBufferSubData(target, offset, copy); + copy.asDoubleBuffer().get(data); + MemoryUtilities.memFree(copy); + } + + public static void nglGetBufferSubData(int target, long offset, long size, long data) { glGetBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data, checkedSize(size))); } + + public static int glGetBufferParameteri(int target, int pname) { rejectExitCapture(); return RENDER_BACKEND.getBufferParameteri(target, pname); } + public static int glGetBufferParameter(int target, int pname) { return glGetBufferParameteri(target, pname); } + public static void glGetBufferParameter(int target, int pname, IntBuffer params) { params.put(params.position(), glGetBufferParameteri(target, pname)); } + public static void glGetBufferParameteriv(int target, int pname, IntBuffer params) { params.put(params.position(), glGetBufferParameteri(target, pname)); } + public static void glGetBufferParameteriv(int target, int pname, int[] params) { params[0] = glGetBufferParameteri(target, pname); } + + public static void glBufferStorage(int target, long size, int flags) { onBufferStorage(target, flags); RENDER_BACKEND.bufferStorage(target, size, flags); } + public static void glBufferStorage(int target, ByteBuffer data, int flags) { onBufferStorage(target, flags); RENDER_BACKEND.bufferStorage(target, data, flags); } + public static void glBufferStorage(int target, ShortBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); } + public static void glBufferStorage(int target, IntBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); } + public static void glBufferStorage(int target, FloatBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); } + public static void glBufferStorage(int target, DoubleBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); } + public static void glBufferStorage(int target, short[] data, int flags) { + final ByteBuffer copy = copyOf(data); + glBufferStorage(target, copy, flags); + MemoryUtilities.memFree(copy); + } + public static void glBufferStorage(int target, int[] data, int flags) { + final ByteBuffer copy = copyOf(data); + glBufferStorage(target, copy, flags); + MemoryUtilities.memFree(copy); + } + public static void glBufferStorage(int target, float[] data, int flags) { + final ByteBuffer copy = copyOf(data); + glBufferStorage(target, copy, flags); + MemoryUtilities.memFree(copy); + } + public static void glBufferStorage(int target, double[] data, int flags) { + final ByteBuffer copy = copyOf(data); + glBufferStorage(target, copy, flags); + MemoryUtilities.memFree(copy); + } + + public static void glNamedBufferData(int buffer, long size, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, size, usage); } + public static void glNamedBufferData(int buffer, ByteBuffer data, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, data, usage); } + public static void glNamedBufferData(int buffer, FloatBuffer data, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, data, usage); } + public static void glNamedBufferData(int buffer, ShortBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); } + public static void glNamedBufferData(int buffer, IntBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); } + public static void glNamedBufferData(int buffer, LongBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); } + public static void glNamedBufferData(int buffer, DoubleBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); } + public static void glNamedBufferData(int buffer, short[] data, int usage) { + final ByteBuffer copy = copyOf(data); + glNamedBufferData(buffer, copy, usage); + MemoryUtilities.memFree(copy); + } + public static void glNamedBufferData(int buffer, int[] data, int usage) { + final ByteBuffer copy = copyOf(data); + glNamedBufferData(buffer, copy, usage); + MemoryUtilities.memFree(copy); + } + public static void glNamedBufferData(int buffer, long[] data, int usage) { + final ByteBuffer copy = copyOf(data); + glNamedBufferData(buffer, copy, usage); + MemoryUtilities.memFree(copy); + } + public static void glNamedBufferData(int buffer, float[] data, int usage) { + final ByteBuffer copy = copyOf(data); + glNamedBufferData(buffer, copy, usage); + MemoryUtilities.memFree(copy); + } + public static void glNamedBufferData(int buffer, double[] data, int usage) { + final ByteBuffer copy = copyOf(data); + glNamedBufferData(buffer, copy, usage); + MemoryUtilities.memFree(copy); + } + + public static void glNamedBufferSubData(int buffer, long offset, ByteBuffer data) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferSubData(buffer, offset, data); } + public static void glNamedBufferSubData(int buffer, long offset, ShortBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); } + public static void glNamedBufferSubData(int buffer, long offset, IntBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); } + public static void glNamedBufferSubData(int buffer, long offset, LongBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); } + public static void glNamedBufferSubData(int buffer, long offset, FloatBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); } + public static void glNamedBufferSubData(int buffer, long offset, DoubleBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); } + public static void glNamedBufferSubData(int buffer, long offset, short[] data) { + final ByteBuffer copy = copyOf(data); + glNamedBufferSubData(buffer, offset, copy); + MemoryUtilities.memFree(copy); + } + public static void glNamedBufferSubData(int buffer, long offset, int[] data) { + final ByteBuffer copy = copyOf(data); + glNamedBufferSubData(buffer, offset, copy); + MemoryUtilities.memFree(copy); + } + public static void glNamedBufferSubData(int buffer, long offset, long[] data) { + final ByteBuffer copy = copyOf(data); + glNamedBufferSubData(buffer, offset, copy); + MemoryUtilities.memFree(copy); + } + public static void glNamedBufferSubData(int buffer, long offset, float[] data) { + final ByteBuffer copy = copyOf(data); + glNamedBufferSubData(buffer, offset, copy); + MemoryUtilities.memFree(copy); + } + public static void glNamedBufferSubData(int buffer, long offset, double[] data) { + final ByteBuffer copy = copyOf(data); + glNamedBufferSubData(buffer, offset, copy); + MemoryUtilities.memFree(copy); + } + + public static void glClearBufferSubData(int target, int internalFormat, long offset, long size, int format, int type, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.clearBufferSubData(target, internalFormat, offset, size, format, type, data); } + public static void glClearBufferData(int target, int internalformat, int format, int type, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.clearBufferData(target, internalformat, format, type, data); } + public static boolean glIsBuffer(int buffer) { rejectExitCapture(); return RENDER_BACKEND.isBuffer(buffer); } + public static void glCopyBufferSubData(int readTarget, int writeTarget, long readOffset, long writeOffset, long size) { onBufferRespec(writeTarget); RENDER_BACKEND.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); } + + private static int checkedSize(long size) { + if (size < 0 || size > Integer.MAX_VALUE) { + throw new IllegalArgumentException("Buffer range does not fit a ByteBuffer wrapper: " + size); + } + return (int) size; + } + + private static ByteBuffer copyOf(short[] data) { + final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 1); + bb.asShortBuffer().put(data); + return bb; + } + + private static ByteBuffer copyOf(int[] data) { + final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 2); + bb.asIntBuffer().put(data); + return bb; + } + + private static ByteBuffer copyOf(long[] data) { + final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 3); + bb.asLongBuffer().put(data); + return bb; + } + + private static ByteBuffer copyOf(float[] data) { + final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 2); + bb.asFloatBuffer().put(data); + return bb; + } + + private static ByteBuffer copyOf(double[] data) { + final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 3); + bb.asDoubleBuffer().put(data); + return bb; + } + + public static void glBindBufferBase(int target, int index, int buffer) { + rejectExitCapture(); + final boolean locked = acquireDrawLock(); + try { + final GLContextState glCtx = ctx(); + trackBufferBinding(glCtx, target, buffer); + trackIndexedBufferBinding(glCtx, target, index, buffer); + RENDER_BACKEND.bindBufferBase(target, index, buffer); + } finally { + if (locked) releaseDrawLock(); + } + } + + public static void glBindBufferRange(int target, int index, int buffer, long offset, long size) { + rejectExitCapture(); + final boolean locked = acquireDrawLock(); + try { + final GLContextState glCtx = ctx(); + trackBufferBinding(glCtx, target, buffer); + trackIndexedBufferBinding(glCtx, target, index, buffer); + RENDER_BACKEND.bindBufferRange(target, index, buffer, offset, size); + } finally { + if (locked) releaseDrawLock(); + } + } + + private static int[] indexedBufferBindings(GLContextState glCtx, int target, int index) { + if (index < 0 || index >= INDEXED_BUFFER_SLOTS) return null; + if (target == GL31.GL_UNIFORM_BUFFER) return glCtx.uniformBufferBindings; + if (target == GL43.GL_SHADER_STORAGE_BUFFER) return glCtx.storageBufferBindings; + return null; + } + + private static void trackIndexedBufferBinding(GLContextState glCtx, int target, int index, int buffer) { + final int[] bindings = indexedBufferBindings(glCtx, target, index); + if (bindings != null) bindings[index] = buffer; + } + + public static int getIndexedBufferBinding(int target, int index) { + if (isCachingEnabled()) { + final int[] bindings = indexedBufferBindings(ctx(), target, index); + if (bindings != null) return bindings[index]; + } + return RENDER_BACKEND.getIndexedBufferBinding(target, index); + } + public static long nglMapBuffer(int target, int access) { + rejectExitCapture(); + final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access); + if (buf != null) onBufferMap(target, access); + return buf == null ? 0L : MemoryUtilities.memAddress0(buf); + } + + public static void glMemoryBarrier(int barriers) { rejectExitCapture(); RENDER_BACKEND.memoryBarrier(barriers); } + + public static int getBoundVBO() { + return ctx().boundVBO; + } + + public static int getBoundCopyReadBuffer() { + return ctx().boundCopyReadBuffer; + } + + public static int getBoundCopyWriteBuffer() { + return ctx().boundCopyWriteBuffer; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMCurrentAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMCurrentAttribs.java new file mode 100644 index 000000000..f688ba546 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMCurrentAttribs.java @@ -0,0 +1,524 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage; +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs; +import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; +import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; +import com.gtnewhorizons.angelica.glsm.hooks.GlintColorHandler; +import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; +import com.gtnewhorizons.angelica.glsm.recording.ImmediateModeRecorder; +import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.Color4Stack; +import com.gtnewhorizons.angelica.glsm.streaming.TessellatorEntityIds; +import org.lwjgl.opengl.GL13; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isMainThread; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMCurrentAttribs { + + private GLSMCurrentAttribs() {} + + public static void setOverlayColor(float r, float g, float b, float a) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.OVERLAY_COLOR); + if (r == glCtx.overlayR && g == glCtx.overlayG && b == glCtx.overlayB && a == glCtx.overlayA) return; + glCtx.overlayR = r; glCtx.overlayG = g; glCtx.overlayB = b; glCtx.overlayA = a; + glCtx.fragmentGeneration++; + } + + public static void setShaderColor(float r, float g, float b, float a) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.SHADER_COLOR); + if (r == glCtx.shaderColorR && g == glCtx.shaderColorG && b == glCtx.shaderColorB && a == glCtx.shaderColorA) return; + glCtx.shaderColorR = r; glCtx.shaderColorG = g; glCtx.shaderColorB = b; glCtx.shaderColorA = a; + if (GLSMHooks.SHADER_COLOR_CHANGE.hasListeners()) { + GLSMHooks.shaderColorChangeEvent.red = r; + GLSMHooks.shaderColorChangeEvent.green = g; + GLSMHooks.shaderColorChangeEvent.blue = b; + GLSMHooks.shaderColorChangeEvent.alpha = a; + GLSMHooks.SHADER_COLOR_CHANGE.post(GLSMHooks.shaderColorChangeEvent); + } + } + + + public static boolean consumeUnit23TexCoordSetDuringDraw(GLContextState glCtx) { + boolean v = glCtx.unit23TexCoordSetDuringDraw; + glCtx.unit23TexCoordSetDuringDraw = false; + return v; + } + + public static void forceAttribDefaultsDirty() { + final GLContextState glCtx = ctx(); + glCtx.dirtyNormalAttrib = true; + glCtx.dirtyTexCoordAttrib = true; + } + + // has* bits mark attribs the VBO already supplies; FFP supplies the rest via u_Current* uniforms. + // Skip the backend vertexAttrib call in either case + public static void flushDeferredVertexAttribs(GLContextState glCtx, boolean hasColor, boolean hasNormal, boolean hasTexCoord, boolean hasLightmap) { + final ShaderManager sm = glCtx.ffp; + final boolean ffpWillHandle = sm.isActive() || (sm.isEnabled() && glCtx.activeProgram == 0); + if (!hasColor && glCtx.dirtyColorAttrib && !ffpWillHandle) { + RENDER_BACKEND.vertexAttrib4f(Usage.COLOR.getAttributeLocation(), glCtx.color.getRed(), glCtx.color.getGreen(), glCtx.color.getBlue(), glCtx.color.getAlpha()); + glCtx.dirtyColorAttrib = false; + } + if (!hasNormal && glCtx.dirtyNormalAttrib && !ffpWillHandle) { + final var n = sm.currentNormal; + RENDER_BACKEND.vertexAttrib3f(Usage.NORMAL.getAttributeLocation(), n.x, n.y, n.z); + glCtx.dirtyNormalAttrib = false; + } + if (!hasTexCoord && glCtx.dirtyTexCoordAttrib && !ffpWillHandle) { + final var tc = sm.currentTexCoords[0]; + RENDER_BACKEND.vertexAttrib4f(Usage.PRIMARY_UV.getAttributeLocation(), tc.x, tc.y, tc.z, tc.w); + glCtx.dirtyTexCoordAttrib = false; + } + if (!hasLightmap && glCtx.dirtyLightmapAttrib && !ffpWillHandle) { + RENDER_BACKEND.vertexAttrib4f(Usage.SECONDARY_UV.getAttributeLocation(), glCtx.lastBrightnessX, glCtx.lastBrightnessY, 0.0f, 1.0f); + glCtx.dirtyLightmapAttrib = false; + } + } + + public static void setEntityIds(int entity, int blockEntity, int item) { + rejectExitCapture(); + if (!isMainThread()) return; + final GLContextState glCtx = ctx(); + final long ids = InstancedAttribs.packEntityInfo(entity, blockEntity, item); + if (ids == glCtx.entityIds) return; + TessellatorEntityIds.onIdsChanged(glCtx.entityIds, ids); + glCtx.entityIds = ids; + glCtx.dirtyEntityIdsAttrib = true; + } + + public static void flushEntityIds(GLContextState glCtx) { + if (!glCtx.dirtyEntityIdsAttrib || glCtx.activeProgram == 0) return; + final ImmediateExtendedAttribHandler handler = GLSMHooks.immediateExtendedHandler; + if (handler == null || !handler.wantsEntityIds()) return; + final long ids = glCtx.entityIds; + RENDER_BACKEND.vertexAttrib4f(ImmediateExtendedAttribHandler.LOC_ENTITY_IDS, + InstancedAttribs.normalizedId(ids, 0), InstancedAttribs.normalizedId(ids, 16), InstancedAttribs.normalizedId(ids, 32), 0.0f); + glCtx.dirtyEntityIdsAttrib = false; + } + + public static void glNormal3b(byte nx, byte ny, byte nz) { + final float fnx = b2f(nx), fny = b2f(ny), fnz = b2f(nz); + final GLContextState glCtx = ctx(); + glCtx.ffp.setNormal(fnx, fny, fnz); + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setNormal(fnx, fny, fnz); + return; + } + glCtx.dirtyNormalAttrib = true; + } + + public static void glNormal3d(double nx, double ny, double nz) { + final float fnx = (float) nx, fny = (float) ny, fnz = (float) nz; + final GLContextState glCtx = ctx(); + glCtx.ffp.setNormal(fnx, fny, fnz); + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setNormal(fnx, fny, fnz); + return; + } + glCtx.dirtyNormalAttrib = true; + } + + public static void glNormal3f(float nx, float ny, float nz) { + final GLContextState glCtx = ctx(); + glCtx.ffp.setNormal(nx, ny, nz); + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setNormal(nx, ny, nz); + return; + } + glCtx.dirtyNormalAttrib = true; + } + + public static void glNormal3i(int nx, int ny, int nz) { + final float fnx = nx / 2147483647.0f, fny = ny / 2147483647.0f, fnz = nz / 2147483647.0f; + final GLContextState glCtx = ctx(); + glCtx.ffp.setNormal(fnx, fny, fnz); + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setNormal(fnx, fny, fnz); + return; + } + glCtx.dirtyNormalAttrib = true; + } + + public static void glEdgeFlag(boolean flag) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordStateCommand(() -> glEdgeFlag(flag)); + if (mode == RecordMode.COMPILE) return; + } + ctx().edgeFlagState.setEnabled(flag); + } + + public static void glColor4f(float red, float green, float blue, float alpha) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordColor(red, green, blue, alpha); + if (mode == RecordMode.COMPILE) { + return; + } + } + changeColor(red, green, blue, alpha); + } + + public static void glColor4d(double red, double green, double blue, double alpha) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordColor((float) red, (float) green, (float) blue, (float) alpha); + if (mode == RecordMode.COMPILE) { + return; + } + } + changeColor((float) red, (float) green, (float) blue, (float) alpha); + } + + public static void glColor4b(byte red, byte green, byte blue, byte alpha) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordColor(b2f(red), b2f(green), b2f(blue), b2f(alpha)); + if (mode == RecordMode.COMPILE) { + return; + } + } + changeColor(b2f(red), b2f(green), b2f(blue), b2f(alpha)); + } + + public static void glColor4ub(byte red, byte green, byte blue, byte alpha) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordColor(ub2f(red), ub2f(green), ub2f(blue), ub2f(alpha)); + if (mode == RecordMode.COMPILE) { + return; + } + } + changeColor(ub2f(red), ub2f(green), ub2f(blue), ub2f(alpha)); + } + + public static void glColor3f(float red, float green, float blue) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordColor(red, green, blue, 1.0F); + if (mode == RecordMode.COMPILE) { + return; + } + } + changeColor(red, green, blue, 1.0F); + } + + public static void glColor3d(double red, double green, double blue) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordColor((float) red, (float) green, (float) blue, 1.0F); + if (mode == RecordMode.COMPILE) { + return; + } + } + changeColor((float) red, (float) green, (float) blue, 1.0F); + } + + public static void glColor3b(byte red, byte green, byte blue) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordColor(b2f(red), b2f(green), b2f(blue), 1.0F); + if (mode == RecordMode.COMPILE) { + return; + } + } + changeColor(b2f(red), b2f(green), b2f(blue), 1.0F); + } + + public static void glColor3ub(byte red, byte green, byte blue) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordColor(ub2f(red), ub2f(green), ub2f(blue), 1.0F); + if (mode == RecordMode.COMPILE) { + return; + } + } + changeColor(ub2f(red), ub2f(green), ub2f(blue), 1.0F); + } + + private static float ub2f(byte b) { + return (b & 0xFF) / 255.0F; + } + + private static float b2f(byte b) { + return ((b - Byte.MIN_VALUE) & 0xFF) / 255.0F; + } + + private static boolean changeColor(float red, float green, float blue, float alpha) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.COLOR); + // Helper function for glColor* + final boolean caching = isCachingEnabled(); + if (!caching || red != glCtx.color.getRed() || green != glCtx.color.getGreen() || blue != glCtx.color.getBlue() || alpha != glCtx.color.getAlpha()) { + mod(glCtx.color); + glCtx.color.setRed(red); + glCtx.color.setGreen(green); + glCtx.color.setBlue(blue); + glCtx.color.setAlpha(alpha); + glCtx.colorGeneration++; + if (ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setColor(red, green, blue, alpha); + } + glCtx.dirtyColorAttrib = true; + // Only set while an enchantment-glint span is active + final GlintColorHandler glintHandler = GLSMHooks.glintColorHandler; + if (glintHandler != null) { + glintHandler.onColorChanged(red, green, blue, alpha); + } + return true; + } + return false; + } + + public static void glSecondaryColor3f(float red, float green, float blue) { + rejectExitCapture(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordSecondaryColor(red, green, blue); + if (mode == RecordMode.COMPILE) { + return; + } + } + changeSecondaryColor(red, green, blue); + } + + public static void glSecondaryColor3d(double red, double green, double blue) { + glSecondaryColor3f((float) red, (float) green, (float) blue); + } + + public static void glSecondaryColor3b(byte red, byte green, byte blue) { + glSecondaryColor3f(b2f(red), b2f(green), b2f(blue)); + } + + public static void glSecondaryColor3ub(byte red, byte green, byte blue) { + glSecondaryColor3f(ub2f(red), ub2f(green), ub2f(blue)); + } + + /** Helper for glSecondaryColor* - the color sum is emulated by the FFP shaders, nothing is sent to the driver. */ + private static void changeSecondaryColor(float red, float green, float blue) { + final GLContextState glCtx = ctx(); + if (!isCachingEnabled() || red != glCtx.secondaryColor.getRed() || green != glCtx.secondaryColor.getGreen() || blue != glCtx.secondaryColor.getBlue()) { + if (glCtx.colorSumState.isEnabled()) beforeUncapturedStateChange(); + mod(glCtx.secondaryColor); + glCtx.secondaryColor.setRed(red); + glCtx.secondaryColor.setGreen(green); + glCtx.secondaryColor.setBlue(blue); + glCtx.fragmentGeneration++; + } + } + + public static void glTexCoord1f(float s) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setTexCoord(s, 0.0f); + return; + } + final GLContextState glCtx = ctx(); + glCtx.ffp.setTexCoord(s, 0.0f, 0.0f, 1.0f); + glCtx.dirtyTexCoordAttrib = true; + } + + public static void glTexCoord1d(double s) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setTexCoord((float) s, 0.0f); + return; + } + final GLContextState glCtx = ctx(); + glCtx.ffp.setTexCoord((float) s, 0.0f, 0.0f, 1.0f); + glCtx.dirtyTexCoordAttrib = true; + } + + public static void glTexCoord2f(float s, float t) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setTexCoord(s, t); + return; + } + final GLContextState glCtx = ctx(); + glCtx.ffp.setTexCoord(s, t, 0.0f, 1.0f); + glCtx.dirtyTexCoordAttrib = true; + } + + public static void glTexCoord2d(double s, double t) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setTexCoord((float) s, (float) t); + return; + } + final GLContextState glCtx = ctx(); + glCtx.ffp.setTexCoord((float) s, (float) t, 0.0f, 1.0f); + glCtx.dirtyTexCoordAttrib = true; + } + + public static void glTexCoord3f(float s, float t, float r) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setTexCoord(s, t); // Only track s,t for 2D textures + return; + } + final GLContextState glCtx = ctx(); + glCtx.ffp.setTexCoord(s, t, r, 1.0f); + glCtx.dirtyTexCoordAttrib = true; + } + + public static void glTexCoord3d(double s, double t, double r) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setTexCoord((float) s, (float) t); + return; + } + final GLContextState glCtx = ctx(); + glCtx.ffp.setTexCoord((float) s, (float) t, (float) r, 1.0f); + glCtx.dirtyTexCoordAttrib = true; + } + + public static void glTexCoord4f(float s, float t, float r, float q) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setTexCoord(s, t); + return; + } + final GLContextState glCtx = ctx(); + glCtx.ffp.setTexCoord(s, t, r, q); + glCtx.dirtyTexCoordAttrib = true; + } + + public static void glTexCoord4d(double s, double t, double r, double q) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setTexCoord((float) s, (float) t); + return; + } + final GLContextState glCtx = ctx(); + glCtx.ffp.setTexCoord((float) s, (float) t, (float) r, (float) q); + glCtx.dirtyTexCoordAttrib = true; + } + + public static void glVertexAttrib2f(int index, float v0, float v1) { + glVertexAttrib4f(index, v0, v1, 0.0f, 1.0f); + } + + public static void glVertexAttrib2s(int index, short v0, short v1) { + glVertexAttrib4f(index, v0, v1, 0.0f, 1.0f); + } + + public static void glVertexAttrib3f(int index, float v0, float v1, float v2) { + glVertexAttrib4f(index, v0, v1, v2, 1.0f); + } + + public static void glVertexAttrib4f(int index, float v0, float v1, float v2, float v3) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordVertexAttrib(index, v0, v1, v2, v3); + if (mode == RecordMode.COMPILE) return; + } + beforeUncapturedStateChange(); + RENDER_BACKEND.vertexAttrib4f(index, v0, v1, v2, v3); + } + + public static void glMultiTexCoord2f(int target, float s, float t) { + final GLContextState glCtx = ctx(); + if (target == GL13.GL_TEXTURE0) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setTexCoord(s, t); + return; + } + glCtx.ffp.setTexCoord(s, t, 0.0f, 1.0f); + glCtx.dirtyTexCoordAttrib = true; + } else if (target == GL13.GL_TEXTURE1) { + if (ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.setLightmapCoord(s, t); + return; + } + setLightmapTextureCoords(target, s, t); + } else { + final int unit = target - GL13.GL_TEXTURE0; + if (unit >= 2 && unit < 4) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + glCtx.unit23TexCoordSetDuringDraw = true; + } + beforeUncapturedStateChange(); + glCtx.ffp.setTexCoord(unit, s, t, 0.0f, 1.0f); + } else { + glCtx.exitCapture.reject(); + } + } + } + + public static void glMultiTexCoord2d(int target, double s, double t) { + glMultiTexCoord2f(target, (float) s, (float) t); + } + + public static void glMultiTexCoord2s(int target, short s, short t) { + glMultiTexCoord2f(target, s, t); + } + + public static void setLightmapTextureCoords(int unit, float x, float y) { + if (unit != GL13.GL_TEXTURE1) { + rejectExitCapture(); + return; + } + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.LIGHTMAP); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordStateCommand(() -> setLightmapTextureCoords(unit, x, y)); + if (mode == RecordMode.COMPILE) return; + } + glCtx.lastBrightnessX = x; + glCtx.lastBrightnessY = y; + glCtx.dirtyLightmapAttrib = true; + if (GLSMHooks.LIGHTMAP_COORDS.hasListeners()) { + GLSMHooks.lightmapCoordsEvent.x = x; + GLSMHooks.lightmapCoordsEvent.y = y; + GLSMHooks.LIGHTMAP_COORDS.post(GLSMHooks.lightmapCoordsEvent); + } + } + + public static float getOverlayR() { + return ctx().overlayR; + } + + public static float getOverlayG() { + return ctx().overlayG; + } + + public static float getOverlayB() { + return ctx().overlayB; + } + + public static float getOverlayA() { + return ctx().overlayA; + } + + public static float getShaderColorR() { + return ctx().shaderColorR; + } + + public static float getShaderColorG() { + return ctx().shaderColorG; + } + + public static float getShaderColorB() { + return ctx().shaderColorB; + } + + public static float getShaderColorA() { + return ctx().shaderColorA; + } + + public static Color4Stack getColor() { + return ctx().color; + } + + public static Color4Stack getSecondaryColor() { + return ctx().secondaryColor; + } + + public static BooleanStateStack getColorSumState() { + return ctx().colorSumState; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDepthStencilAlpha.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDepthStencilAlpha.java new file mode 100644 index 000000000..20afa584a --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDepthStencilAlpha.java @@ -0,0 +1,427 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.hooks.DeferredAlphaHandler; +import com.gtnewhorizons.angelica.glsm.hooks.DeferredDepthColorHandler; +import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; +import com.gtnewhorizons.angelica.glsm.stacks.AlphaStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.DepthStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.StencilStateStack; +import com.gtnewhorizons.angelica.glsm.states.AlphaState; +import org.lwjgl.opengl.GL11; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMDepthStencilAlpha { + + private GLSMDepthStencilAlpha() {} + + public static boolean isEffectiveDepthMaskEnabled() { + return ctx().depthState.isEffectiveMaskEnabled(); + } + + public static boolean isEffectiveAlphaTestEnabled() { + return ctx().alphaTest.isEffectivelyEnabled(); + } + + public static AlphaState getEffectiveAlphaState(AlphaState out) { + return ctx().alphaState.readEffective(out); + } + + public static void glDepthFunc(int func) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.DEPTH_FUNC); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDepthFunc(func); + if (mode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + if (!caching || func != glCtx.depthState.getFunc()) { + mod(glCtx.depthState); + glCtx.depthState.setFunc(func); + RENDER_BACKEND.depthFunc(func); + } + } + + public static void glDepthMask(boolean mask) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.writeDepthColor(ExitStateCapture.DEPTH_MASK); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDepthMask(mask); + if (mode == RecordMode.COMPILE) { + return; + } + } + final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler; + if (dch != null && dch.isDepthColorLocked()) { + mod(glCtx.depthState); + dch.deferDepthEnable(mask); + return; + } + final boolean caching = isCachingEnabled(); + if (!caching || mask != glCtx.depthState.isEnabled()) { + mod(glCtx.depthState); + glCtx.depthState.setEnabled(mask); + RENDER_BACKEND.depthMask(mask); + } + } + + public static void glClearDepth(double depth) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordClearDepth(depth); + if (mode == RecordMode.COMPILE) { + return; + } + } + depth = Math.min(1.0, Math.max(0.0, depth)); + mod(glCtx.depthState); + if (isCachingEnabled()) glCtx.depthState.setClearValue(depth); + RENDER_BACKEND.clearDepth(depth); + } + + public static void enableAlphaTest() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL11.GL_ALPHA_TEST); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableAlphaTest(ctx()); + } + + static void enableAlphaTest(GLContextState glCtx) { + final DeferredAlphaHandler ah = GLSMHooks.alphaHandler; + if (ah != null && ah.isAlphaTestLocked()) { + glCtx.exitCapture.capability(GL11.GL_ALPHA_TEST, -1); + glCtx.alphaTest.beforeModify(); + if (ah.deferAlphaTestToggle(true) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { + GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); + } + return; + } + final boolean wasEnabled = glCtx.alphaTest.isEnabled(); + glCtx.alphaTest.enable(); + if (glCtx.alphaTest.isEnabled() != wasEnabled) { + glCtx.fragmentGeneration++; + if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { + GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); + } + } + } + + public static void disableAlphaTest() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL11.GL_ALPHA_TEST); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableAlphaTest(ctx()); + } + + static void disableAlphaTest(GLContextState glCtx) { + final DeferredAlphaHandler ah = GLSMHooks.alphaHandler; + if (ah != null && ah.isAlphaTestLocked()) { + glCtx.exitCapture.capability(GL11.GL_ALPHA_TEST, -1); + glCtx.alphaTest.beforeModify(); + if (ah.deferAlphaTestToggle(false) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { + GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); + } + return; + } + final boolean wasEnabled = glCtx.alphaTest.isEnabled(); + glCtx.alphaTest.disable(); + if (glCtx.alphaTest.isEnabled() != wasEnabled) { + glCtx.fragmentGeneration++; + if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { + GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); + } + } + } + + public static void glAlphaFunc(int function, float reference) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.writeAlpha(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordAlphaFunc(function, reference); + if (mode == RecordMode.COMPILE) { + return; + } + } + final DeferredAlphaHandler ah = GLSMHooks.alphaHandler; + if (ah != null && ah.isAlphaTestLocked()) { + mod(glCtx.alphaState); + if (ah.deferAlphaFunc(function, reference) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { + GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); + } + return; + } + if (isCachingEnabled() + && (function != glCtx.alphaState.getFunction() || Float.compare(reference, glCtx.alphaState.getReference()) != 0)) { + mod(glCtx.alphaState); + glCtx.alphaState.setFunction(function); + glCtx.alphaState.setReference(reference); + glCtx.fragmentGeneration++; + if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { + GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); + } + } + } + + public static void enableDepthTest() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL11.GL_DEPTH_TEST); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableDepthTest(ctx()); + } + + static void enableDepthTest(GLContextState glCtx) { + glCtx.depthTest.enable(); + } + + public static void disableDepthTest() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL11.GL_DEPTH_TEST); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableDepthTest(ctx()); + } + + static void disableDepthTest(GLContextState glCtx) { + glCtx.depthTest.disable(); + } + + public static void glDepthRange(double near, double far) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (!isCachingEnabled() || glCtx.viewportState.depthRangeNear != near || glCtx.viewportState.depthRangeFar != far) beforeUncapturedStateChange(); + if (isCachingEnabled()) mod(glCtx.viewportState).setDepthRange(near, far); + RENDER_BACKEND.depthRange(near, far); + } + + public static void glStencilFunc(int func, int ref, int mask) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordStencilFunc(func, ref, mask); + if (mode == RecordMode.COMPILE) { + return; + } + } + final int clampedMask = mask & glCtx.stencilBitMask; + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.stencilState.getFuncFront() != func || glCtx.stencilState.getRefFront() != ref || glCtx.stencilState.getValueMaskFront() != clampedMask) { + beforeUncapturedStateChange(); + mod(glCtx.stencilState).setFunc(func, ref, clampedMask); + RENDER_BACKEND.stencilFunc(func, ref, clampedMask); + } + } + + public static void glStencilMask(int mask) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordStencilMask(mask); + if (mode == RecordMode.COMPILE) { + return; + } + } + final int clampedMask = mask & glCtx.stencilBitMask; + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.stencilState.getWriteMaskFront() != clampedMask) { + beforeUncapturedStateChange(); + mod(glCtx.stencilState).setWriteMask(clampedMask); + RENDER_BACKEND.stencilMask(clampedMask); + } + } + + public static void glStencilOp(int fail, int zfail, int zpass) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordStencilOp(fail, zfail, zpass); + if (mode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.stencilState.getFailOpFront() != fail || glCtx.stencilState.getZFailOpFront() != zfail || glCtx.stencilState.getZPassOpFront() != zpass) { + beforeUncapturedStateChange(); + mod(glCtx.stencilState).setOp(fail, zfail, zpass); + RENDER_BACKEND.stencilOp(fail, zfail, zpass); + } + } + + public static void glClearStencil(int s) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordClearStencil(s); + if (mode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.stencilState.getClearValue() != s) { + mod(glCtx.stencilState).setClearValue(s); + RENDER_BACKEND.clearStencil(s); + } + } + + public static void glStencilFuncSeparate(int face, int func, int ref, int mask) { + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordStencilFuncSeparate(face, func, ref, mask); + if (mode == RecordMode.COMPILE) { + return; + } + } + beforeUncapturedStateChange(); + final int clampedMask = mask & glCtx.stencilBitMask; + final boolean caching = isCachingEnabled(); + boolean needsUpdate = !caching; + if (!needsUpdate) { + if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { + needsUpdate = glCtx.stencilState.getFuncFront() != func || glCtx.stencilState.getRefFront() != ref || glCtx.stencilState.getValueMaskFront() != clampedMask; + } + if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) { + needsUpdate = glCtx.stencilState.getFuncBack() != func || glCtx.stencilState.getRefBack() != ref || glCtx.stencilState.getValueMaskBack() != clampedMask; + } + } + if (needsUpdate) { + mod(glCtx.stencilState); + if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { + glCtx.stencilState.setFuncFront(func); + glCtx.stencilState.setRefFront(ref); + glCtx.stencilState.setValueMaskFront(clampedMask); + } + if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) { + glCtx.stencilState.setFuncBack(func); + glCtx.stencilState.setRefBack(ref); + glCtx.stencilState.setValueMaskBack(clampedMask); + } + RENDER_BACKEND.stencilFuncSeparate(face, func, ref, clampedMask); + } + } + + public static void glStencilMaskSeparate(int face, int mask) { + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordStencilMaskSeparate(face, mask); + if (mode == RecordMode.COMPILE) { + return; + } + } + beforeUncapturedStateChange(); + final int clampedMask = mask & glCtx.stencilBitMask; + final boolean caching = isCachingEnabled(); + boolean needsUpdate = !caching; + if (!needsUpdate) { + if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { + needsUpdate = glCtx.stencilState.getWriteMaskFront() != clampedMask; + } + if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) { + needsUpdate = glCtx.stencilState.getWriteMaskBack() != clampedMask; + } + } + if (needsUpdate) { + mod(glCtx.stencilState); + if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { + glCtx.stencilState.setWriteMaskFront(clampedMask); + } + if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) { + glCtx.stencilState.setWriteMaskBack(clampedMask); + } + RENDER_BACKEND.stencilMaskSeparate(face, clampedMask); + } + } + + public static void glStencilOpSeparate(int face, int sfail, int dpfail, int dppass) { + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordStencilOpSeparate(face, sfail, dpfail, dppass); + if (mode == RecordMode.COMPILE) { + return; + } + } + beforeUncapturedStateChange(); + final boolean caching = isCachingEnabled(); + boolean needsUpdate = !caching; + if (!needsUpdate) { + if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { + needsUpdate = glCtx.stencilState.getFailOpFront() != sfail || glCtx.stencilState.getZFailOpFront() != dpfail || glCtx.stencilState.getZPassOpFront() != dppass; + } + if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) { + needsUpdate = glCtx.stencilState.getFailOpBack() != sfail || glCtx.stencilState.getZFailOpBack() != dpfail || glCtx.stencilState.getZPassOpBack() != dppass; + } + } + if (needsUpdate) { + mod(glCtx.stencilState); + if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { + glCtx.stencilState.setFailOpFront(sfail); + glCtx.stencilState.setZFailOpFront(dpfail); + glCtx.stencilState.setZPassOpFront(dppass); + } + if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) { + glCtx.stencilState.setFailOpBack(sfail); + glCtx.stencilState.setZFailOpBack(dpfail); + glCtx.stencilState.setZPassOpBack(dppass); + } + RENDER_BACKEND.stencilOpSeparate(face, sfail, dpfail, dppass); + } + } + + public static DepthStateStack getDepthState() { + return ctx().depthState; + } + + public static BooleanStateStack getDepthTest() { + return ctx().depthTest; + } + + public static AlphaStateStack getAlphaState() { + return ctx().alphaState; + } + + public static BooleanStateStack getAlphaTest() { + return ctx().alphaTest; + } + + public static BooleanStateStack getStencilTest() { + return ctx().stencilTest; + } + + public static StencilStateStack getStencilState() { + return ctx().stencilState; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDraws.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDraws.java new file mode 100644 index 000000000..721dd5f0a --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMDraws.java @@ -0,0 +1,713 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; +import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator; +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.backend.GLDebugMessageListener; +import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs; +import com.gtnewhorizons.angelica.glsm.ffp.VAOManager; +import com.gtnewhorizons.angelica.glsm.recording.CommandRecorder; +import com.gtnewhorizons.angelica.glsm.recording.CompiledDisplayList; +import com.gtnewhorizons.angelica.glsm.recording.ImmediateModeRecorder; +import com.gtnewhorizons.angelica.glsm.recording.commands.IndexedDrawCapture; +import com.gtnewhorizons.angelica.glsm.streaming.LineQuads; +import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL32; +import org.lwjgl.opengl.KHRDebugCallback; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.ShortBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.acquireDrawLock; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.guardUnsupportedFFP; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.initConfig; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.releaseDrawLock; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnce; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMDraws { + + private GLSMDraws() {} + + public static long drawCalls; + + /** + * Check if a display list exists (has been compiled and stored). Delegates to DisplayListManager. + * + * @param list The display list ID to check + * @return true if the display list exists, false otherwise + */ + public static boolean displayListExists(int list) { + return DisplayListManager.displayListExists(list); + } + + private static final String PIXELTRANSFER_MSG = "glPixelTransfer is not available in GL 3.3 core profile."; + + public static void glPixelTransferf(int pname, float param) { + guardUnsupportedFFP("glPixelTransfer", PIXELTRANSFER_MSG); + } + + public static void glPixelTransferi(int pname, int param) { + guardUnsupportedFFP("glPixelTransfer", PIXELTRANSFER_MSG); + } + + private static final String RASTERPOS_MSG = "glRasterPos is not available in GL 3.3 core profile."; + + public static void glRasterPos2f(float x, float y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } + public static void glRasterPos2d(double x, double y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } + public static void glRasterPos2i(int x, int y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } + public static void glRasterPos3f(float x, float y, float z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } + public static void glRasterPos3d(double x, double y, double z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } + public static void glRasterPos3i(int x, int y, int z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } + public static void glRasterPos4f(float x, float y, float z, float w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } + public static void glRasterPos4d(double x, double y, double z, double w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } + public static void glRasterPos4i(int x, int y, int z, int w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } + + public static void glBegin(int mode) { + rejectExitCapture(); + ctx().unit23TexCoordSetDuringDraw = false; + if (DisplayListManager.isRecording()) { + ImmediateModeRecorder.begin(mode); + return; + } + ImmediateModeRecorder.beginLive(mode); + } + + public static void glEnd() { + rejectExitCapture(); + final DirectTessellator result = ImmediateModeRecorder.end(); + if (result != null) { + if (DisplayListManager.isRecording()) { + if (DisplayListManager.isCompileAndExecute() && initConfig != null && initConfig.getDirectDrawer() != null) { + final CommandRecorder recorder = DisplayListManager.pauseRecording(); + initConfig.getDirectDrawer().accept(result); + DisplayListManager.resumeRecording(recorder); + } + DisplayListManager.addImmediateModeDraw(result); + return; + } + if (initConfig != null && initConfig.getDirectDrawer() != null) { + initConfig.getDirectDrawer().accept(result); + } + } + } + + public static void glVertex2f(float x, float y) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.vertex(x, y, 0.0f); + } + } + + public static void glVertex2i(int x, int y) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.vertex((float) x, (float) y, 0.0f); + } + } + + public static void glVertex2d(double x, double y) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.vertex((float) x, (float) y, 0.0f); + } + } + + public static void glVertex3f(float x, float y, float z) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.vertex(x, y, z); + } + } + + public static void glVertex3d(double x, double y, double z) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.vertex((float) x, (float) y, (float) z); + } + } + + public static void glVertex3i(int x, int y, int z) { + if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { + ImmediateModeRecorder.vertex((float) x, (float) y, (float) z); + } + } + + public static void preDraw(GLContextState glCtx, int drawMode) { + prepareLineEmulation(glCtx, drawMode); + glCtx.ffp.preDraw(glCtx); + GLSMVertexInput.prepareClientArrays(glCtx); + } + + public static void glDrawElements(int mode, ByteBuffer indices) { + rejectExitCapture(); + drawCalls++; + CommandRecorder savedRecorder = null; + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtilities.memAddress(indices), indices.remaining()); + if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture); + if (recordMode == RecordMode.COMPILE) return; + savedRecorder = DisplayListManager.pauseRecording(); + } else if (FeedbackManager.isFeedbackMode()) { + FeedbackManager.processDrawElements(mode, indices); + return; + } + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + if (mode == GL11.GL_QUADS) { + QuadConverter.drawQuadElementsAsTriangles(glCtx, indices.remaining(), GL11.GL_UNSIGNED_BYTE, indices); + return; + } + if (widensLineDraw(mode, indices.remaining())) { + drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtilities.memAddress(indices))); + return; + } + preDraw(glCtx, mode); + RENDER_BACKEND.drawElements(mode, indices); + } finally { + if (locked) releaseDrawLock(); + if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); + } + } + + public static void glDrawElements(int mode, IntBuffer indices) { + rejectExitCapture(); + drawCalls++; + CommandRecorder savedRecorder = null; + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtilities.memAddress(indices), (long) indices.remaining() << 2); + if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture); + if (recordMode == RecordMode.COMPILE) return; + savedRecorder = DisplayListManager.pauseRecording(); + } else if (FeedbackManager.isFeedbackMode()) { + FeedbackManager.processDrawElements(mode, indices); + return; + } + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + if (mode == GL11.GL_QUADS) { + QuadConverter.drawQuadElementsAsTriangles(glCtx, indices); + return; + } + if (widensLineDraw(mode, indices.remaining())) { + drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtilities.memAddress(indices))); + return; + } + preDraw(glCtx, mode); + RENDER_BACKEND.drawElements(mode, indices); + } finally { + if (locked) releaseDrawLock(); + if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); + } + } + + public static void glDrawElements(int mode, ShortBuffer indices) { + rejectExitCapture(); + drawCalls++; + CommandRecorder savedRecorder = null; + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtilities.memAddress(indices), (long) indices.remaining() << 1); + if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture); + if (recordMode == RecordMode.COMPILE) return; + savedRecorder = DisplayListManager.pauseRecording(); + } else if (FeedbackManager.isFeedbackMode()) { + FeedbackManager.processDrawElements(mode, indices); + return; + } + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + if (mode == GL11.GL_QUADS) { + QuadConverter.drawQuadElementsAsTriangles(glCtx, indices); + return; + } + if (widensLineDraw(mode, indices.remaining())) { + drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtilities.memAddress(indices))); + return; + } + preDraw(glCtx, mode); + RENDER_BACKEND.drawElements(mode, indices); + } finally { + if (locked) releaseDrawLock(); + if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); + } + } + + public static void glDrawElements(int mode, int count, int type, ByteBuffer indices) { + rejectExitCapture(); + drawCalls++; + CommandRecorder savedRecorder = null; + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, count, type, MemoryUtilities.memAddress(indices), indices.remaining()); + if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture); + if (recordMode == RecordMode.COMPILE) return; + savedRecorder = DisplayListManager.pauseRecording(); + } else if (FeedbackManager.isFeedbackMode()) { + FeedbackManager.processDrawElements(mode, count, type, indices); + return; + } + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + if (mode == GL11.GL_QUADS) { + QuadConverter.drawQuadElementsAsTriangles(glCtx, count, type, indices); + return; + } + if (widensLineDraw(mode, count)) { + drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, count, type, MemoryUtilities.memAddress(indices))); + return; + } + preDraw(glCtx, mode); + RENDER_BACKEND.drawElements(mode, count, type, indices); + } finally { + if (locked) releaseDrawLock(); + if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); + } + } + + public static void glDrawElements(int mode, int indices_count, int type, long indices_buffer_offset) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + drawCalls++; + CommandRecorder savedRecorder = null; + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + // Core profile: a default VAO is generated at init and glBindVertexArray(0) + // is redirected to it, so a VAO is always bound here -- no fallback branches. + final IndexedDrawCapture capture = IndexedDrawCapture.create(mode, indices_count, type, indices_buffer_offset, glCtx.vaos.boundEBO); + if (capture != null) { + DisplayListManager.recordIndexedDrawCapture(capture); + } + if (recordMode == RecordMode.COMPILE) { + return; + } + savedRecorder = DisplayListManager.pauseRecording(); + } else if (FeedbackManager.isFeedbackMode()) { + FeedbackManager.processDrawElements(mode, indices_count, type, indices_buffer_offset); + return; + } + final boolean locked = acquireDrawLock(); + try { + if (widensLineDraw(mode, indices_count)) { + drawLinesAsQuads(glCtx, lineElementsFromBuffer(glCtx, mode, indices_count, type, indices_buffer_offset)); + return; + } + final boolean ffpExt = FfpExtendedAttribs.maybeBindIndexed(glCtx, mode, indices_count, type, indices_buffer_offset); + try { + if (mode == GL11.GL_QUADS) { + QuadConverter.drawQuadElementsAsTriangles(glCtx, indices_count, type, indices_buffer_offset); + return; + } + preDraw(glCtx, mode); + RENDER_BACKEND.drawElements(mode, indices_count, type, indices_buffer_offset); + } finally { + if (ffpExt) FfpExtendedAttribs.unbind(); + } + } finally { + if (locked) releaseDrawLock(); + if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); + } + } + + public static void glMultiDrawElementsIndirect(int mode, int type, long indirect, int drawcount, int stride) { + rejectExitCapture(); + drawCalls += drawcount; + RENDER_BACKEND.multiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + } + + public static void glMultiDrawElementsBaseVertex(int mode, long pCount, int type, long pIndices, int drawcount, long pBaseVertex) { + rejectExitCapture(); + drawCalls += drawcount; + RENDER_BACKEND.multiDrawElementsBaseVertex(mode, pCount, type, pIndices, drawcount, pBaseVertex); + } + + public static void glDrawElementsBaseVertex(int mode, int count, int type, long indices, int basevertex) { + rejectExitCapture(); + drawCalls++; + RENDER_BACKEND.drawElementsBaseVertex(mode, count, type, indices, basevertex); + } + + public static void glDrawElementsInstanced(int mode, int count, int type, long indices, int primcount) { + rejectExitCapture(); + drawCalls++; + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + if (mode == GL11.GL_QUADS) { + QuadConverter.drawQuadElementsAsTrianglesInstanced(glCtx, count, type, indices, primcount); + return; + } + warnIfInstancedWideLines(mode); + preDraw(glCtx, mode); + RENDER_BACKEND.drawElementsInstanced(mode, count, type, indices, primcount); + } finally { + if (locked) releaseDrawLock(); + } + } + + public static void glDrawArraysInstanced(int mode, int first, int count, int primcount) { + rejectExitCapture(); + drawCalls++; + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + if (mode == GL11.GL_QUADS) { + QuadConverter.drawQuadsAsTrianglesInstanced(glCtx, first, count, primcount); + } else if (mode == GL11.GL_QUAD_STRIP) { + preDraw(glCtx, GL11.GL_TRIANGLES); + RENDER_BACKEND.drawArraysInstanced(GL11.GL_TRIANGLE_STRIP, first, count & ~1, primcount); + } else if (mode == GL11.GL_POLYGON) { + preDraw(glCtx, GL11.GL_TRIANGLES); + RENDER_BACKEND.drawArraysInstanced(GL11.GL_TRIANGLE_FAN, first, count, primcount); + } else { + warnIfInstancedWideLines(mode); + preDraw(glCtx, mode); + RENDER_BACKEND.drawArraysInstanced(mode, first, count, primcount); + } + } finally { + if (locked) releaseDrawLock(); + } + } + + public static void glDrawRangeElements(int mode, int start, int end, int count, int type, long indices) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + if (widensLineDraw(mode, count)) { + drawLinesAsQuads(glCtx, lineElementsFromBuffer(glCtx, mode, count, type, indices)); + return; + } + preDraw(glCtx, mode); + RENDER_BACKEND.drawRangeElements(mode, start, end, count, type, indices); + } finally { + if (locked) releaseDrawLock(); + } + } + + public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, int count, int type, long indices, int baseVertex) { + rejectExitCapture(); + RENDER_BACKEND.drawRangeElementsBaseVertex(mode, start, end, count, type, indices, baseVertex); + } + + public static void glMultiDrawArrays(int mode, IntBuffer firsts, IntBuffer counts) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + if (LineQuads.isLineMode(mode) && ffpWidensLineQuads()) { + for (int i = firsts.position(); i < firsts.limit(); i++) { + final int count = counts.get(counts.position() + i - firsts.position()); + if (LineQuads.segmentCount(mode, count) == 0) continue; + drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawArraysFromAttribs(mode, firsts.get(i), count)); + } + return; + } + preDraw(glCtx, mode); + RENDER_BACKEND.multiDrawArrays(mode, firsts, counts); + } finally { + if (locked) releaseDrawLock(); + } + } + + public static void glPrimitiveRestartIndex(int index) { + rejectExitCapture(); + RENDER_BACKEND.primitiveRestartIndex(index); + } + + public static void glDrawArrays(int mode, int first, int count) { + rejectExitCapture(); + drawCalls++; + CommandRecorder savedRecorder = null; + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + final DirectTessellator result = ImmediateModeRecorder.processDrawArraysFromAttribs(mode, first, count); + if (result != null) { + DisplayListManager.addImmediateModeDraw(result); + } + if (recordMode == RecordMode.COMPILE) { + return; + } + DisplayListManager.flushAll(); + savedRecorder = DisplayListManager.pauseRecording(); + } else if (FeedbackManager.isFeedbackMode()) { + FeedbackManager.processDrawArrays(mode, first, count); + return; + } + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + if (widensLineDraw(mode, count)) { + drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawArraysFromAttribs(mode, first, count)); + return; + } + final boolean ffpExt = FfpExtendedAttribs.maybeBind(glCtx, mode, first, count); + try { + if (mode == GL11.GL_QUADS) { + QuadConverter.drawQuadsAsTriangles(glCtx, first, count); + } else if (mode == GL11.GL_QUAD_STRIP) { + preDraw(glCtx, GL11.GL_TRIANGLES); + RENDER_BACKEND.drawArrays(GL11.GL_TRIANGLE_STRIP, first, count & ~1); + } else if (mode == GL11.GL_POLYGON) { + preDraw(glCtx, GL11.GL_TRIANGLES); + RENDER_BACKEND.drawArrays(GL11.GL_TRIANGLE_FAN, first, count); + } else { + preDraw(glCtx, mode); + RENDER_BACKEND.drawArrays(mode, first, count); + } + } finally { + if (ffpExt) FfpExtendedAttribs.unbind(); + } + } finally { + if (locked) releaseDrawLock(); + if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); + } + } + + public static void glNewList(int list, int mode) { + rejectExitCapture(); + DisplayListManager.glNewList(list, mode); + } + + public static void glEndList() { + rejectExitCapture(); + DisplayListManager.glEndList(); + } + + private static final DisplayListIDAllocator displayListIdAllocator = new DisplayListIDAllocator(); + + public static int glGenLists(int range) { + rejectExitCapture(); + return displayListIdAllocator.allocRange(range); + } + + public static boolean glIsList(int list) { + rejectExitCapture(); + return displayListIdAllocator.isAllocated(list); + } + + /** + * Delete display lists and free their VBO resources. + */ + public static void glDeleteLists(int list, int range) { + rejectExitCapture(); + final boolean locked = acquireDrawLock(); + try { + synchronized (displayListIdAllocator) { + DisplayListManager.glDeleteLists(list, range); + displayListIdAllocator.freeRange(list, range); + } + } finally { + if (locked) releaseDrawLock(); + } + } + + /** + * Get a compiled display list from the cache. Used for executing nested display lists. + * + * @param list The display list ID + * @return The CompiledDisplayList, or null if not found + */ + public static CompiledDisplayList getDisplayList(int list) { + return DisplayListManager.getDisplayList(list); + } + + public static void glCallList(int list) { + rejectExitCapture(); + if (!GLDebug.isActive()) { + DisplayListManager.glCallList(list); + return; + } + GLDebug.pushGroup("glCallList ", list); + try { + DisplayListManager.glCallList(list); + } finally { + GLDebug.popGroup(); + } + } + + public static int getListMode() { + return DisplayListManager.getListMode(); + } + + public static boolean ffpWidensLineQuads() { + final GLContextState glCtx = ctx(); + return GLSMRasterizer.wideLineEmulationEnabled && glCtx.activeProgram == 0 && glCtx.lineState.getWidth() > 1.0f + && !DisplayListManager.isRecording(); + } + + private static boolean widensLineDraw(int mode, int count) { + return LineQuads.isLineMode(mode) && LineQuads.segmentCount(mode, count) > 0 && ffpWidensLineQuads(); + } + + private static void drawLinesAsQuads(GLContextState glCtx, DirectTessellator lines) { + if (lines == null) return; + if (readsBufferObject(glCtx.vaos)) { + warnOnce("line-readback", "Wide GL_LINES drawn from a buffer object; widening them reads the buffer back, which waits for the GPU"); + } + final int vao = glCtx.boundVAO; + final int vbo = glCtx.boundVBO; + TessellatorStreamingDrawer.drawDirect(lines); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + } + + private static DirectTessellator lineElementsFromBuffer(GLContextState glCtx, int mode, int count, int type, long offset) { + if (glCtx.vaos.boundEBO == 0) return null; + final ByteBuffer indices = MemoryUtilities.memAlloc(count * GLTypes.sizeBytes(type)); + try { + GLSMBuffers.glGetBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, offset, indices); + return ImmediateModeRecorder.processDrawElementsFromAttribs(mode, count, type, MemoryUtilities.memAddress0(indices)); + } finally { + MemoryUtilities.memFree(indices); + } + } + + private static void warnIfInstancedWideLines(int mode) { + if (LineQuads.isLineMode(mode) && ffpWidensLineQuads()) { + warnOnce("instanced-wide-lines", "Instanced wide GL_LINES are not widened and draw 1 px wide"); + } + } + + private static boolean readsBufferObject(VAOManager vaos) { + for (int i = 0; i < VAOManager.MAX_ATTRIBS; i++) { + final VAOManager.Attrib attrib = vaos.attrib(i); + if (attrib != null && attrib.enabled && attrib.vboId != 0) return true; + } + return false; + } + + private static void prepareLineEmulation(GLContextState glCtx, int drawMode) { + setLineStippleActive(glCtx, (LineQuads.isLineMode(drawMode) || glCtx.lineQuadsActive) && glCtx.lineStippleState.isEnabled()); + } + + private static void setLineStippleActive(GLContextState glCtx, boolean active) { + if (glCtx.lineStippleActive == active) return; + glCtx.lineStippleActive = active; + RENDER_BACKEND.provokingVertex(active ? GL32.GL_FIRST_VERTEX_CONVENTION : GL32.GL_LAST_VERTEX_CONVENTION); + } + + public static void glFlush() { + rejectExitCapture(); + RENDER_BACKEND.flush(); + } + + public static void glFinish() { + rejectExitCapture(); + RENDER_BACKEND.finish(); + } + + public static void glMultiDrawArraysIndirectCount(int mode, long indirect, long drawcount, int maxdrawcount, int stride) { + rejectExitCapture(); + RENDER_BACKEND.multiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride); + } + + public static void glMultiDrawElementsIndirectCount(int mode, int type, long indirect, long drawcount, int maxdrawcount, int stride) { + rejectExitCapture(); + RENDER_BACKEND.multiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride); + } + + public static void glCallLists(IntBuffer lists) { + while (lists.hasRemaining()) { + final int listId = lists.get() + ctx().listBase; + glCallList(listId); + } + } + + public static void glCallLists(ShortBuffer lists) { + while (lists.hasRemaining()) { + final int listId = (lists.get() & 0xFFFF) + ctx().listBase; + glCallList(listId); + } + } + + public static void glCallLists(ByteBuffer lists) { + while (lists.hasRemaining()) { + final int listId = (lists.get() & 0xFF) + ctx().listBase; + glCallList(listId); + } + } + + public static void glListBase(int base) { + rejectExitCapture(); + ctx().listBase = base; + } + public static void nglMultiDrawElementsBaseVertex(int mode, long count, int type, long indices, int primcount, long basevertex) { + rejectExitCapture(); + RENDER_BACKEND.multiDrawElementsBaseVertex(mode, count, type, indices, primcount, basevertex); + } + + public static void glObjectLabel(int identifier, int name, CharSequence label) { RENDER_BACKEND.objectLabel(identifier, name, label); } + public static String glGetObjectLabel(int identifier, int name, int bufSize) { rejectExitCapture(); return RENDER_BACKEND.getObjectLabel(identifier, name); } + public static void glPushDebugGroup(int source, int id, CharSequence message) { RENDER_BACKEND.pushDebugGroup(source, id, message); } + public static void glPopDebugGroup() { RENDER_BACKEND.popDebugGroup(); } + public static void glDebugMessageInsert(int source, int type, int id, int severity, CharSequence buf) { RENDER_BACKEND.debugMessageInsert(source, type, id, severity, buf); } + public static void glDebugMessageControl(int source, int type, int severity, IntBuffer ids, boolean enabled) { RENDER_BACKEND.debugMessageControl(source, type, severity, ids, enabled); } + + public static int glGetDebugMessageLog(int count, IntBuffer sources, IntBuffer types, IntBuffer ids, IntBuffer severities, IntBuffer lengths, ByteBuffer messageLog) { + rejectExitCapture(); + return RENDER_BACKEND.getDebugMessageLog(count, sources, types, ids, severities, lengths, messageLog); + } + + public static void registerDebugMessageListener(GLDebugMessageListener listener, long userParam) { + RENDER_BACKEND.debugMessageCallback(listener, userParam); + } + + public static void glDebugMessageCallback(KHRDebugCallback callback) { + RENDER_BACKEND.debugMessageCallback(GLDebug.adaptDebugCallback(callback), 0L); + } + + public static void glAccum(int op, float value) { + guardUnsupportedFFP("glAccum", "The accumulation buffer is not available in GL 3.3 core profile."); + } + + public static void glFeedbackBuffer(int type, FloatBuffer buffer) { + rejectExitCapture(); + FeedbackManager.glFeedbackBuffer(type, buffer); + } + + public static int glRenderMode(int mode) { + rejectExitCapture(); + return FeedbackManager.glRenderMode(mode); + } + + public static void glPassThrough(float token) { + rejectExitCapture(); + FeedbackManager.glPassThrough(token); + } + + private static boolean selectWarned = false; + + public static void glSelectBuffer(IntBuffer buffer) { + rejectExitCapture(); + if (!selectWarned) { + LOGGER.warn("glSelectBuffer: selection mode not emulated"); + selectWarned = true; + } + } + + public static void glInitNames() { /* no-op: ignored outside GL_SELECT */ } + + public static void glPushName(int name) { /* no-op */ } + + public static void glPopName() { /* no-op */ } + + public static void glLoadName(int name) { /* no-op */ } + + /** + * Draw modes that rely on the previous vertex data cannot be merged currently. + * It is possible to merge them using Index Buffers, but currently unimplemented. + */ + public static boolean isContinuousDraw(int drawMode) { + return drawMode == GL11.GL_TRIANGLE_STRIP || drawMode == GL11.GL_TRIANGLE_FAN + || drawMode == GL11.GL_LINE_STRIP || drawMode == GL11.GL_LINE_LOOP + || drawMode == GL11.GL_QUAD_STRIP || drawMode == GL11.GL_POLYGON; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMEnable.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMEnable.java new file mode 100644 index 000000000..6ecb0c3e1 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMEnable.java @@ -0,0 +1,302 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL14; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL30; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_CLIP_PLANES; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMEnable { + + private GLSMEnable() {} + + public static void glEnable(int cap) { + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(cap); + if (mode == RecordMode.COMPILE) { + return; + } + } + // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES) + if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) { + glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].enable(); + glCtx.clipPlaneGeneration++; + return; + } + + switch (cap) { + case GL11.GL_ALPHA_TEST -> GLSMDepthStencilAlpha.enableAlphaTest(glCtx); + case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.enable(); + case GL11.GL_BLEND -> GLSMBlend.enableBlend(glCtx); + case GL11.GL_COLOR_MATERIAL -> GLSMLighting.enableColorMaterial(glCtx); + case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.enable(); + case GL14.GL_COLOR_SUM -> glCtx.colorSumState.enable(); + case GL11.GL_CULL_FACE -> GLSMRasterizer.enableCull(glCtx); + case GL11.GL_DEPTH_TEST -> GLSMDepthStencilAlpha.enableDepthTest(glCtx); + case GL11.GL_DITHER -> glCtx.ditherState.enable(); + case GL11.GL_FOG -> GLSMFog.enableFog(glCtx); + case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.enable(); + case GL11.GL_LIGHTING -> GLSMLighting.enableLighting(glCtx); + case GL11.GL_LIGHT0 -> GLSMLighting.enableLight(glCtx, 0); + case GL11.GL_LIGHT1 -> GLSMLighting.enableLight(glCtx, 1); + case GL11.GL_LIGHT2 -> GLSMLighting.enableLight(glCtx, 2); + case GL11.GL_LIGHT3 -> GLSMLighting.enableLight(glCtx, 3); + case GL11.GL_LIGHT4 -> GLSMLighting.enableLight(glCtx, 4); + case GL11.GL_LIGHT5 -> GLSMLighting.enableLight(glCtx, 5); + case GL11.GL_LIGHT6 -> GLSMLighting.enableLight(glCtx, 6); + case GL11.GL_LIGHT7 -> GLSMLighting.enableLight(glCtx, 7); + case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.enable(); + case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.enable(); + case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.enable(); + case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.enable(); + case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.enable(); + case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.enable(); + case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.enable(); + case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.enable(); + case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.enable(); + case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.enable(); + case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.enable(); + case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.enable(); + case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.enable(); + case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.enable(); + case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.enable(); + case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.enable(); + case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.enable(); + case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.enable(); + case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.enable(); + case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.enable(); + case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.enable(); + case GL11.GL_NORMALIZE -> glCtx.normalizeState.enable(); + case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.enable(); + case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.enable(); + case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.enable(); + case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.enable(); + case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.enable(); + case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.enable(); + case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.enable(); + case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.enable(); + case GL12.GL_RESCALE_NORMAL -> GLSMLighting.enableRescaleNormal(glCtx); + case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.enable(); + case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.enable(); + case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.enable(); + case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.enable(); + case GL11.GL_SCISSOR_TEST -> GLSMRasterizer.enableScissorTest(glCtx); + case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.enable(); + case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).enable(); + case GL11.GL_TEXTURE_2D -> GLSMTextures.enableTexture(glCtx); + case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).enable(); + case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).enable(); + case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).enable(); + case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).enable(); + case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).enable(); + case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).enable(); + default -> { + glCtx.exitCapture.reject(); + if (!GLSMVertexInput.setClientArrayCap(glCtx, cap, true)) RENDER_BACKEND.enable(cap); + } + } + } + + public static void glDisable(int cap) { + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(cap); + if (mode == RecordMode.COMPILE) { + return; + } + } + // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES) + if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) { + glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].disable(); + glCtx.clipPlaneGeneration++; + return; + } + + switch (cap) { + case GL11.GL_ALPHA_TEST -> GLSMDepthStencilAlpha.disableAlphaTest(glCtx); + case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.disable(); + case GL11.GL_BLEND -> GLSMBlend.disableBlend(glCtx); + case GL11.GL_COLOR_MATERIAL -> GLSMLighting.disableColorMaterial(glCtx); + case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.disable(); + case GL14.GL_COLOR_SUM -> glCtx.colorSumState.disable(); + case GL11.GL_CULL_FACE -> GLSMRasterizer.disableCull(glCtx); + case GL11.GL_DEPTH_TEST -> GLSMDepthStencilAlpha.disableDepthTest(glCtx); + case GL11.GL_DITHER -> glCtx.ditherState.disable(); + case GL11.GL_FOG -> GLSMFog.disableFog(glCtx); + case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.disable(); + case GL11.GL_LIGHTING -> GLSMLighting.disableLighting(glCtx); + case GL11.GL_LIGHT0 -> GLSMLighting.disableLight(glCtx, 0); + case GL11.GL_LIGHT1 -> GLSMLighting.disableLight(glCtx, 1); + case GL11.GL_LIGHT2 -> GLSMLighting.disableLight(glCtx, 2); + case GL11.GL_LIGHT3 -> GLSMLighting.disableLight(glCtx, 3); + case GL11.GL_LIGHT4 -> GLSMLighting.disableLight(glCtx, 4); + case GL11.GL_LIGHT5 -> GLSMLighting.disableLight(glCtx, 5); + case GL11.GL_LIGHT6 -> GLSMLighting.disableLight(glCtx, 6); + case GL11.GL_LIGHT7 -> GLSMLighting.disableLight(glCtx, 7); + case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.disable(); + case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.disable(); + case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.disable(); + case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.disable(); + case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.disable(); + case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.disable(); + case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.disable(); + case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.disable(); + case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.disable(); + case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.disable(); + case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.disable(); + case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.disable(); + case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.disable(); + case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.disable(); + case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.disable(); + case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.disable(); + case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.disable(); + case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.disable(); + case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.disable(); + case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.disable(); + case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.disable(); + case GL11.GL_NORMALIZE -> glCtx.normalizeState.disable(); + case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.disable(); + case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.disable(); + case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.disable(); + case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.disable(); + case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.disable(); + case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.disable(); + case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.disable(); + case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.disable(); + case GL12.GL_RESCALE_NORMAL -> GLSMLighting.disableRescaleNormal(glCtx); + case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.disable(); + case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.disable(); + case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.disable(); + case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.disable(); + case GL11.GL_SCISSOR_TEST -> GLSMRasterizer.disableScissorTest(glCtx); + case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.disable(); + case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).disable(); + case GL11.GL_TEXTURE_2D -> GLSMTextures.disableTexture(glCtx); + case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).disable(); + case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).disable(); + case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).disable(); + case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).disable(); + case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).disable(); + case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).disable(); + default -> { + glCtx.exitCapture.reject(); + if (!GLSMVertexInput.setClientArrayCap(glCtx, cap, false)) RENDER_BACKEND.disable(cap); + } + } + } + + public static boolean glIsEnabled(int cap) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (!isCachingEnabled()) { + return RENDER_BACKEND.getBoolean(cap); + } + // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES) + if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) { + return glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].isEnabled(); + } + + return switch (cap) { + case GL11.GL_ALPHA_TEST -> glCtx.alphaTest.isEnabled(); + case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.isEnabled(); + case GL11.GL_BLEND -> glCtx.blendMode.isEnabled(); + case GL11.GL_COLOR_MATERIAL -> glCtx.colorMaterial.isEnabled(); + case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.isEnabled(); + case GL14.GL_COLOR_SUM -> glCtx.colorSumState.isEnabled(); + case GL11.GL_CULL_FACE -> glCtx.cullState.isEnabled(); + case GL11.GL_DEPTH_TEST -> glCtx.depthTest.isEnabled(); + case GL11.GL_DITHER -> glCtx.ditherState.isEnabled(); + case GL11.GL_FOG -> glCtx.fogMode.isEnabled(); + case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.isEnabled(); + case GL11.GL_LIGHTING -> glCtx.lightingState.isEnabled(); + case GL11.GL_LIGHT0 -> glCtx.lightStates[0].isEnabled(); + case GL11.GL_LIGHT1 -> glCtx.lightStates[1].isEnabled(); + case GL11.GL_LIGHT2 -> glCtx.lightStates[2].isEnabled(); + case GL11.GL_LIGHT3 -> glCtx.lightStates[3].isEnabled(); + case GL11.GL_LIGHT4 -> glCtx.lightStates[4].isEnabled(); + case GL11.GL_LIGHT5 -> glCtx.lightStates[5].isEnabled(); + case GL11.GL_LIGHT6 -> glCtx.lightStates[6].isEnabled(); + case GL11.GL_LIGHT7 -> glCtx.lightStates[7].isEnabled(); + case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.isEnabled(); + case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.isEnabled(); + case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.isEnabled(); + case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.isEnabled(); + case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.isEnabled(); + case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.isEnabled(); + case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.isEnabled(); + case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.isEnabled(); + case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.isEnabled(); + case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.isEnabled(); + case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.isEnabled(); + case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.isEnabled(); + case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.isEnabled(); + case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.isEnabled(); + case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.isEnabled(); + case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.isEnabled(); + case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.isEnabled(); + case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.isEnabled(); + case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.isEnabled(); + case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.isEnabled(); + case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.isEnabled(); + case GL11.GL_NORMALIZE -> glCtx.normalizeState.isEnabled(); + case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.isEnabled(); + case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.isEnabled(); + case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.isEnabled(); + case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.isEnabled(); + case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.isEnabled(); + case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.isEnabled(); + case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.isEnabled(); + case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.isEnabled(); + case GL12.GL_RESCALE_NORMAL -> glCtx.rescaleNormalState.isEnabled(); + case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.isEnabled(); + case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.isEnabled(); + case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.isEnabled(); + case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.isEnabled(); + case GL11.GL_SCISSOR_TEST -> glCtx.scissorTest.isEnabled(); + case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.isEnabled(); + case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_TEXTURE_2D -> glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + default -> { + final int conv = GLSMVertexInput.clientStateToConventional(glCtx, cap); + yield conv >= 0 ? glCtx.vaos.isConventionalEnabled(conv) : LegacyQueries.desc(cap) == 0 && RENDER_BACKEND.getBoolean(cap); + } + }; + } + + public static void glEnablei(int cap, int index) { + rejectExitCapture(); + RENDER_BACKEND.enablei(cap, index); + markIndexedCapUnknown(cap); + } + + public static void glDisablei(int cap, int index) { + rejectExitCapture(); + RENDER_BACKEND.disablei(cap, index); + markIndexedCapUnknown(cap); + } + + private static void markIndexedCapUnknown(int cap) { + if (cap == GL11.GL_BLEND) { + ctx().blendMode.setUnknownState(); + } else if (cap == GL11.GL_SCISSOR_TEST) { + ctx().scissorTest.setUnknownState(); + } + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFog.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFog.java new file mode 100644 index 000000000..98abb9e99 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFog.java @@ -0,0 +1,169 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; +import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.FogStateStack; +import org.joml.Vector3d; +import org.lwjgl.opengl.GL11; +import java.nio.FloatBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.HAS_MULTIPLE_SET; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; + +public final class GLSMFog { + + private GLSMFog() {} + + public static void enableFog() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL11.GL_FOG); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableFog(ctx()); + } + + static void enableFog(GLContextState glCtx) { + glCtx.fogMode.enable(); + if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { + GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); + } + } + + public static void disableFog() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL11.GL_FOG); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableFog(ctx()); + } + + static void disableFog(GLContextState glCtx) { + glCtx.fogMode.disable(); + if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { + GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); + } + } + + public static void glFog(int pname, FloatBuffer param) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordFog(pname, param); + if (mode == RecordMode.COMPILE) { + return; + } + } + if (HAS_MULTIPLE_SET.contains(pname)) { + if (pname == GL11.GL_FOG_COLOR && isCachingEnabled()) { + final float red = param.get(0); + final float green = param.get(1); + final float blue = param.get(2); + + beforeUncapturedStateChange(); + mod(glCtx.fogState); + glCtx.fogState.getFogColor().set(red, green, blue); + glCtx.fogState.setFogAlpha(param.get(3)); + glCtx.fogState.getFogColorBuffer().clear(); + glCtx.fogState.getFogColorBuffer().put((FloatBuffer) param.position(0)).flip(); + glCtx.fragmentGeneration++; + if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { + GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); + } + } + } else { + glFogf(pname, param.get(0)); + } + } + + public static Vector3d getFogColor() { + return ctx().fogState.getFogColor(); + } + + public static void fogColor(float red, float green, float blue, float alpha) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final boolean caching = isCachingEnabled(); + if (!caching || red != glCtx.fogState.getFogColor().x || green != glCtx.fogState.getFogColor().y || blue != glCtx.fogState.getFogColor().z || alpha != glCtx.fogState.getFogAlpha()) { + beforeUncapturedStateChange(); + mod(glCtx.fogState); + glCtx.fogState.getFogColor().set(red, green, blue); + glCtx.fogState.setFogAlpha(alpha); + glCtx.fogState.getFogColorBuffer().clear(); + glCtx.fogState.getFogColorBuffer().put(red).put(green).put(blue).put(alpha).flip(); + glCtx.fragmentGeneration++; + if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { + GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); + } + } + } + + public static void glFogf(int pname, float param) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordFogf(pname, param); + if (mode == RecordMode.COMPILE) { + return; + } + } + // Update cached state (FFP shader reads from cache) + if (isCachingEnabled()) { + boolean changed = false; + switch (pname) { + case GL11.GL_FOG_DENSITY -> { if (!isCachingEnabled() || glCtx.fogState.getDensity() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setDensity(param); changed = true; } } + case GL11.GL_FOG_START -> { if (!isCachingEnabled() || glCtx.fogState.getStart() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setStart(param); changed = true; } } + case GL11.GL_FOG_END -> { if (!isCachingEnabled() || glCtx.fogState.getEnd() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setEnd(param); changed = true; } } + case GL11.GL_FOG_MODE -> { if (!isCachingEnabled() || glCtx.fogState.getFogMode() != (int) param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setFogMode((int) param); changed = true; } } + default -> {} + } + if (changed) { + glCtx.fragmentGeneration++; + if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { + GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); + } + } + } + } + + public static void glFogi(int pname, int param) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordFogi(pname, param); + if (mode == RecordMode.COMPILE) { + return; + } + } + // Update cached state (FFP shader reads from cache) + if (isCachingEnabled() && pname == GL11.GL_FOG_MODE && (!isCachingEnabled() || glCtx.fogState.getFogMode() != param)) { + beforeUncapturedStateChange(); + mod(glCtx.fogState).setFogMode(param); + glCtx.fragmentGeneration++; + if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { + GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); + } + } + } + + public static FogStateStack getFogState() { + return ctx().fogState; + } + + public static BooleanStateStack getFogMode() { + return ctx().fogMode; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFramebuffer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFramebuffer.java new file mode 100644 index 000000000..937c36251 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMFramebuffer.java @@ -0,0 +1,344 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL30; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MainThread; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMFramebuffer { + + private GLSMFramebuffer() {} + + // This setting varies depending on driver, so it gets queried at runtime + public static int DEFAULT_DRAW_BUFFER = GL11.GL_BACK; + public static boolean framebufferCompletenessIsMeaningful() { return RENDER_BACKEND.framebufferCompletenessIsMeaningful(); } + + static int drawFramebufferBits(GLContextState glCtx, boolean stencil) { + final int sizePname = stencil ? GL30.GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE : GL30.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE; + if (glCtx.drawFramebuffer == 0) { + return RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, stencil ? GL11.GL_STENCIL : GL11.GL_DEPTH, sizePname); + } + final int attachment = stencil ? GL30.GL_STENCIL_ATTACHMENT : GL30.GL_DEPTH_ATTACHMENT; + if (RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, attachment, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) == GL11.GL_NONE) { + return 0; + } + return RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, attachment, sizePname); + } + + static void queryDefaultDrawBuffer() { + DEFAULT_DRAW_BUFFER = RENDER_BACKEND.getInteger(GL11.GL_DRAW_BUFFER); + } + + static void armFirstClear() { + firstClearPending = true; + } + + public static void glDrawBuffer(int mode) { + rejectExitCapture(); + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + DisplayListManager.recordDrawBuffer(mode); + if (recordMode == RecordMode.COMPILE) { + return; + } + } + if (!isCachingEnabled() || ctx().drawBuffer.getValue() != mode) beforeUncapturedStateChange(); + if (isCachingEnabled()) mod(ctx().drawBuffer).setValue(mode); + RENDER_BACKEND.drawBuffer(mode); + } + + private static boolean firstClearPending; + private static long firstClearBlockNanos; + + public static void glClear(int mask) { + rejectExitCapture(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordClear(mask); + if (mode == RecordMode.COMPILE) { + return; + } + } + if (ctx().rasterizerDiscard.isEnabled() || FeedbackManager.getRenderMode() != GL11.GL_RENDER) { + return; + } + if (firstClearPending && Thread.currentThread() == MainThread && getDrawFramebuffer() == 0) { + firstClearPending = false; + final long start = System.nanoTime(); + RENDER_BACKEND.clear(mask); + final long end = System.nanoTime(); + if (end - start > 0) { + firstClearBlockNanos += end - start; + RENDER_BACKEND.recordGate(end - start, end); + } + return; + } + RENDER_BACKEND.clear(mask); + } + + public static long takeFirstClearBlockNanos() { + final long value = firstClearBlockNanos; + firstClearBlockNanos = 0L; + return value; + } + + public static void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer pixels) { + rejectExitCapture(); + type = GLSMTextures.remapPixelTypeForGLES(format, type); + GLSMBuffers.suspendPixelPackBuffer(); + RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels); + GLSMBuffers.restorePixelPackBuffer(); + } + public static void glReadPixels(int x, int y, int width, int height, int format, int type, FloatBuffer pixels) { + rejectExitCapture(); + type = GLSMTextures.remapPixelTypeForGLES(format, type); + GLSMBuffers.suspendPixelPackBuffer(); + RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels); + GLSMBuffers.restorePixelPackBuffer(); + } + public static void glReadPixels(int x, int y, int width, int height, int format, int type, IntBuffer pixels) { + rejectExitCapture(); + type = GLSMTextures.remapPixelTypeForGLES(format, type); + GLSMBuffers.suspendPixelPackBuffer(); + RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels); + GLSMBuffers.restorePixelPackBuffer(); + } + + public static void glReadBuffer(int mode) { + rejectExitCapture(); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glReadBuffer"); + } + RENDER_BACKEND.readBuffer(mode); + } + + public static void glDrawBuffers(int buffer) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDrawBuffers(1, buffer); + if (mode == RecordMode.COMPILE) { + return; + } + } + beforeUncapturedStateChange(); + RENDER_BACKEND.drawBuffers(buffer); + } + + public static void glDrawBuffers(IntBuffer bufs) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDrawBuffers(bufs.remaining(), bufs); + if (mode == RecordMode.COMPILE) { + return; + } + } + beforeUncapturedStateChange(); + RENDER_BACKEND.drawBuffers(bufs); + } + public static boolean glIsFramebuffer(int framebuffer) { rejectExitCapture(); return RENDER_BACKEND.isFramebuffer(framebuffer); } + public static boolean glIsRenderbuffer(int renderbuffer) { rejectExitCapture(); return RENDER_BACKEND.isRenderbuffer(renderbuffer); } + + public static void glBindFramebuffer(int target, int framebuffer) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (target == GL30.GL_FRAMEBUFFER) { + if (glCtx.drawFramebuffer == framebuffer && glCtx.readFramebuffer == framebuffer) return; + if (glCtx.drawFramebuffer != framebuffer) glCtx.drawFramebufferGeneration++; + glCtx.drawFramebuffer = framebuffer; + glCtx.readFramebuffer = framebuffer; + } else if (target == GL30.GL_DRAW_FRAMEBUFFER) { + if (glCtx.drawFramebuffer == framebuffer) return; + glCtx.drawFramebufferGeneration++; + glCtx.drawFramebuffer = framebuffer; + } else if (target == GL30.GL_READ_FRAMEBUFFER) { + if (glCtx.readFramebuffer == framebuffer) return; + glCtx.readFramebuffer = framebuffer; + } + RENDER_BACKEND.bindFramebuffer(target, framebuffer); + } + + public static void glDeleteFramebuffers(int framebuffer) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (glCtx.drawFramebuffer == framebuffer) { glCtx.drawFramebuffer = 0; glCtx.drawFramebufferGeneration++; } + if (glCtx.readFramebuffer == framebuffer) glCtx.readFramebuffer = 0; + final int[] slots = glCtx.framebufferTextures.remove(framebuffer); + if (slots != null) { + for (int slot = 0; slot < slots.length; slot++) GLSMTextureLifetime.setFramebufferSlot(slots, slot, 0); + } + RENDER_BACKEND.deleteFramebuffers(framebuffer); + } + + public static void glDeleteFramebuffers(IntBuffer framebuffers) { + for (int i = framebuffers.position(); i < framebuffers.limit(); i++) glDeleteFramebuffers(framebuffers.get(i)); + } + + public static void glDeleteFramebuffers(int[] framebuffers) { + for (int framebuffer : framebuffers) glDeleteFramebuffers(framebuffer); + } + + public static int glGenFramebuffers() { + requireContext("glGenFramebuffers"); + return RENDER_BACKEND.genFramebuffers(); + } + + public static int glCheckFramebufferStatus(int target) { + rejectExitCapture(); + return RENDER_BACKEND.checkFramebufferStatus(target); + } + + public static int glGetFramebufferAttachmentParameteri(int target, int attachment, int pname) { + rejectExitCapture(); + return RENDER_BACKEND.getFramebufferAttachmentParameteri(target, attachment, pname); + } + + public static void glFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level) { + rejectExitCapture(); + if (!GLSMTextureLifetime.beginAttach(target, attachment, texture)) return; + RENDER_BACKEND.framebufferTexture2D(target, attachment, textarget, texture, level); + } + + public static void glFramebufferTexture1D(int target, int attachment, int textarget, int texture, int level) { + rejectExitCapture(); + if (!GLSMTextureLifetime.beginAttach(target, attachment, texture)) return; + RENDER_BACKEND.framebufferTexture1D(target, attachment, textarget, texture, level); + } + + public static void glFramebufferTexture3D(int target, int attachment, int textarget, int texture, int level, int zoffset) { + rejectExitCapture(); + if (!GLSMTextureLifetime.beginAttach(target, attachment, texture)) return; + RENDER_BACKEND.framebufferTexture3D(target, attachment, textarget, texture, level, zoffset); + } + + public static void glFramebufferTextureLayer(int target, int attachment, int texture, int level, int layer) { + rejectExitCapture(); + if (!GLSMTextureLifetime.beginAttach(target, attachment, texture)) return; + RENDER_BACKEND.framebufferTextureLayer(target, attachment, texture, level, layer); + } + + public static void glFramebufferTexture(int target, int attachment, int texture, int level) { + rejectExitCapture(); + if (!GLSMTextureLifetime.beginAttach(target, attachment, texture)) return; + RENDER_BACKEND.framebufferTexture(target, attachment, texture, level); + } + + public static void glFramebufferTextureFace(int target, int attachment, int texture, int level, int face) { + glFramebufferTexture2D(target, attachment, face, texture, level); + } + + public static void glNamedFramebufferTexture(int framebuffer, int attachment, int texture, int level) { + rejectExitCapture(); + if (!GLSMTextureLifetime.beginAttach(ctx(), framebuffer, attachment, texture)) return; + RENDER_BACKEND.namedFramebufferTexture(framebuffer, attachment, texture, level); + } + + private static int swapDrawFramebuffer(int framebuffer) { + final GLContextState glCtx = ctx(); + final int previous = glCtx.drawFramebuffer; + glCtx.drawFramebuffer = framebuffer; + RENDER_BACKEND.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, framebuffer); + return previous; + } + + public static void glNamedFramebufferTextureLayer(int framebuffer, int attachment, int texture, int level, int layer) { + final int previous = swapDrawFramebuffer(framebuffer); + glFramebufferTextureLayer(GL30.GL_DRAW_FRAMEBUFFER, attachment, texture, level, layer); + swapDrawFramebuffer(previous); + } + + public static void glNamedFramebufferRenderbuffer(int framebuffer, int attachment, int renderbuffertarget, int renderbuffer) { + final int previous = swapDrawFramebuffer(framebuffer); + glFramebufferRenderbuffer(GL30.GL_DRAW_FRAMEBUFFER, attachment, renderbuffertarget, renderbuffer); + swapDrawFramebuffer(previous); + } + + public static void glNamedFramebufferTexture1DEXT(int framebuffer, int attachment, int textarget, int texture, int level) { + final int previous = swapDrawFramebuffer(framebuffer); + glFramebufferTexture1D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level); + swapDrawFramebuffer(previous); + } + + public static void glNamedFramebufferTexture2DEXT(int framebuffer, int attachment, int textarget, int texture, int level) { + final int previous = swapDrawFramebuffer(framebuffer); + glFramebufferTexture2D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level); + swapDrawFramebuffer(previous); + } + + public static void glNamedFramebufferTexture3DEXT(int framebuffer, int attachment, int textarget, int texture, int level, int zoffset) { + final int previous = swapDrawFramebuffer(framebuffer); + glFramebufferTexture3D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level, zoffset); + swapDrawFramebuffer(previous); + } + + public static void glNamedFramebufferTextureEXT(int framebuffer, int attachment, int texture, int level) { + final int previous = swapDrawFramebuffer(framebuffer); + glFramebufferTexture(GL30.GL_DRAW_FRAMEBUFFER, attachment, texture, level); + swapDrawFramebuffer(previous); + } + + public static void glNamedFramebufferTextureFaceEXT(int framebuffer, int attachment, int texture, int level, int face) { + glNamedFramebufferTexture2DEXT(framebuffer, attachment, face, texture, level); + } + + public static void attachTextureForReading(int attachment, int texture) { + if (GLSMTextureLifetime.isDeferredDelete(texture)) return; + final GLContextState glCtx = ctx(); + GLSMTextureLifetime.trackFramebufferAttachment(glCtx, glCtx.readFramebuffer, attachment, texture); + RENDER_BACKEND.framebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, attachment, GL11.GL_TEXTURE_2D, texture, 0); + } + + public static int glGenRenderbuffers() { + requireContext("glGenRenderbuffers"); + return RENDER_BACKEND.genRenderbuffers(); + } + public static void glDeleteRenderbuffers(int renderbuffer) { rejectExitCapture(); RENDER_BACKEND.deleteRenderbuffers(renderbuffer); } + public static void glBindRenderbuffer(int target, int renderbuffer) { rejectExitCapture(); RENDER_BACKEND.bindRenderbuffer(target, renderbuffer); } + public static void glRenderbufferStorage(int target, int internalformat, int width, int height) { rejectExitCapture(); RENDER_BACKEND.renderbufferStorage(target, internalformat, width, height); } + public static void glRenderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) { rejectExitCapture(); RENDER_BACKEND.renderbufferStorageMultisample(target, samples, internalformat, width, height); } + public static void glFramebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer) { + rejectExitCapture(); + GLSMTextureLifetime.beginAttach(target, attachment, 0); + RENDER_BACKEND.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); + } + + public static void glBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { + rejectExitCapture(); + RENDER_BACKEND.blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + } + + public static boolean isFramebufferEnabled() { + return true; + } + public static void glReadPixels(int x, int y, int width, int height, int format, int type, long pixels) { + rejectExitCapture(); + RENDER_BACKEND.readPixels(x, y, width, height, format, GLSMTextures.remapPixelTypeForGLES(format, type), pixels); + } + + public static int getDrawFramebufferGeneration() { + return ctx().drawFramebufferGeneration; + } + + public static IntegerStateStack getDrawBuffer() { + return ctx().drawBuffer; + } + + public static int getDrawFramebuffer() { + return ctx().drawFramebuffer; + } + + public static int getReadFramebuffer() { + return ctx().readFramebuffer; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMLighting.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMLighting.java new file mode 100644 index 000000000..23f7424e4 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMLighting.java @@ -0,0 +1,781 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; +import com.gtnewhorizons.angelica.glsm.ffp.VertexKey; +import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.LightModelStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.LightStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.MaterialStateStack; +import org.joml.Vector4f; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; + +public final class GLSMLighting { + + private GLSMLighting() {} + + public static void glGetMaterial(int face, int pname, FloatBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final MaterialStateStack state; + if (face == GL11.GL_FRONT) { + state = glCtx.frontMaterial; + } else if (face == GL11.GL_BACK) { + state = glCtx.backMaterial; + } else { + throw new RuntimeException("Invalid face parameter specified to glGetMaterial: " + face); + } + + switch (pname) { + case GL11.GL_AMBIENT -> state.ambient.get(params.position(), params); + case GL11.GL_DIFFUSE -> state.diffuse.get(params.position(), params); + case GL11.GL_SPECULAR -> state.specular.get(params.position(), params); + case GL11.GL_EMISSION -> state.emission.get(params.position(), params); + case GL11.GL_SHININESS -> params.put(params.position(), state.shininess); + case GL11.GL_COLOR_INDEXES -> state.colorIndexes.get(params.position(), params); + default -> { + } + } + } + + private static void putLightingInts(FloatBuffer values, int pname, boolean material, IntBuffer params) { + final int count = switch (pname) { + case GL11.GL_AMBIENT, GL11.GL_DIFFUSE, GL11.GL_SPECULAR -> 4; + case GL11.GL_EMISSION -> material ? 4 : 0; + case GL11.GL_COLOR_INDEXES -> material ? 3 : 0; + case GL11.GL_SHININESS -> material ? 1 : 0; + case GL11.GL_POSITION -> material ? 0 : 4; + case GL11.GL_SPOT_DIRECTION -> material ? 0 : 3; + case GL11.GL_SPOT_EXPONENT, GL11.GL_SPOT_CUTOFF, GL11.GL_CONSTANT_ATTENUATION, GL11.GL_LINEAR_ATTENUATION, + GL11.GL_QUADRATIC_ATTENUATION -> material ? 0 : 1; + default -> 0; + }; + final boolean color = count == 4 && pname != GL11.GL_POSITION; + final int pos = params.position(); + for (int i = 0; i < count; i++) { + final float value = values.get(i); + final int converted; + if (color) { + converted = LegacyQueries.floatToInt(value); + } else if (material) { + converted = LegacyQueries.lround(value); + } else { + converted = (int) value; + } + params.put(pos + i, converted); + } + } + + public static void glGetMaterial(int face, int pname, IntBuffer params) { + final FloatBuffer scratch = ctx().queryScratch; + scratch.clear(); + glGetMaterial(face, pname, scratch); + putLightingInts(scratch, pname, true, params); + } + + public static void glGetLight(int light, int pname, IntBuffer params) { + final FloatBuffer scratch = ctx().queryScratch; + scratch.clear(); + glGetLight(light, pname, scratch); + putLightingInts(scratch, pname, false, params); + } + + public static void glGetLight(int light, int pname, FloatBuffer params) { + rejectExitCapture(); + final LightStateStack state = ctx().lightDataStates[light - GL11.GL_LIGHT0]; + switch (pname) { + case GL11.GL_AMBIENT -> state.ambient.get(params.position(), params); + case GL11.GL_DIFFUSE -> state.diffuse.get(params.position(), params); + case GL11.GL_SPECULAR -> state.specular.get(params.position(), params); + case GL11.GL_POSITION -> state.position.get(params.position(), params); + case GL11.GL_SPOT_DIRECTION -> state.spotDirection.get(params.position(), params); + case GL11.GL_SPOT_EXPONENT -> params.put(params.position(), state.spotExponent); + case GL11.GL_SPOT_CUTOFF -> params.put(params.position(), state.spotCutoff); + case GL11.GL_CONSTANT_ATTENUATION -> params.put(params.position(), state.constantAttenuation); + case GL11.GL_LINEAR_ATTENUATION -> params.put(params.position(), state.linearAttenuation); + case GL11.GL_QUADRATIC_ATTENUATION -> params.put(params.position(), state.quadraticAttenuation); + default -> { + } + } + } + + public static float i2f(int i) {return ((i - Integer.MIN_VALUE) & 0xFFFFFFFFL) / 4294967295.0F;} + + public static void enableLighting() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL11.GL_LIGHTING); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableLighting(ctx()); + } + + static void enableLighting(GLContextState glCtx) { + glCtx.lightingState.enable(); + } + + public static void enableLight(int light) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL11.GL_LIGHT0 + light); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableLight(ctx(), light); + } + + static void enableLight(GLContextState glCtx, int light) { + if (light >= VertexKey.FFP_LIGHT_COUNT && (warnedFfpLightMask & (1 << light)) == 0 && ShaderManager.isEnabled()) { + warnedFfpLightMask |= (1 << light); + LOGGER.warn("GL_LIGHT{} enabled, but FFP shader emulation implements only GL_LIGHT0..{}", light, VertexKey.FFP_LIGHT_COUNT - 1, new Throwable("call site")); + } + glCtx.lightStates[light].enable(); + } + + private static int warnedFfpLightMask = 0; + + public static void enableColorMaterial() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL11.GL_COLOR_MATERIAL); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableColorMaterial(ctx()); + } + + static void enableColorMaterial(GLContextState glCtx) { + glCtx.colorMaterial.enable(); + bakeCurrentColorIntoTrackedMaterial(glCtx); + } + + public static void disableColorMaterial() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL11.GL_COLOR_MATERIAL); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableColorMaterial(ctx()); + } + + static void disableColorMaterial(GLContextState glCtx) { + bakeCurrentColorIntoTrackedMaterial(glCtx); + glCtx.colorMaterial.disable(); + } + + private static void bakeCurrentColorIntoTrackedMaterial(GLContextState glCtx) { + glCtx.exitCapture.requireMaterialBakeInputs(); + final float r = glCtx.color.getRed(); + final float g = glCtx.color.getGreen(); + final float b = glCtx.color.getBlue(); + final float a = glCtx.color.getAlpha(); + final int face = glCtx.colorMaterialFace.getValue(); + final int param = glCtx.colorMaterialParameter.getValue(); + if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { + bakeMaterialColor(glCtx, glCtx.frontMaterial, param, r, g, b, a); + } + if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) { + bakeMaterialColor(glCtx, glCtx.backMaterial, param, r, g, b, a); + } + } + + private static boolean materialVectorDiffers(Vector4f vec, float r, float g, float b, float a) { + return vec.x != r || vec.y != g || vec.z != b || vec.w != a; + } + + private static void bakeMaterialColor(GLContextState glCtx, MaterialStateStack material, int param, float r, float g, float b, float a) { + glCtx.exitCapture.material(material.face, param); + final boolean changed = switch (param) { + case GL11.GL_AMBIENT_AND_DIFFUSE -> materialVectorDiffers(material.ambient, r, g, b, a) || materialVectorDiffers(material.diffuse, r, g, b, a); + case GL11.GL_AMBIENT -> materialVectorDiffers(material.ambient, r, g, b, a); + case GL11.GL_DIFFUSE -> materialVectorDiffers(material.diffuse, r, g, b, a); + case GL11.GL_SPECULAR -> materialVectorDiffers(material.specular, r, g, b, a); + case GL11.GL_EMISSION -> materialVectorDiffers(material.emission, r, g, b, a); + default -> false; + }; + if (!changed) return; + mod(material); + switch (param) { + case GL11.GL_AMBIENT_AND_DIFFUSE -> { + material.ambient.set(r, g, b, a); + material.diffuse.set(r, g, b, a); + } + case GL11.GL_AMBIENT -> material.ambient.set(r, g, b, a); + case GL11.GL_DIFFUSE -> material.diffuse.set(r, g, b, a); + case GL11.GL_SPECULAR -> material.specular.set(r, g, b, a); + case GL11.GL_EMISSION -> material.emission.set(r, g, b, a); + default -> {} + } + } + + public static void disableLighting() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL11.GL_LIGHTING); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableLighting(ctx()); + } + + static void disableLighting(GLContextState glCtx) { + glCtx.lightingState.disable(); + } + + public static void disableLight(int light) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL11.GL_LIGHT0 + light); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableLight(ctx(), light); + } + + static void disableLight(GLContextState glCtx, int light) { + glCtx.lightStates[light].disable(); + } + + public static void enableRescaleNormal() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL12.GL_RESCALE_NORMAL); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableRescaleNormal(ctx()); + } + + static void enableRescaleNormal(GLContextState glCtx) { + glCtx.rescaleNormalState.enable(); + } + + public static void disableRescaleNormal() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL12.GL_RESCALE_NORMAL); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableRescaleNormal(ctx()); + } + + static void disableRescaleNormal(GLContextState glCtx) { + glCtx.rescaleNormalState.disable(); + } + + private static boolean glMaterialFront(int pname, FloatBuffer params) { + final GLContextState glCtx = ctx(); + mod(glCtx.frontMaterial); + return switch (pname) { + case GL11.GL_AMBIENT -> glCtx.frontMaterial.setAmbient(params); + case GL11.GL_DIFFUSE -> glCtx.frontMaterial.setDiffuse(params); + case GL11.GL_SPECULAR -> glCtx.frontMaterial.setSpecular(params); + case GL11.GL_EMISSION -> glCtx.frontMaterial.setEmission(params); + case GL11.GL_SHININESS -> glCtx.frontMaterial.setShininess(params); + case GL11.GL_AMBIENT_AND_DIFFUSE -> { + final boolean a = glCtx.frontMaterial.setAmbient(params); + final boolean d = glCtx.frontMaterial.setDiffuse(params); + yield a || d; + } + case GL11.GL_COLOR_INDEXES -> glCtx.frontMaterial.setColorIndexes(params); + default -> false; + }; + } + + private static boolean glMaterialBack(int pname, FloatBuffer params) { + final GLContextState glCtx = ctx(); + mod(glCtx.backMaterial); + return switch (pname) { + case GL11.GL_AMBIENT -> glCtx.backMaterial.setAmbient(params); + case GL11.GL_DIFFUSE -> glCtx.backMaterial.setDiffuse(params); + case GL11.GL_SPECULAR -> glCtx.backMaterial.setSpecular(params); + case GL11.GL_EMISSION -> glCtx.backMaterial.setEmission(params); + case GL11.GL_SHININESS -> glCtx.backMaterial.setShininess(params); + case GL11.GL_AMBIENT_AND_DIFFUSE -> { + final boolean a = glCtx.backMaterial.setAmbient(params); + final boolean d = glCtx.backMaterial.setDiffuse(params); + yield a || d; + } + case GL11.GL_COLOR_INDEXES -> glCtx.backMaterial.setColorIndexes(params); + default -> false; + }; + } + + private static boolean glMaterialFront(int pname, IntBuffer params) { + final GLContextState glCtx = ctx(); + mod(glCtx.frontMaterial); + return switch (pname) { + case GL11.GL_AMBIENT -> glCtx.frontMaterial.setAmbient(params); + case GL11.GL_DIFFUSE -> glCtx.frontMaterial.setDiffuse(params); + case GL11.GL_SPECULAR -> glCtx.frontMaterial.setSpecular(params); + case GL11.GL_EMISSION -> glCtx.frontMaterial.setEmission(params); + case GL11.GL_SHININESS -> glCtx.frontMaterial.setShininess(params); + case GL11.GL_AMBIENT_AND_DIFFUSE -> { + final boolean a = glCtx.frontMaterial.setAmbient(params); + final boolean d = glCtx.frontMaterial.setDiffuse(params); + yield a || d; + } + case GL11.GL_COLOR_INDEXES -> glCtx.frontMaterial.setColorIndexes(params); + default -> false; + }; + } + + private static boolean glMaterialBack(int pname, IntBuffer params) { + final GLContextState glCtx = ctx(); + mod(glCtx.backMaterial); + return switch (pname) { + case GL11.GL_AMBIENT -> glCtx.backMaterial.setAmbient(params); + case GL11.GL_DIFFUSE -> glCtx.backMaterial.setDiffuse(params); + case GL11.GL_SPECULAR -> glCtx.backMaterial.setSpecular(params); + case GL11.GL_EMISSION -> glCtx.backMaterial.setEmission(params); + case GL11.GL_SHININESS -> glCtx.backMaterial.setShininess(params); + case GL11.GL_AMBIENT_AND_DIFFUSE -> { + final boolean a = glCtx.backMaterial.setAmbient(params); + final boolean d = glCtx.backMaterial.setDiffuse(params); + yield a || d; + } + case GL11.GL_COLOR_INDEXES -> glCtx.backMaterial.setColorIndexes(params); + default -> false; + }; + } + + public static void glMaterial(int face, int pname, FloatBuffer params) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.material(face, pname); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordMaterial(face, pname, params); + if (mode == RecordMode.COMPILE) { + return; + } + } + boolean changed = false; + if (face == GL11.GL_FRONT) { + changed = glMaterialFront(pname, params); + } else if (face == GL11.GL_BACK) { + changed = glMaterialBack(pname, params); + } else if (face == GL11.GL_FRONT_AND_BACK) { + final boolean f = glMaterialFront(pname, params); + final boolean b = glMaterialBack(pname, params); + changed = f || b; + } else { + throw new RuntimeException("Unsupported face value for glMaterial: " + face); + } + if (changed) glCtx.lightingGeneration++; + } + + public static void glMaterial(int face, int pname, IntBuffer params) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.material(face, pname); + // For IntBuffer version, we need to convert to float for recording + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + // Convert int params to float for recording + final float[] floatParams = new float[params.remaining()]; + params.mark(); + for (int i = 0; i < floatParams.length; i++) { + floatParams[i] = i2f(params.get()); + } + params.reset(); + DisplayListManager.recordMaterial(face, pname, FloatBuffer.wrap(floatParams)); + if (mode == RecordMode.COMPILE) { + return; + } + } + boolean changed = false; + if (face == GL11.GL_FRONT) { + changed = glMaterialFront(pname, params); + } else if (face == GL11.GL_BACK) { + changed = glMaterialBack(pname, params); + } else if (face == GL11.GL_FRONT_AND_BACK) { + final boolean f = glMaterialFront(pname, params); + final boolean b = glMaterialBack(pname, params); + changed = f || b; + } else { + throw new RuntimeException("Unsupported face value for glMaterial: " + face); + } + if (changed) glCtx.lightingGeneration++; + } + + public static void glMaterialf(int face, int pname, float val) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordMaterialf(face, pname, val); + if (mode == RecordMode.COMPILE) { + return; + } + } + if (pname != GL11.GL_SHININESS) { + // it is only valid to call glMaterialf for the GL_SHININESS parameter + return; + } + + boolean changed = false; + if (face == GL11.GL_FRONT) { + mod(glCtx.frontMaterial); + changed = glCtx.frontMaterial.setShininess(val); + } else if (face == GL11.GL_BACK) { + mod(glCtx.backMaterial); + changed = glCtx.backMaterial.setShininess(val); + } else if (face == GL11.GL_FRONT_AND_BACK) { + mod(glCtx.frontMaterial); + mod(glCtx.backMaterial); + final boolean f = glCtx.frontMaterial.setShininess(val); + final boolean b = glCtx.backMaterial.setShininess(val); + changed = f || b; + } else { + throw new RuntimeException("Unsupported face value for glMaterial: " + face); + } + if (changed) glCtx.lightingGeneration++; + } + + public static void glMateriali(int face, int pname, int val) { + // This will end up no-opping if pname != GL_SHININESS, it is invalid to call this with another pname + // Command recording happens in glMaterialf + glMaterialf(face, pname, (float) val); + } + + public static void glLight(int light, int pname, FloatBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordLight(light, pname, params); + if (mode == RecordMode.COMPILE) { + return; + } + } + final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0]; + mod(lightState); + final boolean changed = switch (pname) { + case GL11.GL_AMBIENT -> lightState.setAmbient(params); + case GL11.GL_DIFFUSE -> lightState.setDiffuse(params); + case GL11.GL_SPECULAR -> lightState.setSpecular(params); + case GL11.GL_POSITION -> lightState.setPosition(params); + case GL11.GL_SPOT_DIRECTION -> lightState.setSpotDirection(params); + case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(params); + case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(params); + case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(params); + case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(params); + case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(params); + default -> false; + }; + if (changed) glCtx.lightingGeneration++; + } + + public static void glLight(int light, int pname, IntBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + // For IntBuffer version, we need to convert to float for recording + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + // Convert int params to float for recording + final float[] floatParams = new float[params.remaining()]; + params.mark(); + for (int i = 0; i < floatParams.length; i++) { + floatParams[i] = i2f(params.get()); + } + params.reset(); + DisplayListManager.recordLight(light, pname, FloatBuffer.wrap(floatParams)); + if (mode == RecordMode.COMPILE) { + return; + } + } + final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0]; + mod(lightState); + final boolean changed = switch (pname) { + case GL11.GL_AMBIENT -> lightState.setAmbient(params); + case GL11.GL_DIFFUSE -> lightState.setDiffuse(params); + case GL11.GL_SPECULAR -> lightState.setSpecular(params); + case GL11.GL_POSITION -> lightState.setPosition(params); + case GL11.GL_SPOT_DIRECTION -> lightState.setSpotDirection(params); + case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(params); + case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(params); + case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(params); + case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(params); + case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(params); + default -> false; + }; + if (changed) glCtx.lightingGeneration++; + } + + public static void glLightf(int light, int pname, float param) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordLightf(light, pname, param); + if (mode == RecordMode.COMPILE) { + return; + } + } + final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0]; + mod(lightState); + final boolean changed = switch (pname) { + case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(param); + case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(param); + case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(param); + case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(param); + case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(param); + default -> false; + }; + if (changed) glCtx.lightingGeneration++; + } + + public static void glLighti(int light, int pname, int param) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordLighti(light, pname, param); + if (mode == RecordMode.COMPILE) { + return; + } + } + final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0]; + mod(lightState); + final boolean changed = switch (pname) { + case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(param); + case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(param); + case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(param); + case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(param); + case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(param); + default -> false; + }; + if (changed) glCtx.lightingGeneration++; + } + + public static void glLightModel(int pname, FloatBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordLightModel(pname, params); + if (mode == RecordMode.COMPILE) { + return; + } + } + mod(glCtx.lightModel); + final boolean changed = switch (pname) { + case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.setAmbient(params); + case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(params); + case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(params); + default -> false; + }; + if (changed) glCtx.lightingGeneration++; + } + + public static void glLightModel(int pname, IntBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + // For IntBuffer version, we need to convert to float for recording + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + // Convert int params to float for recording + final float[] floatParams = new float[params.remaining()]; + params.mark(); + for (int i = 0; i < floatParams.length; i++) { + floatParams[i] = i2f(params.get()); + } + params.reset(); + DisplayListManager.recordLightModel(pname, FloatBuffer.wrap(floatParams)); + if (mode == RecordMode.COMPILE) { + return; + } + } + mod(glCtx.lightModel); + final boolean changed = switch (pname) { + case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.setAmbient(params); + case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.setColorControl(params); + case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(params); + case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(params); + default -> false; + }; + if (changed) glCtx.lightingGeneration++; + } + + public static void glLightModelf(int pname, float param) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordLightModelf(pname, param); + if (mode == RecordMode.COMPILE) { + return; + } + } + + if (isCachingEnabled()) { + mod(glCtx.lightModel); + final boolean changed = switch (pname) { + case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(param); + case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(param); + default -> false; + }; + if (changed) glCtx.lightingGeneration++; + } + } + + public static void glLightModeli(int pname, int param) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordLightModeli(pname, param); + if (mode == RecordMode.COMPILE) { + return; + } + } + + if (isCachingEnabled()) { + mod(glCtx.lightModel); + final boolean changed = switch (pname) { + case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.setColorControl(param); + case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(param); + case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(param); + default -> false; + }; + if (changed) glCtx.lightingGeneration++; + } + } + + public static void glColorMaterial(int face, int mode) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.COLOR_MATERIAL_SETTINGS); + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + DisplayListManager.recordColorMaterial(face, mode); + if (recordMode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.colorMaterialFace.getValue() != face || glCtx.colorMaterialParameter.getValue() != mode) { + mod(glCtx.colorMaterialFace).setValue(face); + mod(glCtx.colorMaterialParameter).setValue(mode); + glCtx.lightingGeneration++; + } + } + + public static int getLightingGeneration() { + return ctx().lightingGeneration; + } + + public static BooleanStateStack getLightingState() { + return ctx().lightingState; + } + + public static BooleanStateStack getRescaleNormalState() { + return ctx().rescaleNormalState; + } + + public static BooleanStateStack getNormalizeState() { + return ctx().normalizeState; + } + + public static BooleanStateStack[] getLightStates() { + return ctx().lightStates; + } + + public static LightStateStack[] getLightDataStates() { + return ctx().lightDataStates; + } + + public static BooleanStateStack getColorMaterial() { + return ctx().colorMaterial; + } + + public static IntegerStateStack getColorMaterialFace() { + return ctx().colorMaterialFace; + } + + public static IntegerStateStack getColorMaterialParameter() { + return ctx().colorMaterialParameter; + } + + public static LightModelStateStack getLightModel() { + return ctx().lightModel; + } + + public static MaterialStateStack getFrontMaterial() { + return ctx().frontMaterial; + } + + public static MaterialStateStack getBackMaterial() { + return ctx().backMaterial; + } + + public static void captureLighting(LightingSnapshot out) { + final GLContextState glCtx = ctx(); + for (int i = 0; i < out.lights.length; i++) { + out.lightEnabled[i] = glCtx.lightStates[i].isEnabled(); + out.lights[i].set(glCtx.lightDataStates[i]); + } + out.lightModel.set(glCtx.lightModel); + out.frontMaterial.set(glCtx.frontMaterial); + out.backMaterial.set(glCtx.backMaterial); + out.colorMaterial = glCtx.colorMaterial.isEnabled(); + out.colorMaterialFace = glCtx.colorMaterialFace.getValue(); + out.colorMaterialParameter = glCtx.colorMaterialParameter.getValue(); + out.normalize = glCtx.normalizeState.isEnabled(); + out.rescaleNormal = glCtx.rescaleNormalState.isEnabled(); + } + + public static void applyLighting(LightingSnapshot in) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + boolean changed = false; + for (int i = 0; i < in.lights.length; i++) { + glCtx.lightStates[i].setEnabled(in.lightEnabled[i]); + if (!glCtx.lightDataStates[i].sameAs(in.lights[i])) { + mod(glCtx.lightDataStates[i]).set(in.lights[i]); + changed = true; + } + } + if (!glCtx.lightModel.sameAs(in.lightModel)) { + mod(glCtx.lightModel).set(in.lightModel); + changed = true; + } + if (!glCtx.frontMaterial.sameAs(in.frontMaterial)) { + mod(glCtx.frontMaterial).set(in.frontMaterial); + changed = true; + } + if (!glCtx.backMaterial.sameAs(in.backMaterial)) { + mod(glCtx.backMaterial).set(in.backMaterial); + changed = true; + } + if (glCtx.colorMaterialFace.getValue() != in.colorMaterialFace || glCtx.colorMaterialParameter.getValue() != in.colorMaterialParameter) { + mod(glCtx.colorMaterialFace).setValue(in.colorMaterialFace); + mod(glCtx.colorMaterialParameter).setValue(in.colorMaterialParameter); + changed = true; + } + // Direct set: glEnable(GL_COLOR_MATERIAL) would bake the current color over the captured material. + glCtx.colorMaterial.setEnabled(in.colorMaterial); + glCtx.normalizeState.setEnabled(in.normalize); + glCtx.rescaleNormalState.setEnabled(in.rescaleNormal); + if (changed) glCtx.lightingGeneration++; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMMatrices.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMMatrices.java new file mode 100644 index 000000000..a9e33967e --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMMatrices.java @@ -0,0 +1,504 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.stacks.MatrixModeStack; +import lombok.SneakyThrows; +import org.joml.Matrix4f; +import org.joml.Matrix4fStack; +import org.joml.Matrix4fc; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.GLU; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Field; +import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.initConfig; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; + +public final class GLSMMatrices { + + private GLSMMatrices() {} + + private static void beforeMatrixChange(GLContextState c) { + beforeMatrixChange(c, false); + } + + private static void beforeMatrixChange(GLContextState c, boolean absolute) { + c.exitCapture.matrixChange(absolute); + if (isUncapturedMatrix(c)) beforeUncapturedStateChange(); + } + + private static boolean isUncapturedMatrix(GLContextState c) { + final int mode = c.matrixMode.getMode(); + return mode == GL11.GL_PROJECTION || (mode == GL11.GL_TEXTURE && c.activeTextureUnit.getValue() != 0); + } + + private static final MethodHandle MAT4_STACK_CURR_DEPTH; + + static { + try { + final Field curr = Matrix4fStack.class.getDeclaredField("curr"); + curr.setAccessible(true); + MAT4_STACK_CURR_DEPTH = MethodHandles.lookup().unreflectGetter(curr); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + @SneakyThrows + public static int getMatrixStackDepth(Matrix4fStack stack) { + // JOML's curr is 0-based (0 = no pushes), but OpenGL starts at 1 (base matrix counts) + return (int) MAT4_STACK_CURR_DEPTH.invokeExact(stack) + 1; + } + + public static void glMatrixMode(int mode) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.MATRIX_MODE); + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + DisplayListManager.recordMatrixMode(mode); + if (recordMode == RecordMode.COMPILE) { + return; + } + } + mod(glCtx.matrixMode).setMode(mode); + } + + public static void glLoadMatrix(FloatBuffer m) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx, true); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + final Matrix4f matrix = new Matrix4f().set(m); + m.rewind(); + DisplayListManager.recordLoadMatrix(matrix); + if (mode == RecordMode.COMPILE) { + return; + } + } + if (isCachingEnabled()) { + matrixStack(glCtx).set(m); + bumpMatrixGeneration(glCtx); + } + } + + public static void glLoadMatrix(DoubleBuffer m) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx, true); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + // Convert double buffer to float buffer for recording + glCtx.conversionMatrix4d.set(m); + m.rewind(); + final Matrix4f floatMatrix = new Matrix4f(); + floatMatrix.set(glCtx.conversionMatrix4d); + DisplayListManager.recordLoadMatrix(floatMatrix); + if (mode == RecordMode.COMPILE) { + return; + } + } + if (isCachingEnabled()) { + glCtx.conversionMatrix4d.set(m); + matrixStack(glCtx).set(glCtx.conversionMatrix4d); + bumpMatrixGeneration(glCtx); + } + } + + public static void setModelViewMatrix(Matrix4fc m) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.matrixChange(GL11.GL_MODELVIEW, 0, true); + if (isCachingEnabled()) { + glCtx.modelViewMatrix.set(m); + glCtx.mvGeneration++; + glCtx.mvLinearGeneration++; + } + } + + public static void setTextureMatrix(int unit, Matrix4fc m) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.matrixChange(GL11.GL_TEXTURE, unit, true); + if (unit != 0) beforeUncapturedStateChange(); + if (isCachingEnabled()) { + glCtx.textures.getTextureUnitMatrix(unit).set(m); + glCtx.texMatrixGeneration++; + } + } + + public static void setProjectionMatrix(Matrix4fc m) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (isCachingEnabled()) { + glCtx.projectionMatrix.set(m); + glCtx.projGeneration++; + } + } + + public static Matrix4fStack getMatrixStack() { + return matrixStack(ctx()); + } + + private static Matrix4fStack matrixStack(GLContextState glCtx) { + switch (glCtx.matrixMode.getMode()) { + case GL11.GL_MODELVIEW -> { + return glCtx.modelViewMatrix; + } + case GL11.GL_PROJECTION -> { + return glCtx.projectionMatrix; + } + case GL11.GL_TEXTURE -> { + return glCtx.textures.getTextureUnitMatrix(glCtx.activeTextureUnit.getValue()); + } + default -> throw new IllegalStateException("Unknown matrix mode: " + glCtx.matrixMode.getMode()); + } + } + + /** Bump the generation counter for the currently active matrix mode. */ + private static void bumpMatrixGeneration(GLContextState glCtx) { + bumpMatrixGeneration(glCtx, true); + } + + private static void bumpMatrixGeneration(GLContextState glCtx, boolean linearChanged) { + switch (glCtx.matrixMode.getMode()) { + case GL11.GL_MODELVIEW -> { + glCtx.mvGeneration++; + if (linearChanged) glCtx.mvLinearGeneration++; + } + case GL11.GL_PROJECTION -> glCtx.projGeneration++; + case GL11.GL_TEXTURE -> glCtx.texMatrixGeneration++; + } + } + + public static void glLoadIdentity() { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx, true); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordLoadIdentity(); + if (mode == RecordMode.COMPILE) { + return; + } + } + if (isCachingEnabled()) { + matrixStack(glCtx).identity(); + bumpMatrixGeneration(glCtx); + } + } + + public static void glTranslatef(float x, float y, float z) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + if (DisplayListManager.isRecording()) { + DisplayListManager.applyMatrixTranslation(x, y, z); + return; + } + if (isCachingEnabled()) { + matrixStack(glCtx).translate(x, y, z); + bumpMatrixGeneration(glCtx, false); + } + } + + public static void glTranslated(double x, double y, double z) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + if (DisplayListManager.isRecording()) { + DisplayListManager.applyMatrixTranslation((float) x, (float) y, (float) z); + return; + } + if (isCachingEnabled()) { + matrixStack(glCtx).translate((float) x, (float) y, (float) z); + bumpMatrixGeneration(glCtx, false); + } + } + + public static void glScalef(float x, float y, float z) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + if (DisplayListManager.isRecording()) { + DisplayListManager.applyMatrixScale(x, y, z); + return; + } + if (isCachingEnabled()) { + matrixStack(glCtx).scale(x, y, z); + bumpMatrixGeneration(glCtx); + } + } + + public static void glScaled(double x, double y, double z) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + if (DisplayListManager.isRecording()) { + DisplayListManager.applyMatrixScale((float) x, (float) y, (float) z); + return; + } + if (isCachingEnabled()) { + matrixStack(glCtx).scale((float) x, (float) y, (float) z); + bumpMatrixGeneration(glCtx); + } + } + + public static void glMultMatrix(FloatBuffer floatBuffer) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + glCtx.multMatrix.set(floatBuffer); + final int currentMode = glCtx.matrixMode.getMode(); + + if (DisplayListManager.isRecording()) { + DisplayListManager.updateRelativeTransform(glCtx.multMatrix); + return; + } + if (isCachingEnabled()) { + matrixStack(glCtx).mul(glCtx.multMatrix); + bumpMatrixGeneration(glCtx); + } + } + + public static void applyMultMatrix(Matrix4f multMatrix) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + if (isCachingEnabled()) { + matrixStack(glCtx).mul(multMatrix); + bumpMatrixGeneration(glCtx); + } + } + + public static void glMultMatrix(DoubleBuffer matrix) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + glCtx.conversionMatrix4d.set(matrix); + glCtx.conversionMatrix4f.set(glCtx.conversionMatrix4d); + + if (DisplayListManager.isRecording()) { + DisplayListManager.updateRelativeTransform(glCtx.conversionMatrix4f); + return; + } + if (isCachingEnabled()) { + matrixStack(glCtx).mul(glCtx.conversionMatrix4f); + bumpMatrixGeneration(glCtx); + } + } + + public static void glRotatef(float angle, float x, float y, float z) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + final float lenSq = x * x + y * y + z * z; + if (lenSq == 0.0f) return; + + // Fast way to normalize rotation + final float scalar = 1.0f / (float) Math.sqrt(lenSq); + x *= scalar; + y *= scalar; + z *= scalar; + // Convert deg to rad + angle = (float) Math.toRadians(angle); + + if (DisplayListManager.isRecording()) { + DisplayListManager.applyMatrixRotation(angle, x, y, z); + return; + } + if (isCachingEnabled()) { + matrixStack(glCtx).rotate(angle, x, y, z); + bumpMatrixGeneration(glCtx); + } + } + + public static void glRotated(double angle, double x, double y, double z) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + final double lenSq = x * x + y * y + z * z; + if (lenSq == 0.0) return; + + // Fast way to normalize rotation + final double scalar = 1.0 / Math.sqrt(lenSq); + x *= scalar; + y *= scalar; + z *= scalar; + // Convert deg to rad + angle = Math.toRadians(angle); + + if (DisplayListManager.isRecording()) { + DisplayListManager.applyMatrixRotation((float) angle, (float) x, (float) y, (float) z); + return; + } + if (isCachingEnabled()) { + matrixStack(glCtx).rotate((float) angle, (float) x, (float) y, (float) z); + bumpMatrixGeneration(glCtx); + } + } + + public static void glOrtho(double left, double right, double bottom, double top, double zNear, double zFar) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + if (DisplayListManager.isRecording()) { + DisplayListManager.updateRelativeTransformOrtho(left, right, bottom, top, zNear, zFar); + return; + } + if (isCachingEnabled()) { + matrixStack(glCtx).ortho((float) left, (float) right, (float) bottom, (float) top, (float) zNear, (float) zFar); + bumpMatrixGeneration(glCtx); + } + } + + public static void glFrustum(double left, double right, double bottom, double top, double zNear, double zFar) { + final GLContextState glCtx = ctx(); + beforeMatrixChange(glCtx); + if (DisplayListManager.isRecording()) { + DisplayListManager.updateRelativeTransformFrustum(left, right, bottom, top, zNear, zFar); + return; + } + if (isCachingEnabled()) { + matrixStack(glCtx).frustum((float) left, (float) right, (float) bottom, (float) top, (float) zNear, (float) zFar); + bumpMatrixGeneration(glCtx); + } + } + + public static void glPushMatrix() { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.pushMatrix(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordPushMatrix(); // Handles flush + relativeTransform stack + if (mode == RecordMode.COMPILE) { + return; + } + } + // Only track stack on main thread (splash thread has separate GL context) + if (isCachingEnabled()) { + try { + matrixStack(glCtx).pushMatrix(); + } catch (IllegalStateException ignored) { + glCtx.exitCapture.reject(); + if (initConfig != null && initConfig.isLwjglDebug()) LOGGER.warn("Matrix stack overflow ", new Throwable()); + } + } + } + + public static void glPopMatrix() { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.popMatrix(); + if (isUncapturedMatrix(glCtx)) beforeUncapturedStateChange(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordPopMatrix(); // Handles flush + relativeTransform stack + lastRecordedTransform sync + if (mode == RecordMode.COMPILE) { + return; + } + } + // Only track stack on main thread (splash thread has separate GL context) + if (isCachingEnabled()) { + try { + matrixStack(glCtx).popMatrix(); + bumpMatrixGeneration(glCtx); + } catch (IllegalStateException ignored) { + glCtx.exitCapture.reject(); + if (initConfig != null && initConfig.isLwjglDebug()) LOGGER.warn("Matrix stack underflow ", new Throwable()); + } + } + } + + public static void gluPerspective(float fovy, float aspect, float zNear, float zFar) { + final GLContextState glCtx = ctx(); + glCtx.gluMatrix.identity().perspective((float) Math.toRadians(fovy), aspect, zNear, zFar); + glCtx.gluMatrix.get(0, glCtx.gluBuffer); + glMultMatrix(glCtx.gluBuffer); + } + + public static void gluLookAt(float eyex, float eyey, float eyez, float centerx, float centery, float centerz, float upx, float upy, float upz) { + final GLContextState glCtx = ctx(); + glCtx.gluMatrix.identity().lookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz); + glCtx.gluMatrix.get(0, glCtx.gluBuffer); + glMultMatrix(glCtx.gluBuffer); + } + + public static void gluOrtho2D(float left, float right, float bottom, float top) { + glOrtho(left, right, bottom, top, -1.0, 1.0); + } + + public static void gluPickMatrix(float x, float y, float deltaX, float deltaY, IntBuffer viewport) { + rejectExitCapture(); + if (deltaX <= 0 || deltaY <= 0) return; + glTranslatef( + (viewport.get(viewport.position() + 2) - 2 * (x - viewport.get(viewport.position() + 0))) / deltaX, + (viewport.get(viewport.position() + 3) - 2 * (y - viewport.get(viewport.position() + 1))) / deltaY, + 0); + glScalef(viewport.get(viewport.position() + 2) / deltaX, viewport.get(viewport.position() + 3) / deltaY, 1.0f); + } + + public static int gluBuild2DMipmaps(int target, int components, int width, int height, int format, int type, ByteBuffer data) { + if (width < 1 || height < 1) return GLU.GLU_INVALID_VALUE; + GLSMTextures.glTexImage2D(target, 0, components, width, height, 0, format, type, data); + GLSMTextures.glGenerateMipmap(target); + return 0; + } + + public static String gluErrorString(int errorCode) { + return switch (errorCode) { + case GLU.GLU_INVALID_ENUM -> "Invalid enum (glu)"; + case GLU.GLU_INVALID_VALUE -> "Invalid value (glu)"; + case GLU.GLU_OUT_OF_MEMORY -> "Out of memory (glu)"; + case GL11.GL_NO_ERROR -> "No error"; + case GL11.GL_INVALID_ENUM -> "Invalid enum"; + case GL11.GL_INVALID_VALUE -> "Invalid value"; + case GL11.GL_INVALID_OPERATION -> "Invalid operation"; + case GL11.GL_OUT_OF_MEMORY -> "Out of memory"; + default -> "Unknown error: " + errorCode; + }; + } + + public static boolean gluUnProject(float winx, float winy, float winz, FloatBuffer modelMatrix, FloatBuffer projMatrix, IntBuffer viewport, FloatBuffer obj_pos) { + final GLContextState glCtx = ctx(); + glCtx.gluMatrix.set(projMatrix).mul(glCtx.gluMatrix2.set(modelMatrix)); + if (Math.abs(glCtx.gluMatrix.determinant()) < 1.0e-10f) return false; + glCtx.gluMatrix.invert(glCtx.gluMatrix); + + float ndcX = (winx - viewport.get(viewport.position())) / viewport.get(viewport.position() + 2) * 2.0f - 1.0f; + float ndcY = (winy - viewport.get(viewport.position() + 1)) / viewport.get(viewport.position() + 3) * 2.0f - 1.0f; + float ndcZ = winz * 2.0f - 1.0f; + + glCtx.gluVec4.set(ndcX, ndcY, ndcZ, 1.0f); + glCtx.gluMatrix.transform(glCtx.gluVec4); + if (glCtx.gluVec4.w == 0.0f) return false; + + float invW = 1.0f / glCtx.gluVec4.w; + obj_pos.put(obj_pos.position(), glCtx.gluVec4.x * invW); + obj_pos.put(obj_pos.position() + 1, glCtx.gluVec4.y * invW); + obj_pos.put(obj_pos.position() + 2, glCtx.gluVec4.z * invW); + return true; + } + + public static int getMvGeneration() { + return ctx().mvGeneration; + } + + public static int getMvLinearGeneration() { + return ctx().mvLinearGeneration; + } + + public static int getProjGeneration() { + return ctx().projGeneration; + } + + public static int getTexMatrixGeneration() { + return ctx().texMatrixGeneration; + } + + public static MatrixModeStack getMatrixMode() { + return ctx().matrixMode; + } + + public static Matrix4fStack getModelViewMatrix() { + return ctx().modelViewMatrix; + } + + public static Matrix4fStack getProjectionMatrix() { + return ctx().projectionMatrix; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMPrograms.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMPrograms.java new file mode 100644 index 000000000..f582fd7f3 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMPrograms.java @@ -0,0 +1,613 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; +import com.gtnewhorizon.gtnhlib.bytebuf.Pointer; +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.ffp.Instancing; +import com.gtnewhorizons.angelica.glsm.profiling.Tracy; +import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; +import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; +import com.gtnewhorizons.angelica.glsm.shader.ProgramBinaryCache; +import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import lombok.Getter; +import org.lwjgl.opengl.ARBShaderObjects; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.KHRDebug; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.charset.StandardCharsets; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.initConfig; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnce; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMPrograms { + + private GLSMPrograms() {} + + public static long programSwitches; + + private static final String TEXTURE = "texture"; + private static final String TEXTURE_RENAMED = "gtexture"; + public static void setFfpInstancing(Instancing mode) { + ctx().ffpInstancing = mode; + } + + public static void glUseProgram(int program) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordUseProgram(program); + if (mode == RecordMode.COMPILE) { + return; + } + } + + final ShaderManager ffp = glCtx.ffp; + if (program == 0 && ffp.isEnabled()) { + final int prev = glCtx.activeProgram; + final boolean changed = prev != 0; + if (changed) glCtx.programGeneration++; + glCtx.activeProgram = 0; // Track that FFP was requested + if (changed && GLSMHooks.PROGRAM_CHANGE.hasListeners()) { + GLSMHooks.programChangeEvent.previousProgram = prev; + GLSMHooks.programChangeEvent.newProgram = 0; + GLSMHooks.programChangeEvent.postBind = false; + GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent); + } + ffp.activate(); + if (changed && GLSMHooks.PROGRAM_CHANGE.hasListeners()) { + GLSMHooks.programChangeEvent.previousProgram = prev; + GLSMHooks.programChangeEvent.newProgram = 0; + GLSMHooks.programChangeEvent.postBind = true; + GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent); + } + return; + } + + // Non-zero program or FFP emulation not enabled + if (program == 0) { + warnOnce("useprogram-zero-ffp-disabled", + "[FFP] glUseProgram(0) reached the driver because emulation is disabled"); + } + if (ffp.isActive()) { + ffp.deactivate(); + } + + final boolean caching = isCachingEnabled(); + if (!caching || program != glCtx.activeProgram) { + if (Tracy.ENABLED) programSwitches++; + glCtx.programGeneration++; + final int prev = glCtx.activeProgram; + glCtx.activeProgram = program; + if (GLSMHooks.PROGRAM_CHANGE.hasListeners()) { + GLSMHooks.programChangeEvent.previousProgram = prev; + GLSMHooks.programChangeEvent.newProgram = program; + GLSMHooks.programChangeEvent.postBind = false; + GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent); + } + if (initConfig != null && initConfig.isLwjglDebug()) { + final String programName = GLDebug.getObjectLabel(KHRDebug.GL_PROGRAM, program); + GLDebug.debugMessage("Activating Program - " + program + ":" + programName); + } + RENDER_BACKEND.useProgram(program); + if (GLSMHooks.PROGRAM_CHANGE.hasListeners()) { + GLSMHooks.programChangeEvent.previousProgram = prev; + GLSMHooks.programChangeEvent.newProgram = program; + GLSMHooks.programChangeEvent.postBind = true; + GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent); + } + } + } + + public static void glShaderSource(int shader, CharSequence source) { + rejectExitCapture(); + String src = source.toString(); + // Always rename reserved words for the target GLSL version (e.g. 'sampler' at 460) + src = GlslTransformUtils.renameReservedWords(src, RENDER_BACKEND.getMinGLSLVersion()); + if (ShaderManager.isEnabled()) { + final int shaderType = RENDER_BACKEND.getShaderi(shader, GL20.GL_SHADER_TYPE); + src = CompatShaderTransformer.transform(src, shaderType, shaderType == GL20.GL_FRAGMENT_SHADER); + } + RENDER_BACKEND.shaderSource(shader, src); + } + + public static void nglShaderSource(int shader, int count, long strings, long lengths) { + rejectExitCapture(); + if (count <= 0) return; + final CharSequence source; + if (count == 1) { + source = decodeShaderSourceString(strings, lengths, 0); + } else { + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < count; i++) sb.append(decodeShaderSourceString(strings, lengths, i)); + source = sb.toString(); + } + glShaderSource(shader, source); + } + + private static String decodeShaderSourceString(long strings, long lengths, int i) { + final long strAddr = MemoryUtilities.memGetAddress(strings + (long) i * Pointer.POINTER_SIZE); + final int len = lengths == MemoryUtilities.NULL ? -1 : MemoryUtilities.memGetInt(lengths + (long) i * 4); + return len < 0 ? MemoryUtilities.memUTF8(strAddr) : MemoryUtilities.memUTF8(strAddr, len); + } + + public static void glShaderSource(int shader, ByteBuffer source) { + final byte[] bytes = new byte[source.remaining()]; + final int pos = source.position(); + source.get(bytes); + source.position(pos); + glShaderSource(shader, new String(bytes, StandardCharsets.UTF_8)); + } + + public static void glShaderSource(int shader, CharSequence[] sources) { + int totalLen = 0; + for (CharSequence s : sources) totalLen += s.length(); + final StringBuilder sb = new StringBuilder(totalLen); + for (CharSequence s : sources) sb.append(s); + glShaderSource(shader, sb.toString()); + } + + public static void glSpecializeShader(int shader, CharSequence entryPoint, IntBuffer constantIndex, IntBuffer constantValue) { + rejectExitCapture(); + RENDER_BACKEND.specializeShader(shader, entryPoint, constantIndex, constantValue); + } + + public static int glGetUniformBlockIndex(int program, CharSequence name) { rejectExitCapture(); return RENDER_BACKEND.getUniformBlockIndex(program, name); } + public static void glUniformBlockBinding(int program, int blockIndex, int binding) { rejectExitCapture(); RENDER_BACKEND.uniformBlockBinding(program, blockIndex, binding); } + public static void glBindFragDataLocation(int program, int colorNumber, CharSequence name) { rejectExitCapture(); RENDER_BACKEND.bindFragDataLocation(program, colorNumber, name); } + public static void glUniform3(int location, float[] values) { rejectExitCapture(); RENDER_BACKEND.uniform3fv(location, values); } + public static void glUniform4(int location, float[] values) { rejectExitCapture(); RENDER_BACKEND.uniform4fv(location, values); } + + public static void glLinkProgram(int program) { + rejectExitCapture(); + if (ShaderManager.isEnabled()) { + generateVertexShaderIfNeeded(program); + } + if (ProgramBinaryCache.isEnabled()) { + ProgramBinaryCache.markRetrievable(program); + } + RENDER_BACKEND.linkProgram(program); + if (ShaderManager.isEnabled() && RENDER_BACKEND.getProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) { + LOGGER.warn("Program {} failed to link: {}", program, RENDER_BACKEND.getProgramInfoLog(program)); + } + CompatUniformManager.onLinkProgram(program); + } + + public static void glProgramParameteri(int program, int pname, int value) { + rejectExitCapture(); + RENDER_BACKEND.programParameteri(program, pname, value); + } + + public static void glGetProgramBinary(int program, IntBuffer length, IntBuffer binaryFormat, ByteBuffer binary) { + rejectExitCapture(); + RENDER_BACKEND.getProgramBinary(program, length, binaryFormat, binary); + } + + public static void glProgramBinary(int program, int binaryFormat, ByteBuffer binary) { + rejectExitCapture(); + RENDER_BACKEND.programBinary(program, binaryFormat, binary); + if (RENDER_BACKEND.getProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_TRUE) { + CompatUniformManager.onLinkProgram(program); + } + } + + /** + * If a program has a fragment shader but no vertex shader, generate a passthrough vertex shader from the fragment's in declarations and attach it. + */ + private static void generateVertexShaderIfNeeded(int program) { + final GLContextState glCtx = ctx(); + final int shaderCount = RENDER_BACKEND.getProgrami(program, GL20.GL_ATTACHED_SHADERS); + if (shaderCount == 0 || shaderCount > glCtx.shaderBuf.capacity()) return; + + glCtx.shaderBuf.clear().limit(shaderCount); + RENDER_BACKEND.getAttachedShaders(program, null, glCtx.shaderBuf); + + int fragmentShader = 0; + boolean hasVertex = false; + for (int i = 0; i < shaderCount; i++) { + final int shader = glCtx.shaderBuf.get(i); + final int type = RENDER_BACKEND.getShaderi(shader, GL20.GL_SHADER_TYPE); + if (type == GL20.GL_VERTEX_SHADER) { + hasVertex = true; + break; + } else if (type == GL20.GL_FRAGMENT_SHADER) { + fragmentShader = shader; + } + } + + if (hasVertex || fragmentShader == 0) return; + + // Fragment-only program - generate a passthrough vertex shader + final String fragSource = RENDER_BACKEND.getShaderSource(fragmentShader, 65536); + String vertSource = CompatShaderTransformer.generatePassthroughVertexShader(fragSource); + if (RenderSystem.isGLES()) { + vertSource = CompatShaderTransformer.toGLES(vertSource, GL20.GL_VERTEX_SHADER, false); + } + + final int vertShader = RENDER_BACKEND.createShader(GL20.GL_VERTEX_SHADER); + RENDER_BACKEND.shaderSource(vertShader, vertSource); + RENDER_BACKEND.compileShader(vertShader); + + if (RENDER_BACKEND.getShaderi(vertShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) { + final String log = RENDER_BACKEND.getShaderInfoLog(vertShader, 8192); + LOGGER.warn("CompatShaderTransformer: Generated passthrough vertex shader failed to compile:\n{}\nSource:\n{}", log, vertSource); + RENDER_BACKEND.deleteShader(vertShader); + return; + } + + LOGGER.debug("CompatShaderTransformer: Generated passthrough vertex shader for fragment-only program {}", program); + RENDER_BACKEND.attachShader(program, vertShader); + RENDER_BACKEND.deleteShader(vertShader); + } + + @Getter + static long programLifetimeGeneration; + private static final IntOpenHashSet programsPendingDeletion = new IntOpenHashSet(); + + public static boolean isProgramPendingDeletion(int program) { + return programsPendingDeletion.contains(program); + } + + public static void glDeleteProgram(int program) { + rejectExitCapture(); + if (program == 0) return; + CompatUniformManager.onDeleteProgram(program); + + // GL defers deletion of a bound program until unbind; activeProgram stays set so the + // cache matches GL_CURRENT_PROGRAM and the next glUseProgram is not skipped as redundant. + if (GLSMHooks.PROGRAM_DELETE.hasListeners()) { + GLSMHooks.programDeleteEvent.program = program; + GLSMHooks.PROGRAM_DELETE.post(GLSMHooks.programDeleteEvent); + } + RENDER_BACKEND.deleteProgram(program); + programsPendingDeletion.add(program); + programsPendingDeletion.removeIf((int id) -> !RENDER_BACKEND.isProgram(id)); + programLifetimeGeneration++; + } + + public static int glCreateShader(int type) { + requireContext("glCreateShader"); + return RENDER_BACKEND.createShader(type); + } + + public static void glCompileShader(int shader) { + rejectExitCapture(); + RENDER_BACKEND.compileShader(shader); + } + + public static int glCreateProgram() { + requireContext("glCreateProgram"); + final int program = RENDER_BACKEND.createProgram(); + programsPendingDeletion.remove(program); + programLifetimeGeneration++; + return program; + } + + public static void glAttachShader(int program, int shader) { + rejectExitCapture(); + RENDER_BACKEND.attachShader(program, shader); + } + + public static void glDetachShader(int program, int shader) { + rejectExitCapture(); + RENDER_BACKEND.detachShader(program, shader); + } + + public static void glDeleteShader(int shader) { + rejectExitCapture(); + RENDER_BACKEND.deleteShader(shader); + } + + public static void glBindAttribLocation(int program, int index, CharSequence name) { + rejectExitCapture(); + RENDER_BACKEND.bindAttribLocation(program, index, name); + } + + public static void glValidateProgram(int program) { + rejectExitCapture(); + RENDER_BACKEND.validateProgram(program); + } + + public static int glGetShaderi(int shader, int pname) { + rejectExitCapture(); + return RENDER_BACKEND.getShaderi(shader, pname); + } + + public static String glGetShaderInfoLog(int shader, int maxLength) { + rejectExitCapture(); + return RENDER_BACKEND.getShaderInfoLog(shader, maxLength); + } + + public static String glGetShaderInfoLog(int shader) { + rejectExitCapture(); + return RENDER_BACKEND.getShaderInfoLog(shader); + } + + public static int glGetProgrami(int program, int pname) { + rejectExitCapture(); + return RENDER_BACKEND.getProgrami(program, pname); + } + + public static String glGetProgramInfoLog(int program, int maxLength) { + rejectExitCapture(); + return RENDER_BACKEND.getProgramInfoLog(program, maxLength); + } + + public static String glGetProgramInfoLog(int program) { + rejectExitCapture(); + return RENDER_BACKEND.getProgramInfoLog(program); + } + + public static boolean glIsProgram(int obj) { + rejectExitCapture(); + final boolean valid = RENDER_BACKEND.isProgram(obj); + if (!valid) programsPendingDeletion.remove(obj); + return valid; + } + + public static boolean glIsShader(int obj) { + rejectExitCapture(); + return RENDER_BACKEND.isShader(obj); + } + public static void glDispatchCompute(int x, int y, int z) { rejectExitCapture(); RENDER_BACKEND.dispatchCompute(x, y, z); } + + public static int glGetUniformLocation(int program, CharSequence name) { + rejectExitCapture(); + int loc = RENDER_BACKEND.getUniformLocation(program, name); + if (loc == -1 && TEXTURE.contentEquals(name)) { + loc = RENDER_BACKEND.getUniformLocation(program, TEXTURE_RENAMED); + } + return loc; + } + + public static int glGetUniformLocation(int program, ByteBuffer name) { + rejectExitCapture(); + int loc = RENDER_BACKEND.getUniformLocation(program, name); + if (loc == -1 && isTextureBuffer(name)) { + loc = RENDER_BACKEND.getUniformLocation(program, TEXTURE_RENAMED); + } + return loc; + } + + public static int glGetAttribLocation(int program, CharSequence name) { + rejectExitCapture(); + int loc = RENDER_BACKEND.getAttribLocation(program, name); + if (loc == -1 && TEXTURE.contentEquals(name)) { + loc = RENDER_BACKEND.getAttribLocation(program, TEXTURE_RENAMED); + } + return loc; + } + + public static int glGetAttribLocation(int program, ByteBuffer name) { + rejectExitCapture(); + int loc = RENDER_BACKEND.getAttribLocation(program, name); + if (loc == -1 && isTextureBuffer(name)) { + loc = RENDER_BACKEND.getAttribLocation(program, TEXTURE_RENAMED); + } + return loc; + } + + private static final ByteBuffer TEXTURE_BYTES = ByteBuffer.wrap(TEXTURE.getBytes(StandardCharsets.US_ASCII)); + + private static boolean isTextureBuffer(ByteBuffer buf) { + final int len = buf.remaining(); + if (len != 7 && len != 8) return false; + // I believe the driver accepts null terminated or not + if (len == 8 && buf.get(buf.position() + 7) != 0) return false; + return buf.slice(buf.position(), 7).equals(TEXTURE_BYTES); + } + + public static void glDeleteObjectARB(int obj) { + rejectExitCapture(); + if (RENDER_BACKEND.isShader(obj)) { + RENDER_BACKEND.deleteShader(obj); + } else { + glDeleteProgram(obj); + } + } + + public static int glGetHandleARB(int pname) { + rejectExitCapture(); + return pname == ARBShaderObjects.GL_PROGRAM_OBJECT_ARB ? GLSMQueries.glGetInteger(GL20.GL_CURRENT_PROGRAM) : RENDER_BACKEND.getInteger(pname); + } + + public static void glGetObjectParameterARB(int obj, int pname, IntBuffer params) { + rejectExitCapture(); + final var backend = RENDER_BACKEND; + if (backend.isShader(obj)) { + params.put(params.position(), backend.getShaderi(obj, pname)); + } else { + backend.getProgramiv(obj, pname, params); + } + } + + public static void glGetObjectParameterARB(int obj, int pname, FloatBuffer params) { + rejectExitCapture(); + final var backend = RENDER_BACKEND; + params.put(params.position(), (float) (backend.isShader(obj) ? backend.getShaderi(obj, pname) : backend.getProgrami(obj, pname))); + } + + public static int glGetObjectParameteriARB(int obj, int pname) { + rejectExitCapture(); + final var backend = RENDER_BACKEND; + return backend.isShader(obj) ? backend.getShaderi(obj, pname) : backend.getProgrami(obj, pname); + } + + public static String glGetInfoLogARB(int obj, int maxLength) { + rejectExitCapture(); + final var backend = RENDER_BACKEND; + return backend.isShader(obj) ? backend.getShaderInfoLog(obj, maxLength) : backend.getProgramInfoLog(obj, maxLength); + } + + public static void glGetInfoLogARB(int obj, IntBuffer length, ByteBuffer infoLog) { + rejectExitCapture(); + final var backend = RENDER_BACKEND; + if (backend.isShader(obj)) { + backend.getShaderInfoLog(obj, length, infoLog); + } else { + backend.getProgramInfoLog(obj, length, infoLog); + } + } + + public static void glUniform1f(int location, float v0) { + rejectExitCapture(); + RENDER_BACKEND.uniform1f(location, v0); + } + + public static void glUniform2f(int location, float v0, float v1) { + rejectExitCapture(); + RENDER_BACKEND.uniform2f(location, v0, v1); + } + + public static void glUniform3f(int location, float v0, float v1, float v2) { + rejectExitCapture(); + RENDER_BACKEND.uniform3f(location, v0, v1, v2); + } + + public static void glUniform4f(int location, float v0, float v1, float v2, float v3) { + rejectExitCapture(); + RENDER_BACKEND.uniform4f(location, v0, v1, v2, v3); + } + + public static void glUniform1i(int location, int v0) { + rejectExitCapture(); + RENDER_BACKEND.uniform1i(location, v0); + } + + public static void glUniform2i(int location, int v0, int v1) { + rejectExitCapture(); + RENDER_BACKEND.uniform2i(location, v0, v1); + } + + public static void glUniform3i(int location, int v0, int v1, int v2) { + rejectExitCapture(); + RENDER_BACKEND.uniform3i(location, v0, v1, v2); + } + + public static void glUniform4i(int location, int v0, int v1, int v2, int v3) { + rejectExitCapture(); + RENDER_BACKEND.uniform4i(location, v0, v1, v2, v3); + } + + public static void glUniform1(int location, FloatBuffer values) { + rejectExitCapture(); + RENDER_BACKEND.uniform1fv(location, values); + } + + public static void glUniform1(int location, IntBuffer values) { + rejectExitCapture(); + RENDER_BACKEND.uniform1iv(location, values); + } + + public static void glUniform2(int location, FloatBuffer values) { + rejectExitCapture(); + RENDER_BACKEND.uniform2(location, values); + } + + public static void glUniform2(int location, IntBuffer values) { + rejectExitCapture(); + RENDER_BACKEND.uniform2iv(location, values); + } + + public static void glUniform3(int location, FloatBuffer values) { + rejectExitCapture(); + RENDER_BACKEND.uniform3(location, values); + } + + public static void glUniform3(int location, IntBuffer values) { + rejectExitCapture(); + RENDER_BACKEND.uniform3iv(location, values); + } + + public static void glUniform4(int location, FloatBuffer values) { + rejectExitCapture(); + RENDER_BACKEND.uniform4(location, values); + } + + public static void glUniform4(int location, IntBuffer values) { + rejectExitCapture(); + RENDER_BACKEND.uniform4iv(location, values); + } + + public static void glUniformMatrix2(int location, boolean transpose, FloatBuffer matrices) { + rejectExitCapture(); + RENDER_BACKEND.uniformMatrix2(location, transpose, matrices); + } + + public static void glUniformMatrix3(int location, boolean transpose, FloatBuffer matrices) { + rejectExitCapture(); + RENDER_BACKEND.uniformMatrix3(location, transpose, matrices); + } + + public static void glUniformMatrix4(int location, boolean transpose, FloatBuffer matrices) { + rejectExitCapture(); + RENDER_BACKEND.uniformMatrix4(location, transpose, matrices); + } + + public static void glGetActiveUniform(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + rejectExitCapture(); + RENDER_BACKEND.getActiveUniform(program, index, length, size, type, name); + } + + public static void glGetActiveAttrib(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { + rejectExitCapture(); + RENDER_BACKEND.getActiveAttrib(program, index, length, size, type, name); + } + + public static String glGetActiveAttrib(int program, int index, int maxLength, IntBuffer sizeType) { + rejectExitCapture(); + return RENDER_BACKEND.getActiveAttrib(program, index, maxLength, sizeType); + } + + public static void glGetAttachedShaders(int program, IntBuffer count, IntBuffer shaders) { + rejectExitCapture(); + RENDER_BACKEND.getAttachedShaders(program, count, shaders); + } + + public static String glGetShaderSource(int shader, int maxLength) { + rejectExitCapture(); + return RENDER_BACKEND.getShaderSource(shader, maxLength); + } + + public static void glGetShaderSource(int shader, IntBuffer length, ByteBuffer source) { + rejectExitCapture(); + RENDER_BACKEND.getShaderSource(shader, length, source); + } + + public static void glGetUniform(int program, int location, FloatBuffer params) { + rejectExitCapture(); + RENDER_BACKEND.getUniformfv(program, location, params); + } + + public static void glGetUniform(int program, int location, IntBuffer params) { + rejectExitCapture(); + RENDER_BACKEND.getUniformiv(program, location, params); + } + + public static int getProgramGeneration() { + return ctx().programGeneration; + } + + public static IntegerStateStack getProgramStack() { + return ctx().programStack; + } + + public static BooleanStateStack getVertexProgramTwoSideState() { + return ctx().vertexProgramTwoSideState; + } + + public static int getActiveProgram() { + return ctx().activeProgram; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMQueries.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMQueries.java new file mode 100644 index 000000000..a48b6e789 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMQueries.java @@ -0,0 +1,594 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.states.PolygonState; +import com.gtnewhorizons.angelica.glsm.states.ImageUnitBinding; +import org.joml.Vector3f; +import org.joml.Vector4f; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL14; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL21; +import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GL31; +import org.lwjgl.opengl.GL33; +import org.lwjgl.opengl.GL42; +import org.lwjgl.opengl.GL43; +import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.HAS_MULTIPLE_SET; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_ATTRIB_STACK_DEPTH; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_CLIP_PLANES; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_LEGACY_TEXTURE_UNITS; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_MODELVIEW_STACK_DEPTH; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_PROJECTION_STACK_DEPTH; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_TEXTURE_COORDS; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_TEXTURE_STACK_DEPTH; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.initConfig; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMQueries { + + private GLSMQueries() {} + + public static boolean glGetBoolean(int pname) { + rejectExitCapture(); + return glGetBoolean(ctx(), pname); + } + + static boolean glGetBoolean(GLContextState glCtx, int pname) { + if (!isCachingEnabled()) { + return RENDER_BACKEND.getBoolean(pname); + } + // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES) + if (pname >= GL11.GL_CLIP_PLANE0 && pname < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) { + return glCtx.clipPlaneStates[pname - GL11.GL_CLIP_PLANE0].isEnabled(); + } + + return switch (pname) { + case GL11.GL_ALPHA_TEST -> glCtx.alphaTest.isEnabled(); + case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.isEnabled(); + case GL11.GL_BLEND -> glCtx.blendMode.isEnabled(); + case GL11.GL_COLOR_MATERIAL -> glCtx.colorMaterial.isEnabled(); + case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.isEnabled(); + case GL14.GL_COLOR_SUM -> glCtx.colorSumState.isEnabled(); + case GL11.GL_CULL_FACE -> glCtx.cullState.isEnabled(); + case GL11.GL_DEPTH_TEST -> glCtx.depthTest.isEnabled(); + case GL11.GL_DEPTH_WRITEMASK -> glCtx.depthState.isEnabled(); + case GL11.GL_DITHER -> glCtx.ditherState.isEnabled(); + case GL11.GL_FOG -> glCtx.fogMode.isEnabled(); + case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.isEnabled(); + case GL11.GL_LIGHTING -> glCtx.lightingState.isEnabled(); + case GL11.GL_LIGHT0 -> glCtx.lightStates[0].isEnabled(); + case GL11.GL_LIGHT1 -> glCtx.lightStates[1].isEnabled(); + case GL11.GL_LIGHT2 -> glCtx.lightStates[2].isEnabled(); + case GL11.GL_LIGHT3 -> glCtx.lightStates[3].isEnabled(); + case GL11.GL_LIGHT4 -> glCtx.lightStates[4].isEnabled(); + case GL11.GL_LIGHT5 -> glCtx.lightStates[5].isEnabled(); + case GL11.GL_LIGHT6 -> glCtx.lightStates[6].isEnabled(); + case GL11.GL_LIGHT7 -> glCtx.lightStates[7].isEnabled(); + case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.isEnabled(); + case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.isEnabled(); + case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.isEnabled(); + case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.isEnabled(); + case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.isEnabled(); + case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.isEnabled(); + case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.isEnabled(); + case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.isEnabled(); + case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.isEnabled(); + case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.isEnabled(); + case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.isEnabled(); + case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.isEnabled(); + case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.isEnabled(); + case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.isEnabled(); + case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.isEnabled(); + case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.isEnabled(); + case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.isEnabled(); + case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.isEnabled(); + case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.isEnabled(); + case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.isEnabled(); + case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.isEnabled(); + case GL11.GL_NORMALIZE -> glCtx.normalizeState.isEnabled(); + case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.isEnabled(); + case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.isEnabled(); + case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.isEnabled(); + case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.isEnabled(); + case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.isEnabled(); + case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.isEnabled(); + case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.isEnabled(); + case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.isEnabled(); + case GL12.GL_RESCALE_NORMAL -> glCtx.rescaleNormalState.isEnabled(); + case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.isEnabled(); + case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.isEnabled(); + case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.isEnabled(); + case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.isEnabled(); + case GL11.GL_SCISSOR_TEST -> glCtx.scissorTest.isEnabled(); + case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.isEnabled(); + case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_TEXTURE_2D -> glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).isEnabled(); + case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.localViewer != 0.0f; + case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.twoSide != 0.0f; + case GL11.GL_EDGE_FLAG -> glCtx.edgeFlagState.isEnabled(); + default -> { + final int conv = GLSMVertexInput.clientStateToConventional(glCtx, pname); + if (conv >= 0) yield glCtx.vaos.isConventionalEnabled(conv); + final int desc = LegacyQueries.desc(pname); + yield desc != 0 ? LegacyQueries.getBoolean(glCtx, pname, desc) : RENDER_BACKEND.getBoolean(pname); + } + }; + } + + public static void glGetBoolean(int pname, ByteBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (!isCachingEnabled()) { + RENDER_BACKEND.getBoolean(pname, params); + return; + } + + switch (pname) { + case GL11.GL_COLOR_WRITEMASK -> { + final int pos = params.position(); + params.put(pos, (byte) (glCtx.colorMask.red ? GL11.GL_TRUE : GL11.GL_FALSE)); + params.put(pos + 1, (byte) (glCtx.colorMask.green ? GL11.GL_TRUE : GL11.GL_FALSE)); + params.put(pos + 2, (byte) (glCtx.colorMask.blue ? GL11.GL_TRUE : GL11.GL_FALSE)); + params.put(pos + 3, (byte) (glCtx.colorMask.alpha ? GL11.GL_TRUE : GL11.GL_FALSE)); + } + default -> { + if (!HAS_MULTIPLE_SET.contains(pname)) { + params.put(params.position(), (byte) (glGetBoolean(glCtx, pname) ? GL11.GL_TRUE : GL11.GL_FALSE)); + } else if (!LegacyQueries.getBooleanv(glCtx, pname, params)) { + RENDER_BACKEND.getBoolean(pname, params); + } + } + } + } + + public static int glGetInteger(int pname) { + rejectExitCapture(); + return glGetInteger(ctx(), pname); + } + + static int glGetInteger(GLContextState glCtx, int pname) { + if (!isCachingEnabled()) { + return RENDER_BACKEND.getInteger(pname); + } + + return switch (pname) { + case GL11.GL_ALPHA_TEST_FUNC -> glCtx.alphaState.getFunction(); + case GL11.GL_DEPTH_FUNC -> glCtx.depthState.getFunc(); + case GL11.GL_LIST_BASE -> glCtx.listBase; + case GL11.GL_LIST_MODE -> DisplayListManager.getListMode(); + case GL11.GL_MATRIX_MODE -> glCtx.matrixMode.getMode(); + case GL11.GL_SHADE_MODEL -> glCtx.shadeModelState.getValue(); + // GL_TEXTURE_2D makes no sense here, but some mod still queries it... + case GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_BINDING_2D -> GLSMTextures.getBoundTextureForServerState(); + case GL13.GL_ACTIVE_TEXTURE -> GL13.GL_TEXTURE0 + GLSMTextures.getActiveTextureUnitForServerState(); + case GL13.GL_CLIENT_ACTIVE_TEXTURE -> GL13.GL_TEXTURE0 + glCtx.clientActiveTextureUnit; + case GL11.GL_COLOR_MATERIAL_FACE -> glCtx.colorMaterialFace.getValue(); + case GL11.GL_COLOR_MATERIAL_PARAMETER -> glCtx.colorMaterialParameter.getValue(); + case GL11.GL_MODELVIEW_STACK_DEPTH -> GLSMMatrices.getMatrixStackDepth(glCtx.modelViewMatrix); + case GL11.GL_PROJECTION_STACK_DEPTH -> GLSMMatrices.getMatrixStackDepth(glCtx.projectionMatrix); + case GL11.GL_DEPTH_WRITEMASK -> glCtx.depthState.isEnabled() ? GL11.GL_TRUE : GL11.GL_FALSE; + case GL11.GL_CULL_FACE_MODE -> glCtx.polygonState.getCullFaceMode(); + case GL11.GL_FRONT_FACE -> glCtx.polygonState.getFrontFace(); + case GL11.GL_POLYGON_MODE -> glCtx.polygonState.getFrontMode(); + case GL11.GL_UNPACK_ALIGNMENT -> glCtx.pixelUnpackState.alignment(); + case GL11.GL_UNPACK_ROW_LENGTH -> glCtx.pixelUnpackState.rowLength(); + case GL11.GL_UNPACK_SKIP_ROWS -> glCtx.pixelUnpackState.skipRows(); + case GL11.GL_UNPACK_SKIP_PIXELS -> glCtx.pixelUnpackState.skipPixels(); + + case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.colorControl; + + case GL14.GL_BLEND_DST_ALPHA -> glCtx.blendState.getDstAlpha(); + case GL11.GL_BLEND_DST, GL14.GL_BLEND_DST_RGB -> glCtx.blendState.getDstRgb(); + case GL14.GL_BLEND_SRC_ALPHA -> glCtx.blendState.getSrcAlpha(); + case GL11.GL_BLEND_SRC, GL14.GL_BLEND_SRC_RGB -> glCtx.blendState.getSrcRgb(); + case GL14.GL_BLEND_EQUATION -> glCtx.blendState.getEquationRgb(); + case GL20.GL_BLEND_EQUATION_ALPHA -> glCtx.blendState.getEquationAlpha(); + + case GL11.GL_LOGIC_OP_MODE -> glCtx.logicOpMode.getValue(); + case GL11.GL_DRAW_BUFFER -> glCtx.drawBuffer.getValue(); + + case GL11.GL_STENCIL_FUNC -> glCtx.stencilState.getFuncFront(); + case GL11.GL_STENCIL_REF -> glCtx.stencilState.getRefFront(); + case GL11.GL_STENCIL_VALUE_MASK -> glCtx.stencilState.getValueMaskFront(); + case GL11.GL_STENCIL_FAIL -> glCtx.stencilState.getFailOpFront(); + case GL11.GL_STENCIL_PASS_DEPTH_FAIL -> glCtx.stencilState.getZFailOpFront(); + case GL11.GL_STENCIL_PASS_DEPTH_PASS -> glCtx.stencilState.getZPassOpFront(); + case GL11.GL_STENCIL_WRITEMASK -> glCtx.stencilState.getWriteMaskFront(); + case GL11.GL_STENCIL_CLEAR_VALUE -> glCtx.stencilState.getClearValue(); + + case GL15.GL_ARRAY_BUFFER_BINDING -> glCtx.boundVBO; + case GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING -> glCtx.vaos.boundEBO; + case GL21.GL_PIXEL_UNPACK_BUFFER_BINDING -> glCtx.boundPixelUnpackBuffer; + case GL21.GL_PIXEL_PACK_BUFFER_BINDING -> glCtx.boundPixelPackBuffer; + + case GL20.GL_CURRENT_PROGRAM -> glCtx.activeProgram; + + case GL30.GL_VERTEX_ARRAY_BINDING -> glCtx.boundVAO; + + case GL30.GL_DRAW_FRAMEBUFFER_BINDING -> glCtx.drawFramebuffer; + case GL30.GL_READ_FRAMEBUFFER_BINDING -> glCtx.readFramebuffer; + + case GL33.GL_SAMPLER_BINDING -> glCtx.samplerUnits.get(glCtx.activeTextureUnit.getValue()); + + default -> switch (pname) { + case GL11.GL_FOG_MODE -> glCtx.fogState.getFogMode(); + case GL11.GL_LINE_STIPPLE_PATTERN -> glCtx.lineState.getStipplePattern() & 0xFFFF; + case GL11.GL_LINE_STIPPLE_REPEAT -> glCtx.lineState.getStippleFactor(); + case GL11.GL_LIST_INDEX -> DisplayListManager.isRecording() ? Math.max(DisplayListManager.getRecordingListId(), 0) : 0; + case GL11.GL_ATTRIB_STACK_DEPTH -> glCtx.attribDepth; + case GL11.GL_CLIENT_ATTRIB_STACK_DEPTH -> glCtx.clientAttribStackPointer; + case GL11.GL_TEXTURE_STACK_DEPTH -> GLSMMatrices.getMatrixStackDepth(glCtx.textures.getTextureUnitMatrix(glCtx.activeTextureUnit.getValue())); + case GL11.GL_MAX_ATTRIB_STACK_DEPTH -> MAX_ATTRIB_STACK_DEPTH; + case GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH -> GLSMAttribStack.CLIENT_ATTRIB_STACK_DEPTH; + case GL11.GL_MAX_MODELVIEW_STACK_DEPTH -> MAX_MODELVIEW_STACK_DEPTH; + case GL11.GL_MAX_PROJECTION_STACK_DEPTH -> MAX_PROJECTION_STACK_DEPTH; + case GL11.GL_MAX_TEXTURE_STACK_DEPTH -> MAX_TEXTURE_STACK_DEPTH; + case GL13.GL_MAX_TEXTURE_UNITS -> MAX_LEGACY_TEXTURE_UNITS; + case GL11.GL_MAX_LIGHTS -> glCtx.lightStates.length; + case GL11.GL_STENCIL_BITS -> GLSMFramebuffer.drawFramebufferBits(glCtx, true); + case GL11.GL_DEPTH_BITS -> GLSMFramebuffer.drawFramebufferBits(glCtx, false); + case GL20.GL_MAX_TEXTURE_COORDS -> MAX_TEXTURE_COORDS; + case GL20.GL_POINT_SPRITE_COORD_ORIGIN -> glCtx.pointState.getSpriteCoordOrigin(); + case GL11.GL_RENDER_MODE -> FeedbackManager.getRenderMode(); + default -> { + final int shift = GLSMRasterizer.hintShift(pname); + if (shift >= 0) yield GLSMRasterizer.hintMode(glCtx.hintState.getValue(), shift); + final int key = GLSMVertexInput.clientArrayField(glCtx, pname); + if (key >= 0 && (key & ~0xFF) != GLSMVertexInput.FIELD_POINTER) yield GLSMVertexInput.clientArrayParam(glCtx, key); + final int desc = LegacyQueries.desc(pname); + yield desc != 0 ? LegacyQueries.getInteger(glCtx, pname, desc) : RENDER_BACKEND.getInteger(pname); + } + }; + }; + } + + public static void glGetInteger(int pname, IntBuffer params) { + rejectExitCapture(); + if (!isCachingEnabled()) { + RENDER_BACKEND.getInteger(pname, params); + return; + } + + switch (pname) { + case GL11.GL_VIEWPORT -> ctx().viewportState.get(params); + case GL11.GL_SCISSOR_BOX -> ctx().scissorState.get(params); + case GL11.GL_POLYGON_MODE -> { + final PolygonState polygon = ctx().polygonState; + final int pos = params.position(); + params.put(pos, polygon.getFrontMode()); + params.put(pos + 1, polygon.getBackMode()); + } + default -> { + final GLContextState glCtx = ctx(); + if (!HAS_MULTIPLE_SET.contains(pname)) { + params.put(params.position(), glGetInteger(glCtx, pname)); + } else if (!LegacyQueries.getIntegerv(glCtx, pname, params)) { + RENDER_BACKEND.getInteger(pname, params); + } + } + } + } + + public static void glGetFloat(int pname, FloatBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (!isCachingEnabled()) { + RENDER_BACKEND.getFloat(pname, params); + return; + } + + switch (pname) { + case GL11.GL_MODELVIEW_MATRIX -> glCtx.modelViewMatrix.get(params.position(), params); + case GL11.GL_PROJECTION_MATRIX -> glCtx.projectionMatrix.get(params.position(), params); + case GL11.GL_TEXTURE_MATRIX -> glCtx.textures.getTextureUnitMatrix(GLSMTextures.getActiveTextureUnit()).get(params.position(), params); + case GL11.GL_COLOR_CLEAR_VALUE -> glCtx.clearColor.get(params); + case GL11.GL_CURRENT_COLOR -> glCtx.color.get(params); + case GL14.GL_CURRENT_SECONDARY_COLOR -> glCtx.secondaryColor.get(params); + case GL11.GL_DEPTH_RANGE -> { + final int pos = params.position(); + params.put(pos, (float) glCtx.viewportState.depthRangeNear); + params.put(pos + 1, (float) glCtx.viewportState.depthRangeFar); + } + case GL14.GL_BLEND_COLOR -> { + final int pos = params.position(); + params.put(pos, glCtx.blendState.getBlendColorR()); + params.put(pos + 1, glCtx.blendState.getBlendColorG()); + params.put(pos + 2, glCtx.blendState.getBlendColorB()); + params.put(pos + 3, glCtx.blendState.getBlendColorA()); + } + case GL11.GL_CURRENT_NORMAL -> { + final Vector3f normal = glCtx.ffp.currentNormal; + final int pos = params.position(); + params.put(pos, normal.x); + params.put(pos + 1, normal.y); + params.put(pos + 2, normal.z); + } + case GL11.GL_CURRENT_TEXTURE_COORDS -> { + final int unit = glCtx.activeTextureUnit.getValue(); + final int pos = params.position(); + if (unit == 1) { + params.put(pos, glCtx.lastBrightnessX); + params.put(pos + 1, glCtx.lastBrightnessY); + params.put(pos + 2, 0.0f); + params.put(pos + 3, 1.0f); + } else if (unit >= 0 && unit < glCtx.ffp.currentTexCoords.length) { + final Vector4f tc = glCtx.ffp.currentTexCoords[unit]; + params.put(pos, tc.x); + params.put(pos + 1, tc.y); + params.put(pos + 2, tc.z); + params.put(pos + 3, tc.w); + } else { + params.put(pos, 0.0f); + params.put(pos + 1, 0.0f); + params.put(pos + 2, 0.0f); + params.put(pos + 3, 1.0f); + } + } + case GL11.GL_FOG_COLOR -> { + final FloatBuffer fogBuf = glCtx.fogState.getFogColorBuffer(); + final int pos = params.position(); + params.put(pos, fogBuf.get(0)); + params.put(pos + 1, fogBuf.get(1)); + params.put(pos + 2, fogBuf.get(2)); + params.put(pos + 3, fogBuf.get(3)); + } + case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.ambient.get(params.position(), params); + case GL14.GL_POINT_DISTANCE_ATTENUATION -> { + final int pos = params.position(); + params.put(pos, glCtx.pointState.getAttenuationConstant()); + params.put(pos + 1, glCtx.pointState.getAttenuationLinear()); + params.put(pos + 2, glCtx.pointState.getAttenuationQuadratic()); + } + default -> { + if (!HAS_MULTIPLE_SET.contains(pname)) { + params.put(params.position(), glGetFloat(glCtx, pname)); + } else { + RENDER_BACKEND.getFloat(pname, params); + } + } + } + } + + public static float glGetFloat(int pname) { + rejectExitCapture(); + return glGetFloat(ctx(), pname); + } + + static float glGetFloat(GLContextState glCtx, int pname) { + return switch (pname) { + case GL11.GL_ALPHA_TEST_REF -> glCtx.alphaState.getReference(); + case GL11.GL_FOG_DENSITY -> glCtx.fogState.getDensity(); + case GL11.GL_FOG_START -> glCtx.fogState.getStart(); + case GL11.GL_FOG_END -> glCtx.fogState.getEnd(); + case GL11.GL_DEPTH_CLEAR_VALUE -> (float) glCtx.depthState.getClearValue(); + case GL11.GL_LINE_WIDTH -> glCtx.lineState.getWidth(); + case GL11.GL_POINT_SIZE -> glCtx.pointState.getSize(); + case GL14.GL_POINT_SIZE_MIN -> glCtx.pointState.getMinSize(); + case GL14.GL_POINT_SIZE_MAX -> Float.isNaN(glCtx.pointState.getMaxSize()) ? GLSMRasterizer.maxPointSize : glCtx.pointState.getMaxSize(); + case GL14.GL_POINT_FADE_THRESHOLD_SIZE -> glCtx.pointState.getFadeThreshold(); + default -> { + final int desc = isCachingEnabled() ? LegacyQueries.desc(pname) : 0; + yield desc != 0 ? LegacyQueries.getFloat(glCtx, pname, desc) : RENDER_BACKEND.getFloat(pname); + } + }; + } + + public static void glGetFloat(int pname, float[] params) { + final FloatBuffer scratch = ctx().queryScratch; + final FloatBuffer buf; + if (params.length <= scratch.capacity()) { + buf = scratch; + buf.clear(); + buf.limit(params.length); + } else { + buf = BufferUtils.createFloatBuffer(params.length); + } + glGetFloat(pname, buf); + buf.position(0); + buf.get(params); + } + + public static double glGetDouble(int pname) { + rejectExitCapture(); + return switch (pname) { + case GL11.GL_DEPTH_CLEAR_VALUE -> ctx().depthState.getClearValue(); + default -> glGetFloat(pname); + }; + } + + public static void glGetDouble(int pname, DoubleBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (!isCachingEnabled()) { + RENDER_BACKEND.getDouble(pname, params); + return; + } + + final int pos = params.position(); + switch (pname) { + case GL11.GL_DEPTH_CLEAR_VALUE -> params.put(pos, glCtx.depthState.getClearValue()); + case GL11.GL_DEPTH_RANGE -> { + params.put(pos, glCtx.viewportState.depthRangeNear); + params.put(pos + 1, glCtx.viewportState.depthRangeFar); + } + case GL11.GL_MODELVIEW_MATRIX, GL11.GL_PROJECTION_MATRIX, GL11.GL_TEXTURE_MATRIX -> widenFromFloat(pname, params, 16); + case GL11.GL_COLOR_CLEAR_VALUE, GL11.GL_CURRENT_COLOR, GL11.GL_CURRENT_TEXTURE_COORDS, GL11.GL_FOG_COLOR, + GL11.GL_LIGHT_MODEL_AMBIENT, GL14.GL_BLEND_COLOR, GL14.GL_CURRENT_SECONDARY_COLOR -> widenFromFloat(pname, params, 4); + case GL11.GL_CURRENT_NORMAL, GL14.GL_POINT_DISTANCE_ATTENUATION -> widenFromFloat(pname, params, 3); + default -> { + if (!HAS_MULTIPLE_SET.contains(pname)) { + params.put(pos, glGetDouble(pname)); + } else { + RENDER_BACKEND.getDouble(pname, params); + } + } + } + } + + public static void glGetDouble(int pname, double[] params) { + final DoubleBuffer scratch = ctx().queryScratchDouble; + final DoubleBuffer buf; + if (params.length <= scratch.capacity()) { + buf = scratch; + buf.clear(); + buf.limit(params.length); + } else { + buf = BufferUtils.createDoubleBuffer(params.length); + } + glGetDouble(pname, buf); + buf.position(0); + buf.get(params); + } + + private static void widenFromFloat(int pname, DoubleBuffer params, int count) { + final FloatBuffer scratch = ctx().queryScratch; + scratch.clear(); + glGetFloat(pname, scratch); + final int pos = params.position(); + for (int i = 0; i < count; i++) { + params.put(pos + i, scratch.get(i)); + } + } + + public static int glGetError() { + rejectExitCapture(); + if (!RENDER_BACKEND.hasContext()) return 0; + if (initConfig.isNoErrorChecks()) return 0; + return RENDER_BACKEND.getError(); + } + + public static void checkGLError() { + final int error = glGetError(); + if (error != GL11.GL_NO_ERROR) GLErrorReporter.reportError(error); + } + + public static String glGetString(int pname) { + rejectExitCapture(); + if (!RENDER_BACKEND.hasContext()) return "no valid GL/render context"; + return RENDER_BACKEND.getString(pname); + } + + public static String glGetStringi(int name, int index) { + rejectExitCapture(); + if (!RENDER_BACKEND.hasContext()) return "no valid GL/render context"; + return RENDER_BACKEND.getStringi(name, index); + } + public static boolean glIsQuery(int query) { rejectExitCapture(); return RENDER_BACKEND.isQuery(query); } + + public static void glGenQueries(IntBuffer ids) { + requireContext("glGenQueries"); + RENDER_BACKEND.genQueries(ids); + } + public static int glGenQueries() { + requireContext("glGenQueries"); + return RENDER_BACKEND.genQueries(); + } + public static void glDeleteQueries(int id) { rejectExitCapture(); RENDER_BACKEND.deleteQueries(id); } + public static void glBeginQuery(int target, int id) { rejectExitCapture(); RENDER_BACKEND.beginQuery(target, id); } + public static void glEndQuery(int target) { rejectExitCapture(); RENDER_BACKEND.endQuery(target); } + public static void glGetQueryObjectui(int id, int pname, IntBuffer params) { rejectExitCapture(); RENDER_BACKEND.getQueryObjectui(id, pname, params); } + public static int glGetQueryObjecti(int id, int pname) { rejectExitCapture(); return RENDER_BACKEND.getQueryObjecti(id, pname); } + public static void glQueryCounter(int id, int target) { rejectExitCapture(); RENDER_BACKEND.queryCounter(id, target); } + public static long glGetQueryObjectui64(int id, int pname) { rejectExitCapture(); return RENDER_BACKEND.getQueryObjectui64(id, pname); } + + public static void glGetInteger(int pname, int[] params) { + rejectExitCapture(); + if (!isCachingEnabled() || params.length == 0) { + RENDER_BACKEND.getInteger(pname, params); + return; + } + + switch (pname) { + case GL11.GL_VIEWPORT -> { + if (params.length < 4) { + RENDER_BACKEND.getInteger(pname, params); + } else { + ctx().viewportState.get(params); + } + } + case GL11.GL_SCISSOR_BOX -> { + if (params.length < 4) { + RENDER_BACKEND.getInteger(pname, params); + } else { + ctx().scissorState.get(params); + } + } + case GL11.GL_POLYGON_MODE -> { + final PolygonState polygon = ctx().polygonState; + params[0] = polygon.getFrontMode(); + if (params.length > 1) params[1] = polygon.getBackMode(); + } + default -> { + final GLContextState glCtx = ctx(); + if (!HAS_MULTIPLE_SET.contains(pname)) { + params[0] = glGetInteger(glCtx, pname); + } else if (!LegacyQueries.getIntegerv(glCtx, pname, params)) { + RENDER_BACKEND.getInteger(pname, params); + } + } + } + } + + private static int indexedIntegerOrBackend(int pname, int index) { + if (pname == GL31.GL_UNIFORM_BUFFER_BINDING) return GLSMBuffers.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index); + if (pname == GL43.GL_SHADER_STORAGE_BUFFER_BINDING) return GLSMBuffers.getIndexedBufferBinding(GL43.GL_SHADER_STORAGE_BUFFER, index); + final ImageUnitBinding binding = !isCachingEnabled() ? null : ctx().imageUnits.get(index); + if (binding == null) return RENDER_BACKEND.getIntegerIndexed(pname, index); + return switch (pname) { + case GL42.GL_IMAGE_BINDING_NAME -> binding.getTexture(); + case GL42.GL_IMAGE_BINDING_LEVEL -> binding.getLevel(); + case GL42.GL_IMAGE_BINDING_LAYERED -> binding.isLayered() ? GL11.GL_TRUE : GL11.GL_FALSE; + case GL42.GL_IMAGE_BINDING_LAYER -> binding.getLayer(); + case GL42.GL_IMAGE_BINDING_ACCESS -> binding.getAccess(); + case GL42.GL_IMAGE_BINDING_FORMAT -> binding.getFormat(); + default -> RENDER_BACKEND.getIntegerIndexed(pname, index); + }; + } + + public static int glGetInteger(int pname, int index) { + rejectExitCapture(); + return indexedIntegerOrBackend(pname, index); + } + + public static int glGetIntegeri(int pname, int index) { + rejectExitCapture(); + return indexedIntegerOrBackend(pname, index); + } + + public static void glGetIntegeri(int pname, int index, IntBuffer params) { + glGetIntegeri_v(pname, index, params); + } + + public static void glGetIntegeri_v(int pname, int index, IntBuffer params) { + rejectExitCapture(); + params.put(params.position(), indexedIntegerOrBackend(pname, index)); + } + + public static void glGetBooleani_v(int pname, int index, ByteBuffer params) { + rejectExitCapture(); + params.put(params.position(), (byte) (indexedIntegerOrBackend(pname, index) != 0 ? GL11.GL_TRUE : GL11.GL_FALSE)); + } + + public static void glGetBooleani(int pname, int index, ByteBuffer params) { + glGetBooleani_v(pname, index, params); + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMRasterizer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMRasterizer.java new file mode 100644 index 000000000..face3d271 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMRasterizer.java @@ -0,0 +1,700 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.LineStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.PointStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.PolygonStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.ScissorStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.ViewPortStateStack; +import com.gtnewhorizons.angelica.glsm.states.ClipPlaneState; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL14; +import org.lwjgl.opengl.GL20; +import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_CLIP_PLANES; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.guardUnsupportedFFP; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMRasterizer { + + private GLSMRasterizer() {} + + static float maxPointSize; + + // Line width range queried at init from GL_ALIASED_LINE_WIDTH_RANGE + static float lineWidthMin = 1.0f; + static float lineWidthMax = 1.0f; + // The driver cannot draw wide lines (Mesa forward-compat, SDL_GPU), so FFP widens them from LineQuads in the vertex shader + public static boolean wideLineEmulationEnabled = false; + + public static void glGetClipPlane(int plane, DoubleBuffer equation) { + rejectExitCapture(); + final int index = plane - GL11.GL_CLIP_PLANE0; + if (index < 0 || index >= MAX_CLIP_PLANES) return; + ctx().clipPlaneState.getEyePlane(index, equation); + } + + static void probeLineWidthRange() { + final FloatBuffer lwRange = BufferUtils.createFloatBuffer(16); + RENDER_BACKEND.getFloat(GL12.GL_ALIASED_LINE_WIDTH_RANGE, lwRange); + lineWidthMin = lwRange.get(0); + lineWidthMax = lwRange.get(1); + final float queriedMax = lineWidthMax; + // Probe whether the driver actually accepts the queried max (Mesa forward-compat rejects > 1.0) + if (lineWidthMax > 1.0f) { + while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {} + RENDER_BACKEND.lineWidth(lineWidthMax); + if (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) { + // Binary search for the actual accepted max between 1.0 and queriedMax + float lo = 1.0f, hi = queriedMax; + while (hi - lo > 0.01f) { + final float mid = (lo + hi) * 0.5f; + while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {} + RENDER_BACKEND.lineWidth(mid); + if (RENDER_BACKEND.getError() == GL11.GL_NO_ERROR) { + lo = mid; + } else { + hi = mid; + } + } + lineWidthMax = lo; + } + RENDER_BACKEND.lineWidth(1.0f); + while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {} + } + wideLineEmulationEnabled = lineWidthMax <= 1.0f; + if (wideLineEmulationEnabled) { + LOGGER.info("GL line width: aliased range [{}, {}], probe at {} rejected, native [{}, {}], line quads widen ({}, {}]", lineWidthMin, queriedMax, queriedMax, lineWidthMin, lineWidthMax, lineWidthMax, queriedMax); + } else { + LOGGER.info("GL line width: aliased range [{}, {}], probe at {} accepted, native [{}, {}]", lineWidthMin, queriedMax, queriedMax, lineWidthMin, lineWidthMax); + } + } + + static void probePointSizeRange(GLContextState glCtx) { + final FloatBuffer range = glCtx.queryScratch; + range.clear(); + RENDER_BACKEND.getFloat(GL11.GL_POINT_SIZE_RANGE, range); + final float smooth = range.get(1); + RENDER_BACKEND.getFloat(GL12.GL_ALIASED_POINT_SIZE_RANGE, range); + maxPointSize = Math.max(smooth, range.get(1)); + } + + public static void enableScissorTest() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL11.GL_SCISSOR_TEST); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableScissorTest(ctx()); + } + + static void enableScissorTest(GLContextState glCtx) { + glCtx.scissorTest.enable(); + } + + public static void disableScissorTest() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL11.GL_SCISSOR_TEST); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableScissorTest(ctx()); + } + + static void disableScissorTest(GLContextState glCtx) { + glCtx.scissorTest.disable(); + } + + public static void glPointParameterf(int pname, float param) { + pointParameter(pname, param, 0.0f, 0.0f); + } + + public static void glPointParameteri(int pname, int param) { + pointParameter(pname, param, 0.0f, 0.0f); + } + + public static void glPointParameter(int pname, FloatBuffer params) { + final int pos = params.position(); + final boolean attenuation = pname == GL14.GL_POINT_DISTANCE_ATTENUATION; + pointParameter(pname, params.get(pos), attenuation ? params.get(pos + 1) : 0.0f, attenuation ? params.get(pos + 2) : 0.0f); + } + + public static void glPointParameter(int pname, IntBuffer params) { + final int pos = params.position(); + final boolean attenuation = pname == GL14.GL_POINT_DISTANCE_ATTENUATION; + pointParameter(pname, params.get(pos), attenuation ? params.get(pos + 1) : 0.0f, attenuation ? params.get(pos + 2) : 0.0f); + } + + private static void pointParameter(int pname, float v0, float v1, float v2) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final PointStateStack point = glCtx.pointState; + switch (pname) { + case GL14.GL_POINT_SIZE_MIN -> { + if (!(v0 < 0.0f) && point.getMinSize() != v0) mod(point).setMinSize(v0); + } + case GL14.GL_POINT_SIZE_MAX -> { + if (!(v0 < 0.0f) && point.getMaxSize() != v0) mod(point).setMaxSize(v0); + } + case GL14.GL_POINT_FADE_THRESHOLD_SIZE -> { + if (!(v0 < 0.0f) && point.getFadeThreshold() != v0) { + mod(point).setFadeThreshold(v0); + RENDER_BACKEND.pointParameterf(pname, v0); + } + } + case GL14.GL_POINT_DISTANCE_ATTENUATION -> { + if (point.getAttenuationConstant() == v0 && point.getAttenuationLinear() == v1 && point.getAttenuationQuadratic() == v2) return; + mod(point); + point.setAttenuationConstant(v0); + point.setAttenuationLinear(v1); + point.setAttenuationQuadratic(v2); + } + case GL20.GL_POINT_SPRITE_COORD_ORIGIN -> { + final int origin = (int) v0; + if ((origin == GL20.GL_LOWER_LEFT || origin == GL20.GL_UPPER_LEFT) && point.getSpriteCoordOrigin() != origin) { + mod(point).setSpriteCoordOrigin(origin); + RENDER_BACKEND.pointParameteri(pname, origin); + } + } + default -> RENDER_BACKEND.pointParameterf(pname, v0); + } + } + + static void applyPointState(GLContextState glCtx) { + final PointStateStack point = glCtx.pointState; + RENDER_BACKEND.pointSize(point.getSize()); + RENDER_BACKEND.pointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, point.getFadeThreshold()); + RENDER_BACKEND.pointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, point.getSpriteCoordOrigin()); + } + + private static boolean isLegacyHint(int target) { + return switch (target) { + case GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_POINT_SMOOTH_HINT, GL11.GL_FOG_HINT, GL14.GL_GENERATE_MIPMAP_HINT -> true; + default -> false; + }; + } + + static int hintShift(int target) { + return switch (target) { + case GL11.GL_PERSPECTIVE_CORRECTION_HINT -> 0; + case GL11.GL_POINT_SMOOTH_HINT -> 2; + case GL11.GL_LINE_SMOOTH_HINT -> 4; + case GL11.GL_POLYGON_SMOOTH_HINT -> 6; + case GL11.GL_FOG_HINT -> 8; + case GL13.GL_TEXTURE_COMPRESSION_HINT -> 10; + case GL14.GL_GENERATE_MIPMAP_HINT -> 12; + case GL20.GL_FRAGMENT_SHADER_DERIVATIVE_HINT -> 14; + default -> -1; + }; + } + + static int hintMode(int packed, int shift) { + return switch (packed >>> shift & 3) { + case 1 -> GL11.GL_FASTEST; + case 2 -> GL11.GL_NICEST; + default -> GL11.GL_DONT_CARE; + }; + } + + private static final int[] DRIVER_HINTS = { + GL11.GL_LINE_SMOOTH_HINT, GL11.GL_POLYGON_SMOOTH_HINT, GL13.GL_TEXTURE_COMPRESSION_HINT, GL20.GL_FRAGMENT_SHADER_DERIVATIVE_HINT + }; + + static void applyHintState(GLContextState glCtx) { + final int packed = glCtx.hintState.getValue(); + for (final int target : DRIVER_HINTS) { + RENDER_BACKEND.hint(target, hintMode(packed, hintShift(target))); + } + } + + public static void enableCull() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL11.GL_CULL_FACE); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableCull(ctx()); + } + + static void enableCull(GLContextState glCtx) { + glCtx.cullState.enable(); + } + + public static void disableCull() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL11.GL_CULL_FACE); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableCull(ctx()); + } + + static void disableCull(GLContextState glCtx) { + glCtx.cullState.disable(); + } + + public static void glShadeModel(int mode) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.SHADE_MODEL); + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + DisplayListManager.recordShadeModel(mode); + if (recordMode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + final int oldValue = glCtx.shadeModelState.getValue(); + final boolean needsUpdate = !caching || oldValue != mode; + + if (needsUpdate) { + mod(glCtx.shadeModelState).setValue(mode); + } + } + + public static void glViewport(int x, int y, int width, int height) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordViewport(x, y, width, height); + if (mode == RecordMode.COMPILE) { + return; + } + } + beforeUncapturedStateChange(); + RENDER_BACKEND.viewport(x, y, width, height); + // Only update cached state when caching is enabled + if (isCachingEnabled()) { + mod(ctx().viewportState).setViewPort(x, y, width, height); + } + } + + public static void glLineWidth(float width) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordLineWidth(width); + if (mode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.lineState.getWidth() != width) { + mod(glCtx.lineState).setWidth(width); + RENDER_BACKEND.lineWidth(Math.clamp(width, lineWidthMin, lineWidthMax)); + } + } + + public static void glCullFace(int mode) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.CULL_FACE); + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + DisplayListManager.recordCullFace(mode); + if (recordMode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.polygonState.getCullFaceMode() != mode) { + mod(glCtx.polygonState).setCullFaceMode(mode); + RENDER_BACKEND.cullFace(mode); + } + } + + public static void glFrontFace(int mode) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.FRONT_FACE); + final RecordMode recordMode = DisplayListManager.getRecordMode(); + if (recordMode != RecordMode.NONE) { + DisplayListManager.recordFrontFace(mode); + if (recordMode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.polygonState.getFrontFace() != mode) { + mod(glCtx.polygonState).setFrontFace(mode); + RENDER_BACKEND.frontFace(mode); + } + } + + public static void glHint(int target, int hint) { + rejectExitCapture(); + if (hint != GL11.GL_NICEST && hint != GL11.GL_FASTEST && hint != GL11.GL_DONT_CARE) { + return; + } + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordHint(target, hint); + if (mode == RecordMode.COMPILE) { + return; + } + } + final int shift = hintShift(target); + if (shift >= 0) { + final IntegerStateStack hints = ctx().hintState; + final int code = hint == GL11.GL_FASTEST ? 1 : hint == GL11.GL_NICEST ? 2 : 0; + final int packed = hints.getValue() & ~(3 << shift) | code << shift; + if (packed != hints.getValue()) mod(hints).setValue(packed); + } + if (!isLegacyHint(target)) { + RENDER_BACKEND.hint(target, hint); + } + } + + public static void glLineStipple(int factor, short pattern) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordLineStipple(factor, pattern); + if (mode == RecordMode.COMPILE) { + return; + } + } + mod(glCtx.lineState); + glCtx.lineState.setStippleFactor(factor); + glCtx.lineState.setStipplePattern(pattern); + } + + public static void glPointSize(float size) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordPointSize(size); + if (mode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.pointState.getSize() != size) { + mod(glCtx.pointState).setSize(size); + RENDER_BACKEND.pointSize(size); + } + } + + public static void glPolygonMode(int face, int polygonMode) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordPolygonMode(face, polygonMode); + if (mode == RecordMode.COMPILE) { + return; + } + } + // Track front/back separately in cache (Mesa compat semantics), but always issue GL_FRONT_AND_BACK to the driver (core profile constraint). + final boolean caching = isCachingEnabled(); + final boolean front = face != GL11.GL_BACK; + final boolean back = face != GL11.GL_FRONT; + final boolean needsUpdate = !caching + || (front && glCtx.polygonState.getFrontMode() != polygonMode) + || (back && glCtx.polygonState.getBackMode() != polygonMode); + if (!needsUpdate) return; + beforeUncapturedStateChange(); + if (caching) { + mod(glCtx.polygonState); + if (front) glCtx.polygonState.setFrontMode(polygonMode); + if (back) glCtx.polygonState.setBackMode(polygonMode); + } + RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, polygonMode); + } + + public static void glPolygonOffset(float factor, float units) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.OFFSET_VALUES); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordPolygonOffset(factor, units); + if (mode == RecordMode.COMPILE) { + return; + } + } + final boolean caching = isCachingEnabled(); + + if (!caching || glCtx.polygonState.getOffsetFactor() != factor || glCtx.polygonState.getOffsetUnits() != units || glCtx.polygonState.getOffsetClamp() != 0.0f) { + mod(glCtx.polygonState); + glCtx.polygonState.setOffsetFactor(factor); + glCtx.polygonState.setOffsetUnits(units); + glCtx.polygonState.setOffsetClamp(0.0f); + RENDER_BACKEND.polygonOffset(factor, units); + } + } + + public static void glPolygonOffsetClamp(float factor, float units, float clamp) { + if (clamp == 0.0f) { + glPolygonOffset(factor, units); + return; + } + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glPolygonOffsetClamp"); + } + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.OFFSET_VALUES); + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.polygonState.getOffsetFactor() != factor || glCtx.polygonState.getOffsetUnits() != units || glCtx.polygonState.getOffsetClamp() != clamp) { + mod(glCtx.polygonState); + glCtx.polygonState.setOffsetFactor(factor); + glCtx.polygonState.setOffsetUnits(units); + glCtx.polygonState.setOffsetClamp(clamp); + RENDER_BACKEND.polygonOffsetClamp(factor, units, clamp); + } + } + + public static void glScissor(int x, int y, int width, int height) { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordScissor(x, y, width, height); + if (mode == RecordMode.COMPILE) { + return; + } + } + beforeUncapturedStateChange(); + RENDER_BACKEND.scissor(x, y, width, height); + if (isCachingEnabled()) { + mod(ctx().scissorState).setScissor(x, y, width, height); + } + } + + public static void glClipPlane(int plane, DoubleBuffer equation) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (DisplayListManager.isRecording()) { + final int pos = equation.position(); + DisplayListManager.recordClipPlane(plane, equation.get(pos), equation.get(pos + 1), equation.get(pos + 2), equation.get(pos + 3)); + return; + } + final int index = plane - GL11.GL_CLIP_PLANE0; + if (index < 0 || index >= MAX_CLIP_PLANES) return; + final int pos = equation.position(); + beforeUncapturedStateChange(); + glCtx.clipPlaneState.setPlane(index, equation.get(pos), equation.get(pos + 1), equation.get(pos + 2), equation.get(pos + 3), glCtx.modelViewMatrix); + glCtx.clipPlaneGeneration++; + } + + /** Returns true if any GL_CLIP_PLANE0..7 is currently enabled. */ + public static boolean anyClipPlaneEnabled() { + return anyClipPlaneEnabled(ctx()); + } + + public static boolean anyClipPlaneEnabled(GLContextState glCtx) { + return glCtx.clipPlaneEnabledMask != 0; + } + + public static void glSampleCoverage(float value, boolean invert) { + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glSampleCoverage"); + } + beforeUncapturedStateChange(); + RENDER_BACKEND.sampleCoverage(value, invert); + } + + public static void glPolygonStipple(ByteBuffer pattern) { + guardUnsupportedFFP("glPolygonStipple", "glPolygonStipple is not available in GL 3.3 core profile."); + } + + public static IntegerStateStack getShadeModelState() { + return ctx().shadeModelState; + } + + public static BooleanStateStack getScissorTest() { + return ctx().scissorTest; + } + + public static BooleanStateStack getCullState() { + return ctx().cullState; + } + + public static BooleanStateStack getDitherState() { + return ctx().ditherState; + } + + public static BooleanStateStack getLineSmoothState() { + return ctx().lineSmoothState; + } + + public static BooleanStateStack getLineStippleState() { + return ctx().lineStippleState; + } + + public static BooleanStateStack getPointSmoothState() { + return ctx().pointSmoothState; + } + + public static BooleanStateStack getPolygonSmoothState() { + return ctx().polygonSmoothState; + } + + public static BooleanStateStack getPolygonStippleState() { + return ctx().polygonStippleState; + } + + public static BooleanStateStack getMultisampleState() { + return ctx().multisampleState; + } + + public static BooleanStateStack getSampleAlphaToCoverageState() { + return ctx().sampleAlphaToCoverageState; + } + + public static BooleanStateStack getSampleAlphaToOneState() { + return ctx().sampleAlphaToOneState; + } + + public static BooleanStateStack getSampleCoverageState() { + return ctx().sampleCoverageState; + } + + public static BooleanStateStack getPolygonOffsetPointState() { + return ctx().polygonOffsetPointState; + } + + public static BooleanStateStack getPolygonOffsetLineState() { + return ctx().polygonOffsetLineState; + } + + public static BooleanStateStack getPolygonOffsetFillState() { + return ctx().polygonOffsetFillState; + } + + public static LineStateStack getLineState() { + return ctx().lineState; + } + + public static PointStateStack getPointState() { + return ctx().pointState; + } + + public static IntegerStateStack getHintState() { + return ctx().hintState; + } + + public static BooleanStateStack getPointSpriteState() { + return ctx().pointSpriteState; + } + + public static BooleanStateStack getEdgeFlagState() { + return ctx().edgeFlagState; + } + + public static PolygonStateStack getPolygonState() { + return ctx().polygonState; + } + + public static BooleanStateStack getAutoNormalState() { + return ctx().autoNormalState; + } + + public static BooleanStateStack getMap1Color4State() { + return ctx().map1Color4State; + } + + public static BooleanStateStack getMap1IndexState() { + return ctx().map1IndexState; + } + + public static BooleanStateStack getMap1NormalState() { + return ctx().map1NormalState; + } + + public static BooleanStateStack getMap1TextureCoord1State() { + return ctx().map1TextureCoord1State; + } + + public static BooleanStateStack getMap1TextureCoord2State() { + return ctx().map1TextureCoord2State; + } + + public static BooleanStateStack getMap1TextureCoord3State() { + return ctx().map1TextureCoord3State; + } + + public static BooleanStateStack getMap1TextureCoord4State() { + return ctx().map1TextureCoord4State; + } + + public static BooleanStateStack getMap1Vertex3State() { + return ctx().map1Vertex3State; + } + + public static BooleanStateStack getMap1Vertex4State() { + return ctx().map1Vertex4State; + } + + public static BooleanStateStack getMap2Color4State() { + return ctx().map2Color4State; + } + + public static BooleanStateStack getMap2IndexState() { + return ctx().map2IndexState; + } + + public static BooleanStateStack getMap2NormalState() { + return ctx().map2NormalState; + } + + public static BooleanStateStack getMap2TextureCoord1State() { + return ctx().map2TextureCoord1State; + } + + public static BooleanStateStack getMap2TextureCoord2State() { + return ctx().map2TextureCoord2State; + } + + public static BooleanStateStack getMap2TextureCoord3State() { + return ctx().map2TextureCoord3State; + } + + public static BooleanStateStack getMap2TextureCoord4State() { + return ctx().map2TextureCoord4State; + } + + public static BooleanStateStack getMap2Vertex3State() { + return ctx().map2Vertex3State; + } + + public static BooleanStateStack getMap2Vertex4State() { + return ctx().map2Vertex4State; + } + + public static BooleanStateStack[] getClipPlaneStates() { + return ctx().clipPlaneStates; + } + + public static ClipPlaneState getClipPlaneState() { + return ctx().clipPlaneState; + } + + public static ViewPortStateStack getViewportState() { + return ctx().viewportState; + } + + public static ScissorStateStack getScissorState() { + return ctx().scissorState; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTexEnvGen.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTexEnvGen.java new file mode 100644 index 000000000..c1532d148 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTexEnvGen.java @@ -0,0 +1,366 @@ +package com.gtnewhorizons.angelica.glsm; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL14; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.guardUnsupportedFFP; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; + +public final class GLSMTexEnvGen { + + private GLSMTexEnvGen() {} + + public static void glTexEnvi(int target, int pname, int param) { + handleTexEnvScalar(target, pname, param); + } + + public static void glTexEnvf(int target, int pname, float param) { + handleTexEnvScalar(target, pname, param); + } + + public static void glTexEnv(int target, int pname, FloatBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (target == GL11.GL_TEXTURE_ENV && pname == GL11.GL_TEXTURE_ENV_COLOR && params.remaining() >= 4) { + beforeUncapturedStateChange(); + final int pos = params.position(); + final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue()); + envState.beforeModify(); + envState.envColorR = params.get(pos); + envState.envColorG = params.get(pos + 1); + envState.envColorB = params.get(pos + 2); + envState.envColorA = params.get(pos + 3); + glCtx.fragmentGeneration++; + return; + } + if (target == GL14.GL_TEXTURE_FILTER_CONTROL) { + guardUnsupportedFFP( + "glTexEnv", + "LOD bias via buffer glTexEnv is not supported; use glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, value) instead."); + return; + } + // Silently ignore other buffer glTexEnv calls (some mods pass combine params via buffers) + } + + public static void glTexEnv(int target, int pname, IntBuffer params) { + rejectExitCapture(); + if (target == GL11.GL_TEXTURE_ENV) { + handleTexEnvScalar(target, pname, (float) params.get(params.position())); + } + } + + /** + * Scalar glTexEnvi/glTexEnvf dispatch. glTexEnv is removed in core profile. GL_TEXTURE_FILTER_CONTROL (LOD bias) is remapped to glTexParameterf. All + * GL_TEXTURE_ENV parameters including GL_COMBINE sub-params are tracked in per-unit TexEnvState. + */ + private static void handleTexEnvScalar(int target, int pname, float param) { + beforeUncapturedStateChange(); + final GLContextState glCtx = ctx(); + if (target == GL14.GL_TEXTURE_FILTER_CONTROL) { + // LOD bias via legacy glTexEnv path - remap to core-profile glTexParameterf + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, param); + return; + } + if (target != GL11.GL_TEXTURE_ENV) return; + + final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue()); + envState.beforeModify(); + final int iparam = (int) param; + + switch (pname) { + case GL11.GL_TEXTURE_ENV_MODE -> { + envState.mode = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_COMBINE_RGB -> { + envState.combineRgb = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_COMBINE_ALPHA -> { + envState.combineAlpha = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_SOURCE0_RGB -> { + envState.sourceRgb[0] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_SOURCE1_RGB -> { + envState.sourceRgb[1] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_SOURCE2_RGB -> { + envState.sourceRgb[2] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_SOURCE0_ALPHA -> { + envState.sourceAlpha[0] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_SOURCE1_ALPHA -> { + envState.sourceAlpha[1] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_SOURCE2_ALPHA -> { + envState.sourceAlpha[2] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_OPERAND0_RGB -> { + envState.operandRgb[0] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_OPERAND1_RGB -> { + envState.operandRgb[1] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_OPERAND2_RGB -> { + envState.operandRgb[2] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_OPERAND0_ALPHA -> { + envState.operandAlpha[0] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_OPERAND1_ALPHA -> { + envState.operandAlpha[1] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_OPERAND2_ALPHA -> { + envState.operandAlpha[2] = iparam; + glCtx.fragmentGeneration++; + } + case GL13.GL_RGB_SCALE -> { + envState.scaleRgb = param; + glCtx.fragmentGeneration++; + } + case GL11.GL_ALPHA_SCALE -> { + envState.scaleAlpha = param; + glCtx.fragmentGeneration++; + } + // Silently ignore unknown pname - other mods may pass unrecognized params + } + } + + public static float glGetTexEnvf(int target, int pname) { + return (float) glGetTexEnvi(target, pname); + } + + public static int glGetTexEnvi(int target, int pname) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (target != GL11.GL_TEXTURE_ENV) return 0; + + final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue()); + return switch (pname) { + case GL11.GL_TEXTURE_ENV_MODE -> envState.mode; + case GL13.GL_COMBINE_RGB -> envState.combineRgb; + case GL13.GL_COMBINE_ALPHA -> envState.combineAlpha; + case GL13.GL_SOURCE0_RGB -> envState.sourceRgb[0]; + case GL13.GL_SOURCE1_RGB -> envState.sourceRgb[1]; + case GL13.GL_SOURCE2_RGB -> envState.sourceRgb[2]; + case GL13.GL_SOURCE0_ALPHA -> envState.sourceAlpha[0]; + case GL13.GL_SOURCE1_ALPHA -> envState.sourceAlpha[1]; + case GL13.GL_SOURCE2_ALPHA -> envState.sourceAlpha[2]; + case GL13.GL_OPERAND0_RGB -> envState.operandRgb[0]; + case GL13.GL_OPERAND1_RGB -> envState.operandRgb[1]; + case GL13.GL_OPERAND2_RGB -> envState.operandRgb[2]; + case GL13.GL_OPERAND0_ALPHA -> envState.operandAlpha[0]; + case GL13.GL_OPERAND1_ALPHA -> envState.operandAlpha[1]; + case GL13.GL_OPERAND2_ALPHA -> envState.operandAlpha[2]; + case GL13.GL_RGB_SCALE -> (int) envState.scaleRgb; + case GL11.GL_ALPHA_SCALE -> (int) envState.scaleAlpha; + default -> 0; + }; + } + + public static void glGetTexEnv(int target, int pname, IntBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (target != GL11.GL_TEXTURE_ENV) return; + if (pname == GL11.GL_TEXTURE_ENV_COLOR) { + final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue()); + params.put(params.position(), (int) (envState.envColorR * 2147483647.0f)); + params.put(params.position() + 1, (int) (envState.envColorG * 2147483647.0f)); + params.put(params.position() + 2, (int) (envState.envColorB * 2147483647.0f)); + params.put(params.position() + 3, (int) (envState.envColorA * 2147483647.0f)); + } else { + params.put(params.position(), glGetTexEnvi(target, pname)); + } + } + + public static void glGetTexEnv(int target, int pname, FloatBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (target != GL11.GL_TEXTURE_ENV) return; + if (pname == GL11.GL_TEXTURE_ENV_COLOR) { + final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue()); + params.put(params.position(), envState.envColorR); + params.put(params.position() + 1, envState.envColorG); + params.put(params.position() + 2, envState.envColorB); + params.put(params.position() + 3, envState.envColorA); + } else { + params.put(params.position(), (float) glGetTexEnvi(target, pname)); + } + } + + + public static void glTexGeni(int coord, int pname, int param) { + beforeUncapturedStateChange(); + final GLContextState glCtx = ctx(); + if (!isCachingEnabled()) return; + if (pname == GL11.GL_TEXTURE_GEN_MODE) { + final int unit = glCtx.activeTextureUnit.getValue(); + glCtx.textures.getTexGenState(unit).setMode(coord, param); + glCtx.texGenGeneration++; + } + } + + public static void glTexGenf(int coord, int pname, float param) { + // Single-float form only valid for GL_TEXTURE_GEN_MODE + glTexGeni(coord, pname, (int) param); + } + + public static void glTexGend(int coord, int pname, double param) { + glTexGeni(coord, pname, (int) param); + } + + public static void glTexGen(int coord, int pname, FloatBuffer params) { + beforeUncapturedStateChange(); + final GLContextState glCtx = ctx(); + if (!isCachingEnabled()) return; + final int unit = glCtx.activeTextureUnit.getValue(); + final var texGenState = glCtx.textures.getTexGenState(unit); + final int pos = params.position(); + switch (pname) { + case GL11.GL_TEXTURE_GEN_MODE -> { + texGenState.setMode(coord, (int) params.get(pos)); + glCtx.texGenGeneration++; + } + case GL11.GL_OBJECT_PLANE -> { + glCtx.texGenTempPlane[0] = params.get(pos); + glCtx.texGenTempPlane[1] = params.get(pos + 1); + glCtx.texGenTempPlane[2] = params.get(pos + 2); + glCtx.texGenTempPlane[3] = params.get(pos + 3); + texGenState.setObjectPlane(coord, glCtx.texGenTempPlane); + glCtx.texGenGeneration++; + } + case GL11.GL_EYE_PLANE -> { + glCtx.texGenTempPlane[0] = params.get(pos); + glCtx.texGenTempPlane[1] = params.get(pos + 1); + glCtx.texGenTempPlane[2] = params.get(pos + 2); + glCtx.texGenTempPlane[3] = params.get(pos + 3); + texGenState.setEyePlane(coord, glCtx.texGenTempPlane, glCtx.modelViewMatrix); + glCtx.texGenGeneration++; + } + } + } + + public static void glTexGen(int coord, int pname, DoubleBuffer params) { + beforeUncapturedStateChange(); + final GLContextState glCtx = ctx(); + if (!isCachingEnabled()) return; + final int pos = params.position(); + glCtx.texGenTempPlane[0] = (float) params.get(pos); + glCtx.texGenTempPlane[1] = (float) params.get(pos + 1); + glCtx.texGenTempPlane[2] = (float) params.get(pos + 2); + glCtx.texGenTempPlane[3] = (float) params.get(pos + 3); + final int unit = glCtx.activeTextureUnit.getValue(); + final var texGenState = glCtx.textures.getTexGenState(unit); + switch (pname) { + case GL11.GL_TEXTURE_GEN_MODE -> { + texGenState.setMode(coord, (int) params.get(pos)); + glCtx.texGenGeneration++; + } + case GL11.GL_OBJECT_PLANE -> { + texGenState.setObjectPlane(coord, glCtx.texGenTempPlane); + glCtx.texGenGeneration++; + } + case GL11.GL_EYE_PLANE -> { + texGenState.setEyePlane(coord, glCtx.texGenTempPlane, glCtx.modelViewMatrix); + glCtx.texGenGeneration++; + } + } + } + + public static void glTexGen(int coord, int pname, IntBuffer params) { + beforeUncapturedStateChange(); + final GLContextState glCtx = ctx(); + if (!isCachingEnabled()) return; + if (pname == GL11.GL_TEXTURE_GEN_MODE) { + final int unit = glCtx.activeTextureUnit.getValue(); + glCtx.textures.getTexGenState(unit).setMode(coord, params.get(params.position())); + glCtx.texGenGeneration++; + } + } + + public static int glGetTexGeni(int coord, int pname) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (pname == GL11.GL_TEXTURE_GEN_MODE) { + return glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue()).getMode(coord); + } + return 0; + } + + public static float glGetTexGenf(int coord, int pname) { + return (float) glGetTexGeni(coord, pname); + } + + public static double glGetTexGend(int coord, int pname) { + return glGetTexGeni(coord, pname); + } + + public static void glGetTexGen(int coord, int pname, IntBuffer params) { + if (pname == GL11.GL_TEXTURE_GEN_MODE) { + params.put(params.position(), glGetTexGeni(coord, pname)); + } + } + + public static void glGetTexGen(int coord, int pname, FloatBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final var state = glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue()); + if (pname == GL11.GL_TEXTURE_GEN_MODE) { + params.put(params.position(), (float) state.getMode(coord)); + } else if (pname == GL11.GL_OBJECT_PLANE) { + final float[] plane = state.getObjectPlane(coord); + params.put(params.position(), plane[0]); + params.put(params.position() + 1, plane[1]); + params.put(params.position() + 2, plane[2]); + params.put(params.position() + 3, plane[3]); + } else if (pname == GL11.GL_EYE_PLANE) { + final float[] plane = state.getEyePlane(coord); + params.put(params.position(), plane[0]); + params.put(params.position() + 1, plane[1]); + params.put(params.position() + 2, plane[2]); + params.put(params.position() + 3, plane[3]); + } + } + + public static void glGetTexGen(int coord, int pname, DoubleBuffer params) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final var state = glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue()); + if (pname == GL11.GL_TEXTURE_GEN_MODE) { + params.put(params.position(), state.getMode(coord)); + } else if (pname == GL11.GL_OBJECT_PLANE) { + final float[] plane = state.getObjectPlane(coord); + params.put(params.position(), plane[0]); + params.put(params.position() + 1, plane[1]); + params.put(params.position() + 2, plane[2]); + params.put(params.position() + 3, plane[3]); + } else if (pname == GL11.GL_EYE_PLANE) { + final float[] plane = state.getEyePlane(coord); + params.put(params.position(), plane[0]); + params.put(params.position() + 1, plane[1]); + params.put(params.position() + 2, plane[2]); + params.put(params.position() + 3, plane[3]); + } + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextureLifetime.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextureLifetime.java new file mode 100644 index 000000000..09737dcfb --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextureLifetime.java @@ -0,0 +1,360 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.profiling.Tracy; +import com.gtnewhorizons.angelica.glsm.stacks.TextureBindingStack; +import com.gtnewhorizons.angelica.glsm.states.ImageUnitBinding; +import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache; +import com.gtnewhorizons.angelica.glsm.texture.TextureTargets; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2LongMap; +import it.unimi.dsi.fastutil.ints.Int2LongMaps; +import it.unimi.dsi.fastutil.ints.Int2LongOpenHashMap; +import it.unimi.dsi.fastutil.longs.LongIterator; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.EXTTextureFilterAnisotropic; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL14; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GL31; +import org.lwjgl.opengl.GL32; +import org.lwjgl.opengl.GL33; +import org.lwjgl.opengl.GL42; +import org.lwjgl.opengl.GL43; +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.acquireDrawLock; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.drawableContextStates; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.primaryContext; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.releaseDrawLock; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.splashComplete; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMTextureLifetime { + + private GLSMTextureLifetime() {} + + // Deferred texture deletion: names kept valid until glGenTextures recycles them. + // Emulates Mesa/compat-profile behavior where delete-then-bind doesn't error. + private static final Int2LongOpenHashMap deferredDeleteTextures = new Int2LongOpenHashMap(); + private static final long DEFERRED_ABSENT = Long.MIN_VALUE; + private static final long DEFERRED_ATTACHED = -1; + private static final long DEFERRED_RELEASED = -2; + private static final int RELEASE_DELAY_FRAMES = 3; + private static long frameIndex; + private static long nextReleaseFrame = Long.MAX_VALUE; + private static final Int2IntOpenHashMap non2DTextureTargets = new Int2IntOpenHashMap(); + private static final Int2IntOpenHashMap textureFramebufferRefs = new Int2IntOpenHashMap(); + private static final FloatBuffer TRANSPARENT_BLACK = BufferUtils.createFloatBuffer(4); + private static final Tracy.ZoneId Z_TEX_RELEASE_STORAGE = Tracy.zoneId("texReleaseStorage", Tracy.COLOR_FFP); + private static final Tracy.ZoneId Z_TEX_RESCUE_RESET = Tracy.zoneId("texRescueReset", Tracy.COLOR_FFP); + private static final Tracy.ZoneId Z_TEX_FLUSH_DELETES = Tracy.zoneId("texFlushDeletes", Tracy.COLOR_FFP); + static { + deferredDeleteTextures.defaultReturnValue(DEFERRED_ABSENT); + non2DTextureTargets.defaultReturnValue(GL11.GL_TEXTURE_2D); + } + + /** + * Defer deleting textures until it has been reclaimed. + * Why you might ask? In compat profile if you bind a texture that doesn't exist, ie a deleted texture, + * mesa will silently create it for you, in core this is an error. Why would you be binding a deleted texture? + * Damned if I know, but vanilla and mods do it... they create one, delete it, and then bind it.... + * */ + static void deferDeleteTexture(int id) { + final GLContextState glCtx = ctx(); + if (id == 0) return; + + final int savedUnit = glCtx.activeTextureUnit.getValue(); + int activeUnit = savedUnit; + + // Unbind from all units that have this texture + for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) { + final TextureBindingStack unitBindings = glCtx.textures.getTextureUnitBindings(i); + if (unitBindings.getBinding() == id) { + if (i != activeUnit) { + RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i); + activeUnit = i; + } + final int unitTarget = unitBindings.getTarget(); + RENDER_BACKEND.bindTexture(unitTarget == 0 ? GL11.GL_TEXTURE_2D : unitTarget, 0); + } + } + + for (int i = 0; i <= glCtx.maxBoundImageUnit; i++) { + final ImageUnitBinding image = glCtx.imageUnits.get(i); + if (image != null && image.getTexture() == id) { + RENDER_BACKEND.bindImageTexture(i, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8); + } + } + + if (activeUnit != savedUnit) { + RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + savedUnit); + } + + final TextureBindingStack savedBindings = glCtx.textures.getTextureUnitBindings(savedUnit); + if (!is2D(savedBindings.getTarget()) && previous2D(savedBindings) == id) restoreUnitAfter2DBind(savedBindings, id, id); + + final boolean locked = acquireDrawLock(); + try { + detachFromFramebuffer(glCtx, GL30.GL_DRAW_FRAMEBUFFER, glCtx.drawFramebuffer, id); + if (glCtx.readFramebuffer != glCtx.drawFramebuffer) detachFromFramebuffer(glCtx, GL30.GL_READ_FRAMEBUFFER, glCtx.readFramebuffer, id); + if (textureFramebufferRefs.get(id) > 0) deferredDeleteTextures.put(id, DEFERRED_ATTACHED); + else scheduleRelease(id); + } finally { + if (locked) releaseDrawLock(); + } + } + + private static void scheduleRelease(int id) { + deferredDeleteTextures.put(id, frameIndex); + nextReleaseFrame = Math.min(nextReleaseFrame, frameIndex + RELEASE_DELAY_FRAMES); + } + + static final long BIND_REJECTED = Long.MIN_VALUE + 1; + + // Rebinding a deferred-delete texture rescues it (Mesa/compat-profile behavior) + static long claimForBind(int texture, int target) { + if (texture == 0) return DEFERRED_ABSENT; + final boolean locked = acquireDrawLock(); + try { + final long state = deferredDeleteTextures.isEmpty() ? DEFERRED_ABSENT : deferredDeleteTextures.get(texture); + if (state == DEFERRED_ABSENT) { + recordTarget(texture, target); + return DEFERRED_ABSENT; + } + return non2DTextureTargets.get(texture) == target ? deferredDeleteTextures.remove(texture) : BIND_REJECTED; + } finally { + if (locked) releaseDrawLock(); + } + } + + static void finishRescue(int target, int texture, long claim) { + if (claim != DEFERRED_ABSENT) resetRescuedTexture(target, texture, claim); + } + + static int targetOf(int texture) { + return non2DTextureTargets.get(texture); + } + + static boolean isDeferredDelete(int texture) { + if (texture == 0 || deferredDeleteTextures.isEmpty()) return false; + final boolean locked = acquireDrawLock(); + try { + return deferredDeleteTextures.containsKey(texture); + } finally { + if (locked) releaseDrawLock(); + } + } + + public static void onFrameEnd() { + frameIndex++; + if (!splashComplete || frameIndex < nextReleaseFrame) return; + nextReleaseFrame = Long.MAX_VALUE; + for (Int2LongMap.Entry entry : Int2LongMaps.fastIterable(deferredDeleteTextures)) { + final long since = entry.getLongValue(); + if (since < 0) continue; + if (frameIndex - since < RELEASE_DELAY_FRAMES) { + nextReleaseFrame = Math.min(nextReleaseFrame, since + RELEASE_DELAY_FRAMES); + continue; + } + final int id = entry.getIntKey(); + if (non2DTextureTargets.get(id) == GL11.GL_TEXTURE_2D) releaseStorage2D(id); + entry.setValue(DEFERRED_RELEASED); + } + } + + public static int deferredTexturesAwaitingRelease() { + int count = 0; + final LongIterator it = deferredDeleteTextures.values().iterator(); + while (it.hasNext()) { + if (it.nextLong() != DEFERRED_RELEASED) count++; + } + return count; + } + + private static void releaseStorage2D(int id) { + if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_RELEASE_STORAGE); + try { + final TextureBindingStack unit = ctx().textures.getTextureUnitBindings(GLSMTextures.getActiveTextureUnit()); + final int previous2D = previous2D(unit); + RENDER_BACKEND.bindTexture(GL11.GL_TEXTURE_2D, id); + if (bindTook(GL11.GL_TEXTURE_2D, id)) releaseBoundStorage2D(); + restoreUnitAfter2DBind(unit, id, previous2D); + } finally { + if (Tracy.ENABLED) Tracy.endZone(); + } + } + + private static void restoreUnitAfter2DBind(TextureBindingStack unit, int deleted, int previous2D) { + RENDER_BACKEND.bindTexture(GL11.GL_TEXTURE_2D, previous2D == deleted ? 0 : previous2D); + final int target = unit.getTarget(); + if (is2D(target)) return; + RENDER_BACKEND.bindTexture(target, unit.getBinding() == deleted ? 0 : unit.getBinding()); + } + + static boolean is2D(int target) { + return target == 0 || target == GL11.GL_TEXTURE_2D; + } + + private static int previous2D(TextureBindingStack unit) { + return is2D(unit.getTarget()) ? unit.getBinding() : RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_2D); + } + + static void recordTarget(int texture, int target) { + if (target != GL11.GL_TEXTURE_2D) non2DTextureTargets.put(texture, target); + } + + private static void releaseBoundStorage2D() { + if (RenderSystem.supportsTextureStorage() && RENDER_BACKEND.getTexParameteri(GL11.GL_TEXTURE_2D, GL42.GL_TEXTURE_IMMUTABLE_FORMAT) != 0) return; + final int size = Math.max(RENDER_BACKEND.getTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH), RENDER_BACKEND.getTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT)); + final int levels = Math.max(1, 32 - Integer.numberOfLeadingZeros(size)); + GLSMBuffers.suspendPixelUnpackBuffer(); + for (int level = 0; level < levels; level++) { + RENDER_BACKEND.texImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, 0, 0, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + } + GLSMBuffers.restorePixelUnpackBuffer(); + } + + private static boolean bindTook(int target, int texture) { + return RENDER_BACKEND.getInteger(TextureTargets.bindingQuery(target)) == texture; + } + + private static void resetRescuedTexture(int target, int texture, long state) { + if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_RESCUE_RESET); + try { + if (!bindTook(target, texture)) return; + if (target == GL11.GL_TEXTURE_2D && state >= 0) releaseBoundStorage2D(); + if (target == GL31.GL_TEXTURE_BUFFER || target == GL32.GL_TEXTURE_2D_MULTISAMPLE || target == GL32.GL_TEXTURE_2D_MULTISAMPLE_ARRAY) return; + final boolean rectangle = target == GL31.GL_TEXTURE_RECTANGLE; + final int wrap = rectangle ? GL12.GL_CLAMP_TO_EDGE : GL11.GL_REPEAT; + RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_MIN_FILTER, rectangle ? GL11.GL_LINEAR : GL11.GL_NEAREST_MIPMAP_LINEAR); + RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_WRAP_S, wrap); + RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_WRAP_T, wrap); + RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_WRAP_R, wrap); + RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_BASE_LEVEL, 0); + if (!rectangle) RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_MAX_LEVEL, 1000); + RENDER_BACKEND.texParameterf(target, GL12.GL_TEXTURE_MIN_LOD, -1000.0f); + RENDER_BACKEND.texParameterf(target, GL12.GL_TEXTURE_MAX_LOD, 1000.0f); + RENDER_BACKEND.texParameteri(target, GL14.GL_TEXTURE_COMPARE_MODE, GL11.GL_NONE); + RENDER_BACKEND.texParameteri(target, GL14.GL_TEXTURE_COMPARE_FUNC, GL11.GL_LEQUAL); + RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_R, GL11.GL_RED); + RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_G, GL11.GL_GREEN); + RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_B, GL11.GL_BLUE); + RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_A, GL11.GL_ALPHA); + if (!RenderSystem.isGLES()) { + RENDER_BACKEND.texParameterf(target, GL14.GL_TEXTURE_LOD_BIAS, 0.0f); + RENDER_BACKEND.texParameterfv(target, GL11.GL_TEXTURE_BORDER_COLOR, TRANSPARENT_BLACK); + } + if (RenderSystem.supportsStencilTexturing()) RENDER_BACKEND.texParameteri(target, GL43.GL_DEPTH_STENCIL_TEXTURE_MODE, GL11.GL_DEPTH_COMPONENT); + if (RENDER_BACKEND.isAnisotropicSupported()) RENDER_BACKEND.texParameterf(target, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); + } finally { + if (Tracy.ENABLED) Tracy.endZone(); + } + } + + /** Flush deferred deletes so the driver can recycle names. */ + static void flushDeferredTextureDeletes() { + if (!splashComplete || deferredDeleteTextures.isEmpty()) return; + if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_FLUSH_DELETES); + try { + final GLContextState primary = primaryContext(); + final GLContextState[] drawables = drawableContextStates; + final var it = Int2LongMaps.fastIterator(deferredDeleteTextures); + while (it.hasNext()) { + final Int2LongMap.Entry entry = it.next(); + if (entry.getLongValue() == DEFERRED_ATTACHED) continue; + final int id = entry.getIntKey(); + it.remove(); + RENDER_BACKEND.deleteTextures(id); + non2DTextureTargets.remove(id); + GLSMTextures.clearTextureBindings(primary, id); + for (int i = 0; i < drawables.length; i++) { + GLSMTextures.clearTextureBindings(drawables[i], id); + } + } + } finally { + if (Tracy.ENABLED) Tracy.endZone(); + } + } + + private static final int DEPTH_SLOT = 16; + private static final int STENCIL_SLOT = 17; + private static final int FRAMEBUFFER_SLOTS = 18; + + private static int attachmentSlot(int attachment) { + return switch (attachment) { + case GL30.GL_DEPTH_ATTACHMENT -> DEPTH_SLOT; + case GL30.GL_STENCIL_ATTACHMENT -> STENCIL_SLOT; + default -> attachment >= GL30.GL_COLOR_ATTACHMENT0 && attachment <= GL30.GL_COLOR_ATTACHMENT15 ? attachment - GL30.GL_COLOR_ATTACHMENT0 : -1; + }; + } + + private static int slotAttachment(int slot) { + return switch (slot) { + case DEPTH_SLOT -> GL30.GL_DEPTH_ATTACHMENT; + case STENCIL_SLOT -> GL30.GL_STENCIL_ATTACHMENT; + default -> GL30.GL_COLOR_ATTACHMENT0 + slot; + }; + } + + static boolean beginAttach(int target, int attachment, int texture) { + final GLContextState glCtx = ctx(); + return beginAttach(glCtx, target == GL30.GL_READ_FRAMEBUFFER ? glCtx.readFramebuffer : glCtx.drawFramebuffer, attachment, texture); + } + + static boolean beginAttach(GLContextState glCtx, int framebuffer, int attachment, int texture) { + if (isDeferredDelete(texture)) return false; + TextureInfoCache.INSTANCE.onWrittenOutsideUploads(texture); + trackFramebufferAttachment(glCtx, framebuffer, attachment, texture); + return true; + } + + static void trackFramebufferAttachment(GLContextState glCtx, int framebuffer, int attachment, int texture) { + if (framebuffer == 0) return; + if (attachment == GL30.GL_DEPTH_STENCIL_ATTACHMENT) { + trackFramebufferAttachment(glCtx, framebuffer, GL30.GL_DEPTH_ATTACHMENT, texture); + trackFramebufferAttachment(glCtx, framebuffer, GL30.GL_STENCIL_ATTACHMENT, texture); + return; + } + final int slot = attachmentSlot(attachment); + if (slot < 0) return; + int[] slots = glCtx.framebufferTextures.get(framebuffer); + if (slots == null) { + if (texture == 0) return; + slots = new int[FRAMEBUFFER_SLOTS]; + glCtx.framebufferTextures.put(framebuffer, slots); + } + setFramebufferSlot(slots, slot, texture); + } + + static void setFramebufferSlot(int[] slots, int slot, int texture) { + final int previous = slots[slot]; + if (previous == texture) return; + slots[slot] = texture; + final boolean locked = acquireDrawLock(); + try { + if (texture != 0) textureFramebufferRefs.addTo(texture, 1); + if (previous != 0 && textureFramebufferRefs.addTo(previous, -1) == 1) { + textureFramebufferRefs.remove(previous); + if (deferredDeleteTextures.get(previous) == DEFERRED_ATTACHED) scheduleRelease(previous); + } + } finally { + if (locked) releaseDrawLock(); + } + } + + private static void detachFromFramebuffer(GLContextState glCtx, int target, int framebuffer, int texture) { + final int[] slots = glCtx.framebufferTextures.get(framebuffer); + if (slots == null) return; + for (int slot = 0; slot < slots.length; slot++) { + if (slots[slot] != texture) continue; + RENDER_BACKEND.framebufferTexture2D(target, slotAttachment(slot), GL11.GL_TEXTURE_2D, 0, 0); + setFramebufferSlot(slots, slot, 0); + } + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextures.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextures.java new file mode 100644 index 000000000..c32c71fd3 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMTextures.java @@ -0,0 +1,1334 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; +import com.gtnewhorizons.angelica.glsm.profiling.Tracy; +import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; +import com.gtnewhorizons.angelica.glsm.recording.CommandRecorder; +import com.gtnewhorizons.angelica.glsm.recording.commands.TexImage2DCmd; +import com.gtnewhorizons.angelica.glsm.recording.commands.TexSubImage2DCmd; +import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack; +import com.gtnewhorizons.angelica.glsm.stacks.TextureBindingStack; +import com.gtnewhorizons.angelica.glsm.states.PixelStoreState; +import com.gtnewhorizons.angelica.glsm.states.SamplerUnitArray; +import com.gtnewhorizons.angelica.glsm.states.ImageUnitBinding; +import com.gtnewhorizons.angelica.glsm.states.TextureUnitArray; +import com.gtnewhorizons.angelica.glsm.texture.TextureInfo; +import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache; +import com.gtnewhorizons.angelica.glsm.texture.TextureStaging; +import org.lwjgl.opengl.EXTTextureFilterAnisotropic; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL14; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GL31; +import org.lwjgl.opengl.GL32; +import org.lwjgl.opengl.GL33; +import org.lwjgl.opengl.GL40; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.LOGGER; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_TEXTURE_COORDS; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.MAX_TEXTURE_UNITS; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.acquireDrawLock; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.beforeUncapturedStateChange; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isCachingEnabled; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.isRecordingDisplayList; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.mod; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.recordExitTextureBind; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.releaseDrawLock; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnce; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnceTrace; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMTextures { + + private GLSMTextures() {} + + public static long texBindMisses; + + + public static int getMaxBoundTextureUnit() { + return ctx().maxBoundTextureUnit; + } + + public static void trackMaxBoundTextureUnit(int unit) { + final GLContextState glCtx = ctx(); + if (unit > glCtx.maxBoundTextureUnit) glCtx.maxBoundTextureUnit = unit; + } + private static final Tracy.ZoneId Z_TEX_DELETE = Tracy.zoneId("texDelete", Tracy.COLOR_FFP); + + /** + * Get the active texture unit for server-side state operations. If caching is enabled, returns cached value. If caching is disabled (SharedDrawable), + * queries actual GL state. + */ + public static int getActiveTextureUnitForServerState() { + if (isCachingEnabled()) { + return getActiveTextureUnit(); + } + // Query actual GL state for SharedDrawable context + return RENDER_BACKEND.getInteger(GL13.GL_ACTIVE_TEXTURE) - GL13.GL_TEXTURE0; + } + + /** + * Get the texture bound to the current texture unit for server-side state operations. + * If caching is enabled, returns cached value. + * If caching is disabled (SharedDrawable), queries actual GL state. + */ + public static int getBoundTextureForServerState() { + if (isCachingEnabled()) { + return getBoundTexture(); + } + // Query actual GL state for SharedDrawable context + return RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_2D); + } + + private static TextureInfo getBoundTextureInfo() { + final GLContextState glCtx = ctx(); + if (isCachingEnabled()) { + return glCtx.textures.getTextureUnitBindings(glCtx.activeTextureUnit.getValue()).getOrResolveInfo(); + } + return TextureInfoCache.INSTANCE.getInfo(getBoundTextureForServerState()); + } + + /** + * Get the texture bound to a specific texture unit for server-side state operations. + * If caching is enabled, returns cached value. + * If caching is disabled (SharedDrawable), returns -1 to force operations to proceed + */ + public static int getBoundTextureForServerState(int unit) { + if (isCachingEnabled()) { + return getBoundTexture(unit); + } + return -1; + } + + public static int setTextureSupersamplingSamples(int samples) { + if (samples < 1 || samples > 16 || (samples & (samples - 1)) != 0) { + throw new IllegalArgumentException("Texture supersampling requires 1, 2, 4, 8, or 16 samples"); + } + final GLContextState glCtx = ctx(); + final int previous = glCtx.textureSupersamplingSamples; + if (previous != samples) { + beforeUncapturedStateChange(); + glCtx.textureSupersamplingSamples = samples; + } + return previous; + } + + public static void markTextureAsAtlas(int texture, int gutter) { + if (texture <= 0) return; + final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(texture); + if (info.getAtlasGutter() != gutter) { + beforeUncapturedStateChange(); + info.setAtlasGutter(gutter); + } + } + + public static void glActiveTexture(int texture) { + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.ACTIVE_UNIT); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordActiveTexture(texture); + if (mode == RecordMode.COMPILE) { + return; + } + } + final int newTexture = texture - GL13.GL_TEXTURE0; + if (!isValidTextureUnit(newTexture, texture, "glActiveTexture")) { + return; + } + final boolean caching = isCachingEnabled(); + if (!caching || glCtx.activeTextureUnit.getValue() != newTexture) { + mod(glCtx.activeTextureUnit).setValue(newTexture); + RENDER_BACKEND.activeTexture(texture); + } + } + + private static boolean isValidTextureUnit(int unit, int rawEnum, String function) { + return isValidTextureUnit(unit, MAX_TEXTURE_UNITS, rawEnum, function); + } + + private static boolean isValidTextureUnit(int unit, int limit, int rawEnum, String function) { + if (unit >= 0 && unit < limit) { + return true; + } + warnOnceTrace(function, "{}({}) is not a valid texture unit enum (expected GL_TEXTURE0..GL_TEXTURE{}); ignoring", function, rawEnum, limit - 1); + return false; + } + + public static void glActiveTextureARB(int texture) { + glActiveTexture(texture); + } + + public static void glClientActiveTexture(int texture) { + final int unit = texture - GL13.GL_TEXTURE0; + if (!isValidTextureUnit(unit, MAX_TEXTURE_COORDS, texture, "glClientActiveTexture")) { + return; + } + final GLContextState glCtx = ctx(); + glCtx.exitCapture.write(ExitStateCapture.CLIENT_ACTIVE_UNIT); + glCtx.clientActiveTextureUnit = unit; + } + + public static int getClientActiveTextureUnit() { + return ctx().clientActiveTextureUnit; + } + + private static int getBoundTexture() { + return getBoundTexture(ctx().activeTextureUnit.getValue()); + } + + private static int getBoundTexture(int unit) { + return ctx().textures.getTextureUnitBindings(unit).getBinding(); + } + + public static void glBindTexture(int target, int texture) { + if (TextureInfoCache.isProxyTarget(target)) return; + final GLContextState glCtx = ctx(); + recordExitTextureBind(glCtx, target, glCtx.activeTextureUnit.getValue()); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordBindTexture(target, texture); + if (mode == RecordMode.COMPILE) { + return; + } + } + final long claim = GLSMTextureLifetime.claimForBind(texture, target); + if (claim == GLSMTextureLifetime.BIND_REJECTED) return; + + if (!isCachingEnabled()) { + RENDER_BACKEND.bindTexture(target, texture); + GLSMTextureLifetime.finishRescue(target, texture, claim); + return; + } + + final int activeUnit = glCtx.activeTextureUnit.getValue(); + final TextureBindingStack textureUnit = glCtx.textures.getTextureUnitBindings(activeUnit); + final int cachedBinding = textureUnit.getBinding(); + + if (cachedBinding != texture || (texture == 0 && textureUnit.getTarget() != target)) { + if (activeUnit != 0 || target != GL11.GL_TEXTURE_2D) beforeUncapturedStateChange(); + if (Tracy.ENABLED) texBindMisses++; + RENDER_BACKEND.bindTexture(target, texture); + mod(textureUnit).setBinding(texture, target); + if (texture != 0) { + if (activeUnit > glCtx.maxBoundTextureUnit) glCtx.maxBoundTextureUnit = activeUnit; + } + if (!glCtx.lockBindCallback && target == GL11.GL_TEXTURE_2D && glCtx.activeTextureUnit.getValue() == 0) { + glCtx.lockBindCallback = true; + if (GLSMHooks.TEXTURE_BIND.hasListeners()) { + GLSMHooks.textureBindEvent.textureId = texture; + GLSMHooks.TEXTURE_BIND.post(GLSMHooks.textureBindEvent); + } + RenderSystem.bindTextureToUnit(0, texture); + glCtx.lockBindCallback = false; + } + } + GLSMTextureLifetime.finishRescue(target, texture, claim); + } + + private static void bindTextureUnitByName(int unit, int texture) { + if (GLSMTextureLifetime.isDeferredDelete(texture)) return; + final CommandRecorder paused = DisplayListManager.pauseRecording(); + final int saved = getActiveTextureUnit(); + try { + glActiveTexture(GL13.GL_TEXTURE0 + unit); + if (texture == 0) { + // Read before the 2D unbind, which overwrites the unit's cached target. + final int target = ctx().textures.getTextureUnitBindings(unit).getTarget(); + glBindTexture(GL11.GL_TEXTURE_2D, 0); + if (!GLSMTextureLifetime.is2D(target)) glBindTexture(target, 0); + } else { + glBindTexture(GLSMTextureLifetime.targetOf(texture), texture); + } + } finally { + glActiveTexture(GL13.GL_TEXTURE0 + saved); + if (paused != null) DisplayListManager.resumeRecording(paused); + } + } + + public static void glBindTextures(int first, int count, IntBuffer textures) { + if (first < 0 || !isValidTextureUnit(first + count - 1, GL13.GL_TEXTURE0 + first + count - 1, "glBindTextures")) return; + if (textures != null) requireRemaining(textures, count); + for (int i = 0; i < count; i++) bindTextureUnitByName(first + i, textures == null ? 0 : textures.get(textures.position() + i)); + } + + public static void glBindTextures(int first, IntBuffer textures) { + if (textures != null) glBindTextures(first, textures.remaining(), textures); + } + + public static void glBindTextures(int first, int[] textures) { + if (textures != null) glBindTextures(first, textures.length, IntBuffer.wrap(textures)); + } + + public static void glBindTextureUnit(int unit, int texture) { + if (isValidTextureUnit(unit, GL13.GL_TEXTURE0 + unit, "glBindTextureUnit")) bindTextureUnitByName(unit, texture); + } + + public static void glBindMultiTextureEXT(int texunit, int target, int texture) { + if (DisplayListManager.isRecording()) throw DisplayListManager.unsupportedInList("glBindMultiTextureEXT"); + if (!isValidTextureUnit(texunit - GL13.GL_TEXTURE0, texunit, "glBindMultiTextureEXT")) return; + final int saved = getActiveTextureUnit(); + glActiveTexture(texunit); + glBindTexture(target, texture); + glActiveTexture(GL13.GL_TEXTURE0 + saved); + } + + private static int changeFormatIfDeprecated(int internalformat) { + internalformat = GLESFormatRemap.promoteAlphaFormat(internalformat); + if (RenderSystem.isGLES()) { + internalformat = GLESFormatRemap.remapInternalFormat(internalformat); + } + return internalformat; + } + + public static final class GLESTexImageRemap { + private final GLESFormatRemap.Result r; + private GLESTexImageRemap(GLESFormatRemap.Result r) { this.r = r; } + public int internalFormat() { return r.internalFormat(); } + public int format() { return r.format(); } + public int type() { return r.type(); } + } + + public static GLESTexImageRemap remapTexImageForGLES(int internalformat, int format, int type) { + return new GLESTexImageRemap(GLESFormatRemap.apply(internalformat, format, type, RenderSystem.isGLES())); + } + + static { + if (ByteOrder.nativeOrder() != ByteOrder.LITTLE_ENDIAN) { + LOGGER.warn("GLSM GLES pixel-type remap assumes little-endian host; big-endian detected - BGRA uploads may be byte-swapped"); + } + } + + static int remapPixelTypeForGLES(int format, int type) { + return RenderSystem.isGLES() ? GLESFormatRemap.remapPixelType(format, type) : type; + } + + private static int remapTypeForRemappedInternalFormat(int internalformat, int type) { + if (!RenderSystem.isGLES()) return type; + if (!GLESFormatRemap.isGenericPixelType(type)) return type; + return GLESFormatRemap.typeForInternalFormatES32(internalformat, type); + } + + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) { + rejectExitCapture(); + internalformat = changeFormatIfDeprecated(internalformat); + type = remapPixelTypeForGLES(format, type); + type = remapTypeForRemappedInternalFormat(internalformat, type); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordComplexCommand(TexImage2DCmd.fromIntBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState)); + if (mode == RecordMode.COMPILE) { + return; + } + } + TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null); + maybeGenerateMipmap(target, level); + } + + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, FloatBuffer pixels) { + rejectExitCapture(); + internalformat = changeFormatIfDeprecated(internalformat); + type = remapPixelTypeForGLES(format, type); + type = remapTypeForRemappedInternalFormat(internalformat, type); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordComplexCommand(TexImage2DCmd.fromFloatBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState)); + if (mode == RecordMode.COMPILE) { + return; + } + } + TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null); + maybeGenerateMipmap(target, level); + } + + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, DoubleBuffer pixels) { + rejectExitCapture(); + internalformat = changeFormatIfDeprecated(internalformat); + type = remapPixelTypeForGLES(format, type); + type = remapTypeForRemappedInternalFormat(internalformat, type); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordComplexCommand(TexImage2DCmd.fromDoubleBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState)); + if (mode == RecordMode.COMPILE) { + return; + } + } + TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null); + maybeGenerateMipmap(target, level); + } + + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) { + rejectExitCapture(); + internalformat = changeFormatIfDeprecated(internalformat); + type = remapPixelTypeForGLES(format, type); + type = remapTypeForRemappedInternalFormat(internalformat, type); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordComplexCommand(TexImage2DCmd.fromByteBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState)); + if (mode == RecordMode.COMPILE) { + return; + } + } + TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels != null ? pixels.asIntBuffer() : null); + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null); + maybeGenerateMipmap(target, level); + } + + public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset) { + rejectExitCapture(); + internalformat = changeFormatIfDeprecated(internalformat); + type = remapPixelTypeForGLES(format, type); + type = remapTypeForRemappedInternalFormat(internalformat, type); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glTexImage2D with buffer offset"); + } + TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels_buffer_offset); + RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels_buffer_offset); + maybeGenerateMipmap(target, level); + } + + public static void glDeleteTextures(int id) { + rejectExitCapture(); + deleteTexture(id); + } + + public static void glDeleteTextures(IntBuffer ids) { + rejectExitCapture(); + for (int i = 0; i < ids.remaining(); i++) { + deleteTexture(ids.get(ids.position() + i)); + } + } + + public static void glDeleteTextures(int[] ids) { + rejectExitCapture(); + for (int id : ids) deleteTexture(id); + } + + private static void deleteTexture(int id) { + if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_DELETE); + try { + GLSMTextureLifetime.deferDeleteTexture(id); + onDeleteTexture(id); + } finally { + if (Tracy.ENABLED) Tracy.endZone(); + } + } + + public static int glGenTextures() { + requireContext("glGenTextures"); + GLSMTextureLifetime.flushDeferredTextureDeletes(); + return RENDER_BACKEND.genTextures(); + } + + public static void glGenTextures(IntBuffer textures) { + requireContext("glGenTextures"); + GLSMTextureLifetime.flushDeferredTextureDeletes(); + RENDER_BACKEND.genTextures(textures); + } + + public static void glGenTextures(int[] textures) { + requireContext("glGenTextures"); + GLSMTextureLifetime.flushDeferredTextureDeletes(); + for (int i = 0; i < textures.length; i++) textures[i] = RENDER_BACKEND.genTextures(); + } + + public static int glCreateTextures(int target) { + requireContext("glCreateTextures"); + final int id = RENDER_BACKEND.createTextures(target); + final boolean locked = acquireDrawLock(); + try { + GLSMTextureLifetime.recordTarget(id, target); + } finally { + if (locked) releaseDrawLock(); + } + return id; + } + + public static void glCreateTextures(int target, IntBuffer textures) { + for (int i = textures.position(); i < textures.limit(); i++) textures.put(i, glCreateTextures(target)); + } + + public static void glCreateTextures(int target, int[] textures) { + for (int i = 0; i < textures.length; i++) textures[i] = glCreateTextures(target); + } + + public static void enableTexture() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordEnable(GL11.GL_TEXTURE_2D); + if (mode == RecordMode.COMPILE) { + return; + } + } + enableTexture(ctx()); + } + + static void enableTexture(GLContextState glCtx) { + glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).enable(); + } + + public static void disableTexture() { + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordDisable(GL11.GL_TEXTURE_2D); + if (mode == RecordMode.COMPILE) { + return; + } + } + disableTexture(ctx()); + } + + static void disableTexture(GLContextState glCtx) { + glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).disable(); + } + + public static void setFilter(boolean bilinear, boolean mipmap) { + final int i, j; + if (bilinear) { + i = mipmap ? GL11.GL_LINEAR_MIPMAP_LINEAR : GL11.GL_LINEAR; + j = GL11.GL_LINEAR; + } else { + i = mipmap ? GL11.GL_LINEAR_MIPMAP_LINEAR : GL11.GL_NEAREST; + j = GL11.GL_NEAREST; + } + glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, i); + glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, j); + } + + private static void onDeleteTexture(int id) { + final GLContextState glCtx = ctx(); + TextureInfoCache.INSTANCE.onDeleteTexture(id); + if (GLSMHooks.TEXTURE_DELETE.hasListeners()) { + GLSMHooks.textureDeleteEvent.textureId = id; + GLSMHooks.TEXTURE_DELETE.post(GLSMHooks.textureDeleteEvent); + } + + // Always delete + clearTextureBindings(glCtx, id); + } + + static void clearTextureBindings(GLContextState glCtx, int id) { + for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) { + if (glCtx.textures.getTextureUnitBindings(i).getBinding() == id) { + mod(glCtx.textures.getTextureUnitBindings(i)).setBinding(0); + } + } + + for (int i = 0; i <= glCtx.maxBoundImageUnit; i++) { + final ImageUnitBinding image = glCtx.imageUnits.get(i); + if (image != null && image.getTexture() == id) { + image.reset(); + } + } + } + + public static int getActiveTextureUnit() { + return ctx().activeTextureUnit.getValue(); + } + + private static boolean handleRemovedTexParam(int target, int pname, int value) { + if (pname == GL14.GL_GENERATE_MIPMAP) { + if (target == GL11.GL_TEXTURE_2D) { + final TextureInfo info = getBoundTextureInfo(); + if (info != null) info.setGenerateMipmap(value != 0); + } + return true; + } + return false; + } + + private static void maybeGenerateMipmap(int target, int level) { + if (target != GL11.GL_TEXTURE_2D) return; + final TextureInfo info = getBoundTextureInfo(); + if (info != null && info.isGenerateMipmap() && level == info.getBaseLevel() && level < info.getMaxLevel()) { + RENDER_BACKEND.generateMipmap(target); + } + } + + public static boolean updateTexParameteriCache(int target, int texture, int pname, int param) { + rejectExitCapture(); + if (target != GL11.GL_TEXTURE_2D) { + return true; + } + return updateTexParameteriCache(TextureInfoCache.INSTANCE.getInfo(texture), pname, param); + } + + static boolean updateTexParameteriCache(TextureInfo info, int pname, int param) { + if (info == null) { + return true; + } + switch (pname) { + case GL11.GL_TEXTURE_MIN_FILTER -> { + if (info.getMinFilter() == param && isCachingEnabled()) return false; + info.setMinFilter(param); + } + case GL11.GL_TEXTURE_MAG_FILTER -> { + if (info.getMagFilter() == param && isCachingEnabled()) return false; + info.setMagFilter(param); + } + case GL11.GL_TEXTURE_WRAP_S -> { + if (info.getWrapS() == param && isCachingEnabled()) return false; + info.setWrapS(param); + } + case GL11.GL_TEXTURE_WRAP_T -> { + if (info.getWrapT() == param && isCachingEnabled()) return false; + info.setWrapT(param); + } + case GL12.GL_TEXTURE_BASE_LEVEL -> { + if (info.getBaseLevel() == param && isCachingEnabled()) return false; + info.setBaseLevel(param); + } + case GL12.GL_TEXTURE_MAX_LEVEL -> { + if (info.getMaxLevel() == param && isCachingEnabled()) return false; + info.setMaxLevel(param); + } + case GL12.GL_TEXTURE_MIN_LOD -> { + if (info.getMinLod() == param && isCachingEnabled()) return false; + info.setMinLod(param); + } + case GL12.GL_TEXTURE_MAX_LOD -> { + if (info.getMaxLod() == param && isCachingEnabled()) return false; + info.setMaxLod(param); + } + } + return true; + } + + public static void glTexParameter(int target, int pname, IntBuffer params) { + rejectExitCapture(); + if (handleRemovedTexParam(target, pname, params.remaining() >= 1 ? params.get(params.position()) : 0)) return; + if (params.remaining() >= 1) { + final int val = params.get(params.position()); + final int remapped = remapTexClamp(pname, val); + if (remapped != val) params.put(params.position(), remapped); + if (target == GL11.GL_TEXTURE_2D) { + updateTexParameteriCache(getBoundTextureInfo(), pname, remapped); + } + } + RENDER_BACKEND.texParameteriv(target, pname, params); + } + + public static void glTexParameter(int target, int pname, FloatBuffer params) { + rejectExitCapture(); + if (handleRemovedTexParam(target, pname, params.remaining() >= 1 ? (int) params.get(params.position()) : 0)) return; + if (params.remaining() >= 1) { + final float val = params.get(params.position()); + final float remapped = remapTexClamp(pname, val); + if (remapped != val) params.put(params.position(), remapped); + if (target == GL11.GL_TEXTURE_2D) { + updateTexParameterfCache(getBoundTextureInfo(), pname, remapped); + } + } + RENDER_BACKEND.texParameterfv(target, pname, params); + } + + public static void glTexParameteri(int target, int pname, int param) { + rejectExitCapture(); + if (handleRemovedTexParam(target, pname, param)) return; + param = remapTexClamp(pname, param); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordTexParameteri(target, pname, param); + if (mode == RecordMode.COMPILE) { + return; + } + } + if (getActiveTextureUnit() != 0) beforeUncapturedStateChange(); + if (target != GL11.GL_TEXTURE_2D) { + RENDER_BACKEND.texParameteri(target, pname, param); + return; + } + if (!updateTexParameteriCache(getBoundTextureInfo(), pname, param)) return; + + RENDER_BACKEND.texParameteri(target, pname, param); + } + + public static boolean updateTexParameterfCache(int target, int texture, int pname, float param) { + rejectExitCapture(); + if (target != GL11.GL_TEXTURE_2D) { + return true; + } + return updateTexParameterfCache(TextureInfoCache.INSTANCE.getInfo(texture), pname, param); + } + + static boolean updateTexParameterfCache(TextureInfo info, int pname, float param) { + if (info == null) { + return true; + } + switch (pname) { + case GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_TEXTURE_WRAP_S, GL11.GL_TEXTURE_WRAP_T -> { + return updateTexParameteriCache(info, pname, (int) param); + } + case EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT -> { + if (info.getMaxAnisotropy() == param && isCachingEnabled()) return false; + info.setMaxAnisotropy(param); + } + case GL14.GL_TEXTURE_LOD_BIAS -> { + if (info.getLodBias() == param && isCachingEnabled()) return false; + info.setLodBias(param); + } + } + return true; + } + + public static void glTexParameterf(int target, int pname, float param) { + rejectExitCapture(); + if (handleRemovedTexParam(target, pname, param > 0 ? (int) (param + 0.5f) : (int) (param - 0.5f))) return; + param = remapTexClamp(pname, param); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordTexParameterf(target, pname, param); + if (mode == RecordMode.COMPILE) { + return; + } + } + if (getActiveTextureUnit() != 0) beforeUncapturedStateChange(); + if (target != GL11.GL_TEXTURE_2D) { + RENDER_BACKEND.texParameterf(target, pname, param); + return; + } + if (!updateTexParameterfCache(getBoundTextureInfo(), pname, param)) return; + + RENDER_BACKEND.texParameterf(target, pname, param); + } + + public static final long TEX_PARAM_MISS = Long.MIN_VALUE; + + public static long lookupTexParameteri(TextureInfo info, int pname) { + if (info == null) { + if (isRecordingDisplayList()) { + throw new IllegalStateException( + "glGetTexParameteri called during display list recording with no cached TextureInfo. " + + "Cannot query OpenGL state during compilation!"); + } + return TEX_PARAM_MISS; + } + return switch (pname) { + case GL11.GL_TEXTURE_MIN_FILTER -> info.getMinFilter(); + case GL11.GL_TEXTURE_MAG_FILTER -> info.getMagFilter(); + case GL11.GL_TEXTURE_WRAP_S -> info.getWrapS(); + case GL11.GL_TEXTURE_WRAP_T -> info.getWrapT(); + case GL12.GL_TEXTURE_BASE_LEVEL -> info.getBaseLevel(); + case GL12.GL_TEXTURE_MAX_LEVEL -> info.getMaxLevel(); + case GL12.GL_TEXTURE_MIN_LOD -> info.getMinLod(); + case GL12.GL_TEXTURE_MAX_LOD -> info.getMaxLod(); + case GL14.GL_GENERATE_MIPMAP -> info.isGenerateMipmap() ? GL11.GL_TRUE : GL11.GL_FALSE; + default -> { + if (isRecordingDisplayList()) { + throw new IllegalStateException(String.format( + "glGetTexParameteri called during display list recording with uncached pname 0x%s. " + + "Cannot query OpenGL state during compilation!", Integer.toHexString(pname))); + } + yield TEX_PARAM_MISS; + } + }; + } + + public static int glGetTexParameteri(int target, int pname) { + rejectExitCapture(); + if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) { + return RENDER_BACKEND.getTexParameteri(target, pname); + } + final long v = lookupTexParameteri(getBoundTextureInfo(), pname); + return v != TEX_PARAM_MISS ? (int) v : RENDER_BACKEND.getTexParameteri(target, pname); + } + + public static float glGetTexParameterf(int target, int pname) { + rejectExitCapture(); + if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) { + return RENDER_BACKEND.getTexParameterf(target, pname); + } + final TextureInfo info = getBoundTextureInfo(); + if(info == null) { + if (isRecordingDisplayList()) { + throw new IllegalStateException( + "glGetTexParameterf called during display list recording with no cached TextureInfo. " + + "Cannot query OpenGL state during compilation!"); + } + return RENDER_BACKEND.getTexParameterf(target, pname); + } + + return switch (pname) { + case EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT -> info.getMaxAnisotropy(); + case GL14.GL_TEXTURE_LOD_BIAS -> info.getLodBias(); + default -> { + if (isRecordingDisplayList()) { + throw new IllegalStateException(String.format( + "glGetTexParameterf called during display list recording with uncached pname 0x%s. " + + "Cannot query OpenGL state during compilation!", Integer.toHexString(pname))); + } + yield RENDER_BACKEND.getTexParameterf(target, pname); + } + }; + } + + private static int mipLevelSize(int base, int level) { + if (base <= 0 || level < 0 || level >= Integer.SIZE - 1) return 1; + return Math.max(base >> level, 1); + } + + public static int glGetTexLevelParameteri(int target, int level, int pname) { + rejectExitCapture(); + if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) { + return RENDER_BACKEND.getTexLevelParameteri(target, level, pname); + } + final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(getBoundTextureForServerState()); + if (info == null) { + if (isRecordingDisplayList()) { + throw new IllegalStateException(String.format( + "glGetTexLevelParameteri called during display list recording with no cached TextureInfo for texture %d. " + + "Cannot query OpenGL state during compilation!", getBoundTextureForServerState())); + } + return RENDER_BACKEND.getTexLevelParameteri(target, level, pname); + } + return switch (pname) { + case GL11.GL_TEXTURE_WIDTH -> mipLevelSize(info.getWidth(), level); + case GL11.GL_TEXTURE_HEIGHT -> mipLevelSize(info.getHeight(), level); + case GL11.GL_TEXTURE_INTERNAL_FORMAT -> { + if (info.needsInternalFormatResolve() && isRecordingDisplayList()) { + throw new IllegalStateException(String.format("glGetTexLevelParameteri(GL_TEXTURE_INTERNAL_FORMAT) needs to resolve a generic compressed format for texture %d during display list recording", getBoundTextureForServerState())); + } + yield info.getResolvedInternalFormat(); + } + default -> { + if (isRecordingDisplayList()) { + throw new IllegalStateException(String.format( + "glGetTexLevelParameteri called during display list recording with uncached pname 0x%s for texture %d. " + + "Cannot query OpenGL state during compilation!", Integer.toHexString(pname), getBoundTextureForServerState())); + } + yield RENDER_BACKEND.getTexLevelParameteri(target, level, pname); + } + }; + } + + public static void glGetTexImage(int target, int level, int format, int type, ByteBuffer pixels) { + rejectExitCapture(); + if (RenderSystem.isGLES()) { + getTexImageViaFboReadPixels(target, level, format, type, pixels); + return; + } + GLSMBuffers.suspendPixelPackBuffer(); + RENDER_BACKEND.getTexImage(target, level, format, type, pixels); + GLSMBuffers.restorePixelPackBuffer(); + } + public static void glGetTexImage(int target, int level, int format, int type, IntBuffer pixels) { + rejectExitCapture(); + if (RenderSystem.isGLES()) { + getTexImageViaFboReadPixels(target, level, format, type, pixels); + return; + } + GLSMBuffers.suspendPixelPackBuffer(); + RENDER_BACKEND.getTexImage(target, level, format, type, pixels); + GLSMBuffers.restorePixelPackBuffer(); + } + + private static void getTexImageViaFboReadPixels(int target, int level, int format, int type, Buffer pixels) { + if (target != GL11.GL_TEXTURE_2D) { + LOGGER.warn("glGetTexImage ES: unsupported target 0x{}", Integer.toHexString(target)); + return; + } + final int texId = getBoundTextureForServerState(); + if (texId == 0) return; + final int width = RENDER_BACKEND.getTexLevelParameteri(target, level, GL11.GL_TEXTURE_WIDTH); + final int height = RENDER_BACKEND.getTexLevelParameteri(target, level, GL11.GL_TEXTURE_HEIGHT); + if (width <= 0 || height <= 0) return; + + final int prevReadFb = RENDER_BACKEND.getInteger(GL30.GL_READ_FRAMEBUFFER_BINDING); + final int fbo = RENDER_BACKEND.genFramebuffers(); + try { + RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo); + RENDER_BACKEND.framebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, target, texId, level); + final int status = RENDER_BACKEND.checkFramebufferStatus(GL30.GL_READ_FRAMEBUFFER); + if (status != GL30.GL_FRAMEBUFFER_COMPLETE) { + LOGGER.warn("glGetTexImage ES: FBO incomplete (0x{})", Integer.toHexString(status)); + return; + } + final int esType = remapPixelTypeForGLES(format, type); + final boolean bgra = format == GL12.GL_BGRA; + final int esFormat = bgra ? GL11.GL_RGBA : format; + GLSMBuffers.suspendPixelPackBuffer(); + try { + if (pixels instanceof ByteBuffer bb) { + RENDER_BACKEND.readPixels(0, 0, width, height, esFormat, esType, bb); + } else if (pixels instanceof IntBuffer ib) { + RENDER_BACKEND.readPixels(0, 0, width, height, esFormat, esType, ib); + } + if (bgra) swapRedBlueInPlace(pixels); + } finally { + GLSMBuffers.restorePixelPackBuffer(); + } + } finally { + RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, prevReadFb); + RENDER_BACKEND.deleteFramebuffers(fbo); + } + } + + private static void swapRedBlueInPlace(Buffer pixels) { + if (pixels instanceof ByteBuffer bb) { + final int p = bb.position(); + final int lim = bb.limit(); + for (int i = p; i + 3 < lim; i += 4) { + final byte r = bb.get(i); + bb.put(i, bb.get(i + 2)); + bb.put(i + 2, r); + } + } else if (pixels instanceof IntBuffer ib) { + final int p = ib.position(); + final int lim = ib.limit(); + for (int i = p; i < lim; i++) { + final int w = ib.get(i); + ib.put(i, (w & 0xFF00FF00) | ((w & 0xFF) << 16) | ((w >> 16) & 0xFF)); + } + } + } + public static void glTexStorage2D(int target, int levels, int internalFormat, int width, int height) { + rejectExitCapture(); + RENDER_BACKEND.texStorage2D(target, levels, internalFormat, width, height); + TextureInfoCache.INSTANCE.onTexStorage2D(target, internalFormat, width, height); + } + public static void glClearTexImage(int texture, int level, int format, int type, ByteBuffer data) { + rejectExitCapture(); + RENDER_BACKEND.clearTexImage(texture, level, format, type); + if (level == 0) TextureInfoCache.INSTANCE.onContentsChanged(texture); + } + + public static int glGenSamplers() { + requireContext("glGenSamplers"); + return RENDER_BACKEND.genSamplers(); + } + + public static void glGenSamplers(IntBuffer samplers) { + requireContext("glGenSamplers"); + for (int i = samplers.position(); i < samplers.limit(); i++) samplers.put(i, RENDER_BACKEND.genSamplers()); + } + + public static void glGenSamplers(int[] samplers) { + requireContext("glGenSamplers"); + for (int i = 0; i < samplers.length; i++) samplers[i] = RENDER_BACKEND.genSamplers(); + } + + public static void glDeleteSamplers(int sampler) { + rejectExitCapture(); + if (sampler == 0) return; + ctx().samplerUnits.unbindEverywhere(sampler); + RENDER_BACKEND.deleteSamplers(sampler); + } + + public static void glDeleteSamplers(IntBuffer samplers) { + for (int i = samplers.position(); i < samplers.limit(); i++) glDeleteSamplers(samplers.get(i)); + } + + public static void glDeleteSamplers(int[] samplers) { + for (int sampler : samplers) glDeleteSamplers(sampler); + } + + public static void glBindSampler(int unit, int sampler) { + bindSampler(ctx().samplerUnits, unit, sampler); + } + + private static void bindSampler(SamplerUnitArray units, int unit, int sampler) { + rejectExitCapture(); + if (isCachingEnabled() && unit >= 0 && unit < units.size() && units.get(unit) == sampler) return; + beforeUncapturedStateChange(); + if (!units.set(unit, sampler)) { + warnOnce("samplerUnitRange", "glBindSampler unit {} exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS {}", unit, units.size()); + } + RENDER_BACKEND.bindSampler(unit, sampler); + } + + public static void unbindAllSamplers() { + final SamplerUnitArray units = ctx().samplerUnits; + if (units.getHighestBoundUnit() < 0) return; + beforeUncapturedStateChange(); + for (int unit = units.getHighestBoundUnit(); unit >= 0; unit = units.getHighestBoundUnit()) { + units.set(unit, 0); + RENDER_BACKEND.bindSampler(unit, 0); + } + } + + public static void glBindSamplers(int first, int count, IntBuffer samplers) { + if (samplers == null) { + for (int i = 0; i < count; i++) glBindSampler(first + i, 0); + return; + } + requireRemaining(samplers, count); + final int base = samplers.position(); + for (int i = 0; i < count; i++) glBindSampler(first + i, samplers.get(base + i)); + } + + private static void requireRemaining(IntBuffer buffer, int count) { + if (buffer.remaining() < count) throw new IllegalArgumentException("Number of remaining buffer elements is " + buffer.remaining() + ", must be at least " + count); + } + + public static void glBindSamplers(int first, IntBuffer samplers) { + if (samplers != null) glBindSamplers(first, samplers.remaining(), samplers); + } + + public static void glBindSamplers(int first, int[] samplers) { + if (samplers == null) return; + for (int i = 0; i < samplers.length; i++) glBindSampler(first + i, samplers[i]); + } + + public static int getSamplerBinding(int unit) { return ctx().samplerUnits.get(unit); } + public static int getSamplerUnitCount() { return ctx().samplerUnits.size(); } + public static void glSamplerParameteri(int sampler, int pname, int param) { rejectExitCapture(); RENDER_BACKEND.samplerParameteri(sampler, pname, param); } + public static void glSamplerParameterf(int sampler, int pname, float param) { rejectExitCapture(); RENDER_BACKEND.samplerParameterf(sampler, pname, param); } + + public static void glTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) { + rejectExitCapture(); + internalformat = changeFormatIfDeprecated(internalformat); + type = remapPixelTypeForGLES(format, type); + type = remapTypeForRemappedInternalFormat(internalformat, type); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glTexImage1D"); + } + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texImage1D(target, level, internalformat, width, border, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + } + + public static void glTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) { + rejectExitCapture(); + internalformat = changeFormatIfDeprecated(internalformat); + type = remapPixelTypeForGLES(format, type); + type = remapTypeForRemappedInternalFormat(internalformat, type); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glTexImage3D"); + } + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + } + + public static void glTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, IntBuffer pixels) { + rejectExitCapture(); + internalformat = changeFormatIfDeprecated(internalformat); + type = remapPixelTypeForGLES(format, type); + type = remapTypeForRemappedInternalFormat(internalformat, type); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glTexImage3D"); + } + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + } + + public static void glTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, ByteBuffer pixels) { + rejectExitCapture(); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glTexSubImage1D"); + } + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texSubImage1D(target, level, xoffset, width, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + } + + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) { + rejectExitCapture(); + type = remapPixelTypeForGLES(format, type); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordComplexCommand(TexSubImage2DCmd.fromByteBuffer(target, level, xoffset, yoffset, width, height, format, type, pixels, ctx().pixelUnpackState)); + if (mode == RecordMode.COMPILE) { + return; + } + } + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + TextureInfoCache.INSTANCE.onTexSubImage2D(target, level); + maybeGenerateMipmap(target, level); + } + + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) { + rejectExitCapture(); + type = remapPixelTypeForGLES(format, type); + final RecordMode mode = DisplayListManager.getRecordMode(); + if (mode != RecordMode.NONE) { + DisplayListManager.recordComplexCommand(TexSubImage2DCmd.fromIntBuffer(target, level, xoffset, yoffset, width, height, format, type, pixels, ctx().pixelUnpackState)); + if (mode == RecordMode.COMPILE) { + return; + } + } + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + TextureInfoCache.INSTANCE.onTexSubImage2D(target, level); + maybeGenerateMipmap(target, level); + } + + public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels_buffer_offset) { + rejectExitCapture(); + type = remapPixelTypeForGLES(format, type); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glTexSubImage2D with buffer offset"); + } + RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels_buffer_offset); + TextureInfoCache.INSTANCE.onTexSubImage2D(target, level); + maybeGenerateMipmap(target, level); + } + + public static TextureStaging beginTextureStaging(int level, int x, int y, int width, int height) { + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("beginTextureStaging"); + } + if (!ctx().pixelUnpackState.isDefault()) { + return null; + } + return RENDER_BACKEND.beginTextureStaging(level, x, y, width, height); + } + + public static boolean commitTextureStaging(TextureStaging staging) { + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("commitTextureStaging"); + } + GLSMBuffers.suspendPixelUnpackBuffer(); + final boolean committed; + try { + committed = RENDER_BACKEND.commitTextureStaging(staging); + } finally { + GLSMBuffers.restorePixelUnpackBuffer(); + } + if (committed) { + TextureInfoCache.INSTANCE.onTexSubImage2D(GL11.GL_TEXTURE_2D, staging.level()); + maybeGenerateMipmap(GL11.GL_TEXTURE_2D, staging.level()); + } + return committed; + } + + public static void abandonTextureStaging(TextureStaging staging) { + RENDER_BACKEND.abandonTextureStaging(staging); + } + + public static void trimTextureStaging() { + RENDER_BACKEND.trimTextureStaging(); + } + + public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer pixels) { + rejectExitCapture(); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glTexSubImage3D"); + } + GLSMBuffers.suspendPixelUnpackBuffer(); + RENDER_BACKEND.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + GLSMBuffers.restorePixelUnpackBuffer(); + } + + public static void glCopyTexImage1D(int target, int level, int internalFormat, int x, int y, int width, int border) { + rejectExitCapture(); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glCopyTexImage1D"); + } + RENDER_BACKEND.copyTexImage1D(target, level, internalFormat, x, y, width, border); + } + + public static void glCopyTexImage2D(int target, int level, int internalFormat, int x, int y, int width, int height, int border) { + rejectExitCapture(); + internalFormat = changeFormatIfDeprecated(internalFormat); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glCopyTexImage2D"); + } + RENDER_BACKEND.copyTexImage2D(target, level, internalFormat, x, y, width, height, border); + TextureInfoCache.INSTANCE.onCopyTexImage2D(target, level, internalFormat, width, height); + maybeGenerateMipmap(target, level); + } + + public static void glCopyTexSubImage1D(int target, int level, int xoffset, int x, int y, int width) { + rejectExitCapture(); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glCopyTexSubImage1D"); + } + RENDER_BACKEND.copyTexSubImage1D(target, level, xoffset, x, y, width); + } + + public static void glCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) { + rejectExitCapture(); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glCopyTexSubImage2D"); + } + RENDER_BACKEND.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); + TextureInfoCache.INSTANCE.onTexSubImage2D(target, level); + maybeGenerateMipmap(target, level); + } + + public static void glCopyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) { + rejectExitCapture(); + if (DisplayListManager.isRecording()) { + throw DisplayListManager.unsupportedInList("glCopyTexSubImage3D"); + } + RENDER_BACKEND.copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); + } + + // glPixelStore* isn't compiled into display lists, it executes immediately + public static void glPixelStorei(int pname, int param) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (isCachingEnabled()) { + if (PixelStoreState.isPack(pname)) { + glCtx.pixelPackState = glCtx.pixelPackState.with(pname, param); + } else { + glCtx.pixelUnpackState = glCtx.pixelUnpackState.with(pname, param); + } + } + RENDER_BACKEND.pixelStorei(pname, param); + } + + public static void glPixelStoref(int pname, float param) { + glPixelStorei(pname, param < 0 ? -Math.round(-param) : Math.round(param)); + } + + public static void forcePixelUnpackState(PixelStoreState target) { + PixelStoreState.applyDiff(ctx().pixelUnpackState, target, false); + } + + public static void restorePixelUnpackState(PixelStoreState applied) { + PixelStoreState.applyDiff(applied, ctx().pixelUnpackState, false); + } + public static boolean glIsTexture(int texture) { rejectExitCapture(); return !GLSMTextureLifetime.isDeferredDelete(texture) && RENDER_BACKEND.isTexture(texture); } + public static boolean glIsSampler(int sampler) { rejectExitCapture(); return RENDER_BACKEND.isSampler(sampler); } + + public static void glGenerateMipmap(int target) { + rejectExitCapture(); + RENDER_BACKEND.generateMipmap(target); + } + + public static void setActiveTexture(int textureUnit) { + glActiveTexture(textureUnit); + } + + /** + * In core profile, GL_CLAMP (0x2900) is removed. Remap to GL_CLAMP_TO_EDGE for wrap modes. Semantically equivalent when texture border is not used (border + * textures are also removed in core). + */ + public static int remapTexClamp(int pname, int param) { + if (param == GL11.GL_CLAMP && (pname == GL11.GL_TEXTURE_WRAP_S || pname == GL11.GL_TEXTURE_WRAP_T || pname == GL12.GL_TEXTURE_WRAP_R)) { + return GL12.GL_CLAMP_TO_EDGE; + } + return param; + } + + public static float remapTexClamp(int pname, float param) { + if ((int) param == GL11.GL_CLAMP && (pname == GL11.GL_TEXTURE_WRAP_S || pname == GL11.GL_TEXTURE_WRAP_T || pname == GL12.GL_TEXTURE_WRAP_R)) { + return (float) GL12.GL_CLAMP_TO_EDGE; + } + return param; + } + + public static void remapTexClampBuffer(int pname, IntBuffer params) { + if (params.remaining() >= 1) { + final int val = params.get(params.position()); + final int remapped = remapTexClamp(pname, val); + if (remapped != val) params.put(params.position(), remapped); + } + } + + public static void glBindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format) { + rejectExitCapture(); + if (GLSMTextureLifetime.isDeferredDelete(texture)) return; + final GLContextState glCtx = ctx(); + final ImageUnitBinding binding = glCtx.imageUnits.get(unit); + if (binding == null) { + warnOnce("imageUnitRange", "glBindImageTexture unit {} exceeds GL_MAX_IMAGE_UNITS {}", unit, glCtx.imageUnits.size()); + } else { + binding.setBinding(texture, level, texture != 0 && layered, texture != 0 ? layer : 0, access, format); + if (texture != 0 && unit > glCtx.maxBoundImageUnit) glCtx.maxBoundImageUnit = unit; + } + if (access != GL15.GL_READ_ONLY) TextureInfoCache.INSTANCE.onWrittenOutsideUploads(texture); + RENDER_BACKEND.bindImageTexture(unit, texture, level, layered, layer, access, format); + } + + public static void glBindImageTextures(int first, int count, IntBuffer textures) { + if (first < 0 || first + count > ctx().imageUnits.size()) return; + if (textures == null) { + for (int i = 0; i < count; i++) bindImageUnitByName(first + i, 0); + return; + } + requireRemaining(textures, count); + for (int i = 0; i < count; i++) bindImageUnitByName(first + i, textures.get(textures.position() + i)); + } + + public static void glBindImageTextures(int first, IntBuffer textures) { + if (textures != null) glBindImageTextures(first, textures.remaining(), textures); + } + + public static void glBindImageTextures(int first, int[] textures) { + if (textures != null) glBindImageTextures(first, textures.length, IntBuffer.wrap(textures)); + } + + private static void bindImageUnitByName(int unit, int texture) { + if (texture == 0) { + glBindImageTexture(unit, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8); + return; + } + if (GLSMTextureLifetime.isDeferredDelete(texture)) return; + final int format = TextureInfoCache.INSTANCE.getInfo(texture).getInternalFormat(); + if (!isImageFormat(format)) return; + final boolean layered = switch (GLSMTextureLifetime.targetOf(texture)) { + case GL30.GL_TEXTURE_1D_ARRAY, GL30.GL_TEXTURE_2D_ARRAY, GL12.GL_TEXTURE_3D, GL13.GL_TEXTURE_CUBE_MAP, GL40.GL_TEXTURE_CUBE_MAP_ARRAY, GL32.GL_TEXTURE_2D_MULTISAMPLE_ARRAY -> true; + default -> false; + }; + glBindImageTexture(unit, texture, 0, layered, 0, GL15.GL_READ_WRITE, format); + } + + private static boolean isImageFormat(int format) { + return switch (format) { + case GL30.GL_RGBA32F, GL30.GL_RGBA16F, GL30.GL_RG32F, GL30.GL_RG16F, GL30.GL_R11F_G11F_B10F, GL30.GL_R32F, GL30.GL_R16F, + GL30.GL_RGBA32UI, GL30.GL_RGBA16UI, GL33.GL_RGB10_A2UI, GL30.GL_RGBA8UI, GL30.GL_RG32UI, GL30.GL_RG16UI, GL30.GL_RG8UI, GL30.GL_R32UI, GL30.GL_R16UI, GL30.GL_R8UI, + GL30.GL_RGBA32I, GL30.GL_RGBA16I, GL30.GL_RGBA8I, GL30.GL_RG32I, GL30.GL_RG16I, GL30.GL_RG8I, GL30.GL_R32I, GL30.GL_R16I, GL30.GL_R8I, + GL11.GL_RGBA16, GL11.GL_RGB10_A2, GL11.GL_RGBA8, GL30.GL_RG16, GL30.GL_RG8, GL30.GL_R16, GL30.GL_R8, + GL31.GL_RGBA16_SNORM, GL31.GL_RGBA8_SNORM, GL31.GL_RG16_SNORM, GL31.GL_RG8_SNORM, GL31.GL_R16_SNORM, GL31.GL_R8_SNORM -> true; + default -> false; + }; + } + + public static ImageUnitBinding getImageUnitBinding(int unit) { + return ctx().imageUnits.get(unit); + } + public static void glCopyImageSubData(int srcName, int srcTarget, int srcLevel, int srcX, int srcY, int srcZ, + int dstName, int dstTarget, int dstLevel, int dstX, int dstY, int dstZ, + int srcWidth, int srcHeight, int srcDepth) { + rejectExitCapture(); + RENDER_BACKEND.copyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, + dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); + if (dstTarget != GL30.GL_RENDERBUFFER && dstLevel == 0) TextureInfoCache.INSTANCE.onContentsChanged(dstName); + } + public static void glGetTexImage(int target, int level, int format, int type, long pixels) { + rejectExitCapture(); + RENDER_BACKEND.getTexImage(target, level, format, type, pixels); + } + + public static IntegerStateStack getActiveTextureUnitStack() { + return ctx().activeTextureUnit; + } + + public static TextureUnitArray getTextures() { + return ctx().textures; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMVertexInput.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMVertexInput.java new file mode 100644 index 000000000..d302fb7c5 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLSMVertexInput.java @@ -0,0 +1,654 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; +import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; +import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage; +import com.gtnewhorizons.angelica.glsm.ffp.VAOManager; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL14; +import org.lwjgl.opengl.GL15; +import java.nio.ByteBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.ShortBuffer; + +import static com.gtnewhorizons.angelica.glsm.GLStateManager.acquireDrawLock; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.ctx; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.rejectExitCapture; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.releaseDrawLock; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.requireContext; +import static com.gtnewhorizons.angelica.glsm.GLStateManager.warnOnceTrace; +import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; + +public final class GLSMVertexInput { + + private GLSMVertexInput() {} + + public static int getBoundEBO() { + return ctx().vaos.boundEBO; + } + + private static int texCoordConventional(GLContextState glCtx) { + return VAOManager.CONV_TEX0 + glCtx.clientActiveTextureUnit; + } + + static void prepareClientArrays(GLContextState glCtx) { + final VAOManager vaos = glCtx.vaos; + if (vaos.hasAnyClientSideEnabledAttrib()) { + vaos.uploadClientArraysToVBO(); + } + } + + private static boolean isLegalClientArray(int conv, int size, int type, int stride) { + return isLegalPointer(VAOManager.isLegalConventional(conv, size, type), "client-array", "client array", conv, size, type, stride); + } + + private static boolean isLegalVertexAttrib(int index, int size, int type, int stride, boolean integer) { + return isLegalPointer(VAOManager.isLegalGeneric(index, size, type, integer), "vertex-attrib", "vertex attribute", index, size, type, stride); + } + + private static boolean isLegalPointer(boolean legal, String key, String what, int slot, int size, int type, int stride) { + if (stride < 0) warnOnceTrace(key + "-stride", "Negative {} stride {}", what, stride); + if (legal) return true; + warnOnceTrace(key + "-" + slot, "Ignoring {} {} with illegal size {} / type 0x{}", what, slot, size, Integer.toHexString(type)); + return false; + } + + private static boolean isValidVertexAttribIndex(int index, String function) { + if (index >= 0 && index < VAOManager.MAX_ATTRIBS) return true; + warnOnceTrace(function, "{}({}) is outside the {} supported vertex attributes; ignoring", function, index, VAOManager.MAX_ATTRIBS); + return false; + } + + private static void ffpClientArrayPointer(int conv, int size, int type, boolean normalized, int stride, long offset) { + rejectExitCapture(); + if (!isLegalClientArray(conv, size, type, stride)) return; + final GLContextState glCtx = ctx(); + if (glCtx.vaos.setConventional(conv, size, type, normalized, stride, offset, glCtx.boundVBO)) { + RENDER_BACKEND.vertexAttribPointer(VAOManager.conventionalLocation(conv), size, type, normalized, stride, offset); + } + } + + private static void ffpClientArrayPointer(int conv, int size, int type, boolean normalized, int stride, ByteBuffer pointer) { + rejectExitCapture(); + if (!isLegalClientArray(conv, size, type, stride)) return; + ctx().vaos.setConventional(conv, size, type, normalized, stride, pointer); + } + + static final int FIELD_SIZE = 0, FIELD_TYPE = 1 << 8, FIELD_STRIDE = 2 << 8, FIELD_BINDING = 3 << 8, FIELD_POINTER = 4 << 8; + + static int clientArrayField(GLContextState glCtx, int pname) { + return switch (pname) { + case GL11.GL_VERTEX_ARRAY_SIZE -> VAOManager.CONV_POSITION | FIELD_SIZE; + case GL11.GL_VERTEX_ARRAY_TYPE -> VAOManager.CONV_POSITION | FIELD_TYPE; + case GL11.GL_VERTEX_ARRAY_STRIDE -> VAOManager.CONV_POSITION | FIELD_STRIDE; + case GL15.GL_VERTEX_ARRAY_BUFFER_BINDING -> VAOManager.CONV_POSITION | FIELD_BINDING; + case GL11.GL_VERTEX_ARRAY_POINTER -> VAOManager.CONV_POSITION | FIELD_POINTER; + case GL11.GL_NORMAL_ARRAY_TYPE -> VAOManager.CONV_NORMAL | FIELD_TYPE; + case GL11.GL_NORMAL_ARRAY_STRIDE -> VAOManager.CONV_NORMAL | FIELD_STRIDE; + case GL15.GL_NORMAL_ARRAY_BUFFER_BINDING -> VAOManager.CONV_NORMAL | FIELD_BINDING; + case GL11.GL_NORMAL_ARRAY_POINTER -> VAOManager.CONV_NORMAL | FIELD_POINTER; + case GL11.GL_COLOR_ARRAY_SIZE -> VAOManager.CONV_COLOR | FIELD_SIZE; + case GL11.GL_COLOR_ARRAY_TYPE -> VAOManager.CONV_COLOR | FIELD_TYPE; + case GL11.GL_COLOR_ARRAY_STRIDE -> VAOManager.CONV_COLOR | FIELD_STRIDE; + case GL15.GL_COLOR_ARRAY_BUFFER_BINDING -> VAOManager.CONV_COLOR | FIELD_BINDING; + case GL11.GL_COLOR_ARRAY_POINTER -> VAOManager.CONV_COLOR | FIELD_POINTER; + case GL11.GL_INDEX_ARRAY_TYPE -> VAOManager.CONV_INDEX | FIELD_TYPE; + case GL11.GL_INDEX_ARRAY_STRIDE -> VAOManager.CONV_INDEX | FIELD_STRIDE; + case GL15.GL_INDEX_ARRAY_BUFFER_BINDING -> VAOManager.CONV_INDEX | FIELD_BINDING; + case GL11.GL_INDEX_ARRAY_POINTER -> VAOManager.CONV_INDEX | FIELD_POINTER; + case GL11.GL_EDGE_FLAG_ARRAY_STRIDE -> VAOManager.CONV_EDGE_FLAG | FIELD_STRIDE; + case GL15.GL_EDGE_FLAG_ARRAY_BUFFER_BINDING -> VAOManager.CONV_EDGE_FLAG | FIELD_BINDING; + case GL11.GL_EDGE_FLAG_ARRAY_POINTER -> VAOManager.CONV_EDGE_FLAG | FIELD_POINTER; + case GL14.GL_SECONDARY_COLOR_ARRAY_SIZE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_SIZE; + case GL14.GL_SECONDARY_COLOR_ARRAY_TYPE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_TYPE; + case GL14.GL_SECONDARY_COLOR_ARRAY_STRIDE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_STRIDE; + case GL15.GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING -> VAOManager.CONV_SECONDARY_COLOR | FIELD_BINDING; + case GL14.GL_SECONDARY_COLOR_ARRAY_POINTER -> VAOManager.CONV_SECONDARY_COLOR | FIELD_POINTER; + case GL14.GL_FOG_COORDINATE_ARRAY_TYPE -> VAOManager.CONV_FOG_COORD | FIELD_TYPE; + case GL14.GL_FOG_COORDINATE_ARRAY_STRIDE -> VAOManager.CONV_FOG_COORD | FIELD_STRIDE; + case GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -> VAOManager.CONV_FOG_COORD | FIELD_BINDING; + case GL14.GL_FOG_COORDINATE_ARRAY_POINTER -> VAOManager.CONV_FOG_COORD | FIELD_POINTER; + case GL11.GL_TEXTURE_COORD_ARRAY_SIZE -> texCoordConventional(glCtx) | FIELD_SIZE; + case GL11.GL_TEXTURE_COORD_ARRAY_TYPE -> texCoordConventional(glCtx) | FIELD_TYPE; + case GL11.GL_TEXTURE_COORD_ARRAY_STRIDE -> texCoordConventional(glCtx) | FIELD_STRIDE; + case GL15.GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING -> texCoordConventional(glCtx) | FIELD_BINDING; + case GL11.GL_TEXTURE_COORD_ARRAY_POINTER -> texCoordConventional(glCtx) | FIELD_POINTER; + default -> -1; + }; + } + + static int clientArrayParam(GLContextState glCtx, int key) { + final int conv = key & 0xFF; + final VAOManager.Attrib a = glCtx.vaos.conventional(conv); + final boolean specified = a != null && a.size != 0; + return switch (key & ~0xFF) { + case FIELD_SIZE -> specified ? a.size : conv == VAOManager.CONV_SECONDARY_COLOR ? 3 : 4; + case FIELD_TYPE -> specified ? a.type : GL11.GL_FLOAT; + case FIELD_STRIDE -> specified ? a.stride : 0; + default -> specified ? a.vboId : 0; + }; + } + + public static ByteBuffer glGetPointer(int pname, long result_size) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final int key = clientArrayField(glCtx, pname); + if ((key & ~0xFF) != FIELD_POINTER) return null; + final VAOManager.Attrib a = glCtx.vaos.conventional(key & 0xFF); + if (a == null) return null; + final long address = a.clientPointer != null ? MemoryUtilities.memAddress(a.clientPointer) : a.offset; + return address == 0 ? null : MemoryUtilities.memByteBuffer(address, (int) result_size); + } + + public static void glEdgeFlagPointer(int stride, ByteBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_EDGE_FLAG, 1, GL11.GL_UNSIGNED_BYTE, false, stride, pointer); + } + + public static void glEdgeFlagPointer(int stride, long pointer_buffer_offset) { + ffpClientArrayPointer(VAOManager.CONV_EDGE_FLAG, 1, GL11.GL_UNSIGNED_BYTE, false, stride, pointer_buffer_offset); + } + + public static void glFogCoordPointer(int stride, FloatBuffer data) { + ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(data)); + } + + public static void glFogCoordPointer(int stride, DoubleBuffer data) { + ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(data)); + } + + public static void glFogCoordPointer(int type, int stride, long data_buffer_offset) { + ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, type, false, stride, data_buffer_offset); + } + + public static void glSecondaryColorPointer(int size, int stride, FloatBuffer data) { + ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, GL11.GL_FLOAT, true, stride, MemoryUtilities.memByteBuffer(data)); + } + + public static void glSecondaryColorPointer(int size, int stride, DoubleBuffer data) { + ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, GL11.GL_DOUBLE, true, stride, MemoryUtilities.memByteBuffer(data)); + } + + public static void glSecondaryColorPointer(int size, boolean unsigned, int stride, ByteBuffer data) { + final int type = unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE; + ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, type, true, stride, data); + } + + public static void glSecondaryColorPointer(int size, int type, int stride, long data_buffer_offset) { + ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, type, true, stride, data_buffer_offset); + } + + static void pointAttrib(GLContextState glCtx, int index) { + final VAOManager vaos = glCtx.vaos; + final VAOManager.Attrib a = vaos.attrib(index); + if (a == null) return; + RENDER_BACKEND.vertexAttribDivisor(index, a.divisor); + if (a.size == 0 || a.vboId == 0 || !vaos.isBufferLive(a)) return; + if (glCtx.boundVBO != a.vboId) GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId); + if (a.integer) { + RENDER_BACKEND.vertexAttribIPointer(index, a.size, a.type, a.stride, a.offset); + } else { + RENDER_BACKEND.vertexAttribPointer(index, a.size, a.type, a.normalized, a.stride, a.offset); + } + } + + private static void repointAttrib(GLContextState glCtx, int index) { + final int savedVBO = glCtx.boundVBO; + pointAttrib(glCtx, index); + if (glCtx.boundVBO != savedVBO) GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); + } + + public static void glVertexPointer(int size, int stride, IntBuffer pointer) { + glVertexPointer(size, GL11.GL_INT, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glVertexPointer(int size, int stride, ShortBuffer pointer) { + glVertexPointer(size, GL11.GL_SHORT, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glVertexPointer(int size, int stride, FloatBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_POSITION, size, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glVertexPointer(int size, int stride, DoubleBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_POSITION, size, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glVertexPointer(int size, int type, int stride, ByteBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_POSITION, size, type, false, stride, pointer); + } + + public static void glVertexPointer(int size, int type, int stride, long pointer_buffer_offset) { + ffpClientArrayPointer(VAOManager.CONV_POSITION, size, type, false, stride, pointer_buffer_offset); + } + + public static void glColorPointer(int size, int stride, FloatBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_COLOR, size, GL11.GL_FLOAT, Usage.COLOR.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glColorPointer(int size, int stride, DoubleBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_COLOR, size, GL11.GL_DOUBLE, Usage.COLOR.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glColorPointer(int size, int type, int stride, ByteBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer); + } + + public static void glColorPointer(int size, boolean unsigned, int stride, ByteBuffer pointer) { + final int type = unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE; + ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer); + } + + public static void glColorPointer(int size, int type, int stride, long pointer_buffer_offset) { + ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer_buffer_offset); + } + + public static void glNormalPointer(int stride, FloatBuffer pointer) { + glNormalPointer(GL11.GL_FLOAT, stride, pointer); + } + + public static void glNormalPointer(int stride, ByteBuffer pointer) { + glNormalPointer(GL11.GL_BYTE, stride, pointer); + } + + public static void glNormalPointer(int stride, IntBuffer pointer) { + glNormalPointer(GL11.GL_INT, stride, pointer); + } + + public static void glNormalPointer(int stride, DoubleBuffer pointer) { + glNormalPointer(GL11.GL_DOUBLE, stride, pointer); + } + + public static void glNormalPointer(int type, int stride, ByteBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, type, Usage.NORMAL.isNormalized(), stride, pointer); + } + + public static void glNormalPointer(int type, int stride, FloatBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_FLOAT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glNormalPointer(int type, int stride, ShortBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_SHORT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glNormalPointer(int type, int stride, IntBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_INT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glNormalPointer(int type, int stride, DoubleBuffer pointer) { + ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_DOUBLE, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glNormalPointer(int type, int stride, long pointer_buffer_offset) { + ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, type, Usage.NORMAL.isNormalized(), stride, pointer_buffer_offset); + } + + public static void glTexCoordPointer(int size, int type, int stride, ByteBuffer pointer) { + ffpClientArrayPointer(texCoordConventional(ctx()), size, type, false, stride, pointer); + } + + public static void glTexCoordPointer(int size, int stride, FloatBuffer pointer) { + glTexCoordPointer(size, GL11.GL_FLOAT, stride, pointer); + } + + public static void glTexCoordPointer(int size, int stride, IntBuffer pointer) { + glTexCoordPointer(size, GL11.GL_INT, stride, pointer); + } + + public static void glTexCoordPointer(int size, int stride, ShortBuffer pointer) { + glTexCoordPointer(size, GL11.GL_SHORT, stride, pointer); + } + + public static void glTexCoordPointer(int size, int stride, DoubleBuffer pointer) { + glTexCoordPointer(size, GL11.GL_DOUBLE, stride, pointer); + } + + public static void glTexCoordPointer(int size, int type, int stride, FloatBuffer pointer) { + ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glTexCoordPointer(int size, int type, int stride, ShortBuffer pointer) { + ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_SHORT, false, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glTexCoordPointer(int size, int type, int stride, IntBuffer pointer) { + ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_INT, false, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glTexCoordPointer(int size, int type, int stride, DoubleBuffer pointer) { + ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glTexCoordPointer(int size, int type, int stride, long pointer_buffer_offset) { + ffpClientArrayPointer(texCoordConventional(ctx()), size, type, false, stride, pointer_buffer_offset); + } + + public static void glEnableClientState(int cap) { + rejectExitCapture(); + setClientArrayCap(ctx(), cap, true); + } + + public static void glDisableClientState(int cap) { + rejectExitCapture(); + setClientArrayCap(ctx(), cap, false); + } + + static boolean setClientArrayCap(GLContextState glCtx, int cap, boolean enabled) { + final int conv = clientStateToConventional(glCtx, cap); + if (conv < 0) return false; + setClientArrayEnabled(glCtx, conv, enabled); + return true; + } + + private static void setClientArrayEnabled(GLContextState glCtx, int conv, boolean enabled) { + final VAOManager vaos = glCtx.vaos; + final boolean repoint = vaos.setConventionalEnabled(conv, enabled); + final int index = VAOManager.conventionalLocation(conv); + if (index >= 0) { + if (repoint) repointAttrib(glCtx, index); + syncAttribEnable(glCtx, index); + } + final int flag = conventionalVertexFlag(conv); + if (flag == 0) return; + if (enabled) { + vaos.enableClientVertexFlag(flag); + } else { + vaos.disableClientVertexFlag(flag); + } + } + + static void syncAttribEnable(GLContextState glCtx, int index) { + if (glCtx.vaos.isAttribEnabled(index)) { + RENDER_BACKEND.enableVertexAttribArray(index); + } else { + RENDER_BACKEND.disableVertexAttribArray(index); + } + } + + public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset) { + rejectExitCapture(); + if (!isLegalVertexAttrib(index, size, type, stride, false)) return; + final GLContextState glCtx = ctx(); + if (glCtx.vaos.setAttribute(index, size, type, normalized, stride, offset, glCtx.boundVBO)) { + RENDER_BACKEND.vertexAttribPointer(index, size, type, normalized, stride, offset); + } + } + + public static void glVertexAttribPointer(int index, int size, boolean normalized, int stride, FloatBuffer pointer) { + glVertexAttribPointer(index, size, GL11.GL_FLOAT, normalized, stride, pointer); + } + + public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, FloatBuffer pointer) { + glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, DoubleBuffer pointer) { + glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, IntBuffer pointer) { + glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, ShortBuffer pointer) { + glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, ByteBuffer pointer) { + rejectExitCapture(); + if (!isLegalVertexAttrib(index, size, type, stride, false)) return; + ctx().vaos.setAttribute(index, size, type, normalized, stride, pointer); + } + + public static void glVertexAttribIPointer(int index, int size, int type, int stride, long offset) { + rejectExitCapture(); + if (!isLegalVertexAttrib(index, size, type, stride, true)) return; + final GLContextState glCtx = ctx(); + if (glCtx.vaos.setIntegerAttribute(index, size, type, stride, offset, glCtx.boundVBO)) { + RENDER_BACKEND.vertexAttribIPointer(index, size, type, stride, offset); + } + } + + public static void glVertexAttribIPointer(int index, int size, int type, int stride, ByteBuffer pointer) { + rejectExitCapture(); + if (!isLegalVertexAttrib(index, size, type, stride, true)) return; + ctx().vaos.setIntegerAttribute(index, size, type, stride, pointer); + } + + public static void glVertexAttribIPointer(int index, int size, int type, int stride, IntBuffer pointer) { + glVertexAttribIPointer(index, size, type, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glVertexAttribIPointer(int index, int size, int type, int stride, ShortBuffer pointer) { + glVertexAttribIPointer(index, size, type, stride, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glVertexAttribDivisor(int index, int divisor) { + rejectExitCapture(); + if (ctx().vaos.setDivisor(index, divisor)) RENDER_BACKEND.vertexAttribDivisor(index, divisor); + } + + public static void glVertexAttribDivisorARB(int index, int divisor) { glVertexAttribDivisor(index, divisor); } + public static void glBindVertexBuffer(int bindingindex, int buffer, long offset, int stride) { rejectExitCapture(); RENDER_BACKEND.bindVertexBuffer(bindingindex, buffer, offset, stride); } + public static void glVertexAttribFormat(int attribindex, int size, int type, boolean normalized, int relativeoffset) { rejectExitCapture(); RENDER_BACKEND.vertexAttribFormat(attribindex, size, type, normalized, relativeoffset); } + public static void glVertexAttribIFormat(int attribindex, int size, int type, int relativeoffset) { rejectExitCapture(); RENDER_BACKEND.vertexAttribIFormat(attribindex, size, type, relativeoffset); } + public static void glVertexAttribBinding(int attribindex, int bindingindex) { rejectExitCapture(); RENDER_BACKEND.vertexAttribBinding(attribindex, bindingindex); } + + public static void glEnableVertexAttribArray(int index) { + rejectExitCapture(); + if (!isValidVertexAttribIndex(index, "glEnableVertexAttribArray")) return; + final GLContextState glCtx = ctx(); + if (glCtx.vaos.enableAttribute(index)) repointAttrib(glCtx, index); + RENDER_BACKEND.enableVertexAttribArray(index); + } + + public static void glDisableVertexAttribArray(int index) { + rejectExitCapture(); + if (!isValidVertexAttribIndex(index, "glDisableVertexAttribArray")) return; + final GLContextState glCtx = ctx(); + if (glCtx.vaos.disableAttribute(index)) repointAttrib(glCtx, index); + if (!glCtx.vaos.isAttribEnabled(index)) RENDER_BACKEND.disableVertexAttribArray(index); + } + + static int clientStateToConventional(GLContextState glCtx, int cap) { + return switch (cap) { + case GL11.GL_VERTEX_ARRAY -> VAOManager.CONV_POSITION; + case GL11.GL_NORMAL_ARRAY -> VAOManager.CONV_NORMAL; + case GL11.GL_COLOR_ARRAY -> VAOManager.CONV_COLOR; + case GL11.GL_INDEX_ARRAY -> VAOManager.CONV_INDEX; + case GL11.GL_EDGE_FLAG_ARRAY -> VAOManager.CONV_EDGE_FLAG; + case GL14.GL_SECONDARY_COLOR_ARRAY -> VAOManager.CONV_SECONDARY_COLOR; + case GL14.GL_FOG_COORDINATE_ARRAY -> VAOManager.CONV_FOG_COORD; + case GL11.GL_TEXTURE_COORD_ARRAY -> texCoordConventional(glCtx); + default -> -1; + }; + } + + private static int conventionalVertexFlag(int conv) { + return switch (conv) { + case VAOManager.CONV_COLOR -> VertexFlags.COLOR_BIT; + case VAOManager.CONV_NORMAL -> VertexFlags.NORMAL_BIT; + case VAOManager.CONV_TEX0 -> VertexFlags.TEXTURE_BIT; + case VAOManager.CONV_TEX0 + 1 -> VertexFlags.BRIGHTNESS_BIT; + default -> 0; + }; + } + + public static void glInterleavedArrays(int format, int stride, long pointer) { + interleavedArrays(format, stride, pointer, null); + } + + private static void interleavedPointer(int conv, int size, int type, boolean normalized, int stride, long pointer, ByteBuffer base, int offset) { + if (base == null) { + ffpClientArrayPointer(conv, size, type, normalized, stride, pointer + offset); + } else { + ffpClientArrayPointer(conv, size, type, normalized, stride, MemoryUtilities.memSlice(base, offset, base.remaining() - offset)); + } + } + + private static void interleavedArrays(int format, int stride, long pointer, ByteBuffer base) { + rejectExitCapture(); + // Mesa _mesa_get_interleaved_layout decomposition + final int f = 4; // sizeof(float) + final int c = f * ((4 + (f - 1)) / f); // 4 ubytes padded to float alignment = 4 + + boolean tflag = false, cflag = false, nflag = false; + int tcomps = 0, ccomps = 0, vcomps = 0; + int ctype = 0; + final int toffset = 0; + int coffset = 0; + int noffset = 0; + int voffset = 0; + final int defstride; + + switch (format) { + case GL11.GL_V2F: + vcomps = 2; defstride = 2 * f; break; + case GL11.GL_V3F: + vcomps = 3; defstride = 3 * f; break; + case GL11.GL_C4UB_V2F: + cflag = true; ccomps = 4; vcomps = 2; + ctype = GL11.GL_UNSIGNED_BYTE; voffset = c; defstride = c + 2 * f; break; + case GL11.GL_C4UB_V3F: + cflag = true; ccomps = 4; vcomps = 3; + ctype = GL11.GL_UNSIGNED_BYTE; voffset = c; defstride = c + 3 * f; break; + case GL11.GL_C3F_V3F: + cflag = true; ccomps = 3; vcomps = 3; + ctype = GL11.GL_FLOAT; voffset = 3 * f; defstride = 6 * f; break; + case GL11.GL_N3F_V3F: + nflag = true; vcomps = 3; + voffset = 3 * f; defstride = 6 * f; break; + case GL11.GL_C4F_N3F_V3F: + cflag = true; nflag = true; ccomps = 4; vcomps = 3; + ctype = GL11.GL_FLOAT; noffset = 4 * f; voffset = 7 * f; defstride = 10 * f; break; + case GL11.GL_T2F_V3F: + tflag = true; tcomps = 2; vcomps = 3; + voffset = 2 * f; defstride = 5 * f; break; + case GL11.GL_T4F_V4F: + tflag = true; tcomps = 4; vcomps = 4; + voffset = 4 * f; defstride = 8 * f; break; + case GL11.GL_T2F_C4UB_V3F: + tflag = true; cflag = true; tcomps = 2; ccomps = 4; vcomps = 3; + ctype = GL11.GL_UNSIGNED_BYTE; coffset = 2 * f; voffset = c + 2 * f; defstride = c + 5 * f; break; + case GL11.GL_T2F_C3F_V3F: + tflag = true; cflag = true; tcomps = 2; ccomps = 3; vcomps = 3; + ctype = GL11.GL_FLOAT; coffset = 2 * f; voffset = 5 * f; defstride = 8 * f; break; + case GL11.GL_T2F_N3F_V3F: + tflag = true; nflag = true; tcomps = 2; vcomps = 3; + noffset = 2 * f; voffset = 5 * f; defstride = 8 * f; break; + case GL11.GL_T2F_C4F_N3F_V3F: + tflag = true; cflag = true; nflag = true; tcomps = 2; ccomps = 4; vcomps = 3; + ctype = GL11.GL_FLOAT; coffset = 2 * f; noffset = 6 * f; voffset = 9 * f; defstride = 12 * f; break; + case GL11.GL_T4F_C4F_N3F_V4F: + tflag = true; cflag = true; nflag = true; tcomps = 4; ccomps = 4; vcomps = 4; + ctype = GL11.GL_FLOAT; coffset = 4 * f; noffset = 8 * f; voffset = 11 * f; defstride = 15 * f; break; + default: + return; // Invalid format + } + + if (stride == 0) stride = defstride; + + if (tflag) { + glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); + interleavedPointer(texCoordConventional(ctx()), tcomps, GL11.GL_FLOAT, false, stride, pointer, base, toffset); + } else { + glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); + } + + if (cflag) { + glEnableClientState(GL11.GL_COLOR_ARRAY); + interleavedPointer(VAOManager.CONV_COLOR, ccomps, ctype, Usage.COLOR.isNormalized(), stride, pointer, base, coffset); + } else { + glDisableClientState(GL11.GL_COLOR_ARRAY); + } + + if (nflag) { + glEnableClientState(GL11.GL_NORMAL_ARRAY); + interleavedPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_FLOAT, Usage.NORMAL.isNormalized(), stride, pointer, base, noffset); + } else { + glDisableClientState(GL11.GL_NORMAL_ARRAY); + } + + glEnableClientState(GL11.GL_VERTEX_ARRAY); + interleavedPointer(VAOManager.CONV_POSITION, vcomps, GL11.GL_FLOAT, false, stride, pointer, base, voffset); + } + + public static void glInterleavedArrays(int format, int stride, ByteBuffer pointer) { + interleavedArrays(format, stride, 0L, pointer); + } + + public static void glInterleavedArrays(int format, int stride, FloatBuffer pointer) { + interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glInterleavedArrays(int format, int stride, DoubleBuffer pointer) { + interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glInterleavedArrays(int format, int stride, IntBuffer pointer) { + interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glInterleavedArrays(int format, int stride, ShortBuffer pointer) { + interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer)); + } + + public static void glBindVertexArray(int array) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + if (DisplayListManager.isRecording()) { + DisplayListManager.recordBindVAO(array); + // Since the vao needs to be bound to do stuff like state setup & data upload, it'll still execute the bind call. + // This is technically wrong, but I'm not sure if there's a better solution here. + } + bindVertexArrayInternal(glCtx, array == 0 ? glCtx.defaultVAO : array); + } + + static void bindVertexArrayInternal(GLContextState glCtx, int array) { + final boolean locked = acquireDrawLock(); + try { + if (glCtx.boundVAO != array) { + glCtx.boundVAO = array; + glCtx.vaos.onBindVertexArrayPre(array); + RENDER_BACKEND.bindVertexArray(array); + } + } finally { + if (locked) releaseDrawLock(); + } + } + + public static void glDeleteVertexArrays(int array) { + rejectExitCapture(); + final GLContextState glCtx = ctx(); + final boolean locked = acquireDrawLock(); + try { + glCtx.vaos.onDeleteVertexArray(array); + if (array == glCtx.boundVAO) { + // Deleting the bound VAO implicitly unbinds it. Rebind the default VAO. + bindVertexArrayInternal(glCtx, glCtx.defaultVAO); + } + RENDER_BACKEND.deleteVertexArrays(array); + } finally { + if (locked) releaseDrawLock(); + } + } + + public static int glGenVertexArrays() { + requireContext("glGenVertexArrays"); + return RENDER_BACKEND.genVertexArrays(); + } + + public static boolean glIsVertexArray(int array) { + rejectExitCapture(); + return RENDER_BACKEND.isVertexArray(array); + } + + public static void glBindVertexArrayAPPLE(int array) { + glBindVertexArray(array); + } + + public static int getBoundVAO() { + return ctx().boundVAO; + } +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java index 2c0dbd2e5..6c4be63a6 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/GLStateManager.java @@ -1,140 +1,37 @@ package com.gtnewhorizons.angelica.glsm; -import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; -import com.gtnewhorizon.gtnhlib.bytebuf.Pointer; -import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator; import com.gtnewhorizon.gtnhlib.client.renderer.stacks.IStateStack; -import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; -import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage; import com.gtnewhorizons.angelica.config.SystemProperties; import com.gtnewhorizons.angelica.glsm.DisplayListManager.RecordMode; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; -import com.gtnewhorizons.angelica.glsm.backend.GLDebugMessageListener; import com.gtnewhorizons.angelica.glsm.backend.VSyncMode; -import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs; -import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs; -import com.gtnewhorizons.angelica.glsm.ffp.Instancing; -import com.gtnewhorizons.angelica.glsm.profiling.Tracy; -import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; import com.gtnewhorizons.angelica.glsm.ffp.VAOManager; import com.gtnewhorizons.angelica.glsm.ffp.VertexKey; -import com.gtnewhorizons.angelica.glsm.hooks.DeferredAlphaHandler; -import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler; -import com.gtnewhorizons.angelica.glsm.hooks.DeferredDepthColorHandler; -import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard; import com.gtnewhorizons.angelica.glsm.hooks.GLSMInitConfig; -import com.gtnewhorizons.angelica.glsm.hooks.GlintColorHandler; -import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; -import com.gtnewhorizons.angelica.glsm.recording.CommandRecorder; -import com.gtnewhorizons.angelica.glsm.recording.CompiledDisplayList; import com.gtnewhorizons.angelica.glsm.recording.ImmediateModeRecorder; -import com.gtnewhorizons.angelica.glsm.recording.commands.IndexedDrawCapture; -import com.gtnewhorizons.angelica.glsm.recording.commands.TexImage2DCmd; -import com.gtnewhorizons.angelica.glsm.recording.commands.TexSubImage2DCmd; -import com.gtnewhorizons.angelica.glsm.shader.ProgramBinaryCache; -import com.gtnewhorizons.angelica.glsm.stacks.AlphaStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.BlendStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.BooleanStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.Color4Stack; -import com.gtnewhorizons.angelica.glsm.stacks.ColorMaskStack; -import com.gtnewhorizons.angelica.glsm.stacks.CowDepths; -import com.gtnewhorizons.angelica.glsm.stacks.CowDispatch; import com.gtnewhorizons.angelica.glsm.stacks.CowStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.DepthStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.FogStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.IntegerStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.LightModelStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.LightStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.LineStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.MaterialStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.MatrixModeStack; -import com.gtnewhorizons.angelica.glsm.stacks.PointStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.PolygonStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.RetainedState; -import com.gtnewhorizons.angelica.glsm.stacks.ScissorStateStack; import com.gtnewhorizons.angelica.glsm.stacks.StackIdAllocator; -import com.gtnewhorizons.angelica.glsm.stacks.StencilStateStack; -import com.gtnewhorizons.angelica.glsm.stacks.TextureBindingStack; -import com.gtnewhorizons.angelica.glsm.stacks.ViewPortStateStack; -import com.gtnewhorizons.angelica.glsm.states.AlphaState; -import com.gtnewhorizons.angelica.glsm.states.BlendState; -import com.gtnewhorizons.angelica.glsm.states.ClipPlaneState; -import com.gtnewhorizons.angelica.glsm.states.Color4; -import com.gtnewhorizons.angelica.glsm.states.ColorMask; -import com.gtnewhorizons.angelica.glsm.states.PixelStoreState; -import com.gtnewhorizons.angelica.glsm.states.PolygonState; -import com.gtnewhorizons.angelica.glsm.states.SamplerUnitArray; -import com.gtnewhorizons.angelica.glsm.states.ImageUnitBinding; -import com.gtnewhorizons.angelica.glsm.states.TextureBinding; -import com.gtnewhorizons.angelica.glsm.states.TextureUnitArray; -import com.gtnewhorizons.angelica.glsm.streaming.LineQuads; -import com.gtnewhorizons.angelica.glsm.streaming.TessellatorEntityIds; -import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer; -import com.gtnewhorizons.angelica.glsm.texture.TextureInfo; -import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache; -import com.gtnewhorizons.angelica.glsm.texture.TextureStaging; -import com.gtnewhorizons.angelica.glsm.texture.TextureTargets; -import it.unimi.dsi.fastutil.ints.Int2IntMap; -import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; -import it.unimi.dsi.fastutil.ints.Int2LongMap; -import it.unimi.dsi.fastutil.ints.Int2LongMaps; -import it.unimi.dsi.fastutil.ints.Int2LongOpenHashMap; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; -import it.unimi.dsi.fastutil.longs.LongIterator; import lombok.Getter; import lombok.Setter; -import lombok.SneakyThrows; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.joml.Matrix4f; -import org.joml.Matrix4fStack; -import org.joml.Matrix4fc; -import org.joml.Vector3d; -import org.joml.Vector3f; -import org.joml.Vector4f; -import org.lwjgl.BufferUtils; import org.lwjgl.LWJGLException; -import org.lwjgl.opengl.ARBShaderObjects; import org.lwjgl.opengl.ContextCapabilities; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.Drawable; -import org.lwjgl.opengl.EXTTextureFilterAnisotropic; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL14; -import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL21; import org.lwjgl.opengl.GL30; -import org.lwjgl.opengl.GL31; import org.lwjgl.opengl.GL32; -import org.lwjgl.opengl.GL33; -import org.lwjgl.opengl.GL40; -import org.lwjgl.opengl.GL42; -import org.lwjgl.opengl.GL43; import org.lwjgl.opengl.GLContext; -import org.lwjgl.opengl.KHRDebug; -import org.lwjgl.opengl.KHRDebugCallback; -import org.lwjgl.util.glu.GLU; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Field; -import java.nio.Buffer; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.DoubleBuffer; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.nio.LongBuffer; -import java.nio.ShortBuffer; -import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.IdentityHashMap; -import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantLock; @@ -146,16 +43,8 @@ import static com.gtnewhorizons.angelica.glsm.Vendor.NVIDIA; import static com.gtnewhorizons.angelica.glsm.backend.BackendManager.RENDER_BACKEND; /** - * OpenGL State Manager - Provides cached state tracking and management for Backend Renderer Actions - * IMPORTANT NOTE: Do NOT call open gl directly, route everything through {@link BackendManager#RENDER_BACKEND} - * - *

IMPORTANT INITIALIZATION ORDER:

- *
    - *
  • This class performs GL queries in static initializers (MAX_CLIP_PLANES, MAX_TEXTURE_UNITS, etc.)
  • - *
  • The class MUST NOT be loaded until after the GL context has been created and made current
  • - *
  • Violating this requirement will cause crashes with "No current context" or return invalid values
  • - *
  • Call {@link #initialize(GLSMInitConfig)} after GL context creation to initialize runtime state
  • - *
+ * GLSM core: per-thread context lookup ({@link #ctx()}), the exit-capture/batch-guard prologue, limits and lifecycle; GL entry points live in the GLSM group classes. + * The static initializer queries the backend, so this class must not load before a GL context is current; call {@link #initialize(GLSMInitConfig)} after context creation. */ @SuppressWarnings("unused") // Used in ASM public class GLStateManager { @@ -211,7 +100,7 @@ public class GLStateManager { if (ExitStateCapture.anyOpen()) recordExitTextureBind(ctx(), target, unit); } - private static void recordExitTextureBind(GLContextState glCtx, int target, int unit) { + static void recordExitTextureBind(GLContextState glCtx, int target, int unit) { if (target == GL11.GL_TEXTURE_2D && unit == 0) glCtx.exitCapture.write(ExitStateCapture.TEXTURE_BINDING); else glCtx.exitCapture.reject(); } @@ -242,20 +131,6 @@ public class GLStateManager { beforeUncapturedStateChange(); } - private static void beforeMatrixChange(GLContextState c) { - beforeMatrixChange(c, false); - } - - private static void beforeMatrixChange(GLContextState c, boolean absolute) { - c.exitCapture.matrixChange(absolute); - if (isUncapturedMatrix(c)) beforeUncapturedStateChange(); - } - - private static boolean isUncapturedMatrix(GLContextState c) { - final int mode = c.matrixMode.getMode(); - return mode == GL11.GL_PROJECTION || (mode == GL11.GL_TEXTURE && c.activeTextureUnit.getValue() != 0); - } - public static final Logger LOGGER = LogManager.getLogger("GLSM"); private static final Set WARN_ONCE = ConcurrentHashMap.newKeySet(); @@ -264,13 +139,21 @@ public class GLStateManager { if (WARN_ONCE.add(key)) LOGGER.warn(fmt, args); } - private static volatile GLContextState primaryContext; + // The key check comes first so a caller repeating the mistake every frame does not capture a stack each time. + static void warnOnceTrace(String key, String fmt, Object... args) { + if (!WARN_ONCE.add(key)) return; + final Object[] withTrace = Arrays.copyOf(args, args.length + 1); + withTrace[args.length] = new Throwable("call site"); + LOGGER.warn(fmt, withTrace); + } + + static volatile GLContextState primaryContext; private static final ThreadLocal tlWorkerContext = new ThreadLocal<>(); private static GLContextState mainCtx; private static volatile boolean workerContextsActive; private static int workerContextCount; private static final IdentityHashMap drawableContexts = new IdentityHashMap<>(); - private static GLContextState[] drawableContextStates = new GLContextState[0]; + static GLContextState[] drawableContextStates = new GLContextState[0]; public static GLContextState ctx() { if (Thread.currentThread() == MainThread) { @@ -368,20 +251,8 @@ public class GLStateManager { return d == Display.getDrawable(); } - // Tracy profiling counters - public static long drawCalls; - public static long texBindMisses; - public static long programSwitches; - public static long attribPushes; - public static long attribSlotsSaved; - public static long attribValueRestores; - public static long attribBackendCalls; - public static long attribDiscards; - public static int programGeneration; - public static int drawFramebufferGeneration; - // Thread Checking - must be early in static init order so isMainThread() works for state initialization - @Getter private static final Thread MainThread = Thread.currentThread(); + @Getter static final Thread MainThread = Thread.currentThread(); public static boolean isMainThread() { return Thread.currentThread() == MainThread; @@ -393,7 +264,7 @@ public class GLStateManager { throw new IllegalStateException(call + " on thread " + Thread.currentThread().getName() + ", which has no GL context"); } - @Getter private static GLSMInitConfig initConfig; + @Getter static GLSMInitConfig initConfig; public static ContextCapabilities capabilities; @@ -412,132 +283,14 @@ public class GLStateManager { public static final GLFeatureSet HAS_MULTIPLE_SET = new GLFeatureSet(); - // Generation counters for FFP uniform dirty tracking. Bumped when the corresponding GLSM state changes. - // Per-matrix-mode generation counters - avoids re-uploading all matrices when only one mode changed - public static void setOverlayColor(float r, float g, float b, float a) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.OVERLAY_COLOR); - if (r == glCtx.overlayR && g == glCtx.overlayG && b == glCtx.overlayB && a == glCtx.overlayA) return; - glCtx.overlayR = r; glCtx.overlayG = g; glCtx.overlayB = b; glCtx.overlayA = a; - glCtx.fragmentGeneration++; - } - - public static void setShaderColor(float r, float g, float b, float a) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.SHADER_COLOR); - if (r == glCtx.shaderColorR && g == glCtx.shaderColorG && b == glCtx.shaderColorB && a == glCtx.shaderColorA) return; - glCtx.shaderColorR = r; glCtx.shaderColorG = g; glCtx.shaderColorB = b; glCtx.shaderColorA = a; - if (GLSMHooks.SHADER_COLOR_CHANGE.hasListeners()) { - GLSMHooks.shaderColorChangeEvent.red = r; - GLSMHooks.shaderColorChangeEvent.green = g; - GLSMHooks.shaderColorChangeEvent.blue = b; - GLSMHooks.shaderColorChangeEvent.alpha = a; - GLSMHooks.SHADER_COLOR_CHANGE.post(GLSMHooks.shaderColorChangeEvent); - } - } - - - public static boolean consumeUnit23TexCoordSetDuringDraw(GLContextState glCtx) { - boolean v = glCtx.unit23TexCoordSetDuringDraw; - glCtx.unit23TexCoordSetDuringDraw = false; - return v; - } - - public static void forceAttribDefaultsDirty() { - final GLContextState glCtx = ctx(); - glCtx.dirtyNormalAttrib = true; - glCtx.dirtyTexCoordAttrib = true; - } - - // has* bits mark attribs the VBO already supplies; FFP supplies the rest via u_Current* uniforms. - // Skip the backend vertexAttrib call in either case - public static void flushDeferredVertexAttribs(GLContextState glCtx, boolean hasColor, boolean hasNormal, boolean hasTexCoord, boolean hasLightmap) { - final ShaderManager sm = glCtx.ffp; - final boolean ffpWillHandle = sm.isActive() || (sm.isEnabled() && glCtx.activeProgram == 0); - if (!hasColor && glCtx.dirtyColorAttrib && !ffpWillHandle) { - RENDER_BACKEND.vertexAttrib4f(Usage.COLOR.getAttributeLocation(), glCtx.color.getRed(), glCtx.color.getGreen(), glCtx.color.getBlue(), glCtx.color.getAlpha()); - glCtx.dirtyColorAttrib = false; - } - if (!hasNormal && glCtx.dirtyNormalAttrib && !ffpWillHandle) { - final var n = sm.currentNormal; - RENDER_BACKEND.vertexAttrib3f(Usage.NORMAL.getAttributeLocation(), n.x, n.y, n.z); - glCtx.dirtyNormalAttrib = false; - } - if (!hasTexCoord && glCtx.dirtyTexCoordAttrib && !ffpWillHandle) { - final var tc = sm.currentTexCoords[0]; - RENDER_BACKEND.vertexAttrib4f(Usage.PRIMARY_UV.getAttributeLocation(), tc.x, tc.y, tc.z, tc.w); - glCtx.dirtyTexCoordAttrib = false; - } - if (!hasLightmap && glCtx.dirtyLightmapAttrib && !ffpWillHandle) { - RENDER_BACKEND.vertexAttrib4f(Usage.SECONDARY_UV.getAttributeLocation(), glCtx.lastBrightnessX, glCtx.lastBrightnessY, 0.0f, 1.0f); - glCtx.dirtyLightmapAttrib = false; - } - } - - public static void setEntityIds(int entity, int blockEntity, int item) { - rejectExitCapture(); - if (!isMainThread()) return; - final GLContextState glCtx = ctx(); - final long ids = InstancedAttribs.packEntityInfo(entity, blockEntity, item); - if (ids == glCtx.entityIds) return; - TessellatorEntityIds.onIdsChanged(glCtx.entityIds, ids); - glCtx.entityIds = ids; - glCtx.dirtyEntityIdsAttrib = true; - } - - public static void flushEntityIds(GLContextState glCtx) { - if (!glCtx.dirtyEntityIdsAttrib || glCtx.activeProgram == 0) return; - final ImmediateExtendedAttribHandler handler = GLSMHooks.immediateExtendedHandler; - if (handler == null || !handler.wantsEntityIds()) return; - final long ids = glCtx.entityIds; - RENDER_BACKEND.vertexAttrib4f(ImmediateExtendedAttribHandler.LOC_ENTITY_IDS, - InstancedAttribs.normalizedId(ids, 0), InstancedAttribs.normalizedId(ids, 16), InstancedAttribs.normalizedId(ids, 32), 0.0f); - glCtx.dirtyEntityIdsAttrib = false; - } - - - public static int getMaxBoundTextureUnit() { - return ctx().maxBoundTextureUnit; - } - - public static void trackMaxBoundTextureUnit(int unit) { - final GLContextState glCtx = ctx(); - if (unit > glCtx.maxBoundTextureUnit) glCtx.maxBoundTextureUnit = unit; - } - // Deferred texture deletion: names kept valid until glGenTextures recycles them. - // Emulates Mesa/compat-profile behavior where delete-then-bind doesn't error. - private static final Int2LongOpenHashMap deferredDeleteTextures = new Int2LongOpenHashMap(); - private static final long DEFERRED_ABSENT = Long.MIN_VALUE; - private static final long DEFERRED_ATTACHED = -1; - private static final long DEFERRED_RELEASED = -2; - private static final int RELEASE_DELAY_FRAMES = 3; - private static long frameIndex; - private static long nextReleaseFrame = Long.MAX_VALUE; - private static final Int2IntOpenHashMap non2DTextureTargets = new Int2IntOpenHashMap(); - private static final Int2IntOpenHashMap textureFramebufferRefs = new Int2IntOpenHashMap(); - private static final FloatBuffer TRANSPARENT_BLACK = BufferUtils.createFloatBuffer(4); - private static final Tracy.ZoneId Z_TEX_DELETE = Tracy.zoneId("texDelete", Tracy.COLOR_FFP); - private static final Tracy.ZoneId Z_TEX_RELEASE_STORAGE = Tracy.zoneId("texReleaseStorage", Tracy.COLOR_FFP); - private static final Tracy.ZoneId Z_TEX_RESCUE_RESET = Tracy.zoneId("texRescueReset", Tracy.COLOR_FFP); - private static final Tracy.ZoneId Z_TEX_FLUSH_DELETES = Tracy.zoneId("texFlushDeletes", Tracy.COLOR_FFP); - static { - deferredDeleteTextures.defaultReturnValue(DEFERRED_ABSENT); - non2DTextureTargets.defaultReturnValue(GL11.GL_TEXTURE_2D); - } - private static final IntOpenHashSet writeMappedBuffers = new IntOpenHashSet(); - @Getter private static Vendor VENDOR; @Getter private static boolean windows; - // This setting varies depending on driver, so it gets queried at runtime - public static int DEFAULT_DRAW_BUFFER = GL11.GL_BACK; - private static float maxPointSize; - private static volatile Thread CurrentThread = MainThread; @Setter @Getter private static boolean runningSplash = true; - private static volatile boolean splashComplete = false; + static volatile boolean splashComplete = false; private static volatile Thread splashDisplayReleaser; @Getter @Setter private static volatile Thread drawableGLHolder = MainThread; // Reference to DrawableGL (main display context) - works with both FML and BLS splash @@ -576,121 +329,11 @@ public class GLStateManager { return splashComplete; } - /** - * Get the active texture unit for server-side state operations. If caching is enabled, returns cached value. If caching is disabled (SharedDrawable), - * queries actual GL state. - */ - public static int getActiveTextureUnitForServerState() { - if (isCachingEnabled()) { - return getActiveTextureUnit(); - } - // Query actual GL state for SharedDrawable context - return RENDER_BACKEND.getInteger(GL13.GL_ACTIVE_TEXTURE) - GL13.GL_TEXTURE0; - } - - /** - * Get the texture bound to the current texture unit for server-side state operations. - * If caching is enabled, returns cached value. - * If caching is disabled (SharedDrawable), queries actual GL state. - */ - public static int getBoundTextureForServerState() { - if (isCachingEnabled()) { - return getBoundTexture(); - } - // Query actual GL state for SharedDrawable context - return RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_2D); - } - - private static TextureInfo getBoundTextureInfo() { - final GLContextState glCtx = ctx(); - if (isCachingEnabled()) { - return glCtx.textures.getTextureUnitBindings(glCtx.activeTextureUnit.getValue()).getOrResolveInfo(); - } - return TextureInfoCache.INSTANCE.getInfo(getBoundTextureForServerState()); - } - - /** - * Get the texture bound to a specific texture unit for server-side state operations. - * If caching is enabled, returns cached value. - * If caching is disabled (SharedDrawable), returns -1 to force operations to proceed - */ - public static int getBoundTextureForServerState(int unit) { - if (isCachingEnabled()) { - return getBoundTexture(unit); - } - return -1; - } - - private static final String TEXTURE = "texture"; - private static final String TEXTURE_RENAMED = "gtexture"; - - /** Register a state stack id as modified at the current depth (called from beforeModify). */ - public static void registerModifiedState(GLContextState c, int id) { - if (c.attribDepth > 0) { - final int depth = c.attribDepth - 1; - c.modifiedIds[depth][c.modifiedCount[depth]++] = id; - if (!c.poppingAttributes) { - attribSlotsSaved++; - } - } - } - - private static > T mod(T s) { + static > T mod(T s) { s.beforeModify(); return s; } - // Additional enable bit states tracked by GL_ENABLE_BIT - - - // Line width range queried at init from GL_ALIASED_LINE_WIDTH_RANGE - static float lineWidthMin = 1.0f; - static float lineWidthMax = 1.0f; - // The driver cannot draw wide lines (Mesa forward-compat, SDL_GPU), so FFP widens them from LineQuads in the vertex shader - public static boolean wideLineEmulationEnabled = false; - public static boolean framebufferCompletenessIsMeaningful() { return RENDER_BACKEND.framebufferCompletenessIsMeaningful(); } - public static void setFfpInstancing(Instancing mode) { - ctx().ffpInstancing = mode; - } - - public static int setTextureSupersamplingSamples(int samples) { - if (samples < 1 || samples > 16 || (samples & (samples - 1)) != 0) { - throw new IllegalArgumentException("Texture supersampling requires 1, 2, 4, 8, or 16 samples"); - } - final GLContextState glCtx = ctx(); - final int previous = glCtx.textureSupersamplingSamples; - if (previous != samples) { - beforeUncapturedStateChange(); - glCtx.textureSupersamplingSamples = samples; - } - return previous; - } - - public static void markTextureAsAtlas(int texture, int gutter) { - if (texture <= 0) return; - final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(texture); - if (info.getAtlasGutter() != gutter) { - beforeUncapturedStateChange(); - info.setAtlasGutter(gutter); - } - } - - private static final MethodHandle MAT4_STACK_CURR_DEPTH; - - static { - try { - final Field curr = Matrix4fStack.class.getDeclaredField("curr"); - curr.setAccessible(true); - MAT4_STACK_CURR_DEPTH = MethodHandles.lookup().unreflectGetter(curr); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - public static int getBoundEBO() { - return ctx().vaos.boundEBO; - } - public static void reset() { final GLContextState glCtx = ctx(); glCtx.exitCapture.cancel(); @@ -741,20 +384,10 @@ public class GLStateManager { if (RENDER_BACKEND != null) { RENDER_BACKEND.invalidateStateMirror(); - replayStateToBackend(); + GLSMAttribStack.replayStateToBackend(); } } - /** - * Check if a display list exists (has been compiled and stored). Delegates to DisplayListManager. - * - * @param list The display list ID to check - * @return true if the display list exists, false otherwise - */ - public static boolean displayListExists(int list) { - return DisplayListManager.displayListExists(list); - } - public static class GLFeatureSet extends IntOpenHashSet { private static final long serialVersionUID = 8558779940775721010L; @@ -826,7 +459,7 @@ public class GLStateManager { final GLContextState glCtx = ctx(); RenderSystem.initRenderer(); - DEFAULT_DRAW_BUFFER = RENDER_BACKEND.getInteger(GL11.GL_DRAW_BUFFER); + GLSMFramebuffer.queryDefaultDrawBuffer(); // The initial mask value should be defined as all 1's. However, some drivers have it set to 0's. // To ensure consistency & correctness across all drivers, we're setting them to 0xFF. @@ -844,39 +477,7 @@ public class GLStateManager { // Initialize stencil masks from computed bit mask applyStencilBitMask(glCtx, stencilBitMask); - final FloatBuffer lwRange = BufferUtils.createFloatBuffer(16); - RENDER_BACKEND.getFloat(GL12.GL_ALIASED_LINE_WIDTH_RANGE, lwRange); - lineWidthMin = lwRange.get(0); - lineWidthMax = lwRange.get(1); - final float queriedMax = lineWidthMax; - // Probe whether the driver actually accepts the queried max (Mesa forward-compat rejects > 1.0) - if (lineWidthMax > 1.0f) { - while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {} - RENDER_BACKEND.lineWidth(lineWidthMax); - if (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) { - // Binary search for the actual accepted max between 1.0 and queriedMax - float lo = 1.0f, hi = queriedMax; - while (hi - lo > 0.01f) { - final float mid = (lo + hi) * 0.5f; - while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {} - RENDER_BACKEND.lineWidth(mid); - if (RENDER_BACKEND.getError() == GL11.GL_NO_ERROR) { - lo = mid; - } else { - hi = mid; - } - } - lineWidthMax = lo; - } - RENDER_BACKEND.lineWidth(1.0f); - while (RENDER_BACKEND.getError() != GL11.GL_NO_ERROR) {} - } - wideLineEmulationEnabled = lineWidthMax <= 1.0f; - if (wideLineEmulationEnabled) { - LOGGER.info("GL line width: aliased range [{}, {}], probe at {} rejected, native [{}, {}], line quads widen ({}, {}]", lineWidthMin, queriedMax, queriedMax, lineWidthMin, lineWidthMax, lineWidthMax, queriedMax); - } else { - LOGGER.info("GL line width: aliased range [{}, {}], probe at {} accepted, native [{}, {}]", lineWidthMin, queriedMax, queriedMax, lineWidthMin, lineWidthMax); - } + GLSMRasterizer.probeLineWidthRange(); // Sync default vertex attribs with GLSM cache initial values. RENDER_BACKEND.vertexAttrib4f(1, 1.0f, 1.0f, 1.0f, 1.0f); // COLOR = white @@ -906,12 +507,7 @@ public class GLStateManager { initCallback.run(); } - final FloatBuffer range = glCtx.queryScratch; - range.clear(); - RENDER_BACKEND.getFloat(GL11.GL_POINT_SIZE_RANGE, range); - final float smooth = range.get(1); - RENDER_BACKEND.getFloat(GL12.GL_ALIASED_POINT_SIZE_RANGE, range); - maxPointSize = Math.max(smooth, range.get(1)); + GLSMRasterizer.probePointSizeRange(glCtx); // Drain any pending GL errors from initialization. In core profile, some legacy queries may generate GL_INVALID_ENUM. The splash thread inherits the // DrawableGL context and its error state, so stale errors here would cause SplashProgress.checkGLError() to fail. @@ -921,960 +517,6 @@ public class GLStateManager { } } - // LWJGL Overrides - public static void glEnable(int cap) { - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(cap); - if (mode == RecordMode.COMPILE) { - return; - } - } - // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES) - if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) { - glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].enable(); - glCtx.clipPlaneGeneration++; - return; - } - - switch (cap) { - case GL11.GL_ALPHA_TEST -> enableAlphaTest(glCtx); - case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.enable(); - case GL11.GL_BLEND -> enableBlend(glCtx); - case GL11.GL_COLOR_MATERIAL -> enableColorMaterial(glCtx); - case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.enable(); - case GL14.GL_COLOR_SUM -> glCtx.colorSumState.enable(); - case GL11.GL_CULL_FACE -> enableCull(glCtx); - case GL11.GL_DEPTH_TEST -> enableDepthTest(glCtx); - case GL11.GL_DITHER -> glCtx.ditherState.enable(); - case GL11.GL_FOG -> enableFog(glCtx); - case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.enable(); - case GL11.GL_LIGHTING -> enableLighting(glCtx); - case GL11.GL_LIGHT0 -> enableLight(glCtx, 0); - case GL11.GL_LIGHT1 -> enableLight(glCtx, 1); - case GL11.GL_LIGHT2 -> enableLight(glCtx, 2); - case GL11.GL_LIGHT3 -> enableLight(glCtx, 3); - case GL11.GL_LIGHT4 -> enableLight(glCtx, 4); - case GL11.GL_LIGHT5 -> enableLight(glCtx, 5); - case GL11.GL_LIGHT6 -> enableLight(glCtx, 6); - case GL11.GL_LIGHT7 -> enableLight(glCtx, 7); - case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.enable(); - case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.enable(); - case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.enable(); - case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.enable(); - case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.enable(); - case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.enable(); - case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.enable(); - case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.enable(); - case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.enable(); - case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.enable(); - case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.enable(); - case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.enable(); - case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.enable(); - case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.enable(); - case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.enable(); - case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.enable(); - case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.enable(); - case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.enable(); - case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.enable(); - case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.enable(); - case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.enable(); - case GL11.GL_NORMALIZE -> glCtx.normalizeState.enable(); - case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.enable(); - case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.enable(); - case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.enable(); - case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.enable(); - case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.enable(); - case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.enable(); - case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.enable(); - case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.enable(); - case GL12.GL_RESCALE_NORMAL -> enableRescaleNormal(glCtx); - case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.enable(); - case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.enable(); - case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.enable(); - case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.enable(); - case GL11.GL_SCISSOR_TEST -> enableScissorTest(glCtx); - case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.enable(); - case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).enable(); - case GL11.GL_TEXTURE_2D -> enableTexture(glCtx); - case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).enable(); - case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).enable(); - case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).enable(); - case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).enable(); - case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).enable(); - case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).enable(); - default -> { - glCtx.exitCapture.reject(); - if (!setClientArrayCap(glCtx, cap, true)) RENDER_BACKEND.enable(cap); - } - } - } - - public static void glDisable(int cap) { - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(cap); - if (mode == RecordMode.COMPILE) { - return; - } - } - // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES) - if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) { - glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].disable(); - glCtx.clipPlaneGeneration++; - return; - } - - switch (cap) { - case GL11.GL_ALPHA_TEST -> disableAlphaTest(glCtx); - case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.disable(); - case GL11.GL_BLEND -> disableBlend(glCtx); - case GL11.GL_COLOR_MATERIAL -> disableColorMaterial(glCtx); - case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.disable(); - case GL14.GL_COLOR_SUM -> glCtx.colorSumState.disable(); - case GL11.GL_CULL_FACE -> disableCull(glCtx); - case GL11.GL_DEPTH_TEST -> disableDepthTest(glCtx); - case GL11.GL_DITHER -> glCtx.ditherState.disable(); - case GL11.GL_FOG -> disableFog(glCtx); - case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.disable(); - case GL11.GL_LIGHTING -> disableLighting(glCtx); - case GL11.GL_LIGHT0 -> disableLight(glCtx, 0); - case GL11.GL_LIGHT1 -> disableLight(glCtx, 1); - case GL11.GL_LIGHT2 -> disableLight(glCtx, 2); - case GL11.GL_LIGHT3 -> disableLight(glCtx, 3); - case GL11.GL_LIGHT4 -> disableLight(glCtx, 4); - case GL11.GL_LIGHT5 -> disableLight(glCtx, 5); - case GL11.GL_LIGHT6 -> disableLight(glCtx, 6); - case GL11.GL_LIGHT7 -> disableLight(glCtx, 7); - case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.disable(); - case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.disable(); - case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.disable(); - case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.disable(); - case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.disable(); - case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.disable(); - case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.disable(); - case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.disable(); - case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.disable(); - case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.disable(); - case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.disable(); - case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.disable(); - case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.disable(); - case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.disable(); - case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.disable(); - case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.disable(); - case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.disable(); - case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.disable(); - case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.disable(); - case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.disable(); - case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.disable(); - case GL11.GL_NORMALIZE -> glCtx.normalizeState.disable(); - case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.disable(); - case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.disable(); - case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.disable(); - case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.disable(); - case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.disable(); - case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.disable(); - case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.disable(); - case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.disable(); - case GL12.GL_RESCALE_NORMAL -> disableRescaleNormal(glCtx); - case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.disable(); - case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.disable(); - case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.disable(); - case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.disable(); - case GL11.GL_SCISSOR_TEST -> disableScissorTest(glCtx); - case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.disable(); - case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).disable(); - case GL11.GL_TEXTURE_2D -> disableTexture(glCtx); - case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).disable(); - case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).disable(); - case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).disable(); - case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).disable(); - case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).disable(); - case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).disable(); - default -> { - glCtx.exitCapture.reject(); - if (!setClientArrayCap(glCtx, cap, false)) RENDER_BACKEND.disable(cap); - } - } - } - - public static boolean glIsEnabled(int cap) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (!isCachingEnabled()) { - return RENDER_BACKEND.getBoolean(cap); - } - // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES) - if (cap >= GL11.GL_CLIP_PLANE0 && cap < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) { - return glCtx.clipPlaneStates[cap - GL11.GL_CLIP_PLANE0].isEnabled(); - } - - return switch (cap) { - case GL11.GL_ALPHA_TEST -> glCtx.alphaTest.isEnabled(); - case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.isEnabled(); - case GL11.GL_BLEND -> glCtx.blendMode.isEnabled(); - case GL11.GL_COLOR_MATERIAL -> glCtx.colorMaterial.isEnabled(); - case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.isEnabled(); - case GL14.GL_COLOR_SUM -> glCtx.colorSumState.isEnabled(); - case GL11.GL_CULL_FACE -> glCtx.cullState.isEnabled(); - case GL11.GL_DEPTH_TEST -> glCtx.depthTest.isEnabled(); - case GL11.GL_DITHER -> glCtx.ditherState.isEnabled(); - case GL11.GL_FOG -> glCtx.fogMode.isEnabled(); - case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.isEnabled(); - case GL11.GL_LIGHTING -> glCtx.lightingState.isEnabled(); - case GL11.GL_LIGHT0 -> glCtx.lightStates[0].isEnabled(); - case GL11.GL_LIGHT1 -> glCtx.lightStates[1].isEnabled(); - case GL11.GL_LIGHT2 -> glCtx.lightStates[2].isEnabled(); - case GL11.GL_LIGHT3 -> glCtx.lightStates[3].isEnabled(); - case GL11.GL_LIGHT4 -> glCtx.lightStates[4].isEnabled(); - case GL11.GL_LIGHT5 -> glCtx.lightStates[5].isEnabled(); - case GL11.GL_LIGHT6 -> glCtx.lightStates[6].isEnabled(); - case GL11.GL_LIGHT7 -> glCtx.lightStates[7].isEnabled(); - case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.isEnabled(); - case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.isEnabled(); - case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.isEnabled(); - case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.isEnabled(); - case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.isEnabled(); - case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.isEnabled(); - case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.isEnabled(); - case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.isEnabled(); - case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.isEnabled(); - case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.isEnabled(); - case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.isEnabled(); - case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.isEnabled(); - case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.isEnabled(); - case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.isEnabled(); - case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.isEnabled(); - case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.isEnabled(); - case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.isEnabled(); - case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.isEnabled(); - case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.isEnabled(); - case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.isEnabled(); - case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.isEnabled(); - case GL11.GL_NORMALIZE -> glCtx.normalizeState.isEnabled(); - case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.isEnabled(); - case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.isEnabled(); - case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.isEnabled(); - case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.isEnabled(); - case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.isEnabled(); - case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.isEnabled(); - case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.isEnabled(); - case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.isEnabled(); - case GL12.GL_RESCALE_NORMAL -> glCtx.rescaleNormalState.isEnabled(); - case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.isEnabled(); - case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.isEnabled(); - case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.isEnabled(); - case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.isEnabled(); - case GL11.GL_SCISSOR_TEST -> glCtx.scissorTest.isEnabled(); - case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.isEnabled(); - case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_TEXTURE_2D -> glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - default -> { - final int conv = clientStateToConventional(glCtx, cap); - yield conv >= 0 ? glCtx.vaos.isConventionalEnabled(conv) : LegacyQueries.desc(cap) == 0 && RENDER_BACKEND.getBoolean(cap); - } - }; - } - - public static boolean glGetBoolean(int pname) { - rejectExitCapture(); - return glGetBoolean(ctx(), pname); - } - - static boolean glGetBoolean(GLContextState glCtx, int pname) { - if (!isCachingEnabled()) { - return RENDER_BACKEND.getBoolean(pname); - } - // Handle clip planes dynamically (supports up to MAX_CLIP_PLANES) - if (pname >= GL11.GL_CLIP_PLANE0 && pname < GL11.GL_CLIP_PLANE0 + MAX_CLIP_PLANES) { - return glCtx.clipPlaneStates[pname - GL11.GL_CLIP_PLANE0].isEnabled(); - } - - return switch (pname) { - case GL11.GL_ALPHA_TEST -> glCtx.alphaTest.isEnabled(); - case GL11.GL_AUTO_NORMAL -> glCtx.autoNormalState.isEnabled(); - case GL11.GL_BLEND -> glCtx.blendMode.isEnabled(); - case GL11.GL_COLOR_MATERIAL -> glCtx.colorMaterial.isEnabled(); - case GL11.GL_COLOR_LOGIC_OP -> glCtx.colorLogicOpState.isEnabled(); - case GL14.GL_COLOR_SUM -> glCtx.colorSumState.isEnabled(); - case GL11.GL_CULL_FACE -> glCtx.cullState.isEnabled(); - case GL11.GL_DEPTH_TEST -> glCtx.depthTest.isEnabled(); - case GL11.GL_DEPTH_WRITEMASK -> glCtx.depthState.isEnabled(); - case GL11.GL_DITHER -> glCtx.ditherState.isEnabled(); - case GL11.GL_FOG -> glCtx.fogMode.isEnabled(); - case GL11.GL_INDEX_LOGIC_OP -> glCtx.indexLogicOpState.isEnabled(); - case GL11.GL_LIGHTING -> glCtx.lightingState.isEnabled(); - case GL11.GL_LIGHT0 -> glCtx.lightStates[0].isEnabled(); - case GL11.GL_LIGHT1 -> glCtx.lightStates[1].isEnabled(); - case GL11.GL_LIGHT2 -> glCtx.lightStates[2].isEnabled(); - case GL11.GL_LIGHT3 -> glCtx.lightStates[3].isEnabled(); - case GL11.GL_LIGHT4 -> glCtx.lightStates[4].isEnabled(); - case GL11.GL_LIGHT5 -> glCtx.lightStates[5].isEnabled(); - case GL11.GL_LIGHT6 -> glCtx.lightStates[6].isEnabled(); - case GL11.GL_LIGHT7 -> glCtx.lightStates[7].isEnabled(); - case GL11.GL_LINE_SMOOTH -> glCtx.lineSmoothState.isEnabled(); - case GL11.GL_LINE_STIPPLE -> glCtx.lineStippleState.isEnabled(); - case GL11.GL_MAP1_COLOR_4 -> glCtx.map1Color4State.isEnabled(); - case GL11.GL_MAP1_INDEX -> glCtx.map1IndexState.isEnabled(); - case GL11.GL_MAP1_NORMAL -> glCtx.map1NormalState.isEnabled(); - case GL11.GL_MAP1_TEXTURE_COORD_1 -> glCtx.map1TextureCoord1State.isEnabled(); - case GL11.GL_MAP1_TEXTURE_COORD_2 -> glCtx.map1TextureCoord2State.isEnabled(); - case GL11.GL_MAP1_TEXTURE_COORD_3 -> glCtx.map1TextureCoord3State.isEnabled(); - case GL11.GL_MAP1_TEXTURE_COORD_4 -> glCtx.map1TextureCoord4State.isEnabled(); - case GL11.GL_MAP1_VERTEX_3 -> glCtx.map1Vertex3State.isEnabled(); - case GL11.GL_MAP1_VERTEX_4 -> glCtx.map1Vertex4State.isEnabled(); - case GL11.GL_MAP2_COLOR_4 -> glCtx.map2Color4State.isEnabled(); - case GL11.GL_MAP2_INDEX -> glCtx.map2IndexState.isEnabled(); - case GL11.GL_MAP2_NORMAL -> glCtx.map2NormalState.isEnabled(); - case GL11.GL_MAP2_TEXTURE_COORD_1 -> glCtx.map2TextureCoord1State.isEnabled(); - case GL11.GL_MAP2_TEXTURE_COORD_2 -> glCtx.map2TextureCoord2State.isEnabled(); - case GL11.GL_MAP2_TEXTURE_COORD_3 -> glCtx.map2TextureCoord3State.isEnabled(); - case GL11.GL_MAP2_TEXTURE_COORD_4 -> glCtx.map2TextureCoord4State.isEnabled(); - case GL11.GL_MAP2_VERTEX_3 -> glCtx.map2Vertex3State.isEnabled(); - case GL11.GL_MAP2_VERTEX_4 -> glCtx.map2Vertex4State.isEnabled(); - case GL13.GL_MULTISAMPLE -> glCtx.multisampleState.isEnabled(); - case GL11.GL_NORMALIZE -> glCtx.normalizeState.isEnabled(); - case GL11.GL_POINT_SMOOTH -> glCtx.pointSmoothState.isEnabled(); - case GL20.GL_POINT_SPRITE -> glCtx.pointSpriteState.isEnabled(); - case GL20.GL_VERTEX_PROGRAM_TWO_SIDE -> glCtx.vertexProgramTwoSideState.isEnabled(); - case GL11.GL_POLYGON_OFFSET_POINT -> glCtx.polygonOffsetPointState.isEnabled(); - case GL11.GL_POLYGON_OFFSET_LINE -> glCtx.polygonOffsetLineState.isEnabled(); - case GL11.GL_POLYGON_OFFSET_FILL -> glCtx.polygonOffsetFillState.isEnabled(); - case GL11.GL_POLYGON_SMOOTH -> glCtx.polygonSmoothState.isEnabled(); - case GL11.GL_POLYGON_STIPPLE -> glCtx.polygonStippleState.isEnabled(); - case GL12.GL_RESCALE_NORMAL -> glCtx.rescaleNormalState.isEnabled(); - case GL13.GL_SAMPLE_ALPHA_TO_COVERAGE -> glCtx.sampleAlphaToCoverageState.isEnabled(); - case GL13.GL_SAMPLE_ALPHA_TO_ONE -> glCtx.sampleAlphaToOneState.isEnabled(); - case GL13.GL_SAMPLE_COVERAGE -> glCtx.sampleCoverageState.isEnabled(); - case GL30.GL_RASTERIZER_DISCARD -> glCtx.rasterizerDiscard.isEnabled(); - case GL11.GL_SCISSOR_TEST -> glCtx.scissorTest.isEnabled(); - case GL11.GL_STENCIL_TEST -> glCtx.stencilTest.isEnabled(); - case GL11.GL_TEXTURE_1D -> glCtx.textures.getTexture1DStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_TEXTURE_2D -> glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL12.GL_TEXTURE_3D -> glCtx.textures.getTexture3DStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL13.GL_TEXTURE_CUBE_MAP -> glCtx.textures.getTextureCubeMapStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_TEXTURE_GEN_S -> glCtx.textures.getTexGenSStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_TEXTURE_GEN_T -> glCtx.textures.getTexGenTStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_TEXTURE_GEN_R -> glCtx.textures.getTexGenRStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_TEXTURE_GEN_Q -> glCtx.textures.getTexGenQStates(glCtx.activeTextureUnit.getValue()).isEnabled(); - case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.localViewer != 0.0f; - case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.twoSide != 0.0f; - case GL11.GL_EDGE_FLAG -> glCtx.edgeFlagState.isEnabled(); - default -> { - final int conv = clientStateToConventional(glCtx, pname); - if (conv >= 0) yield glCtx.vaos.isConventionalEnabled(conv); - final int desc = LegacyQueries.desc(pname); - yield desc != 0 ? LegacyQueries.getBoolean(glCtx, pname, desc) : RENDER_BACKEND.getBoolean(pname); - } - }; - } - - public static void glGetBoolean(int pname, ByteBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (!isCachingEnabled()) { - RENDER_BACKEND.getBoolean(pname, params); - return; - } - - switch (pname) { - case GL11.GL_COLOR_WRITEMASK -> { - final int pos = params.position(); - params.put(pos, (byte) (glCtx.colorMask.red ? GL11.GL_TRUE : GL11.GL_FALSE)); - params.put(pos + 1, (byte) (glCtx.colorMask.green ? GL11.GL_TRUE : GL11.GL_FALSE)); - params.put(pos + 2, (byte) (glCtx.colorMask.blue ? GL11.GL_TRUE : GL11.GL_FALSE)); - params.put(pos + 3, (byte) (glCtx.colorMask.alpha ? GL11.GL_TRUE : GL11.GL_FALSE)); - } - default -> { - if (!HAS_MULTIPLE_SET.contains(pname)) { - params.put(params.position(), (byte) (glGetBoolean(glCtx, pname) ? GL11.GL_TRUE : GL11.GL_FALSE)); - } else if (!LegacyQueries.getBooleanv(glCtx, pname, params)) { - RENDER_BACKEND.getBoolean(pname, params); - } - } - } - } - - @SneakyThrows - public static int getMatrixStackDepth(Matrix4fStack stack) { - // JOML's curr is 0-based (0 = no pushes), but OpenGL starts at 1 (base matrix counts) - return (int) MAT4_STACK_CURR_DEPTH.invokeExact(stack) + 1; - } - - public static int glGetInteger(int pname) { - rejectExitCapture(); - return glGetInteger(ctx(), pname); - } - - static int glGetInteger(GLContextState glCtx, int pname) { - if (!isCachingEnabled()) { - return RENDER_BACKEND.getInteger(pname); - } - - return switch (pname) { - case GL11.GL_ALPHA_TEST_FUNC -> glCtx.alphaState.getFunction(); - case GL11.GL_DEPTH_FUNC -> glCtx.depthState.getFunc(); - case GL11.GL_LIST_BASE -> glCtx.listBase; - case GL11.GL_LIST_MODE -> DisplayListManager.getListMode(); - case GL11.GL_MATRIX_MODE -> glCtx.matrixMode.getMode(); - case GL11.GL_SHADE_MODEL -> glCtx.shadeModelState.getValue(); - // GL_TEXTURE_2D makes no sense here, but some mod still queries it... - case GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_BINDING_2D -> getBoundTextureForServerState(); - case GL13.GL_ACTIVE_TEXTURE -> GL13.GL_TEXTURE0 + getActiveTextureUnitForServerState(); - case GL13.GL_CLIENT_ACTIVE_TEXTURE -> GL13.GL_TEXTURE0 + glCtx.clientActiveTextureUnit; - case GL11.GL_COLOR_MATERIAL_FACE -> glCtx.colorMaterialFace.getValue(); - case GL11.GL_COLOR_MATERIAL_PARAMETER -> glCtx.colorMaterialParameter.getValue(); - case GL11.GL_MODELVIEW_STACK_DEPTH -> getMatrixStackDepth(glCtx.modelViewMatrix); - case GL11.GL_PROJECTION_STACK_DEPTH -> getMatrixStackDepth(glCtx.projectionMatrix); - case GL11.GL_DEPTH_WRITEMASK -> glCtx.depthState.isEnabled() ? GL11.GL_TRUE : GL11.GL_FALSE; - case GL11.GL_CULL_FACE_MODE -> glCtx.polygonState.getCullFaceMode(); - case GL11.GL_FRONT_FACE -> glCtx.polygonState.getFrontFace(); - case GL11.GL_POLYGON_MODE -> glCtx.polygonState.getFrontMode(); - case GL11.GL_UNPACK_ALIGNMENT -> glCtx.pixelUnpackState.alignment(); - case GL11.GL_UNPACK_ROW_LENGTH -> glCtx.pixelUnpackState.rowLength(); - case GL11.GL_UNPACK_SKIP_ROWS -> glCtx.pixelUnpackState.skipRows(); - case GL11.GL_UNPACK_SKIP_PIXELS -> glCtx.pixelUnpackState.skipPixels(); - - case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.colorControl; - - case GL14.GL_BLEND_DST_ALPHA -> glCtx.blendState.getDstAlpha(); - case GL11.GL_BLEND_DST, GL14.GL_BLEND_DST_RGB -> glCtx.blendState.getDstRgb(); - case GL14.GL_BLEND_SRC_ALPHA -> glCtx.blendState.getSrcAlpha(); - case GL11.GL_BLEND_SRC, GL14.GL_BLEND_SRC_RGB -> glCtx.blendState.getSrcRgb(); - case GL14.GL_BLEND_EQUATION -> glCtx.blendState.getEquationRgb(); - case GL20.GL_BLEND_EQUATION_ALPHA -> glCtx.blendState.getEquationAlpha(); - - case GL11.GL_LOGIC_OP_MODE -> glCtx.logicOpMode.getValue(); - case GL11.GL_DRAW_BUFFER -> glCtx.drawBuffer.getValue(); - - case GL11.GL_STENCIL_FUNC -> glCtx.stencilState.getFuncFront(); - case GL11.GL_STENCIL_REF -> glCtx.stencilState.getRefFront(); - case GL11.GL_STENCIL_VALUE_MASK -> glCtx.stencilState.getValueMaskFront(); - case GL11.GL_STENCIL_FAIL -> glCtx.stencilState.getFailOpFront(); - case GL11.GL_STENCIL_PASS_DEPTH_FAIL -> glCtx.stencilState.getZFailOpFront(); - case GL11.GL_STENCIL_PASS_DEPTH_PASS -> glCtx.stencilState.getZPassOpFront(); - case GL11.GL_STENCIL_WRITEMASK -> glCtx.stencilState.getWriteMaskFront(); - case GL11.GL_STENCIL_CLEAR_VALUE -> glCtx.stencilState.getClearValue(); - - case GL15.GL_ARRAY_BUFFER_BINDING -> glCtx.boundVBO; - case GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING -> glCtx.vaos.boundEBO; - case GL21.GL_PIXEL_UNPACK_BUFFER_BINDING -> glCtx.boundPixelUnpackBuffer; - case GL21.GL_PIXEL_PACK_BUFFER_BINDING -> glCtx.boundPixelPackBuffer; - - case GL20.GL_CURRENT_PROGRAM -> glCtx.activeProgram; - - case GL30.GL_VERTEX_ARRAY_BINDING -> glCtx.boundVAO; - - case GL30.GL_DRAW_FRAMEBUFFER_BINDING -> glCtx.drawFramebuffer; - case GL30.GL_READ_FRAMEBUFFER_BINDING -> glCtx.readFramebuffer; - - case GL33.GL_SAMPLER_BINDING -> glCtx.samplerUnits.get(glCtx.activeTextureUnit.getValue()); - - default -> switch (pname) { - case GL11.GL_FOG_MODE -> glCtx.fogState.getFogMode(); - case GL11.GL_LINE_STIPPLE_PATTERN -> glCtx.lineState.getStipplePattern() & 0xFFFF; - case GL11.GL_LINE_STIPPLE_REPEAT -> glCtx.lineState.getStippleFactor(); - case GL11.GL_LIST_INDEX -> DisplayListManager.isRecording() ? Math.max(DisplayListManager.getRecordingListId(), 0) : 0; - case GL11.GL_ATTRIB_STACK_DEPTH -> glCtx.attribDepth; - case GL11.GL_CLIENT_ATTRIB_STACK_DEPTH -> glCtx.clientAttribStackPointer; - case GL11.GL_TEXTURE_STACK_DEPTH -> getMatrixStackDepth(glCtx.textures.getTextureUnitMatrix(glCtx.activeTextureUnit.getValue())); - case GL11.GL_MAX_ATTRIB_STACK_DEPTH -> MAX_ATTRIB_STACK_DEPTH; - case GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH -> CLIENT_ATTRIB_STACK_DEPTH; - case GL11.GL_MAX_MODELVIEW_STACK_DEPTH -> MAX_MODELVIEW_STACK_DEPTH; - case GL11.GL_MAX_PROJECTION_STACK_DEPTH -> MAX_PROJECTION_STACK_DEPTH; - case GL11.GL_MAX_TEXTURE_STACK_DEPTH -> MAX_TEXTURE_STACK_DEPTH; - case GL13.GL_MAX_TEXTURE_UNITS -> MAX_LEGACY_TEXTURE_UNITS; - case GL11.GL_MAX_LIGHTS -> glCtx.lightStates.length; - case GL11.GL_STENCIL_BITS -> drawFramebufferBits(glCtx, true); - case GL11.GL_DEPTH_BITS -> drawFramebufferBits(glCtx, false); - case GL20.GL_MAX_TEXTURE_COORDS -> MAX_TEXTURE_COORDS; - case GL20.GL_POINT_SPRITE_COORD_ORIGIN -> glCtx.pointState.getSpriteCoordOrigin(); - case GL11.GL_RENDER_MODE -> FeedbackManager.getRenderMode(); - default -> { - final int shift = hintShift(pname); - if (shift >= 0) yield hintMode(glCtx.hintState.getValue(), shift); - final int key = clientArrayField(glCtx, pname); - if (key >= 0 && (key & ~0xFF) != FIELD_POINTER) yield clientArrayParam(glCtx, key); - final int desc = LegacyQueries.desc(pname); - yield desc != 0 ? LegacyQueries.getInteger(glCtx, pname, desc) : RENDER_BACKEND.getInteger(pname); - } - }; - }; - } - - private static int drawFramebufferBits(GLContextState glCtx, boolean stencil) { - final int sizePname = stencil ? GL30.GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE : GL30.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE; - if (glCtx.drawFramebuffer == 0) { - return RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, stencil ? GL11.GL_STENCIL : GL11.GL_DEPTH, sizePname); - } - final int attachment = stencil ? GL30.GL_STENCIL_ATTACHMENT : GL30.GL_DEPTH_ATTACHMENT; - if (RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, attachment, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) == GL11.GL_NONE) { - return 0; - } - return RENDER_BACKEND.getFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, attachment, sizePname); - } - - public static void glGetInteger(int pname, IntBuffer params) { - rejectExitCapture(); - if (!isCachingEnabled()) { - RENDER_BACKEND.getInteger(pname, params); - return; - } - - switch (pname) { - case GL11.GL_VIEWPORT -> ctx().viewportState.get(params); - case GL11.GL_SCISSOR_BOX -> ctx().scissorState.get(params); - case GL11.GL_POLYGON_MODE -> { - final PolygonState polygon = ctx().polygonState; - final int pos = params.position(); - params.put(pos, polygon.getFrontMode()); - params.put(pos + 1, polygon.getBackMode()); - } - default -> { - final GLContextState glCtx = ctx(); - if (!HAS_MULTIPLE_SET.contains(pname)) { - params.put(params.position(), glGetInteger(glCtx, pname)); - } else if (!LegacyQueries.getIntegerv(glCtx, pname, params)) { - RENDER_BACKEND.getInteger(pname, params); - } - } - } - } - - public static void glGetMaterial(int face, int pname, FloatBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final MaterialStateStack state; - if (face == GL11.GL_FRONT) { - state = glCtx.frontMaterial; - } else if (face == GL11.GL_BACK) { - state = glCtx.backMaterial; - } else { - throw new RuntimeException("Invalid face parameter specified to glGetMaterial: " + face); - } - - switch (pname) { - case GL11.GL_AMBIENT -> state.ambient.get(params.position(), params); - case GL11.GL_DIFFUSE -> state.diffuse.get(params.position(), params); - case GL11.GL_SPECULAR -> state.specular.get(params.position(), params); - case GL11.GL_EMISSION -> state.emission.get(params.position(), params); - case GL11.GL_SHININESS -> params.put(params.position(), state.shininess); - case GL11.GL_COLOR_INDEXES -> state.colorIndexes.get(params.position(), params); - default -> { - } - } - } - - private static void putLightingInts(FloatBuffer values, int pname, boolean material, IntBuffer params) { - final int count = switch (pname) { - case GL11.GL_AMBIENT, GL11.GL_DIFFUSE, GL11.GL_SPECULAR -> 4; - case GL11.GL_EMISSION -> material ? 4 : 0; - case GL11.GL_COLOR_INDEXES -> material ? 3 : 0; - case GL11.GL_SHININESS -> material ? 1 : 0; - case GL11.GL_POSITION -> material ? 0 : 4; - case GL11.GL_SPOT_DIRECTION -> material ? 0 : 3; - case GL11.GL_SPOT_EXPONENT, GL11.GL_SPOT_CUTOFF, GL11.GL_CONSTANT_ATTENUATION, GL11.GL_LINEAR_ATTENUATION, - GL11.GL_QUADRATIC_ATTENUATION -> material ? 0 : 1; - default -> 0; - }; - final boolean color = count == 4 && pname != GL11.GL_POSITION; - final int pos = params.position(); - for (int i = 0; i < count; i++) { - final float value = values.get(i); - final int converted; - if (color) { - converted = LegacyQueries.floatToInt(value); - } else if (material) { - converted = LegacyQueries.lround(value); - } else { - converted = (int) value; - } - params.put(pos + i, converted); - } - } - - public static void glGetMaterial(int face, int pname, IntBuffer params) { - final FloatBuffer scratch = ctx().queryScratch; - scratch.clear(); - glGetMaterial(face, pname, scratch); - putLightingInts(scratch, pname, true, params); - } - - public static void glGetLight(int light, int pname, IntBuffer params) { - final FloatBuffer scratch = ctx().queryScratch; - scratch.clear(); - glGetLight(light, pname, scratch); - putLightingInts(scratch, pname, false, params); - } - - public static void glGetLight(int light, int pname, FloatBuffer params) { - rejectExitCapture(); - final LightStateStack state = ctx().lightDataStates[light - GL11.GL_LIGHT0]; - switch (pname) { - case GL11.GL_AMBIENT -> state.ambient.get(params.position(), params); - case GL11.GL_DIFFUSE -> state.diffuse.get(params.position(), params); - case GL11.GL_SPECULAR -> state.specular.get(params.position(), params); - case GL11.GL_POSITION -> state.position.get(params.position(), params); - case GL11.GL_SPOT_DIRECTION -> state.spotDirection.get(params.position(), params); - case GL11.GL_SPOT_EXPONENT -> params.put(params.position(), state.spotExponent); - case GL11.GL_SPOT_CUTOFF -> params.put(params.position(), state.spotCutoff); - case GL11.GL_CONSTANT_ATTENUATION -> params.put(params.position(), state.constantAttenuation); - case GL11.GL_LINEAR_ATTENUATION -> params.put(params.position(), state.linearAttenuation); - case GL11.GL_QUADRATIC_ATTENUATION -> params.put(params.position(), state.quadraticAttenuation); - default -> { - } - } - } - - public static void glGetFloat(int pname, FloatBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (!isCachingEnabled()) { - RENDER_BACKEND.getFloat(pname, params); - return; - } - - switch (pname) { - case GL11.GL_MODELVIEW_MATRIX -> glCtx.modelViewMatrix.get(params.position(), params); - case GL11.GL_PROJECTION_MATRIX -> glCtx.projectionMatrix.get(params.position(), params); - case GL11.GL_TEXTURE_MATRIX -> glCtx.textures.getTextureUnitMatrix(getActiveTextureUnit()).get(params.position(), params); - case GL11.GL_COLOR_CLEAR_VALUE -> glCtx.clearColor.get(params); - case GL11.GL_CURRENT_COLOR -> glCtx.color.get(params); - case GL14.GL_CURRENT_SECONDARY_COLOR -> glCtx.secondaryColor.get(params); - case GL11.GL_DEPTH_RANGE -> { - final int pos = params.position(); - params.put(pos, (float) glCtx.viewportState.depthRangeNear); - params.put(pos + 1, (float) glCtx.viewportState.depthRangeFar); - } - case GL14.GL_BLEND_COLOR -> { - final int pos = params.position(); - params.put(pos, glCtx.blendState.getBlendColorR()); - params.put(pos + 1, glCtx.blendState.getBlendColorG()); - params.put(pos + 2, glCtx.blendState.getBlendColorB()); - params.put(pos + 3, glCtx.blendState.getBlendColorA()); - } - case GL11.GL_CURRENT_NORMAL -> { - final Vector3f normal = glCtx.ffp.currentNormal; - final int pos = params.position(); - params.put(pos, normal.x); - params.put(pos + 1, normal.y); - params.put(pos + 2, normal.z); - } - case GL11.GL_CURRENT_TEXTURE_COORDS -> { - final int unit = glCtx.activeTextureUnit.getValue(); - final int pos = params.position(); - if (unit == 1) { - params.put(pos, glCtx.lastBrightnessX); - params.put(pos + 1, glCtx.lastBrightnessY); - params.put(pos + 2, 0.0f); - params.put(pos + 3, 1.0f); - } else if (unit >= 0 && unit < glCtx.ffp.currentTexCoords.length) { - final Vector4f tc = glCtx.ffp.currentTexCoords[unit]; - params.put(pos, tc.x); - params.put(pos + 1, tc.y); - params.put(pos + 2, tc.z); - params.put(pos + 3, tc.w); - } else { - params.put(pos, 0.0f); - params.put(pos + 1, 0.0f); - params.put(pos + 2, 0.0f); - params.put(pos + 3, 1.0f); - } - } - case GL11.GL_FOG_COLOR -> { - final FloatBuffer fogBuf = glCtx.fogState.getFogColorBuffer(); - final int pos = params.position(); - params.put(pos, fogBuf.get(0)); - params.put(pos + 1, fogBuf.get(1)); - params.put(pos + 2, fogBuf.get(2)); - params.put(pos + 3, fogBuf.get(3)); - } - case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.ambient.get(params.position(), params); - case GL14.GL_POINT_DISTANCE_ATTENUATION -> { - final int pos = params.position(); - params.put(pos, glCtx.pointState.getAttenuationConstant()); - params.put(pos + 1, glCtx.pointState.getAttenuationLinear()); - params.put(pos + 2, glCtx.pointState.getAttenuationQuadratic()); - } - default -> { - if (!HAS_MULTIPLE_SET.contains(pname)) { - params.put(params.position(), glGetFloat(glCtx, pname)); - } else { - RENDER_BACKEND.getFloat(pname, params); - } - } - } - } - - public static float glGetFloat(int pname) { - rejectExitCapture(); - return glGetFloat(ctx(), pname); - } - - static float glGetFloat(GLContextState glCtx, int pname) { - return switch (pname) { - case GL11.GL_ALPHA_TEST_REF -> glCtx.alphaState.getReference(); - case GL11.GL_FOG_DENSITY -> glCtx.fogState.getDensity(); - case GL11.GL_FOG_START -> glCtx.fogState.getStart(); - case GL11.GL_FOG_END -> glCtx.fogState.getEnd(); - case GL11.GL_DEPTH_CLEAR_VALUE -> (float) glCtx.depthState.getClearValue(); - case GL11.GL_LINE_WIDTH -> glCtx.lineState.getWidth(); - case GL11.GL_POINT_SIZE -> glCtx.pointState.getSize(); - case GL14.GL_POINT_SIZE_MIN -> glCtx.pointState.getMinSize(); - case GL14.GL_POINT_SIZE_MAX -> Float.isNaN(glCtx.pointState.getMaxSize()) ? maxPointSize : glCtx.pointState.getMaxSize(); - case GL14.GL_POINT_FADE_THRESHOLD_SIZE -> glCtx.pointState.getFadeThreshold(); - default -> { - final int desc = isCachingEnabled() ? LegacyQueries.desc(pname) : 0; - yield desc != 0 ? LegacyQueries.getFloat(glCtx, pname, desc) : RENDER_BACKEND.getFloat(pname); - } - }; - } - - public static void glGetFloat(int pname, float[] params) { - final FloatBuffer scratch = ctx().queryScratch; - final FloatBuffer buf; - if (params.length <= scratch.capacity()) { - buf = scratch; - buf.clear(); - buf.limit(params.length); - } else { - buf = BufferUtils.createFloatBuffer(params.length); - } - glGetFloat(pname, buf); - buf.position(0); - buf.get(params); - } - - public static double glGetDouble(int pname) { - rejectExitCapture(); - return switch (pname) { - case GL11.GL_DEPTH_CLEAR_VALUE -> ctx().depthState.getClearValue(); - default -> glGetFloat(pname); - }; - } - - public static void glGetDouble(int pname, DoubleBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (!isCachingEnabled()) { - RENDER_BACKEND.getDouble(pname, params); - return; - } - - final int pos = params.position(); - switch (pname) { - case GL11.GL_DEPTH_CLEAR_VALUE -> params.put(pos, glCtx.depthState.getClearValue()); - case GL11.GL_DEPTH_RANGE -> { - params.put(pos, glCtx.viewportState.depthRangeNear); - params.put(pos + 1, glCtx.viewportState.depthRangeFar); - } - case GL11.GL_MODELVIEW_MATRIX, GL11.GL_PROJECTION_MATRIX, GL11.GL_TEXTURE_MATRIX -> widenFromFloat(pname, params, 16); - case GL11.GL_COLOR_CLEAR_VALUE, GL11.GL_CURRENT_COLOR, GL11.GL_CURRENT_TEXTURE_COORDS, GL11.GL_FOG_COLOR, - GL11.GL_LIGHT_MODEL_AMBIENT, GL14.GL_BLEND_COLOR, GL14.GL_CURRENT_SECONDARY_COLOR -> widenFromFloat(pname, params, 4); - case GL11.GL_CURRENT_NORMAL, GL14.GL_POINT_DISTANCE_ATTENUATION -> widenFromFloat(pname, params, 3); - default -> { - if (!HAS_MULTIPLE_SET.contains(pname)) { - params.put(pos, glGetDouble(pname)); - } else { - RENDER_BACKEND.getDouble(pname, params); - } - } - } - } - - public static void glGetDouble(int pname, double[] params) { - final DoubleBuffer scratch = ctx().queryScratchDouble; - final DoubleBuffer buf; - if (params.length <= scratch.capacity()) { - buf = scratch; - buf.clear(); - buf.limit(params.length); - } else { - buf = BufferUtils.createDoubleBuffer(params.length); - } - glGetDouble(pname, buf); - buf.position(0); - buf.get(params); - } - - private static void widenFromFloat(int pname, DoubleBuffer params, int count) { - final FloatBuffer scratch = ctx().queryScratch; - scratch.clear(); - glGetFloat(pname, scratch); - final int pos = params.position(); - for (int i = 0; i < count; i++) { - params.put(pos + i, scratch.get(i)); - } - } - - public static void glGetClipPlane(int plane, DoubleBuffer equation) { - rejectExitCapture(); - final int index = plane - GL11.GL_CLIP_PLANE0; - if (index < 0 || index >= MAX_CLIP_PLANES) return; - ctx().clipPlaneState.getEyePlane(index, equation); - } - - // GLStateManager Functions - - public static void glBlendColor(float red, float green, float blue, float alpha) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordBlendColor(red, green, blue, alpha); - if (mode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - final boolean bypass = !caching; - if (bypass || red != glCtx.blendState.getBlendColorR() || green != glCtx.blendState.getBlendColorG() || blue != glCtx.blendState.getBlendColorB() || alpha != glCtx.blendState.getBlendColorA()) { - mod(glCtx.blendState); - beforeUncapturedStateChange(); - glCtx.blendState.setBlendColorR(red); - glCtx.blendState.setBlendColorG(green); - glCtx.blendState.setBlendColorB(blue); - glCtx.blendState.setBlendColorA(alpha); - RENDER_BACKEND.blendColor(red, green, blue, alpha); - } - } - - public static void glEnablei(int cap, int index) { - rejectExitCapture(); - RENDER_BACKEND.enablei(cap, index); - markIndexedCapUnknown(cap); - } - - public static void glDisablei(int cap, int index) { - rejectExitCapture(); - RENDER_BACKEND.disablei(cap, index); - markIndexedCapUnknown(cap); - } - - private static void markIndexedCapUnknown(int cap) { - if (cap == GL11.GL_BLEND) { - ctx().blendMode.setUnknownState(); - } else if (cap == GL11.GL_SCISSOR_TEST) { - ctx().scissorTest.setUnknownState(); - } - } - - public static void glBlendFuncSeparatei(int buf, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { - rejectExitCapture(); - RENDER_BACKEND.blendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); - ctx().blendState.setFuncUnknownState(); - } - - public static void enableBlend() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL11.GL_BLEND); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableBlend(ctx()); - } - - private static void enableBlend(GLContextState glCtx) { - final BooleanStateStack blend = glCtx.blendMode; - final boolean wasEnabled = blend.isEffectivelyEnabled(); - final DeferredBlendHandler bh = GLSMHooks.blendHandler; - if (bh != null && bh.isBlendLocked()) { - glCtx.exitCapture.capability(GL11.GL_BLEND, -1); - blend.beforeModify(); - bh.deferBlendModeToggle(true); - } else { - blend.enable(); - } - if (!wasEnabled && blend.isEffectivelyEnabled()) postVanillaBlendChange(); - } - - public static void disableBlend() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL11.GL_BLEND); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableBlend(ctx()); - } - - private static void disableBlend(GLContextState glCtx) { - final BooleanStateStack blend = glCtx.blendMode; - final boolean wasEnabled = blend.isEffectivelyEnabled(); - final DeferredBlendHandler bh = GLSMHooks.blendHandler; - if (bh != null && bh.isBlendLocked()) { - glCtx.exitCapture.capability(GL11.GL_BLEND, -1); - blend.beforeModify(); - bh.deferBlendModeToggle(false); - } else { - blend.disable(); - } - if (wasEnabled && !blend.isEffectivelyEnabled()) postVanillaBlendChange(); - } - - private static void postVanillaBlendChange() { - if (GLSMHooks.VANILLA_BLEND_CHANGE.hasListeners()) { - GLSMHooks.VANILLA_BLEND_CHANGE.post(GLSMHooks.vanillaBlendChangeEvent); - } - } - - private static boolean snapshotVanillaBlendFunc() { - if (!GLSMHooks.VANILLA_BLEND_CHANGE.hasListeners()) return false; - final GLContextState glCtx = ctx(); - glCtx.blendState.readEffective(glCtx.vanillaBlendBefore); - glCtx.vanillaBlendEnabledBefore = glCtx.blendMode.isEffectivelyEnabled(); - return true; - } - - private static void postVanillaBlendChangeIfMoved(boolean snapshotted) { - if (!snapshotted) return; - final GLContextState glCtx = ctx(); - final BlendState before = glCtx.vanillaBlendBefore; - final BlendState after = glCtx.blendState.readEffective(glCtx.vanillaBlendAfter); - if (glCtx.blendMode.isEffectivelyEnabled() != glCtx.vanillaBlendEnabledBefore - || after.getSrcRgb() != before.getSrcRgb() - || after.getDstRgb() != before.getDstRgb() - || after.getSrcAlpha() != before.getSrcAlpha() - || after.getDstAlpha() != before.getDstAlpha()) { - postVanillaBlendChange(); - } - } - - public static boolean isEffectiveBlendEnabled() { - return ctx().blendMode.isEffectivelyEnabled(); - } - - public static BlendState getEffectiveBlendState(BlendState out) { - return ctx().blendState.readEffective(out); - } - - public static boolean isEffectiveDepthMaskEnabled() { - return ctx().depthState.isEffectiveMaskEnabled(); - } - - public static ColorMask getEffectiveColorMask(ColorMask out) { - return ctx().colorMask.readEffective(out); - } - - public static boolean isEffectiveAlphaTestEnabled() { - return ctx().alphaTest.isEffectivelyEnabled(); - } - - public static AlphaState getEffectiveAlphaState(AlphaState out) { - return ctx().alphaState.readEffective(out); - } - public static void beginForeignDraw() { ctx().foreignDrawDepth++; } @@ -1893,2974 +535,6 @@ public class GLStateManager { return ctx().foreignDrawDepth > 0; } - public static void enableScissorTest() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL11.GL_SCISSOR_TEST); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableScissorTest(ctx()); - } - - private static void enableScissorTest(GLContextState glCtx) { - glCtx.scissorTest.enable(); - } - - public static void disableScissorTest() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL11.GL_SCISSOR_TEST); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableScissorTest(ctx()); - } - - private static void disableScissorTest(GLContextState glCtx) { - glCtx.scissorTest.disable(); - } - - public static void glBlendFunc(int srcFactor, int dstFactor) { - tryBlendFuncSeparate(srcFactor, dstFactor, srcFactor, dstFactor); - } - - private static void issueBlendFunc(BlendStateStack blend) { - if (GLSMConfig.hudCacheOverride) { - RENDER_BACKEND.blendFuncSeparate(blend.getSrcRgb(), blend.getDstRgb(), GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); - } else { - RENDER_BACKEND.blendFuncSeparate(blend.getSrcRgb(), blend.getDstRgb(), blend.getSrcAlpha(), blend.getDstAlpha()); - } - } - - public static void setHudCacheOverride(boolean enabled) { - if (GLSMConfig.hudCacheOverride == enabled) return; - GLSMConfig.hudCacheOverride = enabled; - final DeferredBlendHandler bh = GLSMHooks.blendHandler; - if (bh != null && bh.isOverrideHeld()) return; - final BlendStateStack blend = ctx().blendState; - issueBlendFunc(blend); - blend.clearFuncUnknownState(); - } - - public static void glBlendEquation(int mode) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glBlendEquation"); - } - final boolean caching = isCachingEnabled(); - final boolean bypass = !caching; - if (bypass || glCtx.blendState.getEquationRgb() != mode || glCtx.blendState.getEquationAlpha() != mode) { - mod(glCtx.blendState); - beforeUncapturedStateChange(); - glCtx.blendState.setEquationRgb(mode); - glCtx.blendState.setEquationAlpha(mode); - RENDER_BACKEND.blendEquation(mode); - } - } - - public static void glBlendEquationSeparate(int modeRGB, int modeAlpha) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glBlendEquationSeparate"); - } - final boolean caching = isCachingEnabled(); - final boolean bypass = !caching; - if (bypass || glCtx.blendState.getEquationRgb() != modeRGB || glCtx.blendState.getEquationAlpha() != modeAlpha) { - mod(glCtx.blendState); - beforeUncapturedStateChange(); - glCtx.blendState.setEquationRgb(modeRGB); - glCtx.blendState.setEquationAlpha(modeAlpha); - RENDER_BACKEND.blendEquationSeparate(modeRGB, modeAlpha); - } - } - - public static void tryBlendFuncSeparate(int srcRgb, int dstRgb, int srcAlpha, int dstAlpha) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.writeBlend(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha); - if (mode == RecordMode.COMPILE) { - return; - } - } - final boolean snapshotted = snapshotVanillaBlendFunc(); - final DeferredBlendHandler bh = GLSMHooks.blendHandler; - if (bh != null && bh.isBlendLocked()) { - mod(glCtx.blendState); - bh.deferBlendFunc(srcRgb, dstRgb, srcAlpha, dstAlpha); - postVanillaBlendChangeIfMoved(snapshotted); - return; - } - final boolean caching = isCachingEnabled(); - final boolean bypass = !caching; - if (bypass || glCtx.blendState.getSrcRgb() != srcRgb || glCtx.blendState.getDstRgb() != dstRgb || glCtx.blendState.getSrcAlpha() != srcAlpha || glCtx.blendState.getDstAlpha() != dstAlpha || glCtx.blendState.isFuncUnknown()) { - mod(glCtx.blendState); - glCtx.blendState.setAll(srcRgb, dstRgb, srcAlpha, dstAlpha); - glCtx.blendState.clearFuncUnknownState(); - issueBlendFunc(glCtx.blendState); - if (GLSMHooks.BLEND_FUNC_CHANGE.hasListeners()) { - final boolean hudCache = GLSMConfig.hudCacheOverride; - GLSMHooks.blendFuncChangeEvent.srcRgb = srcRgb; - GLSMHooks.blendFuncChangeEvent.dstRgb = dstRgb; - GLSMHooks.blendFuncChangeEvent.srcAlpha = hudCache ? GL11.GL_ONE : srcAlpha; - GLSMHooks.blendFuncChangeEvent.dstAlpha = hudCache ? GL11.GL_ONE_MINUS_SRC_ALPHA : dstAlpha; - GLSMHooks.BLEND_FUNC_CHANGE.post(GLSMHooks.blendFuncChangeEvent); - } - } - postVanillaBlendChangeIfMoved(snapshotted); - } - - public static void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { - tryBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); - } - - public static void checkCompiling() { - checkCompiling(""); - } - - public static void checkCompiling(String name) { - if (DisplayListManager.isRecording()) { - throw new UnsupportedOperationException("Not yet implemented (" + name + ")"); - } - } - - // Records glBegin/glEnd/glVertex and compiles them to a VBO - // Currently only used inside of display lists - - public static void glNormal3b(byte nx, byte ny, byte nz) { - final float fnx = b2f(nx), fny = b2f(ny), fnz = b2f(nz); - final GLContextState glCtx = ctx(); - glCtx.ffp.setNormal(fnx, fny, fnz); - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setNormal(fnx, fny, fnz); - return; - } - glCtx.dirtyNormalAttrib = true; - } - - public static void glNormal3d(double nx, double ny, double nz) { - final float fnx = (float) nx, fny = (float) ny, fnz = (float) nz; - final GLContextState glCtx = ctx(); - glCtx.ffp.setNormal(fnx, fny, fnz); - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setNormal(fnx, fny, fnz); - return; - } - glCtx.dirtyNormalAttrib = true; - } - - public static void glNormal3f(float nx, float ny, float nz) { - final GLContextState glCtx = ctx(); - glCtx.ffp.setNormal(nx, ny, nz); - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setNormal(nx, ny, nz); - return; - } - glCtx.dirtyNormalAttrib = true; - } - - public static void glNormal3i(int nx, int ny, int nz) { - final float fnx = nx / 2147483647.0f, fny = ny / 2147483647.0f, fnz = nz / 2147483647.0f; - final GLContextState glCtx = ctx(); - glCtx.ffp.setNormal(fnx, fny, fnz); - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setNormal(fnx, fny, fnz); - return; - } - glCtx.dirtyNormalAttrib = true; - } - - public static void glDepthFunc(int func) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.DEPTH_FUNC); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDepthFunc(func); - if (mode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - if (!caching || func != glCtx.depthState.getFunc()) { - mod(glCtx.depthState); - glCtx.depthState.setFunc(func); - RENDER_BACKEND.depthFunc(func); - } - } - - public static void glDepthMask(boolean mask) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.writeDepthColor(ExitStateCapture.DEPTH_MASK); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDepthMask(mask); - if (mode == RecordMode.COMPILE) { - return; - } - } - final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler; - if (dch != null && dch.isDepthColorLocked()) { - mod(glCtx.depthState); - dch.deferDepthEnable(mask); - return; - } - final boolean caching = isCachingEnabled(); - if (!caching || mask != glCtx.depthState.isEnabled()) { - mod(glCtx.depthState); - glCtx.depthState.setEnabled(mask); - RENDER_BACKEND.depthMask(mask); - } - } - - public static void glEdgeFlag(boolean flag) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordStateCommand(() -> glEdgeFlag(flag)); - if (mode == RecordMode.COMPILE) return; - } - ctx().edgeFlagState.setEnabled(flag); - } - - public static void glColor4f(float red, float green, float blue, float alpha) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordColor(red, green, blue, alpha); - if (mode == RecordMode.COMPILE) { - return; - } - } - changeColor(red, green, blue, alpha); - } - - public static void glColor4d(double red, double green, double blue, double alpha) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordColor((float) red, (float) green, (float) blue, (float) alpha); - if (mode == RecordMode.COMPILE) { - return; - } - } - changeColor((float) red, (float) green, (float) blue, (float) alpha); - } - - public static void glColor4b(byte red, byte green, byte blue, byte alpha) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordColor(b2f(red), b2f(green), b2f(blue), b2f(alpha)); - if (mode == RecordMode.COMPILE) { - return; - } - } - changeColor(b2f(red), b2f(green), b2f(blue), b2f(alpha)); - } - - public static void glColor4ub(byte red, byte green, byte blue, byte alpha) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordColor(ub2f(red), ub2f(green), ub2f(blue), ub2f(alpha)); - if (mode == RecordMode.COMPILE) { - return; - } - } - changeColor(ub2f(red), ub2f(green), ub2f(blue), ub2f(alpha)); - } - - public static void glColor3f(float red, float green, float blue) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordColor(red, green, blue, 1.0F); - if (mode == RecordMode.COMPILE) { - return; - } - } - changeColor(red, green, blue, 1.0F); - } - - public static void glColor3d(double red, double green, double blue) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordColor((float) red, (float) green, (float) blue, 1.0F); - if (mode == RecordMode.COMPILE) { - return; - } - } - changeColor((float) red, (float) green, (float) blue, 1.0F); - } - - public static void glColor3b(byte red, byte green, byte blue) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordColor(b2f(red), b2f(green), b2f(blue), 1.0F); - if (mode == RecordMode.COMPILE) { - return; - } - } - changeColor(b2f(red), b2f(green), b2f(blue), 1.0F); - } - - public static void glColor3ub(byte red, byte green, byte blue) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordColor(ub2f(red), ub2f(green), ub2f(blue), 1.0F); - if (mode == RecordMode.COMPILE) { - return; - } - } - changeColor(ub2f(red), ub2f(green), ub2f(blue), 1.0F); - } - - private static float ub2f(byte b) { - return (b & 0xFF) / 255.0F; - } - - private static float b2f(byte b) { - return ((b - Byte.MIN_VALUE) & 0xFF) / 255.0F; - } - - public static float i2f(int i) {return ((i - Integer.MIN_VALUE) & 0xFFFFFFFFL) / 4294967295.0F;} - - private static boolean changeColor(float red, float green, float blue, float alpha) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.COLOR); - // Helper function for glColor* - final boolean caching = isCachingEnabled(); - if (!caching || red != glCtx.color.getRed() || green != glCtx.color.getGreen() || blue != glCtx.color.getBlue() || alpha != glCtx.color.getAlpha()) { - mod(glCtx.color); - glCtx.color.setRed(red); - glCtx.color.setGreen(green); - glCtx.color.setBlue(blue); - glCtx.color.setAlpha(alpha); - glCtx.colorGeneration++; - if (ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setColor(red, green, blue, alpha); - } - glCtx.dirtyColorAttrib = true; - // Only set while an enchantment-glint span is active - final GlintColorHandler glintHandler = GLSMHooks.glintColorHandler; - if (glintHandler != null) { - glintHandler.onColorChanged(red, green, blue, alpha); - } - return true; - } - return false; - } - - public static void glSecondaryColor3f(float red, float green, float blue) { - rejectExitCapture(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordSecondaryColor(red, green, blue); - if (mode == RecordMode.COMPILE) { - return; - } - } - changeSecondaryColor(red, green, blue); - } - - public static void glSecondaryColor3d(double red, double green, double blue) { - glSecondaryColor3f((float) red, (float) green, (float) blue); - } - - public static void glSecondaryColor3b(byte red, byte green, byte blue) { - glSecondaryColor3f(b2f(red), b2f(green), b2f(blue)); - } - - public static void glSecondaryColor3ub(byte red, byte green, byte blue) { - glSecondaryColor3f(ub2f(red), ub2f(green), ub2f(blue)); - } - - /** Helper for glSecondaryColor* - the color sum is emulated by the FFP shaders, nothing is sent to the driver. */ - private static void changeSecondaryColor(float red, float green, float blue) { - final GLContextState glCtx = ctx(); - if (!isCachingEnabled() || red != glCtx.secondaryColor.getRed() || green != glCtx.secondaryColor.getGreen() || blue != glCtx.secondaryColor.getBlue()) { - if (glCtx.colorSumState.isEnabled()) beforeUncapturedStateChange(); - mod(glCtx.secondaryColor); - glCtx.secondaryColor.setRed(red); - glCtx.secondaryColor.setGreen(green); - glCtx.secondaryColor.setBlue(blue); - glCtx.fragmentGeneration++; - } - } - - private static final Color4 DirtyColor = new Color4(-1.0F, -1.0F, -1.0F, -1.0F); - - public static void clearCurrentColor() { - rejectExitCapture(); - // Marks the cache dirty, doesn't actually reset the color - mod(ctx().color).set(DirtyColor); - } - - public static void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.writeDepthColor(ExitStateCapture.COLOR_MASK); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordColorMask(red, green, blue, alpha); - if (mode == RecordMode.COMPILE) { - return; - } - } - final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler; - if (dch != null && dch.isDepthColorLocked()) { - mod(glCtx.colorMask); - dch.deferColorMask(red, green, blue, alpha); - return; - } - final boolean caching = isCachingEnabled(); - final boolean bypass = !caching; - if (bypass || red != glCtx.colorMask.red || green != glCtx.colorMask.green || blue != glCtx.colorMask.blue || alpha != glCtx.colorMask.alpha) { - mod(glCtx.colorMask); - glCtx.colorMask.setAll(red, green, blue, alpha); - RENDER_BACKEND.colorMask(red, green, blue, alpha); - } - } - - // Clear Color - public static void glClearColor(float red, float green, float blue, float alpha) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordClearColor(red, green, blue, alpha); - if (mode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - if (!caching || red != glCtx.clearColor.getRed() || green != glCtx.clearColor.getGreen() || blue != glCtx.clearColor.getBlue() || alpha != glCtx.clearColor.getAlpha()) { - mod(glCtx.clearColor); - glCtx.clearColor.setRed(red); - glCtx.clearColor.setGreen(green); - glCtx.clearColor.setBlue(blue); - glCtx.clearColor.setAlpha(alpha); - RENDER_BACKEND.clearColor(red, green, blue, alpha); - } - } - - public static void glClearDepth(double depth) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordClearDepth(depth); - if (mode == RecordMode.COMPILE) { - return; - } - } - depth = Math.min(1.0, Math.max(0.0, depth)); - mod(glCtx.depthState); - if (isCachingEnabled()) glCtx.depthState.setClearValue(depth); - RENDER_BACKEND.clearDepth(depth); - } - - // ALPHA - public static void enableAlphaTest() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL11.GL_ALPHA_TEST); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableAlphaTest(ctx()); - } - - private static void enableAlphaTest(GLContextState glCtx) { - final DeferredAlphaHandler ah = GLSMHooks.alphaHandler; - if (ah != null && ah.isAlphaTestLocked()) { - glCtx.exitCapture.capability(GL11.GL_ALPHA_TEST, -1); - glCtx.alphaTest.beforeModify(); - if (ah.deferAlphaTestToggle(true) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { - GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); - } - return; - } - final boolean wasEnabled = glCtx.alphaTest.isEnabled(); - glCtx.alphaTest.enable(); - if (glCtx.alphaTest.isEnabled() != wasEnabled) { - glCtx.fragmentGeneration++; - if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { - GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); - } - } - } - - public static void disableAlphaTest() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL11.GL_ALPHA_TEST); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableAlphaTest(ctx()); - } - - private static void disableAlphaTest(GLContextState glCtx) { - final DeferredAlphaHandler ah = GLSMHooks.alphaHandler; - if (ah != null && ah.isAlphaTestLocked()) { - glCtx.exitCapture.capability(GL11.GL_ALPHA_TEST, -1); - glCtx.alphaTest.beforeModify(); - if (ah.deferAlphaTestToggle(false) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { - GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); - } - return; - } - final boolean wasEnabled = glCtx.alphaTest.isEnabled(); - glCtx.alphaTest.disable(); - if (glCtx.alphaTest.isEnabled() != wasEnabled) { - glCtx.fragmentGeneration++; - if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { - GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); - } - } - } - - public static void glAlphaFunc(int function, float reference) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.writeAlpha(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordAlphaFunc(function, reference); - if (mode == RecordMode.COMPILE) { - return; - } - } - final DeferredAlphaHandler ah = GLSMHooks.alphaHandler; - if (ah != null && ah.isAlphaTestLocked()) { - mod(glCtx.alphaState); - if (ah.deferAlphaFunc(function, reference) && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { - GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); - } - return; - } - if (isCachingEnabled() - && (function != glCtx.alphaState.getFunction() || Float.compare(reference, glCtx.alphaState.getReference()) != 0)) { - mod(glCtx.alphaState); - glCtx.alphaState.setFunction(function); - glCtx.alphaState.setReference(reference); - glCtx.fragmentGeneration++; - if (GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { - GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); - } - } - } - - // Textures - public static void glActiveTexture(int texture) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.ACTIVE_UNIT); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordActiveTexture(texture); - if (mode == RecordMode.COMPILE) { - return; - } - } - final int newTexture = texture - GL13.GL_TEXTURE0; - if (!isValidTextureUnit(newTexture, texture, "glActiveTexture")) { - return; - } - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.activeTextureUnit.getValue() != newTexture) { - mod(glCtx.activeTextureUnit).setValue(newTexture); - RENDER_BACKEND.activeTexture(texture); - } - } - - private static boolean isValidTextureUnit(int unit, int rawEnum, String function) { - return isValidTextureUnit(unit, MAX_TEXTURE_UNITS, rawEnum, function); - } - - private static boolean isValidTextureUnit(int unit, int limit, int rawEnum, String function) { - if (unit >= 0 && unit < limit) { - return true; - } - if (WARN_ONCE.add(function)) { - LOGGER.warn("{}({}) is not a valid texture unit enum (expected GL_TEXTURE0..GL_TEXTURE{}); ignoring", function, rawEnum, limit - 1, new Throwable("call site")); - } - return false; - } - - public static void glActiveTextureARB(int texture) { - glActiveTexture(texture); - } - - public static void glClientActiveTexture(int texture) { - final int unit = texture - GL13.GL_TEXTURE0; - if (!isValidTextureUnit(unit, MAX_TEXTURE_COORDS, texture, "glClientActiveTexture")) { - return; - } - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.CLIENT_ACTIVE_UNIT); - glCtx.clientActiveTextureUnit = unit; - } - - public static int getClientActiveTextureUnit() { - return ctx().clientActiveTextureUnit; - } - - private static int texCoordConventional(GLContextState glCtx) { - return VAOManager.CONV_TEX0 + glCtx.clientActiveTextureUnit; - } - - private static int getBoundTexture() { - return getBoundTexture(ctx().activeTextureUnit.getValue()); - } - - private static int getBoundTexture(int unit) { - return ctx().textures.getTextureUnitBindings(unit).getBinding(); - } - - public static void glBindTexture(int target, int texture) { - if (TextureInfoCache.isProxyTarget(target)) return; - final GLContextState glCtx = ctx(); - recordExitTextureBind(glCtx, target, glCtx.activeTextureUnit.getValue()); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordBindTexture(target, texture); - if (mode == RecordMode.COMPILE) { - return; - } - } - // Rebinding a deferred-delete texture rescues it (Mesa/compat-profile behavior) - long rescued = DEFERRED_ABSENT; - boolean rejected = false; - if (texture != 0) { - final boolean locked = acquireDrawLock(); - try { - final long state = deferredDeleteTextures.isEmpty() ? DEFERRED_ABSENT : deferredDeleteTextures.get(texture); - if (state == DEFERRED_ABSENT) { - recordTarget(texture, target); - } else if (non2DTextureTargets.get(texture) == target) { - rescued = deferredDeleteTextures.remove(texture); - } else { - rejected = true; - } - } finally { - if (locked) releaseDrawLock(); - } - } - if (rejected) return; - - if (!isCachingEnabled()) { - RENDER_BACKEND.bindTexture(target, texture); - if (rescued != DEFERRED_ABSENT) resetRescuedTexture(target, texture, rescued); - return; - } - - final int activeUnit = glCtx.activeTextureUnit.getValue(); - final TextureBindingStack textureUnit = glCtx.textures.getTextureUnitBindings(activeUnit); - final int cachedBinding = textureUnit.getBinding(); - - if (cachedBinding != texture || (texture == 0 && textureUnit.getTarget() != target)) { - if (activeUnit != 0 || target != GL11.GL_TEXTURE_2D) beforeUncapturedStateChange(); - if (Tracy.ENABLED) texBindMisses++; - RENDER_BACKEND.bindTexture(target, texture); - mod(textureUnit).setBinding(texture, target); - if (texture != 0) { - if (activeUnit > glCtx.maxBoundTextureUnit) glCtx.maxBoundTextureUnit = activeUnit; - } - if (!glCtx.lockBindCallback && target == GL11.GL_TEXTURE_2D && glCtx.activeTextureUnit.getValue() == 0) { - glCtx.lockBindCallback = true; - if (GLSMHooks.TEXTURE_BIND.hasListeners()) { - GLSMHooks.textureBindEvent.textureId = texture; - GLSMHooks.TEXTURE_BIND.post(GLSMHooks.textureBindEvent); - } - RenderSystem.bindTextureToUnit(0, texture); - glCtx.lockBindCallback = false; - } - } - if (rescued != DEFERRED_ABSENT) resetRescuedTexture(target, texture, rescued); - } - - private static void bindTextureUnitByName(int unit, int texture) { - if (isDeferredDelete(texture)) return; - final CommandRecorder paused = DisplayListManager.pauseRecording(); - final int saved = getActiveTextureUnit(); - try { - glActiveTexture(GL13.GL_TEXTURE0 + unit); - if (texture == 0) { - // Read before the 2D unbind, which overwrites the unit's cached target. - final int target = ctx().textures.getTextureUnitBindings(unit).getTarget(); - glBindTexture(GL11.GL_TEXTURE_2D, 0); - if (!is2D(target)) glBindTexture(target, 0); - } else { - glBindTexture(non2DTextureTargets.get(texture), texture); - } - } finally { - glActiveTexture(GL13.GL_TEXTURE0 + saved); - if (paused != null) DisplayListManager.resumeRecording(paused); - } - } - - public static void glBindTextures(int first, int count, IntBuffer textures) { - if (first < 0 || !isValidTextureUnit(first + count - 1, GL13.GL_TEXTURE0 + first + count - 1, "glBindTextures")) return; - if (textures != null) requireRemaining(textures, count); - for (int i = 0; i < count; i++) bindTextureUnitByName(first + i, textures == null ? 0 : textures.get(textures.position() + i)); - } - - public static void glBindTextures(int first, IntBuffer textures) { - if (textures != null) glBindTextures(first, textures.remaining(), textures); - } - - public static void glBindTextures(int first, int[] textures) { - if (textures != null) glBindTextures(first, textures.length, IntBuffer.wrap(textures)); - } - - public static void glBindTextureUnit(int unit, int texture) { - if (isValidTextureUnit(unit, GL13.GL_TEXTURE0 + unit, "glBindTextureUnit")) bindTextureUnitByName(unit, texture); - } - - public static void glBindMultiTextureEXT(int texunit, int target, int texture) { - if (DisplayListManager.isRecording()) throw DisplayListManager.unsupportedInList("glBindMultiTextureEXT"); - if (!isValidTextureUnit(texunit - GL13.GL_TEXTURE0, texunit, "glBindMultiTextureEXT")) return; - final int saved = getActiveTextureUnit(); - glActiveTexture(texunit); - glBindTexture(target, texture); - glActiveTexture(GL13.GL_TEXTURE0 + saved); - } - - private static int changeFormatIfDeprecated(int internalformat) { - internalformat = GLESFormatRemap.promoteAlphaFormat(internalformat); - if (RenderSystem.isGLES()) { - internalformat = GLESFormatRemap.remapInternalFormat(internalformat); - } - return internalformat; - } - - public static final class GLESTexImageRemap { - private final GLESFormatRemap.Result r; - private GLESTexImageRemap(GLESFormatRemap.Result r) { this.r = r; } - public int internalFormat() { return r.internalFormat(); } - public int format() { return r.format(); } - public int type() { return r.type(); } - } - - public static GLESTexImageRemap remapTexImageForGLES(int internalformat, int format, int type) { - return new GLESTexImageRemap(GLESFormatRemap.apply(internalformat, format, type, RenderSystem.isGLES())); - } - - static { - if (ByteOrder.nativeOrder() != ByteOrder.LITTLE_ENDIAN) { - LOGGER.warn("GLSM GLES pixel-type remap assumes little-endian host; big-endian detected - BGRA uploads may be byte-swapped"); - } - } - - private static int remapPixelTypeForGLES(int format, int type) { - return RenderSystem.isGLES() ? GLESFormatRemap.remapPixelType(format, type) : type; - } - - private static int remapTypeForRemappedInternalFormat(int internalformat, int type) { - if (!RenderSystem.isGLES()) return type; - if (!GLESFormatRemap.isGenericPixelType(type)) return type; - return GLESFormatRemap.typeForInternalFormatES32(internalformat, type); - } - - public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) { - rejectExitCapture(); - internalformat = changeFormatIfDeprecated(internalformat); - type = remapPixelTypeForGLES(format, type); - type = remapTypeForRemappedInternalFormat(internalformat, type); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordComplexCommand(TexImage2DCmd.fromIntBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState)); - if (mode == RecordMode.COMPILE) { - return; - } - } - TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels); - restorePixelUnpackBuffer(); - if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null); - maybeGenerateMipmap(target, level); - } - - public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, FloatBuffer pixels) { - rejectExitCapture(); - internalformat = changeFormatIfDeprecated(internalformat); - type = remapPixelTypeForGLES(format, type); - type = remapTypeForRemappedInternalFormat(internalformat, type); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordComplexCommand(TexImage2DCmd.fromFloatBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState)); - if (mode == RecordMode.COMPILE) { - return; - } - } - TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels); - restorePixelUnpackBuffer(); - if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null); - maybeGenerateMipmap(target, level); - } - - public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, DoubleBuffer pixels) { - rejectExitCapture(); - internalformat = changeFormatIfDeprecated(internalformat); - type = remapPixelTypeForGLES(format, type); - type = remapTypeForRemappedInternalFormat(internalformat, type); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordComplexCommand(TexImage2DCmd.fromDoubleBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState)); - if (mode == RecordMode.COMPILE) { - return; - } - } - TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels); - restorePixelUnpackBuffer(); - if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null); - maybeGenerateMipmap(target, level); - } - - public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) { - rejectExitCapture(); - internalformat = changeFormatIfDeprecated(internalformat); - type = remapPixelTypeForGLES(format, type); - type = remapTypeForRemappedInternalFormat(internalformat, type); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordComplexCommand(TexImage2DCmd.fromByteBuffer(target, level, internalformat, width, height, border, format, type, pixels, ctx().pixelUnpackState)); - if (mode == RecordMode.COMPILE) { - return; - } - } - TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels != null ? pixels.asIntBuffer() : null); - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels); - restorePixelUnpackBuffer(); - if (mode == RecordMode.NONE && RenderSystem.isLTW()) LTWWorkaround.onTexImage2D(target, level, format, pixels != null); - maybeGenerateMipmap(target, level); - } - - public static void glTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset) { - rejectExitCapture(); - internalformat = changeFormatIfDeprecated(internalformat); - type = remapPixelTypeForGLES(format, type); - type = remapTypeForRemappedInternalFormat(internalformat, type); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glTexImage2D with buffer offset"); - } - TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels_buffer_offset); - RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels_buffer_offset); - maybeGenerateMipmap(target, level); - } - - public static void glTexCoord1f(float s) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setTexCoord(s, 0.0f); - return; - } - final GLContextState glCtx = ctx(); - glCtx.ffp.setTexCoord(s, 0.0f, 0.0f, 1.0f); - glCtx.dirtyTexCoordAttrib = true; - } - - public static void glTexCoord1d(double s) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setTexCoord((float) s, 0.0f); - return; - } - final GLContextState glCtx = ctx(); - glCtx.ffp.setTexCoord((float) s, 0.0f, 0.0f, 1.0f); - glCtx.dirtyTexCoordAttrib = true; - } - - public static void glTexCoord2f(float s, float t) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setTexCoord(s, t); - return; - } - final GLContextState glCtx = ctx(); - glCtx.ffp.setTexCoord(s, t, 0.0f, 1.0f); - glCtx.dirtyTexCoordAttrib = true; - } - - public static void glTexCoord2d(double s, double t) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setTexCoord((float) s, (float) t); - return; - } - final GLContextState glCtx = ctx(); - glCtx.ffp.setTexCoord((float) s, (float) t, 0.0f, 1.0f); - glCtx.dirtyTexCoordAttrib = true; - } - - public static void glTexCoord3f(float s, float t, float r) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setTexCoord(s, t); // Only track s,t for 2D textures - return; - } - final GLContextState glCtx = ctx(); - glCtx.ffp.setTexCoord(s, t, r, 1.0f); - glCtx.dirtyTexCoordAttrib = true; - } - - public static void glTexCoord3d(double s, double t, double r) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setTexCoord((float) s, (float) t); - return; - } - final GLContextState glCtx = ctx(); - glCtx.ffp.setTexCoord((float) s, (float) t, (float) r, 1.0f); - glCtx.dirtyTexCoordAttrib = true; - } - - public static void glTexCoord4f(float s, float t, float r, float q) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setTexCoord(s, t); - return; - } - final GLContextState glCtx = ctx(); - glCtx.ffp.setTexCoord(s, t, r, q); - glCtx.dirtyTexCoordAttrib = true; - } - - public static void glTexCoord4d(double s, double t, double r, double q) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setTexCoord((float) s, (float) t); - return; - } - final GLContextState glCtx = ctx(); - glCtx.ffp.setTexCoord((float) s, (float) t, (float) r, (float) q); - glCtx.dirtyTexCoordAttrib = true; - } - - public static void glDeleteTextures(int id) { - rejectExitCapture(); - deleteTexture(id); - } - - public static void glDeleteTextures(IntBuffer ids) { - rejectExitCapture(); - for (int i = 0; i < ids.remaining(); i++) { - deleteTexture(ids.get(ids.position() + i)); - } - } - - public static void glDeleteTextures(int[] ids) { - rejectExitCapture(); - for (int id : ids) deleteTexture(id); - } - - private static void deleteTexture(int id) { - if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_DELETE); - try { - deferDeleteTexture(id); - onDeleteTexture(id); - } finally { - if (Tracy.ENABLED) Tracy.endZone(); - } - } - - /** - * Defer deleting textures until it has been reclaimed. - * Why you might ask? In compat profile if you bind a texture that doesn't exist, ie a deleted texture, - * mesa will silently create it for you, in core this is an error. Why would you be binding a deleted texture? - * Damned if I know, but vanilla and mods do it... they create one, delete it, and then bind it.... - * */ - private static void deferDeleteTexture(int id) { - final GLContextState glCtx = ctx(); - if (id == 0) return; - - final int savedUnit = glCtx.activeTextureUnit.getValue(); - int activeUnit = savedUnit; - - // Unbind from all units that have this texture - for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) { - final TextureBindingStack unitBindings = glCtx.textures.getTextureUnitBindings(i); - if (unitBindings.getBinding() == id) { - if (i != activeUnit) { - RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i); - activeUnit = i; - } - final int unitTarget = unitBindings.getTarget(); - RENDER_BACKEND.bindTexture(unitTarget == 0 ? GL11.GL_TEXTURE_2D : unitTarget, 0); - } - } - - for (int i = 0; i <= glCtx.maxBoundImageUnit; i++) { - final ImageUnitBinding image = glCtx.imageUnits.get(i); - if (image != null && image.getTexture() == id) { - RENDER_BACKEND.bindImageTexture(i, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8); - } - } - - if (activeUnit != savedUnit) { - RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + savedUnit); - } - - final TextureBindingStack savedBindings = glCtx.textures.getTextureUnitBindings(savedUnit); - if (!is2D(savedBindings.getTarget()) && previous2D(savedBindings) == id) restoreUnitAfter2DBind(savedBindings, id, id); - - final boolean locked = acquireDrawLock(); - try { - detachFromFramebuffer(glCtx, GL30.GL_DRAW_FRAMEBUFFER, glCtx.drawFramebuffer, id); - if (glCtx.readFramebuffer != glCtx.drawFramebuffer) detachFromFramebuffer(glCtx, GL30.GL_READ_FRAMEBUFFER, glCtx.readFramebuffer, id); - if (textureFramebufferRefs.get(id) > 0) deferredDeleteTextures.put(id, DEFERRED_ATTACHED); - else scheduleRelease(id); - } finally { - if (locked) releaseDrawLock(); - } - } - - private static void scheduleRelease(int id) { - deferredDeleteTextures.put(id, frameIndex); - nextReleaseFrame = Math.min(nextReleaseFrame, frameIndex + RELEASE_DELAY_FRAMES); - } - - private static boolean isDeferredDelete(int texture) { - if (texture == 0 || deferredDeleteTextures.isEmpty()) return false; - final boolean locked = acquireDrawLock(); - try { - return deferredDeleteTextures.containsKey(texture); - } finally { - if (locked) releaseDrawLock(); - } - } - - public static void onFrameEnd() { - frameIndex++; - if (!splashComplete || frameIndex < nextReleaseFrame) return; - nextReleaseFrame = Long.MAX_VALUE; - for (Int2LongMap.Entry entry : Int2LongMaps.fastIterable(deferredDeleteTextures)) { - final long since = entry.getLongValue(); - if (since < 0) continue; - if (frameIndex - since < RELEASE_DELAY_FRAMES) { - nextReleaseFrame = Math.min(nextReleaseFrame, since + RELEASE_DELAY_FRAMES); - continue; - } - final int id = entry.getIntKey(); - if (non2DTextureTargets.get(id) == GL11.GL_TEXTURE_2D) releaseStorage2D(id); - entry.setValue(DEFERRED_RELEASED); - } - } - - public static int deferredTexturesAwaitingRelease() { - int count = 0; - final LongIterator it = deferredDeleteTextures.values().iterator(); - while (it.hasNext()) { - if (it.nextLong() != DEFERRED_RELEASED) count++; - } - return count; - } - - private static void releaseStorage2D(int id) { - if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_RELEASE_STORAGE); - try { - final TextureBindingStack unit = ctx().textures.getTextureUnitBindings(getActiveTextureUnit()); - final int previous2D = previous2D(unit); - RENDER_BACKEND.bindTexture(GL11.GL_TEXTURE_2D, id); - if (bindTook(GL11.GL_TEXTURE_2D, id)) releaseBoundStorage2D(); - restoreUnitAfter2DBind(unit, id, previous2D); - } finally { - if (Tracy.ENABLED) Tracy.endZone(); - } - } - - private static void restoreUnitAfter2DBind(TextureBindingStack unit, int deleted, int previous2D) { - RENDER_BACKEND.bindTexture(GL11.GL_TEXTURE_2D, previous2D == deleted ? 0 : previous2D); - final int target = unit.getTarget(); - if (is2D(target)) return; - RENDER_BACKEND.bindTexture(target, unit.getBinding() == deleted ? 0 : unit.getBinding()); - } - - private static boolean is2D(int target) { - return target == 0 || target == GL11.GL_TEXTURE_2D; - } - - private static int previous2D(TextureBindingStack unit) { - return is2D(unit.getTarget()) ? unit.getBinding() : RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_2D); - } - - private static void recordTarget(int texture, int target) { - if (target != GL11.GL_TEXTURE_2D) non2DTextureTargets.put(texture, target); - } - - private static void releaseBoundStorage2D() { - if (RenderSystem.supportsTextureStorage() && RENDER_BACKEND.getTexParameteri(GL11.GL_TEXTURE_2D, GL42.GL_TEXTURE_IMMUTABLE_FORMAT) != 0) return; - final int size = Math.max(RENDER_BACKEND.getTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH), RENDER_BACKEND.getTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT)); - final int levels = Math.max(1, 32 - Integer.numberOfLeadingZeros(size)); - suspendPixelUnpackBuffer(); - for (int level = 0; level < levels; level++) { - RENDER_BACKEND.texImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, 0, 0, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - } - restorePixelUnpackBuffer(); - } - - private static boolean bindTook(int target, int texture) { - return RENDER_BACKEND.getInteger(TextureTargets.bindingQuery(target)) == texture; - } - - private static void resetRescuedTexture(int target, int texture, long state) { - if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_RESCUE_RESET); - try { - if (!bindTook(target, texture)) return; - if (target == GL11.GL_TEXTURE_2D && state >= 0) releaseBoundStorage2D(); - if (target == GL31.GL_TEXTURE_BUFFER || target == GL32.GL_TEXTURE_2D_MULTISAMPLE || target == GL32.GL_TEXTURE_2D_MULTISAMPLE_ARRAY) return; - final boolean rectangle = target == GL31.GL_TEXTURE_RECTANGLE; - final int wrap = rectangle ? GL12.GL_CLAMP_TO_EDGE : GL11.GL_REPEAT; - RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_MIN_FILTER, rectangle ? GL11.GL_LINEAR : GL11.GL_NEAREST_MIPMAP_LINEAR); - RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); - RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_WRAP_S, wrap); - RENDER_BACKEND.texParameteri(target, GL11.GL_TEXTURE_WRAP_T, wrap); - RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_WRAP_R, wrap); - RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_BASE_LEVEL, 0); - if (!rectangle) RENDER_BACKEND.texParameteri(target, GL12.GL_TEXTURE_MAX_LEVEL, 1000); - RENDER_BACKEND.texParameterf(target, GL12.GL_TEXTURE_MIN_LOD, -1000.0f); - RENDER_BACKEND.texParameterf(target, GL12.GL_TEXTURE_MAX_LOD, 1000.0f); - RENDER_BACKEND.texParameteri(target, GL14.GL_TEXTURE_COMPARE_MODE, GL11.GL_NONE); - RENDER_BACKEND.texParameteri(target, GL14.GL_TEXTURE_COMPARE_FUNC, GL11.GL_LEQUAL); - RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_R, GL11.GL_RED); - RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_G, GL11.GL_GREEN); - RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_B, GL11.GL_BLUE); - RENDER_BACKEND.texParameteri(target, GL33.GL_TEXTURE_SWIZZLE_A, GL11.GL_ALPHA); - if (!RenderSystem.isGLES()) { - RENDER_BACKEND.texParameterf(target, GL14.GL_TEXTURE_LOD_BIAS, 0.0f); - RENDER_BACKEND.texParameterfv(target, GL11.GL_TEXTURE_BORDER_COLOR, TRANSPARENT_BLACK); - } - if (RenderSystem.supportsStencilTexturing()) RENDER_BACKEND.texParameteri(target, GL43.GL_DEPTH_STENCIL_TEXTURE_MODE, GL11.GL_DEPTH_COMPONENT); - if (RENDER_BACKEND.isAnisotropicSupported()) RENDER_BACKEND.texParameterf(target, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); - } finally { - if (Tracy.ENABLED) Tracy.endZone(); - } - } - - /** Flush deferred deletes so the driver can recycle names. */ - private static void flushDeferredTextureDeletes() { - if (!splashComplete || deferredDeleteTextures.isEmpty()) return; - if (Tracy.ENABLED) Tracy.beginZone(Z_TEX_FLUSH_DELETES); - try { - final GLContextState primary = primaryContext(); - final GLContextState[] drawables = drawableContextStates; - final var it = Int2LongMaps.fastIterator(deferredDeleteTextures); - while (it.hasNext()) { - final Int2LongMap.Entry entry = it.next(); - if (entry.getLongValue() == DEFERRED_ATTACHED) continue; - final int id = entry.getIntKey(); - it.remove(); - RENDER_BACKEND.deleteTextures(id); - non2DTextureTargets.remove(id); - clearTextureBindings(primary, id); - for (int i = 0; i < drawables.length; i++) { - clearTextureBindings(drawables[i], id); - } - } - } finally { - if (Tracy.ENABLED) Tracy.endZone(); - } - } - - private static final int DEPTH_SLOT = 16; - private static final int STENCIL_SLOT = 17; - private static final int FRAMEBUFFER_SLOTS = 18; - - private static int attachmentSlot(int attachment) { - return switch (attachment) { - case GL30.GL_DEPTH_ATTACHMENT -> DEPTH_SLOT; - case GL30.GL_STENCIL_ATTACHMENT -> STENCIL_SLOT; - default -> attachment >= GL30.GL_COLOR_ATTACHMENT0 && attachment <= GL30.GL_COLOR_ATTACHMENT15 ? attachment - GL30.GL_COLOR_ATTACHMENT0 : -1; - }; - } - - private static int slotAttachment(int slot) { - return switch (slot) { - case DEPTH_SLOT -> GL30.GL_DEPTH_ATTACHMENT; - case STENCIL_SLOT -> GL30.GL_STENCIL_ATTACHMENT; - default -> GL30.GL_COLOR_ATTACHMENT0 + slot; - }; - } - - private static boolean beginAttach(int target, int attachment, int texture) { - final GLContextState glCtx = ctx(); - return beginAttach(glCtx, target == GL30.GL_READ_FRAMEBUFFER ? glCtx.readFramebuffer : glCtx.drawFramebuffer, attachment, texture); - } - - private static boolean beginAttach(GLContextState glCtx, int framebuffer, int attachment, int texture) { - if (isDeferredDelete(texture)) return false; - TextureInfoCache.INSTANCE.onWrittenOutsideUploads(texture); - trackFramebufferAttachment(glCtx, framebuffer, attachment, texture); - return true; - } - - private static void trackFramebufferAttachment(GLContextState glCtx, int framebuffer, int attachment, int texture) { - if (framebuffer == 0) return; - if (attachment == GL30.GL_DEPTH_STENCIL_ATTACHMENT) { - trackFramebufferAttachment(glCtx, framebuffer, GL30.GL_DEPTH_ATTACHMENT, texture); - trackFramebufferAttachment(glCtx, framebuffer, GL30.GL_STENCIL_ATTACHMENT, texture); - return; - } - final int slot = attachmentSlot(attachment); - if (slot < 0) return; - int[] slots = glCtx.framebufferTextures.get(framebuffer); - if (slots == null) { - if (texture == 0) return; - slots = new int[FRAMEBUFFER_SLOTS]; - glCtx.framebufferTextures.put(framebuffer, slots); - } - setFramebufferSlot(slots, slot, texture); - } - - private static void setFramebufferSlot(int[] slots, int slot, int texture) { - final int previous = slots[slot]; - if (previous == texture) return; - slots[slot] = texture; - final boolean locked = acquireDrawLock(); - try { - if (texture != 0) textureFramebufferRefs.addTo(texture, 1); - if (previous != 0 && textureFramebufferRefs.addTo(previous, -1) == 1) { - textureFramebufferRefs.remove(previous); - if (deferredDeleteTextures.get(previous) == DEFERRED_ATTACHED) scheduleRelease(previous); - } - } finally { - if (locked) releaseDrawLock(); - } - } - - private static void detachFromFramebuffer(GLContextState glCtx, int target, int framebuffer, int texture) { - final int[] slots = glCtx.framebufferTextures.get(framebuffer); - if (slots == null) return; - for (int slot = 0; slot < slots.length; slot++) { - if (slots[slot] != texture) continue; - RENDER_BACKEND.framebufferTexture2D(target, slotAttachment(slot), GL11.GL_TEXTURE_2D, 0, 0); - setFramebufferSlot(slots, slot, 0); - } - } - - public static int glGenTextures() { - requireContext("glGenTextures"); - flushDeferredTextureDeletes(); - return RENDER_BACKEND.genTextures(); - } - - public static void glGenTextures(IntBuffer textures) { - requireContext("glGenTextures"); - flushDeferredTextureDeletes(); - RENDER_BACKEND.genTextures(textures); - } - - public static void glGenTextures(int[] textures) { - requireContext("glGenTextures"); - flushDeferredTextureDeletes(); - for (int i = 0; i < textures.length; i++) textures[i] = RENDER_BACKEND.genTextures(); - } - - public static int glCreateTextures(int target) { - requireContext("glCreateTextures"); - final int id = RENDER_BACKEND.createTextures(target); - final boolean locked = acquireDrawLock(); - try { - recordTarget(id, target); - } finally { - if (locked) releaseDrawLock(); - } - return id; - } - - public static void glCreateTextures(int target, IntBuffer textures) { - for (int i = textures.position(); i < textures.limit(); i++) textures.put(i, glCreateTextures(target)); - } - - public static void glCreateTextures(int target, int[] textures) { - for (int i = 0; i < textures.length; i++) textures[i] = glCreateTextures(target); - } - - public static void enableTexture() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL11.GL_TEXTURE_2D); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableTexture(ctx()); - } - - private static void enableTexture(GLContextState glCtx) { - glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).enable(); - } - - public static void disableTexture() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL11.GL_TEXTURE_2D); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableTexture(ctx()); - } - - private static void disableTexture(GLContextState glCtx) { - glCtx.textures.getTextureUnitStates(glCtx.activeTextureUnit.getValue()).disable(); - } - - private static final String PIXELTRANSFER_MSG = "glPixelTransfer is not available in GL 3.3 core profile."; - - public static void glPixelTransferf(int pname, float param) { - guardUnsupportedFFP("glPixelTransfer", PIXELTRANSFER_MSG); - } - - public static void glPixelTransferi(int pname, int param) { - guardUnsupportedFFP("glPixelTransfer", PIXELTRANSFER_MSG); - } - - private static final String RASTERPOS_MSG = "glRasterPos is not available in GL 3.3 core profile."; - - public static void glRasterPos2f(float x, float y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } - public static void glRasterPos2d(double x, double y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } - public static void glRasterPos2i(int x, int y) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } - public static void glRasterPos3f(float x, float y, float z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } - public static void glRasterPos3d(double x, double y, double z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } - public static void glRasterPos3i(int x, int y, int z) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } - public static void glRasterPos4f(float x, float y, float z, float w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } - public static void glRasterPos4d(double x, double y, double z, double w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } - public static void glRasterPos4i(int x, int y, int z, int w) { guardUnsupportedFFP("glRasterPos", RASTERPOS_MSG); } - - public static void setFilter(boolean bilinear, boolean mipmap) { - final int i, j; - if (bilinear) { - i = mipmap ? GL11.GL_LINEAR_MIPMAP_LINEAR : GL11.GL_LINEAR; - j = GL11.GL_LINEAR; - } else { - i = mipmap ? GL11.GL_LINEAR_MIPMAP_LINEAR : GL11.GL_NEAREST; - j = GL11.GL_NEAREST; - } - glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, i); - glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, j); - } - - public static void glBegin(int mode) { - rejectExitCapture(); - ctx().unit23TexCoordSetDuringDraw = false; - if (DisplayListManager.isRecording()) { - ImmediateModeRecorder.begin(mode); - return; - } - ImmediateModeRecorder.beginLive(mode); - } - - public static void glEnd() { - rejectExitCapture(); - final DirectTessellator result = ImmediateModeRecorder.end(); - if (result != null) { - if (DisplayListManager.isRecording()) { - if (DisplayListManager.isCompileAndExecute() && initConfig != null && initConfig.getDirectDrawer() != null) { - final CommandRecorder recorder = DisplayListManager.pauseRecording(); - initConfig.getDirectDrawer().accept(result); - DisplayListManager.resumeRecording(recorder); - } - DisplayListManager.addImmediateModeDraw(result); - return; - } - if (initConfig != null && initConfig.getDirectDrawer() != null) { - initConfig.getDirectDrawer().accept(result); - } - } - } - - // Vertex methods for display list recording and live immediate mode - public static void glVertex2f(float x, float y) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.vertex(x, y, 0.0f); - } - } - - public static void glVertex2i(int x, int y) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.vertex((float) x, (float) y, 0.0f); - } - } - - public static void glVertex2d(double x, double y) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.vertex((float) x, (float) y, 0.0f); - } - } - - public static void glVertex3f(float x, float y, float z) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.vertex(x, y, z); - } - } - - public static void glVertex3d(double x, double y, double z) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.vertex((float) x, (float) y, (float) z); - } - } - - public static void glVertex3i(int x, int y, int z) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.vertex((float) x, (float) y, (float) z); - } - } - - public static void preDraw(GLContextState glCtx, int drawMode) { - prepareLineEmulation(glCtx, drawMode); - glCtx.ffp.preDraw(glCtx); - prepareClientArrays(glCtx); - } - - public static void glDrawElements(int mode, ByteBuffer indices) { - rejectExitCapture(); - drawCalls++; - CommandRecorder savedRecorder = null; - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtilities.memAddress(indices), indices.remaining()); - if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture); - if (recordMode == RecordMode.COMPILE) return; - savedRecorder = DisplayListManager.pauseRecording(); - } else if (FeedbackManager.isFeedbackMode()) { - FeedbackManager.processDrawElements(mode, indices); - return; - } - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - if (mode == GL11.GL_QUADS) { - QuadConverter.drawQuadElementsAsTriangles(glCtx, indices.remaining(), GL11.GL_UNSIGNED_BYTE, indices); - return; - } - if (widensLineDraw(mode, indices.remaining())) { - drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_BYTE, MemoryUtilities.memAddress(indices))); - return; - } - preDraw(glCtx, mode); - RENDER_BACKEND.drawElements(mode, indices); - } finally { - if (locked) releaseDrawLock(); - if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); - } - } - - public static void glDrawElements(int mode, IntBuffer indices) { - rejectExitCapture(); - drawCalls++; - CommandRecorder savedRecorder = null; - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtilities.memAddress(indices), (long) indices.remaining() << 2); - if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture); - if (recordMode == RecordMode.COMPILE) return; - savedRecorder = DisplayListManager.pauseRecording(); - } else if (FeedbackManager.isFeedbackMode()) { - FeedbackManager.processDrawElements(mode, indices); - return; - } - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - if (mode == GL11.GL_QUADS) { - QuadConverter.drawQuadElementsAsTriangles(glCtx, indices); - return; - } - if (widensLineDraw(mode, indices.remaining())) { - drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_INT, MemoryUtilities.memAddress(indices))); - return; - } - preDraw(glCtx, mode); - RENDER_BACKEND.drawElements(mode, indices); - } finally { - if (locked) releaseDrawLock(); - if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); - } - } - - public static void glDrawElements(int mode, ShortBuffer indices) { - rejectExitCapture(); - drawCalls++; - CommandRecorder savedRecorder = null; - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtilities.memAddress(indices), (long) indices.remaining() << 1); - if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture); - if (recordMode == RecordMode.COMPILE) return; - savedRecorder = DisplayListManager.pauseRecording(); - } else if (FeedbackManager.isFeedbackMode()) { - FeedbackManager.processDrawElements(mode, indices); - return; - } - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - if (mode == GL11.GL_QUADS) { - QuadConverter.drawQuadElementsAsTriangles(glCtx, indices); - return; - } - if (widensLineDraw(mode, indices.remaining())) { - drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, indices.remaining(), GL11.GL_UNSIGNED_SHORT, MemoryUtilities.memAddress(indices))); - return; - } - preDraw(glCtx, mode); - RENDER_BACKEND.drawElements(mode, indices); - } finally { - if (locked) releaseDrawLock(); - if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); - } - } - - public static void glDrawElements(int mode, int count, int type, ByteBuffer indices) { - rejectExitCapture(); - drawCalls++; - CommandRecorder savedRecorder = null; - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - final IndexedDrawCapture capture = IndexedDrawCapture.createFromClientIndices(mode, count, type, MemoryUtilities.memAddress(indices), indices.remaining()); - if (capture != null) DisplayListManager.recordIndexedDrawCapture(capture); - if (recordMode == RecordMode.COMPILE) return; - savedRecorder = DisplayListManager.pauseRecording(); - } else if (FeedbackManager.isFeedbackMode()) { - FeedbackManager.processDrawElements(mode, count, type, indices); - return; - } - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - if (mode == GL11.GL_QUADS) { - QuadConverter.drawQuadElementsAsTriangles(glCtx, count, type, indices); - return; - } - if (widensLineDraw(mode, count)) { - drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawElementsFromAttribs(mode, count, type, MemoryUtilities.memAddress(indices))); - return; - } - preDraw(glCtx, mode); - RENDER_BACKEND.drawElements(mode, count, type, indices); - } finally { - if (locked) releaseDrawLock(); - if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); - } - } - - public static void glDrawElements(int mode, int indices_count, int type, long indices_buffer_offset) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - drawCalls++; - CommandRecorder savedRecorder = null; - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - // Core profile: a default VAO is generated at init and glBindVertexArray(0) - // is redirected to it, so a VAO is always bound here — no fallback branches. - final IndexedDrawCapture capture = IndexedDrawCapture.create(mode, indices_count, type, indices_buffer_offset, glCtx.vaos.boundEBO); - if (capture != null) { - DisplayListManager.recordIndexedDrawCapture(capture); - } - if (recordMode == RecordMode.COMPILE) { - return; - } - savedRecorder = DisplayListManager.pauseRecording(); - } else if (FeedbackManager.isFeedbackMode()) { - FeedbackManager.processDrawElements(mode, indices_count, type, indices_buffer_offset); - return; - } - final boolean locked = acquireDrawLock(); - try { - if (widensLineDraw(mode, indices_count)) { - drawLinesAsQuads(glCtx, lineElementsFromBuffer(glCtx, mode, indices_count, type, indices_buffer_offset)); - return; - } - final boolean ffpExt = FfpExtendedAttribs.maybeBindIndexed(glCtx, mode, indices_count, type, indices_buffer_offset); - try { - if (mode == GL11.GL_QUADS) { - QuadConverter.drawQuadElementsAsTriangles(glCtx, indices_count, type, indices_buffer_offset); - return; - } - preDraw(glCtx, mode); - RENDER_BACKEND.drawElements(mode, indices_count, type, indices_buffer_offset); - } finally { - if (ffpExt) FfpExtendedAttribs.unbind(); - } - } finally { - if (locked) releaseDrawLock(); - if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); - } - } - - public static void glDrawBuffer(int mode) { - rejectExitCapture(); - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - DisplayListManager.recordDrawBuffer(mode); - if (recordMode == RecordMode.COMPILE) { - return; - } - } - if (!isCachingEnabled() || ctx().drawBuffer.getValue() != mode) beforeUncapturedStateChange(); - if (isCachingEnabled()) mod(ctx().drawBuffer).setValue(mode); - RENDER_BACKEND.drawBuffer(mode); - } - - public static void glMultiDrawElementsIndirect(int mode, int type, long indirect, int drawcount, int stride) { - rejectExitCapture(); - drawCalls += drawcount; - RENDER_BACKEND.multiDrawElementsIndirect(mode, type, indirect, drawcount, stride); - } - - public static void glMultiDrawElementsBaseVertex(int mode, long pCount, int type, long pIndices, int drawcount, long pBaseVertex) { - rejectExitCapture(); - drawCalls += drawcount; - RENDER_BACKEND.multiDrawElementsBaseVertex(mode, pCount, type, pIndices, drawcount, pBaseVertex); - } - - public static void glDrawElementsBaseVertex(int mode, int count, int type, long indices, int basevertex) { - rejectExitCapture(); - drawCalls++; - RENDER_BACKEND.drawElementsBaseVertex(mode, count, type, indices, basevertex); - } - - public static void glDrawElementsInstanced(int mode, int count, int type, long indices, int primcount) { - rejectExitCapture(); - drawCalls++; - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - if (mode == GL11.GL_QUADS) { - QuadConverter.drawQuadElementsAsTrianglesInstanced(glCtx, count, type, indices, primcount); - return; - } - warnIfInstancedWideLines(mode); - preDraw(glCtx, mode); - RENDER_BACKEND.drawElementsInstanced(mode, count, type, indices, primcount); - } finally { - if (locked) releaseDrawLock(); - } - } - - public static void glDrawArraysInstanced(int mode, int first, int count, int primcount) { - rejectExitCapture(); - drawCalls++; - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - if (mode == GL11.GL_QUADS) { - QuadConverter.drawQuadsAsTrianglesInstanced(glCtx, first, count, primcount); - } else if (mode == GL11.GL_QUAD_STRIP) { - preDraw(glCtx, GL11.GL_TRIANGLES); - RENDER_BACKEND.drawArraysInstanced(GL11.GL_TRIANGLE_STRIP, first, count & ~1, primcount); - } else if (mode == GL11.GL_POLYGON) { - preDraw(glCtx, GL11.GL_TRIANGLES); - RENDER_BACKEND.drawArraysInstanced(GL11.GL_TRIANGLE_FAN, first, count, primcount); - } else { - warnIfInstancedWideLines(mode); - preDraw(glCtx, mode); - RENDER_BACKEND.drawArraysInstanced(mode, first, count, primcount); - } - } finally { - if (locked) releaseDrawLock(); - } - } - - public static void glDrawRangeElements(int mode, int start, int end, int count, int type, long indices) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - if (widensLineDraw(mode, count)) { - drawLinesAsQuads(glCtx, lineElementsFromBuffer(glCtx, mode, count, type, indices)); - return; - } - preDraw(glCtx, mode); - RENDER_BACKEND.drawRangeElements(mode, start, end, count, type, indices); - } finally { - if (locked) releaseDrawLock(); - } - } - - public static void glDrawRangeElementsBaseVertex(int mode, int start, int end, int count, int type, long indices, int baseVertex) { - rejectExitCapture(); - RENDER_BACKEND.drawRangeElementsBaseVertex(mode, start, end, count, type, indices, baseVertex); - } - - public static void glMultiDrawArrays(int mode, IntBuffer firsts, IntBuffer counts) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - if (LineQuads.isLineMode(mode) && ffpWidensLineQuads()) { - for (int i = firsts.position(); i < firsts.limit(); i++) { - final int count = counts.get(counts.position() + i - firsts.position()); - if (LineQuads.segmentCount(mode, count) == 0) continue; - drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawArraysFromAttribs(mode, firsts.get(i), count)); - } - return; - } - preDraw(glCtx, mode); - RENDER_BACKEND.multiDrawArrays(mode, firsts, counts); - } finally { - if (locked) releaseDrawLock(); - } - } - - public static void glPrimitiveRestartIndex(int index) { - rejectExitCapture(); - RENDER_BACKEND.primitiveRestartIndex(index); - } - - public static void glPointParameterf(int pname, float param) { - pointParameter(pname, param, 0.0f, 0.0f); - } - - public static void glPointParameteri(int pname, int param) { - pointParameter(pname, param, 0.0f, 0.0f); - } - - public static void glPointParameter(int pname, FloatBuffer params) { - final int pos = params.position(); - final boolean attenuation = pname == GL14.GL_POINT_DISTANCE_ATTENUATION; - pointParameter(pname, params.get(pos), attenuation ? params.get(pos + 1) : 0.0f, attenuation ? params.get(pos + 2) : 0.0f); - } - - public static void glPointParameter(int pname, IntBuffer params) { - final int pos = params.position(); - final boolean attenuation = pname == GL14.GL_POINT_DISTANCE_ATTENUATION; - pointParameter(pname, params.get(pos), attenuation ? params.get(pos + 1) : 0.0f, attenuation ? params.get(pos + 2) : 0.0f); - } - - private static void pointParameter(int pname, float v0, float v1, float v2) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final PointStateStack point = glCtx.pointState; - switch (pname) { - case GL14.GL_POINT_SIZE_MIN -> { - if (!(v0 < 0.0f) && point.getMinSize() != v0) mod(point).setMinSize(v0); - } - case GL14.GL_POINT_SIZE_MAX -> { - if (!(v0 < 0.0f) && point.getMaxSize() != v0) mod(point).setMaxSize(v0); - } - case GL14.GL_POINT_FADE_THRESHOLD_SIZE -> { - if (!(v0 < 0.0f) && point.getFadeThreshold() != v0) { - mod(point).setFadeThreshold(v0); - RENDER_BACKEND.pointParameterf(pname, v0); - } - } - case GL14.GL_POINT_DISTANCE_ATTENUATION -> { - if (point.getAttenuationConstant() == v0 && point.getAttenuationLinear() == v1 && point.getAttenuationQuadratic() == v2) return; - mod(point); - point.setAttenuationConstant(v0); - point.setAttenuationLinear(v1); - point.setAttenuationQuadratic(v2); - } - case GL20.GL_POINT_SPRITE_COORD_ORIGIN -> { - final int origin = (int) v0; - if ((origin == GL20.GL_LOWER_LEFT || origin == GL20.GL_UPPER_LEFT) && point.getSpriteCoordOrigin() != origin) { - mod(point).setSpriteCoordOrigin(origin); - RENDER_BACKEND.pointParameteri(pname, origin); - } - } - default -> RENDER_BACKEND.pointParameterf(pname, v0); - } - } - - private static void applyPointState(GLContextState glCtx) { - final PointStateStack point = glCtx.pointState; - RENDER_BACKEND.pointSize(point.getSize()); - RENDER_BACKEND.pointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, point.getFadeThreshold()); - RENDER_BACKEND.pointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, point.getSpriteCoordOrigin()); - } - - private static boolean isLegacyHint(int target) { - return switch (target) { - case GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_POINT_SMOOTH_HINT, GL11.GL_FOG_HINT, GL14.GL_GENERATE_MIPMAP_HINT -> true; - default -> false; - }; - } - - private static int hintShift(int target) { - return switch (target) { - case GL11.GL_PERSPECTIVE_CORRECTION_HINT -> 0; - case GL11.GL_POINT_SMOOTH_HINT -> 2; - case GL11.GL_LINE_SMOOTH_HINT -> 4; - case GL11.GL_POLYGON_SMOOTH_HINT -> 6; - case GL11.GL_FOG_HINT -> 8; - case GL13.GL_TEXTURE_COMPRESSION_HINT -> 10; - case GL14.GL_GENERATE_MIPMAP_HINT -> 12; - case GL20.GL_FRAGMENT_SHADER_DERIVATIVE_HINT -> 14; - default -> -1; - }; - } - - private static int hintMode(int packed, int shift) { - return switch (packed >>> shift & 3) { - case 1 -> GL11.GL_FASTEST; - case 2 -> GL11.GL_NICEST; - default -> GL11.GL_DONT_CARE; - }; - } - - private static final int[] DRIVER_HINTS = { - GL11.GL_LINE_SMOOTH_HINT, GL11.GL_POLYGON_SMOOTH_HINT, GL13.GL_TEXTURE_COMPRESSION_HINT, GL20.GL_FRAGMENT_SHADER_DERIVATIVE_HINT - }; - - private static void applyHintState(GLContextState glCtx) { - final int packed = glCtx.hintState.getValue(); - for (final int target : DRIVER_HINTS) { - RENDER_BACKEND.hint(target, hintMode(packed, hintShift(target))); - } - } - - private static void prepareClientArrays(GLContextState glCtx) { - final VAOManager vaos = glCtx.vaos; - if (vaos.hasAnyClientSideEnabledAttrib()) { - vaos.uploadClientArraysToVBO(); - } - } - - public static void glDrawArrays(int mode, int first, int count) { - rejectExitCapture(); - drawCalls++; - CommandRecorder savedRecorder = null; - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - final DirectTessellator result = ImmediateModeRecorder.processDrawArraysFromAttribs(mode, first, count); - if (result != null) { - DisplayListManager.addImmediateModeDraw(result); - } - if (recordMode == RecordMode.COMPILE) { - return; - } - DisplayListManager.flushAll(); - savedRecorder = DisplayListManager.pauseRecording(); - } else if (FeedbackManager.isFeedbackMode()) { - FeedbackManager.processDrawArrays(mode, first, count); - return; - } - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - if (widensLineDraw(mode, count)) { - drawLinesAsQuads(glCtx, ImmediateModeRecorder.processDrawArraysFromAttribs(mode, first, count)); - return; - } - final boolean ffpExt = FfpExtendedAttribs.maybeBind(glCtx, mode, first, count); - try { - if (mode == GL11.GL_QUADS) { - QuadConverter.drawQuadsAsTriangles(glCtx, first, count); - } else if (mode == GL11.GL_QUAD_STRIP) { - preDraw(glCtx, GL11.GL_TRIANGLES); - RENDER_BACKEND.drawArrays(GL11.GL_TRIANGLE_STRIP, first, count & ~1); - } else if (mode == GL11.GL_POLYGON) { - preDraw(glCtx, GL11.GL_TRIANGLES); - RENDER_BACKEND.drawArrays(GL11.GL_TRIANGLE_FAN, first, count); - } else { - preDraw(glCtx, mode); - RENDER_BACKEND.drawArrays(mode, first, count); - } - } finally { - if (ffpExt) FfpExtendedAttribs.unbind(); - } - } finally { - if (locked) releaseDrawLock(); - if (savedRecorder != null) DisplayListManager.resumeRecording(savedRecorder); - } - } - - private static boolean isLegalClientArray(int conv, int size, int type, int stride) { - return isLegalPointer(VAOManager.isLegalConventional(conv, size, type), "client-array", "client array", conv, size, type, stride); - } - - private static boolean isLegalVertexAttrib(int index, int size, int type, int stride, boolean integer) { - return isLegalPointer(VAOManager.isLegalGeneric(index, size, type, integer), "vertex-attrib", "vertex attribute", index, size, type, stride); - } - - // The WARN_ONCE check comes first so a caller repeating the mistake every frame does not capture a stack each time. - private static boolean isLegalPointer(boolean legal, String key, String what, int slot, int size, int type, int stride) { - if (stride < 0 && WARN_ONCE.add(key + "-stride")) { - LOGGER.warn("Negative {} stride {}", what, stride, new Throwable("call site")); - } - if (legal) return true; - if (WARN_ONCE.add(key + "-" + slot)) { - LOGGER.warn("Ignoring {} {} with illegal size {} / type 0x{}", what, slot, size, Integer.toHexString(type), new Throwable("call site")); - } - return false; - } - - private static boolean isValidVertexAttribIndex(int index, String function) { - if (index >= 0 && index < VAOManager.MAX_ATTRIBS) return true; - if (WARN_ONCE.add(function)) { - LOGGER.warn("{}({}) is outside the {} supported vertex attributes; ignoring", function, index, VAOManager.MAX_ATTRIBS, new Throwable("call site")); - } - return false; - } - - private static void ffpClientArrayPointer(int conv, int size, int type, boolean normalized, int stride, long offset) { - rejectExitCapture(); - if (!isLegalClientArray(conv, size, type, stride)) return; - final GLContextState glCtx = ctx(); - if (glCtx.vaos.setConventional(conv, size, type, normalized, stride, offset, glCtx.boundVBO)) { - RENDER_BACKEND.vertexAttribPointer(VAOManager.conventionalLocation(conv), size, type, normalized, stride, offset); - } - } - - private static void ffpClientArrayPointer(int conv, int size, int type, boolean normalized, int stride, ByteBuffer pointer) { - rejectExitCapture(); - if (!isLegalClientArray(conv, size, type, stride)) return; - ctx().vaos.setConventional(conv, size, type, normalized, stride, pointer); - } - - private static final int FIELD_SIZE = 0, FIELD_TYPE = 1 << 8, FIELD_STRIDE = 2 << 8, FIELD_BINDING = 3 << 8, FIELD_POINTER = 4 << 8; - - private static int clientArrayField(GLContextState glCtx, int pname) { - return switch (pname) { - case GL11.GL_VERTEX_ARRAY_SIZE -> VAOManager.CONV_POSITION | FIELD_SIZE; - case GL11.GL_VERTEX_ARRAY_TYPE -> VAOManager.CONV_POSITION | FIELD_TYPE; - case GL11.GL_VERTEX_ARRAY_STRIDE -> VAOManager.CONV_POSITION | FIELD_STRIDE; - case GL15.GL_VERTEX_ARRAY_BUFFER_BINDING -> VAOManager.CONV_POSITION | FIELD_BINDING; - case GL11.GL_VERTEX_ARRAY_POINTER -> VAOManager.CONV_POSITION | FIELD_POINTER; - case GL11.GL_NORMAL_ARRAY_TYPE -> VAOManager.CONV_NORMAL | FIELD_TYPE; - case GL11.GL_NORMAL_ARRAY_STRIDE -> VAOManager.CONV_NORMAL | FIELD_STRIDE; - case GL15.GL_NORMAL_ARRAY_BUFFER_BINDING -> VAOManager.CONV_NORMAL | FIELD_BINDING; - case GL11.GL_NORMAL_ARRAY_POINTER -> VAOManager.CONV_NORMAL | FIELD_POINTER; - case GL11.GL_COLOR_ARRAY_SIZE -> VAOManager.CONV_COLOR | FIELD_SIZE; - case GL11.GL_COLOR_ARRAY_TYPE -> VAOManager.CONV_COLOR | FIELD_TYPE; - case GL11.GL_COLOR_ARRAY_STRIDE -> VAOManager.CONV_COLOR | FIELD_STRIDE; - case GL15.GL_COLOR_ARRAY_BUFFER_BINDING -> VAOManager.CONV_COLOR | FIELD_BINDING; - case GL11.GL_COLOR_ARRAY_POINTER -> VAOManager.CONV_COLOR | FIELD_POINTER; - case GL11.GL_INDEX_ARRAY_TYPE -> VAOManager.CONV_INDEX | FIELD_TYPE; - case GL11.GL_INDEX_ARRAY_STRIDE -> VAOManager.CONV_INDEX | FIELD_STRIDE; - case GL15.GL_INDEX_ARRAY_BUFFER_BINDING -> VAOManager.CONV_INDEX | FIELD_BINDING; - case GL11.GL_INDEX_ARRAY_POINTER -> VAOManager.CONV_INDEX | FIELD_POINTER; - case GL11.GL_EDGE_FLAG_ARRAY_STRIDE -> VAOManager.CONV_EDGE_FLAG | FIELD_STRIDE; - case GL15.GL_EDGE_FLAG_ARRAY_BUFFER_BINDING -> VAOManager.CONV_EDGE_FLAG | FIELD_BINDING; - case GL11.GL_EDGE_FLAG_ARRAY_POINTER -> VAOManager.CONV_EDGE_FLAG | FIELD_POINTER; - case GL14.GL_SECONDARY_COLOR_ARRAY_SIZE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_SIZE; - case GL14.GL_SECONDARY_COLOR_ARRAY_TYPE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_TYPE; - case GL14.GL_SECONDARY_COLOR_ARRAY_STRIDE -> VAOManager.CONV_SECONDARY_COLOR | FIELD_STRIDE; - case GL15.GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING -> VAOManager.CONV_SECONDARY_COLOR | FIELD_BINDING; - case GL14.GL_SECONDARY_COLOR_ARRAY_POINTER -> VAOManager.CONV_SECONDARY_COLOR | FIELD_POINTER; - case GL14.GL_FOG_COORDINATE_ARRAY_TYPE -> VAOManager.CONV_FOG_COORD | FIELD_TYPE; - case GL14.GL_FOG_COORDINATE_ARRAY_STRIDE -> VAOManager.CONV_FOG_COORD | FIELD_STRIDE; - case GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING -> VAOManager.CONV_FOG_COORD | FIELD_BINDING; - case GL14.GL_FOG_COORDINATE_ARRAY_POINTER -> VAOManager.CONV_FOG_COORD | FIELD_POINTER; - case GL11.GL_TEXTURE_COORD_ARRAY_SIZE -> texCoordConventional(glCtx) | FIELD_SIZE; - case GL11.GL_TEXTURE_COORD_ARRAY_TYPE -> texCoordConventional(glCtx) | FIELD_TYPE; - case GL11.GL_TEXTURE_COORD_ARRAY_STRIDE -> texCoordConventional(glCtx) | FIELD_STRIDE; - case GL15.GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING -> texCoordConventional(glCtx) | FIELD_BINDING; - case GL11.GL_TEXTURE_COORD_ARRAY_POINTER -> texCoordConventional(glCtx) | FIELD_POINTER; - default -> -1; - }; - } - - private static int clientArrayParam(GLContextState glCtx, int key) { - final int conv = key & 0xFF; - final VAOManager.Attrib a = glCtx.vaos.conventional(conv); - final boolean specified = a != null && a.size != 0; - return switch (key & ~0xFF) { - case FIELD_SIZE -> specified ? a.size : conv == VAOManager.CONV_SECONDARY_COLOR ? 3 : 4; - case FIELD_TYPE -> specified ? a.type : GL11.GL_FLOAT; - case FIELD_STRIDE -> specified ? a.stride : 0; - default -> specified ? a.vboId : 0; - }; - } - - public static ByteBuffer glGetPointer(int pname, long result_size) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final int key = clientArrayField(glCtx, pname); - if ((key & ~0xFF) != FIELD_POINTER) return null; - final VAOManager.Attrib a = glCtx.vaos.conventional(key & 0xFF); - if (a == null) return null; - final long address = a.clientPointer != null ? MemoryUtilities.memAddress(a.clientPointer) : a.offset; - return address == 0 ? null : MemoryUtilities.memByteBuffer(address, (int) result_size); - } - - public static void glEdgeFlagPointer(int stride, ByteBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_EDGE_FLAG, 1, GL11.GL_UNSIGNED_BYTE, false, stride, pointer); - } - - public static void glEdgeFlagPointer(int stride, long pointer_buffer_offset) { - ffpClientArrayPointer(VAOManager.CONV_EDGE_FLAG, 1, GL11.GL_UNSIGNED_BYTE, false, stride, pointer_buffer_offset); - } - - public static void glFogCoordPointer(int stride, FloatBuffer data) { - ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(data)); - } - - public static void glFogCoordPointer(int stride, DoubleBuffer data) { - ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(data)); - } - - public static void glFogCoordPointer(int type, int stride, long data_buffer_offset) { - ffpClientArrayPointer(VAOManager.CONV_FOG_COORD, 1, type, false, stride, data_buffer_offset); - } - - public static void glSecondaryColorPointer(int size, int stride, FloatBuffer data) { - ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, GL11.GL_FLOAT, true, stride, MemoryUtilities.memByteBuffer(data)); - } - - public static void glSecondaryColorPointer(int size, int stride, DoubleBuffer data) { - ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, GL11.GL_DOUBLE, true, stride, MemoryUtilities.memByteBuffer(data)); - } - - public static void glSecondaryColorPointer(int size, boolean unsigned, int stride, ByteBuffer data) { - final int type = unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE; - ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, type, true, stride, data); - } - - public static void glSecondaryColorPointer(int size, int type, int stride, long data_buffer_offset) { - ffpClientArrayPointer(VAOManager.CONV_SECONDARY_COLOR, size, type, true, stride, data_buffer_offset); - } - - private static void pointAttrib(GLContextState glCtx, int index) { - final VAOManager vaos = glCtx.vaos; - final VAOManager.Attrib a = vaos.attrib(index); - if (a == null) return; - RENDER_BACKEND.vertexAttribDivisor(index, a.divisor); - if (a.size == 0 || a.vboId == 0 || !vaos.isBufferLive(a)) return; - if (glCtx.boundVBO != a.vboId) glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId); - if (a.integer) { - RENDER_BACKEND.vertexAttribIPointer(index, a.size, a.type, a.stride, a.offset); - } else { - RENDER_BACKEND.vertexAttribPointer(index, a.size, a.type, a.normalized, a.stride, a.offset); - } - } - - private static void repointAttrib(GLContextState glCtx, int index) { - final int savedVBO = glCtx.boundVBO; - pointAttrib(glCtx, index); - if (glCtx.boundVBO != savedVBO) glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); - } - - public static void glVertexPointer(int size, int stride, IntBuffer pointer) { - glVertexPointer(size, GL11.GL_INT, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glVertexPointer(int size, int stride, ShortBuffer pointer) { - glVertexPointer(size, GL11.GL_SHORT, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glVertexPointer(int size, int stride, FloatBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_POSITION, size, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glVertexPointer(int size, int stride, DoubleBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_POSITION, size, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glVertexPointer(int size, int type, int stride, ByteBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_POSITION, size, type, false, stride, pointer); - } - - public static void glVertexPointer(int size, int type, int stride, long pointer_buffer_offset) { - ffpClientArrayPointer(VAOManager.CONV_POSITION, size, type, false, stride, pointer_buffer_offset); - } - - public static void glColorPointer(int size, int stride, FloatBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_COLOR, size, GL11.GL_FLOAT, Usage.COLOR.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glColorPointer(int size, int stride, DoubleBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_COLOR, size, GL11.GL_DOUBLE, Usage.COLOR.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glColorPointer(int size, int type, int stride, ByteBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer); - } - - public static void glColorPointer(int size, boolean unsigned, int stride, ByteBuffer pointer) { - final int type = unsigned ? GL11.GL_UNSIGNED_BYTE : GL11.GL_BYTE; - ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer); - } - - public static void glColorPointer(int size, int type, int stride, long pointer_buffer_offset) { - ffpClientArrayPointer(VAOManager.CONV_COLOR, size, type, Usage.COLOR.isNormalized(), stride, pointer_buffer_offset); - } - - public static void glNormalPointer(int stride, FloatBuffer pointer) { - glNormalPointer(GL11.GL_FLOAT, stride, pointer); - } - - public static void glNormalPointer(int stride, ByteBuffer pointer) { - glNormalPointer(GL11.GL_BYTE, stride, pointer); - } - - public static void glNormalPointer(int stride, IntBuffer pointer) { - glNormalPointer(GL11.GL_INT, stride, pointer); - } - - public static void glNormalPointer(int stride, DoubleBuffer pointer) { - glNormalPointer(GL11.GL_DOUBLE, stride, pointer); - } - - public static void glNormalPointer(int type, int stride, ByteBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, type, Usage.NORMAL.isNormalized(), stride, pointer); - } - - public static void glNormalPointer(int type, int stride, FloatBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_FLOAT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glNormalPointer(int type, int stride, ShortBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_SHORT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glNormalPointer(int type, int stride, IntBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_INT, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glNormalPointer(int type, int stride, DoubleBuffer pointer) { - ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_DOUBLE, Usage.NORMAL.isNormalized(), stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glNormalPointer(int type, int stride, long pointer_buffer_offset) { - ffpClientArrayPointer(VAOManager.CONV_NORMAL, 3, type, Usage.NORMAL.isNormalized(), stride, pointer_buffer_offset); - } - - public static void glTexCoordPointer(int size, int type, int stride, ByteBuffer pointer) { - ffpClientArrayPointer(texCoordConventional(ctx()), size, type, false, stride, pointer); - } - - public static void glTexCoordPointer(int size, int stride, FloatBuffer pointer) { - glTexCoordPointer(size, GL11.GL_FLOAT, stride, pointer); - } - - public static void glTexCoordPointer(int size, int stride, IntBuffer pointer) { - glTexCoordPointer(size, GL11.GL_INT, stride, pointer); - } - - public static void glTexCoordPointer(int size, int stride, ShortBuffer pointer) { - glTexCoordPointer(size, GL11.GL_SHORT, stride, pointer); - } - - public static void glTexCoordPointer(int size, int stride, DoubleBuffer pointer) { - glTexCoordPointer(size, GL11.GL_DOUBLE, stride, pointer); - } - - public static void glTexCoordPointer(int size, int type, int stride, FloatBuffer pointer) { - ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_FLOAT, false, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glTexCoordPointer(int size, int type, int stride, ShortBuffer pointer) { - ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_SHORT, false, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glTexCoordPointer(int size, int type, int stride, IntBuffer pointer) { - ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_INT, false, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glTexCoordPointer(int size, int type, int stride, DoubleBuffer pointer) { - ffpClientArrayPointer(texCoordConventional(ctx()), size, GL11.GL_DOUBLE, false, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glTexCoordPointer(int size, int type, int stride, long pointer_buffer_offset) { - ffpClientArrayPointer(texCoordConventional(ctx()), size, type, false, stride, pointer_buffer_offset); - } - - public static void glEnableClientState(int cap) { - rejectExitCapture(); - setClientArrayCap(ctx(), cap, true); - } - - public static void glDisableClientState(int cap) { - rejectExitCapture(); - setClientArrayCap(ctx(), cap, false); - } - - private static boolean setClientArrayCap(GLContextState glCtx, int cap, boolean enabled) { - final int conv = clientStateToConventional(glCtx, cap); - if (conv < 0) return false; - setClientArrayEnabled(glCtx, conv, enabled); - return true; - } - - private static void setClientArrayEnabled(GLContextState glCtx, int conv, boolean enabled) { - final VAOManager vaos = glCtx.vaos; - final boolean repoint = vaos.setConventionalEnabled(conv, enabled); - final int index = VAOManager.conventionalLocation(conv); - if (index >= 0) { - if (repoint) repointAttrib(glCtx, index); - syncAttribEnable(glCtx, index); - } - final int flag = conventionalVertexFlag(conv); - if (flag == 0) return; - if (enabled) { - vaos.enableClientVertexFlag(flag); - } else { - vaos.disableClientVertexFlag(flag); - } - } - - private static void syncAttribEnable(GLContextState glCtx, int index) { - if (glCtx.vaos.isAttribEnabled(index)) { - RENDER_BACKEND.enableVertexAttribArray(index); - } else { - RENDER_BACKEND.disableVertexAttribArray(index); - } - } - - public static void glVertexAttrib2f(int index, float v0, float v1) { - glVertexAttrib4f(index, v0, v1, 0.0f, 1.0f); - } - - public static void glVertexAttrib2s(int index, short v0, short v1) { - glVertexAttrib4f(index, v0, v1, 0.0f, 1.0f); - } - - public static void glVertexAttrib3f(int index, float v0, float v1, float v2) { - glVertexAttrib4f(index, v0, v1, v2, 1.0f); - } - - public static void glVertexAttrib4f(int index, float v0, float v1, float v2, float v3) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordVertexAttrib(index, v0, v1, v2, v3); - if (mode == RecordMode.COMPILE) return; - } - beforeUncapturedStateChange(); - RENDER_BACKEND.vertexAttrib4f(index, v0, v1, v2, v3); - } - - public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset) { - rejectExitCapture(); - if (!isLegalVertexAttrib(index, size, type, stride, false)) return; - final GLContextState glCtx = ctx(); - if (glCtx.vaos.setAttribute(index, size, type, normalized, stride, offset, glCtx.boundVBO)) { - RENDER_BACKEND.vertexAttribPointer(index, size, type, normalized, stride, offset); - } - } - - public static void glVertexAttribPointer(int index, int size, boolean normalized, int stride, FloatBuffer pointer) { - glVertexAttribPointer(index, size, GL11.GL_FLOAT, normalized, stride, pointer); - } - - public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, FloatBuffer pointer) { - glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, DoubleBuffer pointer) { - glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, IntBuffer pointer) { - glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, ShortBuffer pointer) { - glVertexAttribPointer(index, size, type, normalized, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, ByteBuffer pointer) { - rejectExitCapture(); - if (!isLegalVertexAttrib(index, size, type, stride, false)) return; - ctx().vaos.setAttribute(index, size, type, normalized, stride, pointer); - } - - public static void glVertexAttribIPointer(int index, int size, int type, int stride, long offset) { - rejectExitCapture(); - if (!isLegalVertexAttrib(index, size, type, stride, true)) return; - final GLContextState glCtx = ctx(); - if (glCtx.vaos.setIntegerAttribute(index, size, type, stride, offset, glCtx.boundVBO)) { - RENDER_BACKEND.vertexAttribIPointer(index, size, type, stride, offset); - } - } - - public static void glVertexAttribIPointer(int index, int size, int type, int stride, ByteBuffer pointer) { - rejectExitCapture(); - if (!isLegalVertexAttrib(index, size, type, stride, true)) return; - ctx().vaos.setIntegerAttribute(index, size, type, stride, pointer); - } - - public static void glVertexAttribIPointer(int index, int size, int type, int stride, IntBuffer pointer) { - glVertexAttribIPointer(index, size, type, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glVertexAttribIPointer(int index, int size, int type, int stride, ShortBuffer pointer) { - glVertexAttribIPointer(index, size, type, stride, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glVertexAttribDivisor(int index, int divisor) { - rejectExitCapture(); - if (ctx().vaos.setDivisor(index, divisor)) RENDER_BACKEND.vertexAttribDivisor(index, divisor); - } - - public static void glVertexAttribDivisorARB(int index, int divisor) { glVertexAttribDivisor(index, divisor); } - public static void glBindVertexBuffer(int bindingindex, int buffer, long offset, int stride) { rejectExitCapture(); RENDER_BACKEND.bindVertexBuffer(bindingindex, buffer, offset, stride); } - public static void glVertexAttribFormat(int attribindex, int size, int type, boolean normalized, int relativeoffset) { rejectExitCapture(); RENDER_BACKEND.vertexAttribFormat(attribindex, size, type, normalized, relativeoffset); } - public static void glVertexAttribIFormat(int attribindex, int size, int type, int relativeoffset) { rejectExitCapture(); RENDER_BACKEND.vertexAttribIFormat(attribindex, size, type, relativeoffset); } - public static void glVertexAttribBinding(int attribindex, int bindingindex) { rejectExitCapture(); RENDER_BACKEND.vertexAttribBinding(attribindex, bindingindex); } - - public static void glEnableVertexAttribArray(int index) { - rejectExitCapture(); - if (!isValidVertexAttribIndex(index, "glEnableVertexAttribArray")) return; - final GLContextState glCtx = ctx(); - if (glCtx.vaos.enableAttribute(index)) repointAttrib(glCtx, index); - RENDER_BACKEND.enableVertexAttribArray(index); - } - - public static void glDisableVertexAttribArray(int index) { - rejectExitCapture(); - if (!isValidVertexAttribIndex(index, "glDisableVertexAttribArray")) return; - final GLContextState glCtx = ctx(); - if (glCtx.vaos.disableAttribute(index)) repointAttrib(glCtx, index); - if (!glCtx.vaos.isAttribEnabled(index)) RENDER_BACKEND.disableVertexAttribArray(index); - } - - private static int clientStateToConventional(GLContextState glCtx, int cap) { - return switch (cap) { - case GL11.GL_VERTEX_ARRAY -> VAOManager.CONV_POSITION; - case GL11.GL_NORMAL_ARRAY -> VAOManager.CONV_NORMAL; - case GL11.GL_COLOR_ARRAY -> VAOManager.CONV_COLOR; - case GL11.GL_INDEX_ARRAY -> VAOManager.CONV_INDEX; - case GL11.GL_EDGE_FLAG_ARRAY -> VAOManager.CONV_EDGE_FLAG; - case GL14.GL_SECONDARY_COLOR_ARRAY -> VAOManager.CONV_SECONDARY_COLOR; - case GL14.GL_FOG_COORDINATE_ARRAY -> VAOManager.CONV_FOG_COORD; - case GL11.GL_TEXTURE_COORD_ARRAY -> texCoordConventional(glCtx); - default -> -1; - }; - } - - private static int conventionalVertexFlag(int conv) { - return switch (conv) { - case VAOManager.CONV_COLOR -> VertexFlags.COLOR_BIT; - case VAOManager.CONV_NORMAL -> VertexFlags.NORMAL_BIT; - case VAOManager.CONV_TEX0 -> VertexFlags.TEXTURE_BIT; - case VAOManager.CONV_TEX0 + 1 -> VertexFlags.BRIGHTNESS_BIT; - default -> 0; - }; - } - - static final int CLIENT_ATTRIB_STACK_DEPTH = 16; - public static void glPushClientAttrib(int mask) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final int sp = glCtx.clientAttribStackPointer; - if (sp < CLIENT_ATTRIB_STACK_DEPTH) { - glCtx.clientAttribSavedMask[sp] = mask; - if ((mask & GL11.GL_CLIENT_PIXEL_STORE_BIT) != 0) { - glCtx.clientAttribSavedPixelPack[sp] = glCtx.pixelPackState; - glCtx.clientAttribSavedPixelUnpack[sp] = glCtx.pixelUnpackState; - glCtx.clientAttribSavedPackBuffer[sp] = glCtx.boundPixelPackBuffer; - glCtx.clientAttribSavedUnpackBuffer[sp] = glCtx.boundPixelUnpackBuffer; - } - if ((mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0) { - VAOManager.ClientArrays saved = glCtx.clientAttribSavedArrays[sp]; - if (saved == null) glCtx.clientAttribSavedArrays[sp] = saved = new VAOManager.ClientArrays(); - saved.boundVAO = glCtx.boundVAO; - saved.boundVBO = glCtx.boundVBO; - saved.boundEBO = glCtx.vaos.boundEBO; - saved.clientActiveTextureUnit = glCtx.clientActiveTextureUnit; - glCtx.vaos.saveClientArrays(saved); - } - glCtx.clientAttribStackPointer = sp + 1; - } - } - - public static void glPopClientAttrib() { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (glCtx.clientAttribStackPointer > 0) { - final int sp = --glCtx.clientAttribStackPointer; - final int mask = glCtx.clientAttribSavedMask[sp]; - if ((mask & GL11.GL_CLIENT_PIXEL_STORE_BIT) != 0) { - final PixelStoreState pack = glCtx.clientAttribSavedPixelPack[sp]; - final PixelStoreState unpack = glCtx.clientAttribSavedPixelUnpack[sp]; - glCtx.clientAttribSavedPixelPack[sp] = null; - glCtx.clientAttribSavedPixelUnpack[sp] = null; - PixelStoreState.applyDiff(glCtx.pixelPackState, pack, true); - glCtx.pixelPackState = pack; - PixelStoreState.applyDiff(glCtx.pixelUnpackState, unpack, false); - glCtx.pixelUnpackState = unpack; - final int packBuffer = glCtx.clientAttribSavedPackBuffer[sp]; - if (glCtx.boundPixelPackBuffer != packBuffer) glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer); - final int unpackBuffer = glCtx.clientAttribSavedUnpackBuffer[sp]; - if (glCtx.boundPixelUnpackBuffer != unpackBuffer) glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer); - } - if ((mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0) { - restoreClientArrays(glCtx, glCtx.clientAttribSavedArrays[sp]); - } - } - } - - private static void restoreClientArrays(GLContextState glCtx, VAOManager.ClientArrays saved) { - final VAOManager vaos = glCtx.vaos; - if (!vaos.vaoMap.containsKey(saved.boundVAO)) return; - bindVertexArrayInternal(glCtx, saved.boundVAO); - glCtx.clientActiveTextureUnit = saved.clientActiveTextureUnit; - if (vaos.isBufferLive(saved.boundVBO, saved)) { - final int changed = vaos.restoreClientArrays(saved); - for (int pointers = changed & 0xFFFF; pointers != 0; pointers &= pointers - 1) { - pointAttrib(glCtx, Integer.numberOfTrailingZeros(pointers)); - } - for (int enables = changed >>> 16; enables != 0; enables &= enables - 1) { - syncAttribEnable(glCtx, Integer.numberOfTrailingZeros(enables)); - } - if (glCtx.boundVBO != saved.boundVBO) glBindBuffer(GL15.GL_ARRAY_BUFFER, saved.boundVBO); - } - if (vaos.boundEBO != saved.boundEBO && vaos.isBufferLive(saved.boundEBO, saved)) glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, saved.boundEBO); - } - - public static void glInterleavedArrays(int format, int stride, long pointer) { - interleavedArrays(format, stride, pointer, null); - } - - private static void interleavedPointer(int conv, int size, int type, boolean normalized, int stride, long pointer, ByteBuffer base, int offset) { - if (base == null) { - ffpClientArrayPointer(conv, size, type, normalized, stride, pointer + offset); - } else { - ffpClientArrayPointer(conv, size, type, normalized, stride, MemoryUtilities.memSlice(base, offset, base.remaining() - offset)); - } - } - - private static void interleavedArrays(int format, int stride, long pointer, ByteBuffer base) { - rejectExitCapture(); - // Mesa _mesa_get_interleaved_layout decomposition - final int f = 4; // sizeof(float) - final int c = f * ((4 + (f - 1)) / f); // 4 ubytes padded to float alignment = 4 - - boolean tflag = false, cflag = false, nflag = false; - int tcomps = 0, ccomps = 0, vcomps = 0; - int ctype = 0; - final int toffset = 0; - int coffset = 0; - int noffset = 0; - int voffset = 0; - final int defstride; - - switch (format) { - case GL11.GL_V2F: - vcomps = 2; defstride = 2 * f; break; - case GL11.GL_V3F: - vcomps = 3; defstride = 3 * f; break; - case GL11.GL_C4UB_V2F: - cflag = true; ccomps = 4; vcomps = 2; - ctype = GL11.GL_UNSIGNED_BYTE; voffset = c; defstride = c + 2 * f; break; - case GL11.GL_C4UB_V3F: - cflag = true; ccomps = 4; vcomps = 3; - ctype = GL11.GL_UNSIGNED_BYTE; voffset = c; defstride = c + 3 * f; break; - case GL11.GL_C3F_V3F: - cflag = true; ccomps = 3; vcomps = 3; - ctype = GL11.GL_FLOAT; voffset = 3 * f; defstride = 6 * f; break; - case GL11.GL_N3F_V3F: - nflag = true; vcomps = 3; - voffset = 3 * f; defstride = 6 * f; break; - case GL11.GL_C4F_N3F_V3F: - cflag = true; nflag = true; ccomps = 4; vcomps = 3; - ctype = GL11.GL_FLOAT; noffset = 4 * f; voffset = 7 * f; defstride = 10 * f; break; - case GL11.GL_T2F_V3F: - tflag = true; tcomps = 2; vcomps = 3; - voffset = 2 * f; defstride = 5 * f; break; - case GL11.GL_T4F_V4F: - tflag = true; tcomps = 4; vcomps = 4; - voffset = 4 * f; defstride = 8 * f; break; - case GL11.GL_T2F_C4UB_V3F: - tflag = true; cflag = true; tcomps = 2; ccomps = 4; vcomps = 3; - ctype = GL11.GL_UNSIGNED_BYTE; coffset = 2 * f; voffset = c + 2 * f; defstride = c + 5 * f; break; - case GL11.GL_T2F_C3F_V3F: - tflag = true; cflag = true; tcomps = 2; ccomps = 3; vcomps = 3; - ctype = GL11.GL_FLOAT; coffset = 2 * f; voffset = 5 * f; defstride = 8 * f; break; - case GL11.GL_T2F_N3F_V3F: - tflag = true; nflag = true; tcomps = 2; vcomps = 3; - noffset = 2 * f; voffset = 5 * f; defstride = 8 * f; break; - case GL11.GL_T2F_C4F_N3F_V3F: - tflag = true; cflag = true; nflag = true; tcomps = 2; ccomps = 4; vcomps = 3; - ctype = GL11.GL_FLOAT; coffset = 2 * f; noffset = 6 * f; voffset = 9 * f; defstride = 12 * f; break; - case GL11.GL_T4F_C4F_N3F_V4F: - tflag = true; cflag = true; nflag = true; tcomps = 4; ccomps = 4; vcomps = 4; - ctype = GL11.GL_FLOAT; coffset = 4 * f; noffset = 8 * f; voffset = 11 * f; defstride = 15 * f; break; - default: - return; // Invalid format - } - - if (stride == 0) stride = defstride; - - if (tflag) { - glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); - interleavedPointer(texCoordConventional(ctx()), tcomps, GL11.GL_FLOAT, false, stride, pointer, base, toffset); - } else { - glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); - } - - if (cflag) { - glEnableClientState(GL11.GL_COLOR_ARRAY); - interleavedPointer(VAOManager.CONV_COLOR, ccomps, ctype, Usage.COLOR.isNormalized(), stride, pointer, base, coffset); - } else { - glDisableClientState(GL11.GL_COLOR_ARRAY); - } - - if (nflag) { - glEnableClientState(GL11.GL_NORMAL_ARRAY); - interleavedPointer(VAOManager.CONV_NORMAL, 3, GL11.GL_FLOAT, Usage.NORMAL.isNormalized(), stride, pointer, base, noffset); - } else { - glDisableClientState(GL11.GL_NORMAL_ARRAY); - } - - glEnableClientState(GL11.GL_VERTEX_ARRAY); - interleavedPointer(VAOManager.CONV_POSITION, vcomps, GL11.GL_FLOAT, false, stride, pointer, base, voffset); - } - - public static void glInterleavedArrays(int format, int stride, ByteBuffer pointer) { - interleavedArrays(format, stride, 0L, pointer); - } - - public static void glInterleavedArrays(int format, int stride, FloatBuffer pointer) { - interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glInterleavedArrays(int format, int stride, DoubleBuffer pointer) { - interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glInterleavedArrays(int format, int stride, IntBuffer pointer) { - interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glInterleavedArrays(int format, int stride, ShortBuffer pointer) { - interleavedArrays(format, stride, 0L, MemoryUtilities.memByteBuffer(pointer)); - } - - public static void glLogicOp(int opcode) { - rejectExitCapture(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordLogicOp(opcode); - if (mode == RecordMode.COMPILE) { - return; - } - } - if (!isCachingEnabled() || ctx().logicOpMode.getValue() != opcode) beforeUncapturedStateChange(); - if (isCachingEnabled()) mod(ctx().logicOpMode).setValue(opcode); - RENDER_BACKEND.logicOp(opcode); - } - - public static void defaultBlendFunc() { - tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - } - - public static void enableCull() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL11.GL_CULL_FACE); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableCull(ctx()); - } - - private static void enableCull(GLContextState glCtx) { - glCtx.cullState.enable(); - } - - public static void disableCull() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL11.GL_CULL_FACE); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableCull(ctx()); - } - - private static void disableCull(GLContextState glCtx) { - glCtx.cullState.disable(); - } - - public static void enableDepthTest() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL11.GL_DEPTH_TEST); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableDepthTest(ctx()); - } - - private static void enableDepthTest(GLContextState glCtx) { - glCtx.depthTest.enable(); - } - - public static void disableDepthTest() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL11.GL_DEPTH_TEST); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableDepthTest(ctx()); - } - - private static void disableDepthTest(GLContextState glCtx) { - glCtx.depthTest.disable(); - } - - public static void enableLighting() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL11.GL_LIGHTING); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableLighting(ctx()); - } - - private static void enableLighting(GLContextState glCtx) { - glCtx.lightingState.enable(); - } - - public static void enableLight(int light) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL11.GL_LIGHT0 + light); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableLight(ctx(), light); - } - - private static void enableLight(GLContextState glCtx, int light) { - if (light >= VertexKey.FFP_LIGHT_COUNT && (warnedFfpLightMask & (1 << light)) == 0 && ShaderManager.isEnabled()) { - warnedFfpLightMask |= (1 << light); - LOGGER.warn("GL_LIGHT{} enabled, but FFP shader emulation implements only GL_LIGHT0..{}", light, VertexKey.FFP_LIGHT_COUNT - 1, new Throwable("call site")); - } - glCtx.lightStates[light].enable(); - } - - private static int warnedFfpLightMask = 0; - - public static void enableColorMaterial() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL11.GL_COLOR_MATERIAL); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableColorMaterial(ctx()); - } - - private static void enableColorMaterial(GLContextState glCtx) { - glCtx.colorMaterial.enable(); - bakeCurrentColorIntoTrackedMaterial(glCtx); - } - - public static void disableColorMaterial() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL11.GL_COLOR_MATERIAL); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableColorMaterial(ctx()); - } - - private static void disableColorMaterial(GLContextState glCtx) { - bakeCurrentColorIntoTrackedMaterial(glCtx); - glCtx.colorMaterial.disable(); - } - - private static void bakeCurrentColorIntoTrackedMaterial(GLContextState glCtx) { - glCtx.exitCapture.requireMaterialBakeInputs(); - final float r = glCtx.color.getRed(); - final float g = glCtx.color.getGreen(); - final float b = glCtx.color.getBlue(); - final float a = glCtx.color.getAlpha(); - final int face = glCtx.colorMaterialFace.getValue(); - final int param = glCtx.colorMaterialParameter.getValue(); - if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { - bakeMaterialColor(glCtx, glCtx.frontMaterial, param, r, g, b, a); - } - if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) { - bakeMaterialColor(glCtx, glCtx.backMaterial, param, r, g, b, a); - } - } - - private static boolean materialVectorDiffers(Vector4f vec, float r, float g, float b, float a) { - return vec.x != r || vec.y != g || vec.z != b || vec.w != a; - } - - private static void bakeMaterialColor(GLContextState glCtx, MaterialStateStack material, int param, float r, float g, float b, float a) { - glCtx.exitCapture.material(material.face, param); - final boolean changed = switch (param) { - case GL11.GL_AMBIENT_AND_DIFFUSE -> materialVectorDiffers(material.ambient, r, g, b, a) || materialVectorDiffers(material.diffuse, r, g, b, a); - case GL11.GL_AMBIENT -> materialVectorDiffers(material.ambient, r, g, b, a); - case GL11.GL_DIFFUSE -> materialVectorDiffers(material.diffuse, r, g, b, a); - case GL11.GL_SPECULAR -> materialVectorDiffers(material.specular, r, g, b, a); - case GL11.GL_EMISSION -> materialVectorDiffers(material.emission, r, g, b, a); - default -> false; - }; - if (!changed) return; - mod(material); - switch (param) { - case GL11.GL_AMBIENT_AND_DIFFUSE -> { - material.ambient.set(r, g, b, a); - material.diffuse.set(r, g, b, a); - } - case GL11.GL_AMBIENT -> material.ambient.set(r, g, b, a); - case GL11.GL_DIFFUSE -> material.diffuse.set(r, g, b, a); - case GL11.GL_SPECULAR -> material.specular.set(r, g, b, a); - case GL11.GL_EMISSION -> material.emission.set(r, g, b, a); - default -> {} - } - } - - public static void disableLighting() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL11.GL_LIGHTING); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableLighting(ctx()); - } - - private static void disableLighting(GLContextState glCtx) { - glCtx.lightingState.disable(); - } - - public static void disableLight(int light) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL11.GL_LIGHT0 + light); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableLight(ctx(), light); - } - - private static void disableLight(GLContextState glCtx, int light) { - glCtx.lightStates[light].disable(); - } - - public static void enableRescaleNormal() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL12.GL_RESCALE_NORMAL); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableRescaleNormal(ctx()); - } - - private static void enableRescaleNormal(GLContextState glCtx) { - glCtx.rescaleNormalState.enable(); - } - - public static void disableRescaleNormal() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL12.GL_RESCALE_NORMAL); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableRescaleNormal(ctx()); - } - - private static void disableRescaleNormal(GLContextState glCtx) { - glCtx.rescaleNormalState.disable(); - } - - public static void enableFog() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordEnable(GL11.GL_FOG); - if (mode == RecordMode.COMPILE) { - return; - } - } - enableFog(ctx()); - } - - private static void enableFog(GLContextState glCtx) { - glCtx.fogMode.enable(); - if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { - GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); - } - } - - public static void disableFog() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDisable(GL11.GL_FOG); - if (mode == RecordMode.COMPILE) { - return; - } - } - disableFog(ctx()); - } - - private static void disableFog(GLContextState glCtx) { - glCtx.fogMode.disable(); - if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { - GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); - } - } - - public static void glFog(int pname, FloatBuffer param) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordFog(pname, param); - if (mode == RecordMode.COMPILE) { - return; - } - } - if (HAS_MULTIPLE_SET.contains(pname)) { - if (pname == GL11.GL_FOG_COLOR && isCachingEnabled()) { - final float red = param.get(0); - final float green = param.get(1); - final float blue = param.get(2); - - beforeUncapturedStateChange(); - mod(glCtx.fogState); - glCtx.fogState.getFogColor().set(red, green, blue); - glCtx.fogState.setFogAlpha(param.get(3)); - glCtx.fogState.getFogColorBuffer().clear(); - glCtx.fogState.getFogColorBuffer().put((FloatBuffer) param.position(0)).flip(); - glCtx.fragmentGeneration++; - if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { - GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); - } - } - } else { - GLStateManager.glFogf(pname, param.get(0)); - } - } - - public static Vector3d getFogColor() { - return ctx().fogState.getFogColor(); - } - - public static void fogColor(float red, float green, float blue, float alpha) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final boolean caching = isCachingEnabled(); - if (!caching || red != glCtx.fogState.getFogColor().x || green != glCtx.fogState.getFogColor().y || blue != glCtx.fogState.getFogColor().z || alpha != glCtx.fogState.getFogAlpha()) { - beforeUncapturedStateChange(); - mod(glCtx.fogState); - glCtx.fogState.getFogColor().set(red, green, blue); - glCtx.fogState.setFogAlpha(alpha); - glCtx.fogState.getFogColorBuffer().clear(); - glCtx.fogState.getFogColorBuffer().put(red).put(green).put(blue).put(alpha).flip(); - glCtx.fragmentGeneration++; - if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { - GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); - } - } - } - - public static void glFogf(int pname, float param) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordFogf(pname, param); - if (mode == RecordMode.COMPILE) { - return; - } - } - // Update cached state (FFP shader reads from cache) - if (isCachingEnabled()) { - boolean changed = false; - switch (pname) { - case GL11.GL_FOG_DENSITY -> { if (!isCachingEnabled() || glCtx.fogState.getDensity() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setDensity(param); changed = true; } } - case GL11.GL_FOG_START -> { if (!isCachingEnabled() || glCtx.fogState.getStart() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setStart(param); changed = true; } } - case GL11.GL_FOG_END -> { if (!isCachingEnabled() || glCtx.fogState.getEnd() != param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setEnd(param); changed = true; } } - case GL11.GL_FOG_MODE -> { if (!isCachingEnabled() || glCtx.fogState.getFogMode() != (int) param) { beforeUncapturedStateChange(); mod(glCtx.fogState).setFogMode((int) param); changed = true; } } - default -> {} - } - if (changed) { - glCtx.fragmentGeneration++; - if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { - GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); - } - } - } - } - - public static void glFogi(int pname, int param) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordFogi(pname, param); - if (mode == RecordMode.COMPILE) { - return; - } - } - // Update cached state (FFP shader reads from cache) - if (isCachingEnabled() && pname == GL11.GL_FOG_MODE && (!isCachingEnabled() || glCtx.fogState.getFogMode() != param)) { - beforeUncapturedStateChange(); - mod(glCtx.fogState).setFogMode(param); - glCtx.fragmentGeneration++; - if (GLSMHooks.FOG_STATE_CHANGE.hasListeners()) { - GLSMHooks.FOG_STATE_CHANGE.post(GLSMHooks.fogStateChangeEvent); - } - } - } - - public static void setFogBlack() { - glFogf(GL11.GL_FOG_COLOR, 0.0F); - } - - public static void glShadeModel(int mode) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.SHADE_MODEL); - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - DisplayListManager.recordShadeModel(mode); - if (recordMode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - final int oldValue = glCtx.shadeModelState.getValue(); - final boolean needsUpdate = !caching || oldValue != mode; - - if (needsUpdate) { - mod(glCtx.shadeModelState).setValue(mode); - } - } - - // Iris Functions - private static void onDeleteTexture(int id) { - final GLContextState glCtx = ctx(); - TextureInfoCache.INSTANCE.onDeleteTexture(id); - if (GLSMHooks.TEXTURE_DELETE.hasListeners()) { - GLSMHooks.textureDeleteEvent.textureId = id; - GLSMHooks.TEXTURE_DELETE.post(GLSMHooks.textureDeleteEvent); - } - - // Always delete - clearTextureBindings(glCtx, id); - } - - private static void clearTextureBindings(GLContextState glCtx, int id) { - for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) { - if (glCtx.textures.getTextureUnitBindings(i).getBinding() == id) { - mod(glCtx.textures.getTextureUnitBindings(i)).setBinding(0); - } - } - - for (int i = 0; i <= glCtx.maxBoundImageUnit; i++) { - final ImageUnitBinding image = glCtx.imageUnits.get(i); - if (image != null && image.getTexture() == id) { - image.reset(); - } - } - } - public static void makeCurrent(Drawable drawable) throws LWJGLException { final GLContextState previous = tlWorkerContext.get(); final boolean changed = bindThreadContext(isDisplayDrawable(drawable) ? null : contextFor(drawable)); @@ -4872,7 +546,7 @@ public class GLStateManager { if (changed) bindThreadContext(previous); throw failure; } - if (!handled && changed) replayStateToBackend(); + if (!handled && changed) GLSMAttribStack.replayStateToBackend(); CurrentThread = Thread.currentThread(); if (splashComplete) return; @@ -4921,9 +595,6 @@ public class GLStateManager { Display.swapBuffers(); } - private static boolean firstClearPending; - private static long firstClearBlockNanos; - public static void updateDisplay() throws LWJGLException { updateDisplay(true); } @@ -4942,7 +613,7 @@ public class GLStateManager { Display.update(false); final long end = System.nanoTime(); RENDER_BACKEND.recordGate(end - start, end); - firstClearPending = true; + GLSMFramebuffer.armFirstClear(); } /** @@ -4963,16 +634,6 @@ public class GLStateManager { } } - public static void glNewList(int list, int mode) { - rejectExitCapture(); - DisplayListManager.glNewList(list, mode); - } - - public static void glEndList() { - rejectExitCapture(); - DisplayListManager.glEndList(); - } - /** * Check if we're currently recording a display list. */ @@ -4980,2143 +641,6 @@ public class GLStateManager { return DisplayListManager.isRecording(); } - public static int getRecordingDisplayListId() { - return DisplayListManager.getRecordingListId(); - } - - private static final DisplayListIDAllocator displayListIdAllocator = new DisplayListIDAllocator(); - - public static int glGenLists(int range) { - rejectExitCapture(); - return displayListIdAllocator.allocRange(range); - } - - public static boolean glIsList(int list) { - rejectExitCapture(); - return displayListIdAllocator.isAllocated(list); - } - - /** - * Delete display lists and free their VBO resources. - */ - public static void glDeleteLists(int list, int range) { - rejectExitCapture(); - final boolean locked = acquireDrawLock(); - try { - synchronized (displayListIdAllocator) { - DisplayListManager.glDeleteLists(list, range); - displayListIdAllocator.freeRange(list, range); - } - } finally { - if (locked) releaseDrawLock(); - } - } - - /** - * Get a compiled display list from the cache. Used for executing nested display lists. - * - * @param list The display list ID - * @return The CompiledDisplayList, or null if not found - */ - public static CompiledDisplayList getDisplayList(int list) { - return DisplayListManager.getDisplayList(list); - } - - public static void glCallList(int list) { - rejectExitCapture(); - if (!GLDebug.isActive()) { - DisplayListManager.glCallList(list); - return; - } - GLDebug.pushGroup("glCallList ", list); - try { - DisplayListManager.glCallList(list); - } finally { - GLDebug.popGroup(); - } - } - - public static void pushState(int mask) { - pushStateLive(StateSet.forMask(mask)); - } - - public static int pushState(StateSet set) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - final int token = ctx().attribDepth + DisplayListManager.virtualStateDepth(mode); - if (token >= MAX_ATTRIB_STACK_DEPTH) { - throw new IllegalStateException("Attrib stack overflow: max depth " + MAX_ATTRIB_STACK_DEPTH + " reached"); - } - DisplayListManager.recordPushState(set); - if (mode == RecordMode.COMPILE) { - return token; - } - } - return pushStateLive(set); - } - - static int pushStateLive(StateSet set) { - attribPushes++; - final GLContextState glCtx = ctx(); - glCtx.exitCapture.pushAttrib(); - if (glCtx.attribDepth >= MAX_ATTRIB_STACK_DEPTH) { - throw new IllegalStateException("Attrib stack overflow: max depth " + MAX_ATTRIB_STACK_DEPTH + " reached"); - } - final int depthBefore = glCtx.attribDepth; - glCtx.attribSets[depthBefore] = set; - glCtx.savedBatchStateGen[depthBefore] = glCtx.batchStateGeneration; - - snapshotGenerations(glCtx, set.bump); - - glCtx.modifiedCount[depthBefore] = 0; - - if ((set.restore & StateSet.R_PROGRAM) != 0) { - glCtx.programStack.setValue(glCtx.activeProgram); - glCtx.programStack.push(); - attribSlotsSaved++; - } - - glCtx.attribDepth++; - return depthBefore; - } - - private static void snapshotGenerations(GLContextState glCtx, int bump) { - final int depth = glCtx.attribDepth; - if ((bump & StateSet.B_LIGHTING) != 0) { - glCtx.savedLightingGen[depth] = glCtx.lightingGeneration; - } - if ((bump & (StateSet.B_FRAG_COLORBUF | StateSet.B_FRAG_TEXTURE | StateSet.B_FRAG_FOG)) != 0) { - glCtx.savedFragmentGen[depth] = glCtx.fragmentGeneration; - } - if ((bump & StateSet.B_TRANSFORM) != 0) { - glCtx.savedMvGen[depth] = glCtx.mvGeneration; - glCtx.savedMvLinearGen[depth] = glCtx.mvLinearGeneration; - glCtx.savedProjGen[depth] = glCtx.projGeneration; - glCtx.savedTexMatGen[depth] = glCtx.texMatrixGeneration; - } - if ((bump & StateSet.B_CURRENT) != 0) { - glCtx.savedColorGen[depth] = glCtx.colorGeneration; - glCtx.savedNormalGen[depth] = glCtx.ffp.normalGeneration; - glCtx.savedTexCoordGen[depth] = glCtx.ffp.texCoordGeneration; - } - } - - public static void popStateTo(int depth) { - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - while (glCtx.attribDepth + DisplayListManager.virtualStateDepth(mode) > depth) { - if (mode == RecordMode.COMPILE && DisplayListManager.recordPopStateIfPending()) continue; - if (mode == RecordMode.COMPILE_AND_EXECUTE) DisplayListManager.recordPopStateIfPending(); - popState(); - } - } - - public static void popState() { - final GLContextState glCtx = ctx(); - if (glCtx.attribDepth > 0 && glCtx.savedBatchStateGen[glCtx.attribDepth - 1] != glCtx.batchStateGeneration) { - beforeUncapturedStateChange(); - } - final int poppedDepth = glCtx.attribDepth; - final StateSet set = glCtx.attribSets[poppedDepth - 1]; - glCtx.exitCapture.popAttrib(set); - final boolean inspectAlpha = GLSMHooks.ALPHA_STATE_CHANGE.hasListeners() - && ((glCtx.alphaState.cowDepths().claimedAt(poppedDepth) && set.contains(glCtx.alphaState.stackId())) - || (glCtx.alphaTest.cowDepths().claimedAt(poppedDepth) && set.contains(glCtx.alphaTest.stackId()))); - final AlphaState effectiveAlpha = inspectAlpha ? glCtx.alphaState.readEffective(glCtx.restoredAlphaScratch) : null; - final boolean effectiveEnabled = inspectAlpha && glCtx.alphaTest.isEffectivelyEnabled(); - final int effectiveFunction = inspectAlpha ? effectiveAlpha.getFunction() : 0; - final float effectiveReference = inspectAlpha ? effectiveAlpha.getReference() : 0.0f; - final boolean liveEnabled = inspectAlpha && glCtx.alphaTest.isEnabled(); - final int liveFunction = inspectAlpha ? glCtx.alphaState.getFunction() : 0; - final float liveReference = inspectAlpha ? glCtx.alphaState.getReference() : 0.0f; - final boolean prevPoppingAttributes = glCtx.poppingAttributes; - glCtx.poppingAttributes = true; - try { - glCtx.attribDepth--; - final int restore = set.restore; - - final boolean blendSnapshotted = set.blendSnapshot - && (glCtx.blendState.cowDepths().claimedAt(poppedDepth) || glCtx.blendMode.cowDepths().claimedAt(poppedDepth)) - && snapshotVanillaBlendFunc(); - - int changed = 0; - long unitsChanged = 0L; - - if ((restore & StateSet.R_PROGRAM) != 0) { - glCtx.programStack.setValue(glCtx.activeProgram); - if (glCtx.programStack.topSlotChanged()) changed |= StateSet.R_PROGRAM; - glCtx.programStack.pop(); - } - - final int depth = glCtx.attribDepth; - final int count = glCtx.modifiedCount[depth]; - final int[] ids = glCtx.modifiedIds[depth]; - final CowStateStack[] stackById = glCtx.stackById; - final CowDepths[] depthsById = glCtx.depthsById; - final int[] restoreBitById = glCtx.restoreBitById; - final int[] restoreUnitById = glCtx.restoreUnitById; - final byte[] kindById = glCtx.kindById; - - for (int i = 0; i < count; i++) { - final int id = ids[i]; - final CowStateStack cow = stackById[id]; - final byte kind = kindById[id]; - if (set.contains(id)) { - final int bit = restoreBitById[id]; - if (bit != 0 && CowDispatch.topSlotChanged(kind, cow)) { - changed |= bit; - final int unit = restoreUnitById[id]; - if (unit >= 0) unitsChanged |= 1L << Math.min(unit, 63); - } - final int slot = depthsById[id].pop(); - if (slot >= 0) CowDispatch.restoreSlot(kind, cow, slot); - if (bit == 0 - && (kind == CowDispatch.BOOLEAN - || kind == CowDispatch.CLIP_PLANE_BOOLEAN - || kind == CowDispatch.TEXTURE_UNIT_BOOLEAN)) attribValueRestores++; - } else { - if (depthsById[id].discard(poppedDepth) >= 0) registerModifiedState(glCtx, id); - attribDiscards++; - } - } - glCtx.modifiedCount[depth] = 0; - - glCtx.restoreChangedMask = changed; - glCtx.restoreUnitChangedMask = unitsChanged; - - applyRestoredState(set, blendSnapshotted); - } finally { - glCtx.poppingAttributes = prevPoppingAttributes; - } - if (inspectAlpha) { - glCtx.alphaState.readEffective(glCtx.restoredAlphaScratch); - if (effectiveEnabled != glCtx.alphaTest.isEffectivelyEnabled() - || effectiveFunction != effectiveAlpha.getFunction() - || Float.compare(effectiveReference, effectiveAlpha.getReference()) != 0 - || liveEnabled != glCtx.alphaTest.isEnabled() - || liveFunction != glCtx.alphaState.getFunction() - || Float.compare(liveReference, glCtx.alphaState.getReference()) != 0) { - GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); - } - } - } - - public static void retainModifiedState(int depth, RetainedState out) { - final GLContextState glCtx = ctx(); - if (depth < 0 || depth != glCtx.attribDepth - 1) { - throw new IllegalStateException("retainModifiedState: depth " + depth + " is not the open push (attrib depth " + glCtx.attribDepth + ")"); - } - glCtx.retainedOwner = out; - final int count = glCtx.modifiedCount[depth]; - final int[] ids = glCtx.modifiedIds[depth]; - final CowStateStack[] stackById = glCtx.stackById; - out.ensureCapacity(count); - for (int i = 0; i < count; i++) { - final int id = ids[i]; - stackById[id].captureSlot(RETAINED_SLOT); - out.ids[i] = id; - } - out.count = count; - out.program = glCtx.activeProgram; - out.programGen = programLifetimeGeneration; - } - - public static void applyRetainedState(RetainedState in) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (glCtx.retainedOwner != in) return; - final CowStateStack[] stackById = glCtx.stackById; - final byte[] kindById = glCtx.kindById; - final int[] ids = in.ids; - final int count = in.count; - int first = 0; - while (first < count && !CowDispatch.slotChanged(kindById[ids[first]], stackById[ids[first]], RETAINED_SLOT)) first++; - if (first < count) applyRetainedChanges(glCtx, in, first); - if (in.program != glCtx.activeProgram && (in.program == 0 || in.programGen == programLifetimeGeneration)) glUseProgram(in.program); - } - - private static void applyRetainedChanges(GLContextState glCtx, RetainedState in, int first) { - beforeUncapturedStateChange(); - final boolean blendSnapshotted = snapshotVanillaBlendFunc(); - final int alphaFuncId = glCtx.alphaState.stackId(); - final int alphaTestId = glCtx.alphaTest.stackId(); - boolean alphaChanged = false; - final boolean prevPoppingAttributes = glCtx.poppingAttributes; - glCtx.poppingAttributes = true; - try { - final CowStateStack[] stackById = glCtx.stackById; - final int[] restoreBitById = glCtx.restoreBitById; - final int[] restoreUnitById = glCtx.restoreUnitById; - final byte[] kindById = glCtx.kindById; - int changed = 0; - long unitsChanged = 0L; - for (int i = first; i < in.count; i++) { - final int id = in.ids[i]; - final CowStateStack cow = stackById[id]; - final byte kind = kindById[id]; - if (!CowDispatch.slotChanged(kind, cow, RETAINED_SLOT)) continue; - cow.beforeModify(); - final int bit = restoreBitById[id]; - if (bit != 0) { - changed |= bit; - final int unit = restoreUnitById[id]; - if (unit >= 0) unitsChanged |= 1L << Math.min(unit, 63); - } - CowDispatch.restoreSlot(kind, cow, RETAINED_SLOT); - if (id == alphaFuncId || id == alphaTestId) alphaChanged = true; - } - glCtx.restoreChangedMask = changed; - glCtx.restoreUnitChangedMask = unitsChanged; - issueRestoredBackendState(glCtx, -1); - glCtx.lightingGeneration++; - glCtx.fragmentGeneration++; - glCtx.colorGeneration++; - glCtx.ffp.normalGeneration++; - glCtx.ffp.texCoordGeneration++; - glCtx.dirtyColorAttrib = true; - glCtx.dirtyNormalAttrib = true; - glCtx.dirtyTexCoordAttrib = true; - postVanillaBlendChangeIfMoved(blendSnapshotted); - } finally { - glCtx.poppingAttributes = prevPoppingAttributes; - } - if (alphaChanged && GLSMHooks.ALPHA_STATE_CHANGE.hasListeners()) { - GLSMHooks.ALPHA_STATE_CHANGE.post(GLSMHooks.alphaStateChangeEvent); - } - } - - private static boolean isDepthColorOverridden() { - final DeferredDepthColorHandler dch = GLSMHooks.depthColorHandler; - return dch != null && dch.isOverrideHeld(); - } - - public static void replayStateToBackend() { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (RENDER_BACKEND == null) return; - - final List booleanStates = glCtx.allBooleanStates; - for (int i = 0; i < booleanStates.size(); i++) { - booleanStates.get(i).applyToBackend(); - } - - RENDER_BACKEND.depthFunc(glCtx.depthState.getFunc()); - RENDER_BACKEND.depthMask(glCtx.depthState.isEnabled()); - RENDER_BACKEND.clearDepth(glCtx.depthState.getClearValue()); - - issueBlendFunc(glCtx.blendState); - glCtx.blendState.clearFuncUnknownState(); - RENDER_BACKEND.blendEquationSeparate(glCtx.blendState.getEquationRgb(), glCtx.blendState.getEquationAlpha()); - RENDER_BACKEND.blendColor(glCtx.blendState.getBlendColorR(), glCtx.blendState.getBlendColorG(), glCtx.blendState.getBlendColorB(), glCtx.blendState.getBlendColorA()); - RENDER_BACKEND.colorMask(glCtx.colorMask.red, glCtx.colorMask.green, glCtx.colorMask.blue, glCtx.colorMask.alpha); - RENDER_BACKEND.clearColor(glCtx.clearColor.getRed(), glCtx.clearColor.getGreen(), glCtx.clearColor.getBlue(), glCtx.clearColor.getAlpha()); - RENDER_BACKEND.logicOp(glCtx.logicOpMode.getValue()); - - RENDER_BACKEND.stencilFuncSeparate(GL11.GL_FRONT, glCtx.stencilState.getFuncFront(), glCtx.stencilState.getRefFront(), glCtx.stencilState.getValueMaskFront()); - RENDER_BACKEND.stencilFuncSeparate(GL11.GL_BACK, glCtx.stencilState.getFuncBack(), glCtx.stencilState.getRefBack(), glCtx.stencilState.getValueMaskBack()); - RENDER_BACKEND.stencilOpSeparate(GL11.GL_FRONT, glCtx.stencilState.getFailOpFront(), glCtx.stencilState.getZFailOpFront(), glCtx.stencilState.getZPassOpFront()); - RENDER_BACKEND.stencilOpSeparate(GL11.GL_BACK, glCtx.stencilState.getFailOpBack(), glCtx.stencilState.getZFailOpBack(), glCtx.stencilState.getZPassOpBack()); - RENDER_BACKEND.stencilMaskSeparate(GL11.GL_FRONT, glCtx.stencilState.getWriteMaskFront()); - RENDER_BACKEND.stencilMaskSeparate(GL11.GL_BACK, glCtx.stencilState.getWriteMaskBack()); - RENDER_BACKEND.clearStencil(glCtx.stencilState.getClearValue()); - - RENDER_BACKEND.viewport(glCtx.viewportState.x, glCtx.viewportState.y, glCtx.viewportState.width, glCtx.viewportState.height); - RENDER_BACKEND.depthRange(glCtx.viewportState.depthRangeNear, glCtx.viewportState.depthRangeFar); - RENDER_BACKEND.scissor(glCtx.scissorState.x, glCtx.scissorState.y, glCtx.scissorState.width, glCtx.scissorState.height); - RENDER_BACKEND.lineWidth(Math.clamp(glCtx.lineState.getWidth(), lineWidthMin, lineWidthMax)); - applyPointState(glCtx); - applyHintState(glCtx); - - RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, glCtx.polygonState.getFrontMode()); - applyPolygonOffset(glCtx); - RENDER_BACKEND.cullFace(glCtx.polygonState.getCullFaceMode()); - RENDER_BACKEND.frontFace(glCtx.polygonState.getFrontFace()); - - final SamplerUnitArray samplerUnits = glCtx.samplerUnits; - for (int i = 0; i <= samplerUnits.getHighestBoundUnit(); i++) { - final int sampler = samplerUnits.get(i); - if (sampler != 0) RENDER_BACKEND.bindSampler(i, sampler); - } - - for (int i = 0; i <= glCtx.maxBoundTextureUnit; i++) { - final TextureBinding b = glCtx.textures.getTextureUnitBindings(i); - RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i); - RENDER_BACKEND.bindTexture(b.getTarget() == 0 ? GL11.GL_TEXTURE_2D : b.getTarget(), b.getBinding()); - } - RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + getActiveTextureUnit()); - if (glCtx.defaultVAO == 0 && primaryContext().defaultVAO != 0) glCtx.defaultVAO = RENDER_BACKEND.genVertexArrays(); - if (!glCtx.vaos.isInitialized()) glCtx.vaos.init(glCtx.defaultVAO); - RENDER_BACKEND.bindVertexArray(glCtx.boundVAO != 0 ? glCtx.boundVAO : glCtx.defaultVAO); - RENDER_BACKEND.useProgram(glCtx.activeProgram); - glCtx.ffp.invalidateProgram(); - RENDER_BACKEND.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, glCtx.drawFramebuffer); - RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, glCtx.readFramebuffer); - glCtx.dirtyColorAttrib = true; - glCtx.dirtyNormalAttrib = true; - glCtx.dirtyTexCoordAttrib = true; - glCtx.dirtyLightmapAttrib = true; - glCtx.dirtyEntityIdsAttrib = true; - } - - private static void applyPolygonOffset(GLContextState glCtx) { - final float clamp = glCtx.polygonState.getOffsetClamp(); - if (clamp == 0.0f) { - RENDER_BACKEND.polygonOffset(glCtx.polygonState.getOffsetFactor(), glCtx.polygonState.getOffsetUnits()); - } else { - RENDER_BACKEND.polygonOffsetClamp(glCtx.polygonState.getOffsetFactor(), glCtx.polygonState.getOffsetUnits(), clamp); - } - } - - private static void issueRestoredBackendState(GLContextState glCtx, int restore) { - final int changed = glCtx.restoreChangedMask; - if ((restore & StateSet.R_DEPTH) != 0 && (changed & StateSet.R_DEPTH) != 0) { - attribValueRestores++; - RENDER_BACKEND.depthFunc(glCtx.depthState.getFunc()); - attribBackendCalls++; - if (!isDepthColorOverridden()) { - RENDER_BACKEND.depthMask(glCtx.depthState.isEnabled()); - attribBackendCalls++; - } - RENDER_BACKEND.clearDepth(glCtx.depthState.getClearValue()); - attribBackendCalls++; - } - if ((restore & StateSet.R_BLEND) != 0) { - final BlendStateStack blend = glCtx.blendState; - if ((changed & StateSet.R_BLEND) != 0 || blend.isFuncUnknown()) { - attribValueRestores++; - final DeferredBlendHandler restoreBlendHandler = GLSMHooks.blendHandler; - if (restoreBlendHandler == null || !restoreBlendHandler.isOverrideHeld()) { - issueBlendFunc(blend); - attribBackendCalls++; - blend.clearFuncUnknownState(); - } - if ((changed & StateSet.R_BLEND) != 0) { - RENDER_BACKEND.blendEquationSeparate(blend.getEquationRgb(), blend.getEquationAlpha()); - attribBackendCalls++; - RENDER_BACKEND.blendColor( - blend.getBlendColorR(), blend.getBlendColorG(), blend.getBlendColorB(), blend.getBlendColorA()); - attribBackendCalls++; - } - } - } - if ((restore & StateSet.R_COLOR_MASK) != 0 && (changed & StateSet.R_COLOR_MASK) != 0 && !isDepthColorOverridden()) { - attribValueRestores++; - RENDER_BACKEND.colorMask(glCtx.colorMask.red, glCtx.colorMask.green, glCtx.colorMask.blue, glCtx.colorMask.alpha); - attribBackendCalls++; - } - if ((restore & StateSet.R_CLEAR_COLOR) != 0 && (changed & StateSet.R_CLEAR_COLOR) != 0) { - attribValueRestores++; - RENDER_BACKEND.clearColor(glCtx.clearColor.getRed(), glCtx.clearColor.getGreen(), glCtx.clearColor.getBlue(), glCtx.clearColor.getAlpha()); - attribBackendCalls++; - } - if ((restore & StateSet.R_DRAW_BUFFER) != 0 && (changed & StateSet.R_DRAW_BUFFER) != 0 && glCtx.drawFramebuffer == 0) { - attribValueRestores++; - RENDER_BACKEND.drawBuffer(glCtx.drawBuffer.getValue()); - attribBackendCalls++; - } - if ((restore & StateSet.R_LOGIC_OP) != 0 && (changed & StateSet.R_LOGIC_OP) != 0) { - attribValueRestores++; - RENDER_BACKEND.logicOp(glCtx.logicOpMode.getValue()); - attribBackendCalls++; - } - if ((restore & StateSet.R_STENCIL) != 0 && (changed & StateSet.R_STENCIL) != 0) { - attribValueRestores++; - RENDER_BACKEND.stencilFuncSeparate(GL11.GL_FRONT, glCtx.stencilState.getFuncFront(), glCtx.stencilState.getRefFront(), glCtx.stencilState.getValueMaskFront()); - RENDER_BACKEND.stencilFuncSeparate(GL11.GL_BACK, glCtx.stencilState.getFuncBack(), glCtx.stencilState.getRefBack(), glCtx.stencilState.getValueMaskBack()); - RENDER_BACKEND.stencilOpSeparate(GL11.GL_FRONT, glCtx.stencilState.getFailOpFront(), glCtx.stencilState.getZFailOpFront(), glCtx.stencilState.getZPassOpFront()); - RENDER_BACKEND.stencilOpSeparate(GL11.GL_BACK, glCtx.stencilState.getFailOpBack(), glCtx.stencilState.getZFailOpBack(), glCtx.stencilState.getZPassOpBack()); - RENDER_BACKEND.stencilMaskSeparate(GL11.GL_FRONT, glCtx.stencilState.getWriteMaskFront()); - RENDER_BACKEND.stencilMaskSeparate(GL11.GL_BACK, glCtx.stencilState.getWriteMaskBack()); - RENDER_BACKEND.clearStencil(glCtx.stencilState.getClearValue()); - attribBackendCalls += 7; - } - if ((restore & StateSet.R_VIEWPORT) != 0 && (changed & StateSet.R_VIEWPORT) != 0) { - attribValueRestores++; - RENDER_BACKEND.viewport(glCtx.viewportState.x, glCtx.viewportState.y, glCtx.viewportState.width, glCtx.viewportState.height); - RENDER_BACKEND.depthRange(glCtx.viewportState.depthRangeNear, glCtx.viewportState.depthRangeFar); - attribBackendCalls += 2; - } - if ((restore & StateSet.R_SCISSOR) != 0 && (changed & StateSet.R_SCISSOR) != 0) { - attribValueRestores++; - RENDER_BACKEND.scissor(glCtx.scissorState.x, glCtx.scissorState.y, glCtx.scissorState.width, glCtx.scissorState.height); - attribBackendCalls++; - } - if ((restore & StateSet.R_LINE) != 0 && (changed & StateSet.R_LINE) != 0) { - attribValueRestores++; - RENDER_BACKEND.lineWidth(Math.clamp(glCtx.lineState.getWidth(), lineWidthMin, lineWidthMax)); - attribBackendCalls++; - } - if ((restore & StateSet.R_POINT) != 0 && (changed & StateSet.R_POINT) != 0) { - attribValueRestores++; - applyPointState(glCtx); - attribBackendCalls++; - } - if ((restore & StateSet.R_HINT) != 0 && (changed & StateSet.R_HINT) != 0) { - attribValueRestores++; - applyHintState(glCtx); - attribBackendCalls++; - } - if ((restore & StateSet.R_POLYGON) != 0 && (changed & StateSet.R_POLYGON) != 0) { - attribValueRestores++; - RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, glCtx.polygonState.getFrontMode()); - applyPolygonOffset(glCtx); - RENDER_BACKEND.cullFace(glCtx.polygonState.getCullFaceMode()); - RENDER_BACKEND.frontFace(glCtx.polygonState.getFrontFace()); - attribBackendCalls += 4; - } - final boolean textureBitSet = (restore & StateSet.R_TEXTURE) != 0 && (changed & StateSet.R_TEXTURE) != 0; - final boolean activeUnitBitSet = (restore & StateSet.R_ACTIVE_UNIT) != 0; - if (textureBitSet || activeUnitBitSet) { - boolean unitTouched = false; - if (textureBitSet) { - final long unitsChanged = glCtx.restoreUnitChangedMask; - for (int i = 0; i < MAX_TEXTURE_UNITS; i++) { - if ((unitsChanged & (1L << Math.min(i, 63))) != 0) { - final TextureBinding restored = glCtx.textures.getTextureUnitBindings(i); - final int restoredTarget = restored.getTarget() != 0 ? restored.getTarget() : GL11.GL_TEXTURE_2D; - RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + i); - RENDER_BACKEND.bindTexture(restoredTarget, restored.getBinding()); - attribValueRestores++; - attribBackendCalls += 2; - unitTouched = true; - } - } - } - if (unitTouched || (activeUnitBitSet && (changed & StateSet.R_ACTIVE_UNIT) != 0)) { - RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + glCtx.activeTextureUnit.getValue()); - attribValueRestores++; - attribBackendCalls++; - } - } - } - - /** - * After popping GLSM stacks, apply restored state to the GL driver. - */ - private static void applyRestoredState(StateSet set, boolean blendSnapshotted) { - final GLContextState glCtx = ctx(); - final int restore = set.restore; - final int changed = glCtx.restoreChangedMask; - issueRestoredBackendState(glCtx, restore); - - final int bump = set.bump; - final int depth = glCtx.attribDepth; - if ((bump & StateSet.B_LIGHTING) != 0 && glCtx.lightingGeneration != glCtx.savedLightingGen[depth]) glCtx.lightingGeneration++; - if ((bump & StateSet.B_FRAG_FOG) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++; - if ((bump & StateSet.B_FRAG_COLORBUF) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++; - if ((bump & StateSet.B_FRAG_TEXTURE) != 0 && glCtx.fragmentGeneration != glCtx.savedFragmentGen[depth]) glCtx.fragmentGeneration++; - if ((bump & StateSet.B_TRANSFORM) != 0) { - if (glCtx.mvGeneration != glCtx.savedMvGen[depth]) glCtx.mvGeneration++; - if (glCtx.mvLinearGeneration != glCtx.savedMvLinearGen[depth]) glCtx.mvLinearGeneration++; - if (glCtx.projGeneration != glCtx.savedProjGen[depth]) glCtx.projGeneration++; - if (glCtx.texMatrixGeneration != glCtx.savedTexMatGen[depth]) glCtx.texMatrixGeneration++; - } - if ((bump & StateSet.B_CURRENT) != 0) { - if (glCtx.colorGeneration != glCtx.savedColorGen[depth]) { - glCtx.colorGeneration++; - glCtx.dirtyColorAttrib = true; - } - if (glCtx.ffp.normalGeneration != glCtx.savedNormalGen[depth]) { - glCtx.ffp.normalGeneration++; - glCtx.dirtyNormalAttrib = true; - } - if (glCtx.ffp.texCoordGeneration != glCtx.savedTexCoordGen[depth]) { - glCtx.ffp.texCoordGeneration++; - glCtx.dirtyTexCoordAttrib = true; - } - if ((restore & StateSet.R_SECONDARY_COLOR) != 0 && (changed & StateSet.R_SECONDARY_COLOR) != 0) glCtx.fragmentGeneration++; - } - - postVanillaBlendChangeIfMoved(blendSnapshotted); - - if ((restore & StateSet.R_PROGRAM) != 0 && (changed & StateSet.R_PROGRAM) != 0) { - glUseProgram(glCtx.programStack.getValue()); - attribValueRestores++; - attribBackendCalls++; - } - } - - public static void glClear(int mask) { - rejectExitCapture(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordClear(mask); - if (mode == RecordMode.COMPILE) { - return; - } - } - if (ctx().rasterizerDiscard.isEnabled() || FeedbackManager.getRenderMode() != GL11.GL_RENDER) { - return; - } - if (firstClearPending && Thread.currentThread() == MainThread && getDrawFramebuffer() == 0) { - firstClearPending = false; - final long start = System.nanoTime(); - RENDER_BACKEND.clear(mask); - final long end = System.nanoTime(); - if (end - start > 0) { - firstClearBlockNanos += end - start; - RENDER_BACKEND.recordGate(end - start, end); - } - return; - } - RENDER_BACKEND.clear(mask); - } - - public static long takeFirstClearBlockNanos() { - final long value = firstClearBlockNanos; - firstClearBlockNanos = 0L; - return value; - } - - public static void glPushAttrib(int mask) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordPushAttrib(mask); - if (mode == RecordMode.COMPILE) { - return; - } - } - GLDebug.pushGroup("pushState"); - pushState(mask); - } - - public static void glPopAttrib() { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordPopAttrib(); - if (mode == RecordMode.COMPILE) { - return; - } - } - if (ctx().attribDepth == 0) { - rejectExitCapture(); - warnOnce("popattrib-underflow", "glPopAttrib called with an empty attrib stack; ignoring"); - return; - } - GLDebug.popGroup(); - GLDebug.pushGroup("popState"); - try { - popState(); - } finally { - GLDebug.popGroup(); - } - } - - // Matrix Operations - public static void glMatrixMode(int mode) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.MATRIX_MODE); - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - DisplayListManager.recordMatrixMode(mode); - if (recordMode == RecordMode.COMPILE) { - return; - } - } - mod(glCtx.matrixMode).setMode(mode); - } - - public static void glLoadMatrix(FloatBuffer m) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx, true); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - final Matrix4f matrix = new Matrix4f().set(m); - m.rewind(); - DisplayListManager.recordLoadMatrix(matrix); - if (mode == RecordMode.COMPILE) { - return; - } - } - if (isCachingEnabled()) { - matrixStack(glCtx).set(m); - bumpMatrixGeneration(glCtx); - } - } - - public static void glLoadMatrix(DoubleBuffer m) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx, true); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - // Convert double buffer to float buffer for recording - glCtx.conversionMatrix4d.set(m); - m.rewind(); - final Matrix4f floatMatrix = new Matrix4f(); - floatMatrix.set(glCtx.conversionMatrix4d); - DisplayListManager.recordLoadMatrix(floatMatrix); - if (mode == RecordMode.COMPILE) { - return; - } - } - if (isCachingEnabled()) { - glCtx.conversionMatrix4d.set(m); - matrixStack(glCtx).set(glCtx.conversionMatrix4d); - bumpMatrixGeneration(glCtx); - } - } - - public static void setModelViewMatrix(Matrix4fc m) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.matrixChange(GL11.GL_MODELVIEW, 0, true); - if (isCachingEnabled()) { - glCtx.modelViewMatrix.set(m); - glCtx.mvGeneration++; - glCtx.mvLinearGeneration++; - } - } - - public static void setTextureMatrix(int unit, Matrix4fc m) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.matrixChange(GL11.GL_TEXTURE, unit, true); - if (unit != 0) beforeUncapturedStateChange(); - if (isCachingEnabled()) { - glCtx.textures.getTextureUnitMatrix(unit).set(m); - glCtx.texMatrixGeneration++; - } - } - - public static void setProjectionMatrix(Matrix4fc m) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (isCachingEnabled()) { - glCtx.projectionMatrix.set(m); - glCtx.projGeneration++; - } - } - - public static Matrix4fStack getMatrixStack() { - return matrixStack(ctx()); - } - - private static Matrix4fStack matrixStack(GLContextState glCtx) { - switch (glCtx.matrixMode.getMode()) { - case GL11.GL_MODELVIEW -> { - return glCtx.modelViewMatrix; - } - case GL11.GL_PROJECTION -> { - return glCtx.projectionMatrix; - } - case GL11.GL_TEXTURE -> { - return glCtx.textures.getTextureUnitMatrix(glCtx.activeTextureUnit.getValue()); - } - default -> throw new IllegalStateException("Unknown matrix mode: " + glCtx.matrixMode.getMode()); - } - } - - /** Bump the generation counter for the currently active matrix mode. */ - private static void bumpMatrixGeneration(GLContextState glCtx) { - bumpMatrixGeneration(glCtx, true); - } - - private static void bumpMatrixGeneration(GLContextState glCtx, boolean linearChanged) { - switch (glCtx.matrixMode.getMode()) { - case GL11.GL_MODELVIEW -> { - glCtx.mvGeneration++; - if (linearChanged) glCtx.mvLinearGeneration++; - } - case GL11.GL_PROJECTION -> glCtx.projGeneration++; - case GL11.GL_TEXTURE -> glCtx.texMatrixGeneration++; - } - } - - public static void glLoadIdentity() { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx, true); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordLoadIdentity(); - if (mode == RecordMode.COMPILE) { - return; - } - } - if (isCachingEnabled()) { - matrixStack(glCtx).identity(); - bumpMatrixGeneration(glCtx); - } - } - - public static void glTranslatef(float x, float y, float z) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - if (DisplayListManager.isRecording()) { - DisplayListManager.applyMatrixTranslation(x, y, z); - return; - } - if (isCachingEnabled()) { - matrixStack(glCtx).translate(x, y, z); - bumpMatrixGeneration(glCtx, false); - } - } - - public static void glTranslated(double x, double y, double z) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - if (DisplayListManager.isRecording()) { - DisplayListManager.applyMatrixTranslation((float) x, (float) y, (float) z); - return; - } - if (isCachingEnabled()) { - matrixStack(glCtx).translate((float) x, (float) y, (float) z); - bumpMatrixGeneration(glCtx, false); - } - } - - public static void glScalef(float x, float y, float z) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - if (DisplayListManager.isRecording()) { - DisplayListManager.applyMatrixScale(x, y, z); - return; - } - if (isCachingEnabled()) { - matrixStack(glCtx).scale(x, y, z); - bumpMatrixGeneration(glCtx); - } - } - - public static void glScaled(double x, double y, double z) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - if (DisplayListManager.isRecording()) { - DisplayListManager.applyMatrixScale((float) x, (float) y, (float) z); - return; - } - if (isCachingEnabled()) { - matrixStack(glCtx).scale((float) x, (float) y, (float) z); - bumpMatrixGeneration(glCtx); - } - } - - public static void glMultMatrix(FloatBuffer floatBuffer) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - glCtx.multMatrix.set(floatBuffer); - final int currentMode = glCtx.matrixMode.getMode(); - - if (DisplayListManager.isRecording()) { - DisplayListManager.updateRelativeTransform(glCtx.multMatrix); - return; - } - if (isCachingEnabled()) { - matrixStack(glCtx).mul(glCtx.multMatrix); - bumpMatrixGeneration(glCtx); - } - } - - public static void applyMultMatrix(Matrix4f multMatrix) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - if (isCachingEnabled()) { - matrixStack(glCtx).mul(multMatrix); - bumpMatrixGeneration(glCtx); - } - } - - public static void glMultMatrix(DoubleBuffer matrix) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - glCtx.conversionMatrix4d.set(matrix); - glCtx.conversionMatrix4f.set(glCtx.conversionMatrix4d); - - if (DisplayListManager.isRecording()) { - DisplayListManager.updateRelativeTransform(glCtx.conversionMatrix4f); - return; - } - if (isCachingEnabled()) { - matrixStack(glCtx).mul(glCtx.conversionMatrix4f); - bumpMatrixGeneration(glCtx); - } - } - - public static void glRotatef(float angle, float x, float y, float z) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - final float lenSq = x * x + y * y + z * z; - if (lenSq == 0.0f) return; - - // Fast way to normalize rotation - final float scalar = 1.0f / (float) Math.sqrt(lenSq); - x *= scalar; - y *= scalar; - z *= scalar; - // Convert deg to rad - angle = (float) Math.toRadians(angle); - - if (DisplayListManager.isRecording()) { - DisplayListManager.applyMatrixRotation(angle, x, y, z); - return; - } - if (isCachingEnabled()) { - matrixStack(glCtx).rotate(angle, x, y, z); - bumpMatrixGeneration(glCtx); - } - } - - public static void glRotated(double angle, double x, double y, double z) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - final double lenSq = x * x + y * y + z * z; - if (lenSq == 0.0) return; - - // Fast way to normalize rotation - final double scalar = 1.0 / Math.sqrt(lenSq); - x *= scalar; - y *= scalar; - z *= scalar; - // Convert deg to rad - angle = Math.toRadians(angle); - - if (DisplayListManager.isRecording()) { - DisplayListManager.applyMatrixRotation((float) angle, (float) x, (float) y, (float) z); - return; - } - if (isCachingEnabled()) { - matrixStack(glCtx).rotate((float) angle, (float) x, (float) y, (float) z); - bumpMatrixGeneration(glCtx); - } - } - - public static void glOrtho(double left, double right, double bottom, double top, double zNear, double zFar) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - if (DisplayListManager.isRecording()) { - DisplayListManager.updateRelativeTransformOrtho(left, right, bottom, top, zNear, zFar); - return; - } - if (isCachingEnabled()) { - matrixStack(glCtx).ortho((float) left, (float) right, (float) bottom, (float) top, (float) zNear, (float) zFar); - bumpMatrixGeneration(glCtx); - } - } - - public static void glFrustum(double left, double right, double bottom, double top, double zNear, double zFar) { - final GLContextState glCtx = ctx(); - beforeMatrixChange(glCtx); - if (DisplayListManager.isRecording()) { - DisplayListManager.updateRelativeTransformFrustum(left, right, bottom, top, zNear, zFar); - return; - } - if (isCachingEnabled()) { - matrixStack(glCtx).frustum((float) left, (float) right, (float) bottom, (float) top, (float) zNear, (float) zFar); - bumpMatrixGeneration(glCtx); - } - } - - public static void glPushMatrix() { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.pushMatrix(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordPushMatrix(); // Handles flush + relativeTransform stack - if (mode == RecordMode.COMPILE) { - return; - } - } - // Only track stack on main thread (splash thread has separate GL context) - if (isCachingEnabled()) { - try { - matrixStack(glCtx).pushMatrix(); - } catch (IllegalStateException ignored) { - glCtx.exitCapture.reject(); - if (initConfig != null && initConfig.isLwjglDebug()) LOGGER.warn("Matrix stack overflow ", new Throwable()); - } - } - } - - public static void glPopMatrix() { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.popMatrix(); - if (isUncapturedMatrix(glCtx)) beforeUncapturedStateChange(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordPopMatrix(); // Handles flush + relativeTransform stack + lastRecordedTransform sync - if (mode == RecordMode.COMPILE) { - return; - } - } - // Only track stack on main thread (splash thread has separate GL context) - if (isCachingEnabled()) { - try { - matrixStack(glCtx).popMatrix(); - bumpMatrixGeneration(glCtx); - } catch (IllegalStateException ignored) { - glCtx.exitCapture.reject(); - if (initConfig != null && initConfig.isLwjglDebug()) LOGGER.warn("Matrix stack underflow ", new Throwable()); - } - } - } - - public static void gluPerspective(float fovy, float aspect, float zNear, float zFar) { - final GLContextState glCtx = ctx(); - glCtx.gluMatrix.identity().perspective((float) Math.toRadians(fovy), aspect, zNear, zFar); - glCtx.gluMatrix.get(0, glCtx.gluBuffer); - GLStateManager.glMultMatrix(glCtx.gluBuffer); - } - - public static void gluLookAt(float eyex, float eyey, float eyez, float centerx, float centery, float centerz, float upx, float upy, float upz) { - final GLContextState glCtx = ctx(); - glCtx.gluMatrix.identity().lookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz); - glCtx.gluMatrix.get(0, glCtx.gluBuffer); - GLStateManager.glMultMatrix(glCtx.gluBuffer); - } - - public static void gluOrtho2D(float left, float right, float bottom, float top) { - GLStateManager.glOrtho(left, right, bottom, top, -1.0, 1.0); - } - - public static void gluPickMatrix(float x, float y, float deltaX, float deltaY, IntBuffer viewport) { - rejectExitCapture(); - if (deltaX <= 0 || deltaY <= 0) return; - GLStateManager.glTranslatef( - (viewport.get(viewport.position() + 2) - 2 * (x - viewport.get(viewport.position() + 0))) / deltaX, - (viewport.get(viewport.position() + 3) - 2 * (y - viewport.get(viewport.position() + 1))) / deltaY, - 0); - GLStateManager.glScalef(viewport.get(viewport.position() + 2) / deltaX, viewport.get(viewport.position() + 3) / deltaY, 1.0f); - } - - public static int gluBuild2DMipmaps(int target, int components, int width, int height, int format, int type, ByteBuffer data) { - if (width < 1 || height < 1) return GLU.GLU_INVALID_VALUE; - glTexImage2D(target, 0, components, width, height, 0, format, type, data); - glGenerateMipmap(target); - return 0; - } - - public static String gluErrorString(int errorCode) { - return switch (errorCode) { - case GLU.GLU_INVALID_ENUM -> "Invalid enum (glu)"; - case GLU.GLU_INVALID_VALUE -> "Invalid value (glu)"; - case GLU.GLU_OUT_OF_MEMORY -> "Out of memory (glu)"; - case GL11.GL_NO_ERROR -> "No error"; - case GL11.GL_INVALID_ENUM -> "Invalid enum"; - case GL11.GL_INVALID_VALUE -> "Invalid value"; - case GL11.GL_INVALID_OPERATION -> "Invalid operation"; - case GL11.GL_OUT_OF_MEMORY -> "Out of memory"; - default -> "Unknown error: " + errorCode; - }; - } - - public static boolean gluUnProject(float winx, float winy, float winz, FloatBuffer modelMatrix, FloatBuffer projMatrix, IntBuffer viewport, FloatBuffer obj_pos) { - final GLContextState glCtx = ctx(); - glCtx.gluMatrix.set(projMatrix).mul(glCtx.gluMatrix2.set(modelMatrix)); - if (Math.abs(glCtx.gluMatrix.determinant()) < 1.0e-10f) return false; - glCtx.gluMatrix.invert(glCtx.gluMatrix); - - float ndcX = (winx - viewport.get(viewport.position())) / viewport.get(viewport.position() + 2) * 2.0f - 1.0f; - float ndcY = (winy - viewport.get(viewport.position() + 1)) / viewport.get(viewport.position() + 3) * 2.0f - 1.0f; - float ndcZ = winz * 2.0f - 1.0f; - - glCtx.gluVec4.set(ndcX, ndcY, ndcZ, 1.0f); - glCtx.gluMatrix.transform(glCtx.gluVec4); - if (glCtx.gluVec4.w == 0.0f) return false; - - float invW = 1.0f / glCtx.gluVec4.w; - obj_pos.put(obj_pos.position(), glCtx.gluVec4.x * invW); - obj_pos.put(obj_pos.position() + 1, glCtx.gluVec4.y * invW); - obj_pos.put(obj_pos.position() + 2, glCtx.gluVec4.z * invW); - return true; - } - - public static void glViewport(int x, int y, int width, int height) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordViewport(x, y, width, height); - if (mode == RecordMode.COMPILE) { - return; - } - } - beforeUncapturedStateChange(); - RENDER_BACKEND.viewport(x, y, width, height); - // Only update cached state when caching is enabled - if (isCachingEnabled()) { - mod(ctx().viewportState).setViewPort(x, y, width, height); - } - } - - public static int getActiveTextureUnit() { - return ctx().activeTextureUnit.getValue(); - } - - public static int getListMode() { - return DisplayListManager.getListMode(); - } - - private static boolean handleRemovedTexParam(int target, int pname, int value) { - if (pname == GL14.GL_GENERATE_MIPMAP) { - if (target == GL11.GL_TEXTURE_2D) { - final TextureInfo info = getBoundTextureInfo(); - if (info != null) info.setGenerateMipmap(value != 0); - } - return true; - } - return false; - } - - private static void maybeGenerateMipmap(int target, int level) { - if (target != GL11.GL_TEXTURE_2D) return; - final TextureInfo info = getBoundTextureInfo(); - if (info != null && info.isGenerateMipmap() && level == info.getBaseLevel() && level < info.getMaxLevel()) { - RENDER_BACKEND.generateMipmap(target); - } - } - - public static boolean updateTexParameteriCache(int target, int texture, int pname, int param) { - rejectExitCapture(); - if (target != GL11.GL_TEXTURE_2D) { - return true; - } - return updateTexParameteriCache(TextureInfoCache.INSTANCE.getInfo(texture), pname, param); - } - - static boolean updateTexParameteriCache(TextureInfo info, int pname, int param) { - if (info == null) { - return true; - } - switch (pname) { - case GL11.GL_TEXTURE_MIN_FILTER -> { - if (info.getMinFilter() == param && isCachingEnabled()) return false; - info.setMinFilter(param); - } - case GL11.GL_TEXTURE_MAG_FILTER -> { - if (info.getMagFilter() == param && isCachingEnabled()) return false; - info.setMagFilter(param); - } - case GL11.GL_TEXTURE_WRAP_S -> { - if (info.getWrapS() == param && isCachingEnabled()) return false; - info.setWrapS(param); - } - case GL11.GL_TEXTURE_WRAP_T -> { - if (info.getWrapT() == param && isCachingEnabled()) return false; - info.setWrapT(param); - } - case GL12.GL_TEXTURE_BASE_LEVEL -> { - if (info.getBaseLevel() == param && isCachingEnabled()) return false; - info.setBaseLevel(param); - } - case GL12.GL_TEXTURE_MAX_LEVEL -> { - if (info.getMaxLevel() == param && isCachingEnabled()) return false; - info.setMaxLevel(param); - } - case GL12.GL_TEXTURE_MIN_LOD -> { - if (info.getMinLod() == param && isCachingEnabled()) return false; - info.setMinLod(param); - } - case GL12.GL_TEXTURE_MAX_LOD -> { - if (info.getMaxLod() == param && isCachingEnabled()) return false; - info.setMaxLod(param); - } - } - return true; - } - - public static void glTexParameter(int target, int pname, IntBuffer params) { - rejectExitCapture(); - if (handleRemovedTexParam(target, pname, params.remaining() >= 1 ? params.get(params.position()) : 0)) return; - if (params.remaining() >= 1) { - final int val = params.get(params.position()); - final int remapped = remapTexClamp(pname, val); - if (remapped != val) params.put(params.position(), remapped); - if (target == GL11.GL_TEXTURE_2D) { - updateTexParameteriCache(getBoundTextureInfo(), pname, remapped); - } - } - RENDER_BACKEND.texParameteriv(target, pname, params); - } - - public static void glTexParameter(int target, int pname, FloatBuffer params) { - rejectExitCapture(); - if (handleRemovedTexParam(target, pname, params.remaining() >= 1 ? (int) params.get(params.position()) : 0)) return; - if (params.remaining() >= 1) { - final float val = params.get(params.position()); - final float remapped = remapTexClamp(pname, val); - if (remapped != val) params.put(params.position(), remapped); - if (target == GL11.GL_TEXTURE_2D) { - updateTexParameterfCache(getBoundTextureInfo(), pname, remapped); - } - } - RENDER_BACKEND.texParameterfv(target, pname, params); - } - - public static void glTexParameteri(int target, int pname, int param) { - rejectExitCapture(); - if (handleRemovedTexParam(target, pname, param)) return; - param = remapTexClamp(pname, param); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordTexParameteri(target, pname, param); - if (mode == RecordMode.COMPILE) { - return; - } - } - if (getActiveTextureUnit() != 0) beforeUncapturedStateChange(); - if (target != GL11.GL_TEXTURE_2D) { - RENDER_BACKEND.texParameteri(target, pname, param); - return; - } - if (!updateTexParameteriCache(getBoundTextureInfo(), pname, param)) return; - - RENDER_BACKEND.texParameteri(target, pname, param); - } - - public static boolean updateTexParameterfCache(int target, int texture, int pname, float param) { - rejectExitCapture(); - if (target != GL11.GL_TEXTURE_2D) { - return true; - } - return updateTexParameterfCache(TextureInfoCache.INSTANCE.getInfo(texture), pname, param); - } - - static boolean updateTexParameterfCache(TextureInfo info, int pname, float param) { - if (info == null) { - return true; - } - switch (pname) { - case GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_TEXTURE_WRAP_S, GL11.GL_TEXTURE_WRAP_T -> { - return updateTexParameteriCache(info, pname, (int) param); - } - case EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT -> { - if (info.getMaxAnisotropy() == param && isCachingEnabled()) return false; - info.setMaxAnisotropy(param); - } - case GL14.GL_TEXTURE_LOD_BIAS -> { - if (info.getLodBias() == param && isCachingEnabled()) return false; - info.setLodBias(param); - } - } - return true; - } - - public static void glTexParameterf(int target, int pname, float param) { - rejectExitCapture(); - if (handleRemovedTexParam(target, pname, param > 0 ? (int) (param + 0.5f) : (int) (param - 0.5f))) return; - param = remapTexClamp(pname, param); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordTexParameterf(target, pname, param); - if (mode == RecordMode.COMPILE) { - return; - } - } - if (getActiveTextureUnit() != 0) beforeUncapturedStateChange(); - if (target != GL11.GL_TEXTURE_2D) { - RENDER_BACKEND.texParameterf(target, pname, param); - return; - } - if (!updateTexParameterfCache(getBoundTextureInfo(), pname, param)) return; - - RENDER_BACKEND.texParameterf(target, pname, param); - } - - public static final long TEX_PARAM_MISS = Long.MIN_VALUE; - - public static long lookupTexParameteri(TextureInfo info, int pname) { - if (info == null) { - if (isRecordingDisplayList()) { - throw new IllegalStateException( - "glGetTexParameteri called during display list recording with no cached TextureInfo. " + - "Cannot query OpenGL state during compilation!"); - } - return TEX_PARAM_MISS; - } - return switch (pname) { - case GL11.GL_TEXTURE_MIN_FILTER -> info.getMinFilter(); - case GL11.GL_TEXTURE_MAG_FILTER -> info.getMagFilter(); - case GL11.GL_TEXTURE_WRAP_S -> info.getWrapS(); - case GL11.GL_TEXTURE_WRAP_T -> info.getWrapT(); - case GL12.GL_TEXTURE_BASE_LEVEL -> info.getBaseLevel(); - case GL12.GL_TEXTURE_MAX_LEVEL -> info.getMaxLevel(); - case GL12.GL_TEXTURE_MIN_LOD -> info.getMinLod(); - case GL12.GL_TEXTURE_MAX_LOD -> info.getMaxLod(); - case GL14.GL_GENERATE_MIPMAP -> info.isGenerateMipmap() ? GL11.GL_TRUE : GL11.GL_FALSE; - default -> { - if (isRecordingDisplayList()) { - throw new IllegalStateException(String.format( - "glGetTexParameteri called during display list recording with uncached pname 0x%s. " + - "Cannot query OpenGL state during compilation!", Integer.toHexString(pname))); - } - yield TEX_PARAM_MISS; - } - }; - } - - public static int glGetTexParameteri(int target, int pname) { - rejectExitCapture(); - if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) { - return RENDER_BACKEND.getTexParameteri(target, pname); - } - final long v = lookupTexParameteri(getBoundTextureInfo(), pname); - return v != TEX_PARAM_MISS ? (int) v : RENDER_BACKEND.getTexParameteri(target, pname); - } - - public static float glGetTexParameterf(int target, int pname) { - rejectExitCapture(); - if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) { - return RENDER_BACKEND.getTexParameterf(target, pname); - } - final TextureInfo info = getBoundTextureInfo(); - if(info == null) { - if (isRecordingDisplayList()) { - throw new IllegalStateException( - "glGetTexParameterf called during display list recording with no cached TextureInfo. " + - "Cannot query OpenGL state during compilation!"); - } - return RENDER_BACKEND.getTexParameterf(target, pname); - } - - return switch (pname) { - case EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT -> info.getMaxAnisotropy(); - case GL14.GL_TEXTURE_LOD_BIAS -> info.getLodBias(); - default -> { - if (isRecordingDisplayList()) { - throw new IllegalStateException(String.format( - "glGetTexParameterf called during display list recording with uncached pname 0x%s. " + - "Cannot query OpenGL state during compilation!", Integer.toHexString(pname))); - } - yield RENDER_BACKEND.getTexParameterf(target, pname); - } - }; - } - - private static int mipLevelSize(int base, int level) { - if (base <= 0 || level < 0 || level >= Integer.SIZE - 1) return 1; - return Math.max(base >> level, 1); - } - - public static int glGetTexLevelParameteri(int target, int level, int pname) { - rejectExitCapture(); - if (target != GL11.GL_TEXTURE_2D || !isCachingEnabled()) { - return RENDER_BACKEND.getTexLevelParameteri(target, level, pname); - } - final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(getBoundTextureForServerState()); - if (info == null) { - if (isRecordingDisplayList()) { - throw new IllegalStateException(String.format( - "glGetTexLevelParameteri called during display list recording with no cached TextureInfo for texture %d. " + - "Cannot query OpenGL state during compilation!", getBoundTextureForServerState())); - } - return RENDER_BACKEND.getTexLevelParameteri(target, level, pname); - } - return switch (pname) { - case GL11.GL_TEXTURE_WIDTH -> mipLevelSize(info.getWidth(), level); - case GL11.GL_TEXTURE_HEIGHT -> mipLevelSize(info.getHeight(), level); - case GL11.GL_TEXTURE_INTERNAL_FORMAT -> { - if (info.needsInternalFormatResolve() && isRecordingDisplayList()) { - throw new IllegalStateException(String.format("glGetTexLevelParameteri(GL_TEXTURE_INTERNAL_FORMAT) needs to resolve a generic compressed format for texture %d during display list recording", getBoundTextureForServerState())); - } - yield info.getResolvedInternalFormat(); - } - default -> { - if (isRecordingDisplayList()) { - throw new IllegalStateException(String.format( - "glGetTexLevelParameteri called during display list recording with uncached pname 0x%s for texture %d. " + - "Cannot query OpenGL state during compilation!", Integer.toHexString(pname), getBoundTextureForServerState())); - } - yield RENDER_BACKEND.getTexLevelParameteri(target, level, pname); - } - }; - } - - public static void glGetTexImage(int target, int level, int format, int type, ByteBuffer pixels) { - rejectExitCapture(); - if (RenderSystem.isGLES()) { - getTexImageViaFboReadPixels(target, level, format, type, pixels); - return; - } - suspendPixelPackBuffer(); - RENDER_BACKEND.getTexImage(target, level, format, type, pixels); - restorePixelPackBuffer(); - } - public static void glGetTexImage(int target, int level, int format, int type, IntBuffer pixels) { - rejectExitCapture(); - if (RenderSystem.isGLES()) { - getTexImageViaFboReadPixels(target, level, format, type, pixels); - return; - } - suspendPixelPackBuffer(); - RENDER_BACKEND.getTexImage(target, level, format, type, pixels); - restorePixelPackBuffer(); - } - - private static void getTexImageViaFboReadPixels(int target, int level, int format, int type, Buffer pixels) { - if (target != GL11.GL_TEXTURE_2D) { - LOGGER.warn("glGetTexImage ES: unsupported target 0x{}", Integer.toHexString(target)); - return; - } - final int texId = getBoundTextureForServerState(); - if (texId == 0) return; - final int width = RENDER_BACKEND.getTexLevelParameteri(target, level, GL11.GL_TEXTURE_WIDTH); - final int height = RENDER_BACKEND.getTexLevelParameteri(target, level, GL11.GL_TEXTURE_HEIGHT); - if (width <= 0 || height <= 0) return; - - final int prevReadFb = RENDER_BACKEND.getInteger(GL30.GL_READ_FRAMEBUFFER_BINDING); - final int fbo = RENDER_BACKEND.genFramebuffers(); - try { - RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo); - RENDER_BACKEND.framebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, target, texId, level); - final int status = RENDER_BACKEND.checkFramebufferStatus(GL30.GL_READ_FRAMEBUFFER); - if (status != GL30.GL_FRAMEBUFFER_COMPLETE) { - LOGGER.warn("glGetTexImage ES: FBO incomplete (0x{})", Integer.toHexString(status)); - return; - } - final int esType = remapPixelTypeForGLES(format, type); - final boolean bgra = format == GL12.GL_BGRA; - final int esFormat = bgra ? GL11.GL_RGBA : format; - suspendPixelPackBuffer(); - try { - if (pixels instanceof ByteBuffer bb) { - RENDER_BACKEND.readPixels(0, 0, width, height, esFormat, esType, bb); - } else if (pixels instanceof IntBuffer ib) { - RENDER_BACKEND.readPixels(0, 0, width, height, esFormat, esType, ib); - } - if (bgra) swapRedBlueInPlace(pixels); - } finally { - restorePixelPackBuffer(); - } - } finally { - RENDER_BACKEND.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, prevReadFb); - RENDER_BACKEND.deleteFramebuffers(fbo); - } - } - - private static void swapRedBlueInPlace(Buffer pixels) { - if (pixels instanceof ByteBuffer bb) { - final int p = bb.position(); - final int lim = bb.limit(); - for (int i = p; i + 3 < lim; i += 4) { - final byte r = bb.get(i); - bb.put(i, bb.get(i + 2)); - bb.put(i + 2, r); - } - } else if (pixels instanceof IntBuffer ib) { - final int p = ib.position(); - final int lim = ib.limit(); - for (int i = p; i < lim; i++) { - final int w = ib.get(i); - ib.put(i, (w & 0xFF00FF00) | ((w & 0xFF) << 16) | ((w >> 16) & 0xFF)); - } - } - } - - public static void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer pixels) { - rejectExitCapture(); - type = remapPixelTypeForGLES(format, type); - suspendPixelPackBuffer(); - RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels); - restorePixelPackBuffer(); - } - public static void glReadPixels(int x, int y, int width, int height, int format, int type, FloatBuffer pixels) { - rejectExitCapture(); - type = remapPixelTypeForGLES(format, type); - suspendPixelPackBuffer(); - RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels); - restorePixelPackBuffer(); - } - public static void glReadPixels(int x, int y, int width, int height, int format, int type, IntBuffer pixels) { - rejectExitCapture(); - type = remapPixelTypeForGLES(format, type); - suspendPixelPackBuffer(); - RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels); - restorePixelPackBuffer(); - } - public static void glTexStorage2D(int target, int levels, int internalFormat, int width, int height) { - rejectExitCapture(); - RENDER_BACKEND.texStorage2D(target, levels, internalFormat, width, height); - TextureInfoCache.INSTANCE.onTexStorage2D(target, internalFormat, width, height); - } - public static void glClearTexImage(int texture, int level, int format, int type, ByteBuffer data) { - rejectExitCapture(); - RENDER_BACKEND.clearTexImage(texture, level, format, type); - if (level == 0) TextureInfoCache.INSTANCE.onContentsChanged(texture); - } - - public static int glGenSamplers() { - requireContext("glGenSamplers"); - return RENDER_BACKEND.genSamplers(); - } - - public static void glGenSamplers(IntBuffer samplers) { - requireContext("glGenSamplers"); - for (int i = samplers.position(); i < samplers.limit(); i++) samplers.put(i, RENDER_BACKEND.genSamplers()); - } - - public static void glGenSamplers(int[] samplers) { - requireContext("glGenSamplers"); - for (int i = 0; i < samplers.length; i++) samplers[i] = RENDER_BACKEND.genSamplers(); - } - - public static void glDeleteSamplers(int sampler) { - rejectExitCapture(); - if (sampler == 0) return; - ctx().samplerUnits.unbindEverywhere(sampler); - RENDER_BACKEND.deleteSamplers(sampler); - } - - public static void glDeleteSamplers(IntBuffer samplers) { - for (int i = samplers.position(); i < samplers.limit(); i++) glDeleteSamplers(samplers.get(i)); - } - - public static void glDeleteSamplers(int[] samplers) { - for (int sampler : samplers) glDeleteSamplers(sampler); - } - - public static void glBindSampler(int unit, int sampler) { - bindSampler(ctx().samplerUnits, unit, sampler); - } - - private static void bindSampler(SamplerUnitArray units, int unit, int sampler) { - rejectExitCapture(); - if (isCachingEnabled() && unit >= 0 && unit < units.size() && units.get(unit) == sampler) return; - beforeUncapturedStateChange(); - if (!units.set(unit, sampler)) { - warnOnce("samplerUnitRange", "glBindSampler unit {} exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS {}", unit, units.size()); - } - RENDER_BACKEND.bindSampler(unit, sampler); - } - - public static void unbindAllSamplers() { - final SamplerUnitArray units = ctx().samplerUnits; - if (units.getHighestBoundUnit() < 0) return; - beforeUncapturedStateChange(); - for (int unit = units.getHighestBoundUnit(); unit >= 0; unit = units.getHighestBoundUnit()) { - units.set(unit, 0); - RENDER_BACKEND.bindSampler(unit, 0); - } - } - - public static void glBindSamplers(int first, int count, IntBuffer samplers) { - if (samplers == null) { - for (int i = 0; i < count; i++) glBindSampler(first + i, 0); - return; - } - requireRemaining(samplers, count); - final int base = samplers.position(); - for (int i = 0; i < count; i++) glBindSampler(first + i, samplers.get(base + i)); - } - - private static void requireRemaining(IntBuffer buffer, int count) { - if (buffer.remaining() < count) throw new IllegalArgumentException("Number of remaining buffer elements is " + buffer.remaining() + ", must be at least " + count); - } - - public static void glBindSamplers(int first, IntBuffer samplers) { - if (samplers != null) glBindSamplers(first, samplers.remaining(), samplers); - } - - public static void glBindSamplers(int first, int[] samplers) { - if (samplers == null) return; - for (int i = 0; i < samplers.length; i++) glBindSampler(first + i, samplers[i]); - } - - public static int getSamplerBinding(int unit) { return ctx().samplerUnits.get(unit); } - public static int getSamplerUnitCount() { return ctx().samplerUnits.size(); } - public static void glSamplerParameteri(int sampler, int pname, int param) { rejectExitCapture(); RENDER_BACKEND.samplerParameteri(sampler, pname, param); } - public static void glSamplerParameterf(int sampler, int pname, float param) { rejectExitCapture(); RENDER_BACKEND.samplerParameterf(sampler, pname, param); } - - private static boolean glMaterialFront(int pname, FloatBuffer params) { - final GLContextState glCtx = ctx(); - mod(glCtx.frontMaterial); - return switch (pname) { - case GL11.GL_AMBIENT -> glCtx.frontMaterial.setAmbient(params); - case GL11.GL_DIFFUSE -> glCtx.frontMaterial.setDiffuse(params); - case GL11.GL_SPECULAR -> glCtx.frontMaterial.setSpecular(params); - case GL11.GL_EMISSION -> glCtx.frontMaterial.setEmission(params); - case GL11.GL_SHININESS -> glCtx.frontMaterial.setShininess(params); - case GL11.GL_AMBIENT_AND_DIFFUSE -> { - final boolean a = glCtx.frontMaterial.setAmbient(params); - final boolean d = glCtx.frontMaterial.setDiffuse(params); - yield a || d; - } - case GL11.GL_COLOR_INDEXES -> glCtx.frontMaterial.setColorIndexes(params); - default -> false; - }; - } - - private static boolean glMaterialBack(int pname, FloatBuffer params) { - final GLContextState glCtx = ctx(); - mod(glCtx.backMaterial); - return switch (pname) { - case GL11.GL_AMBIENT -> glCtx.backMaterial.setAmbient(params); - case GL11.GL_DIFFUSE -> glCtx.backMaterial.setDiffuse(params); - case GL11.GL_SPECULAR -> glCtx.backMaterial.setSpecular(params); - case GL11.GL_EMISSION -> glCtx.backMaterial.setEmission(params); - case GL11.GL_SHININESS -> glCtx.backMaterial.setShininess(params); - case GL11.GL_AMBIENT_AND_DIFFUSE -> { - final boolean a = glCtx.backMaterial.setAmbient(params); - final boolean d = glCtx.backMaterial.setDiffuse(params); - yield a || d; - } - case GL11.GL_COLOR_INDEXES -> glCtx.backMaterial.setColorIndexes(params); - default -> false; - }; - } - - private static boolean glMaterialFront(int pname, IntBuffer params) { - final GLContextState glCtx = ctx(); - mod(glCtx.frontMaterial); - return switch (pname) { - case GL11.GL_AMBIENT -> glCtx.frontMaterial.setAmbient(params); - case GL11.GL_DIFFUSE -> glCtx.frontMaterial.setDiffuse(params); - case GL11.GL_SPECULAR -> glCtx.frontMaterial.setSpecular(params); - case GL11.GL_EMISSION -> glCtx.frontMaterial.setEmission(params); - case GL11.GL_SHININESS -> glCtx.frontMaterial.setShininess(params); - case GL11.GL_AMBIENT_AND_DIFFUSE -> { - final boolean a = glCtx.frontMaterial.setAmbient(params); - final boolean d = glCtx.frontMaterial.setDiffuse(params); - yield a || d; - } - case GL11.GL_COLOR_INDEXES -> glCtx.frontMaterial.setColorIndexes(params); - default -> false; - }; - } - - private static boolean glMaterialBack(int pname, IntBuffer params) { - final GLContextState glCtx = ctx(); - mod(glCtx.backMaterial); - return switch (pname) { - case GL11.GL_AMBIENT -> glCtx.backMaterial.setAmbient(params); - case GL11.GL_DIFFUSE -> glCtx.backMaterial.setDiffuse(params); - case GL11.GL_SPECULAR -> glCtx.backMaterial.setSpecular(params); - case GL11.GL_EMISSION -> glCtx.backMaterial.setEmission(params); - case GL11.GL_SHININESS -> glCtx.backMaterial.setShininess(params); - case GL11.GL_AMBIENT_AND_DIFFUSE -> { - final boolean a = glCtx.backMaterial.setAmbient(params); - final boolean d = glCtx.backMaterial.setDiffuse(params); - yield a || d; - } - case GL11.GL_COLOR_INDEXES -> glCtx.backMaterial.setColorIndexes(params); - default -> false; - }; - } - - public static void glMaterial(int face, int pname, FloatBuffer params) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.material(face, pname); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordMaterial(face, pname, params); - if (mode == RecordMode.COMPILE) { - return; - } - } - boolean changed = false; - if (face == GL11.GL_FRONT) { - changed = glMaterialFront(pname, params); - } else if (face == GL11.GL_BACK) { - changed = glMaterialBack(pname, params); - } else if (face == GL11.GL_FRONT_AND_BACK) { - final boolean f = glMaterialFront(pname, params); - final boolean b = glMaterialBack(pname, params); - changed = f || b; - } else { - throw new RuntimeException("Unsupported face value for glMaterial: " + face); - } - if (changed) glCtx.lightingGeneration++; - } - - public static void glMaterial(int face, int pname, IntBuffer params) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.material(face, pname); - // For IntBuffer version, we need to convert to float for recording - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - // Convert int params to float for recording - final float[] floatParams = new float[params.remaining()]; - params.mark(); - for (int i = 0; i < floatParams.length; i++) { - floatParams[i] = GLStateManager.i2f(params.get()); - } - params.reset(); - DisplayListManager.recordMaterial(face, pname, FloatBuffer.wrap(floatParams)); - if (mode == RecordMode.COMPILE) { - return; - } - } - boolean changed = false; - if (face == GL11.GL_FRONT) { - changed = glMaterialFront(pname, params); - } else if (face == GL11.GL_BACK) { - changed = glMaterialBack(pname, params); - } else if (face == GL11.GL_FRONT_AND_BACK) { - final boolean f = glMaterialFront(pname, params); - final boolean b = glMaterialBack(pname, params); - changed = f || b; - } else { - throw new RuntimeException("Unsupported face value for glMaterial: " + face); - } - if (changed) glCtx.lightingGeneration++; - } - - public static void glMaterialf(int face, int pname, float val) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordMaterialf(face, pname, val); - if (mode == RecordMode.COMPILE) { - return; - } - } - if (pname != GL11.GL_SHININESS) { - // it is only valid to call glMaterialf for the GL_SHININESS parameter - return; - } - - boolean changed = false; - if (face == GL11.GL_FRONT) { - mod(glCtx.frontMaterial); - changed = glCtx.frontMaterial.setShininess(val); - } else if (face == GL11.GL_BACK) { - mod(glCtx.backMaterial); - changed = glCtx.backMaterial.setShininess(val); - } else if (face == GL11.GL_FRONT_AND_BACK) { - mod(glCtx.frontMaterial); - mod(glCtx.backMaterial); - final boolean f = glCtx.frontMaterial.setShininess(val); - final boolean b = glCtx.backMaterial.setShininess(val); - changed = f || b; - } else { - throw new RuntimeException("Unsupported face value for glMaterial: " + face); - } - if (changed) glCtx.lightingGeneration++; - } - - public static void glMateriali(int face, int pname, int val) { - // This will end up no-opping if pname != GL_SHININESS, it is invalid to call this with another pname - // Command recording happens in glMaterialf - glMaterialf(face, pname, (float) val); - } - - public static void glLight(int light, int pname, FloatBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordLight(light, pname, params); - if (mode == RecordMode.COMPILE) { - return; - } - } - final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0]; - mod(lightState); - final boolean changed = switch (pname) { - case GL11.GL_AMBIENT -> lightState.setAmbient(params); - case GL11.GL_DIFFUSE -> lightState.setDiffuse(params); - case GL11.GL_SPECULAR -> lightState.setSpecular(params); - case GL11.GL_POSITION -> lightState.setPosition(params); - case GL11.GL_SPOT_DIRECTION -> lightState.setSpotDirection(params); - case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(params); - case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(params); - case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(params); - case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(params); - case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(params); - default -> false; - }; - if (changed) glCtx.lightingGeneration++; - } - - public static void glLight(int light, int pname, IntBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - // For IntBuffer version, we need to convert to float for recording - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - // Convert int params to float for recording - final float[] floatParams = new float[params.remaining()]; - params.mark(); - for (int i = 0; i < floatParams.length; i++) { - floatParams[i] = GLStateManager.i2f(params.get()); - } - params.reset(); - DisplayListManager.recordLight(light, pname, FloatBuffer.wrap(floatParams)); - if (mode == RecordMode.COMPILE) { - return; - } - } - final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0]; - mod(lightState); - final boolean changed = switch (pname) { - case GL11.GL_AMBIENT -> lightState.setAmbient(params); - case GL11.GL_DIFFUSE -> lightState.setDiffuse(params); - case GL11.GL_SPECULAR -> lightState.setSpecular(params); - case GL11.GL_POSITION -> lightState.setPosition(params); - case GL11.GL_SPOT_DIRECTION -> lightState.setSpotDirection(params); - case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(params); - case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(params); - case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(params); - case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(params); - case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(params); - default -> false; - }; - if (changed) glCtx.lightingGeneration++; - } - - public static void glLightf(int light, int pname, float param) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordLightf(light, pname, param); - if (mode == RecordMode.COMPILE) { - return; - } - } - final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0]; - mod(lightState); - final boolean changed = switch (pname) { - case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(param); - case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(param); - case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(param); - case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(param); - case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(param); - default -> false; - }; - if (changed) glCtx.lightingGeneration++; - } - - public static void glLighti(int light, int pname, int param) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordLighti(light, pname, param); - if (mode == RecordMode.COMPILE) { - return; - } - } - final LightStateStack lightState = glCtx.lightDataStates[light - GL11.GL_LIGHT0]; - mod(lightState); - final boolean changed = switch (pname) { - case GL11.GL_SPOT_EXPONENT -> lightState.setSpotExponent(param); - case GL11.GL_SPOT_CUTOFF -> lightState.setSpotCutoff(param); - case GL11.GL_CONSTANT_ATTENUATION -> lightState.setConstantAttenuation(param); - case GL11.GL_LINEAR_ATTENUATION -> lightState.setLinearAttenuation(param); - case GL11.GL_QUADRATIC_ATTENUATION -> lightState.setQuadraticAttenuation(param); - default -> false; - }; - if (changed) glCtx.lightingGeneration++; - } - - public static void glLightModel(int pname, FloatBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordLightModel(pname, params); - if (mode == RecordMode.COMPILE) { - return; - } - } - mod(glCtx.lightModel); - final boolean changed = switch (pname) { - case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.setAmbient(params); - case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(params); - case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(params); - default -> false; - }; - if (changed) glCtx.lightingGeneration++; - } - - public static void glLightModel(int pname, IntBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - // For IntBuffer version, we need to convert to float for recording - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - // Convert int params to float for recording - final float[] floatParams = new float[params.remaining()]; - params.mark(); - for (int i = 0; i < floatParams.length; i++) { - floatParams[i] = GLStateManager.i2f(params.get()); - } - params.reset(); - DisplayListManager.recordLightModel(pname, FloatBuffer.wrap(floatParams)); - if (mode == RecordMode.COMPILE) { - return; - } - } - mod(glCtx.lightModel); - final boolean changed = switch (pname) { - case GL11.GL_LIGHT_MODEL_AMBIENT -> glCtx.lightModel.setAmbient(params); - case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.setColorControl(params); - case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(params); - case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(params); - default -> false; - }; - if (changed) glCtx.lightingGeneration++; - } - - public static void glLightModelf(int pname, float param) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordLightModelf(pname, param); - if (mode == RecordMode.COMPILE) { - return; - } - } - - if (isCachingEnabled()) { - mod(glCtx.lightModel); - final boolean changed = switch (pname) { - case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(param); - case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(param); - default -> false; - }; - if (changed) glCtx.lightingGeneration++; - } - } - - public static void glLightModeli(int pname, int param) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordLightModeli(pname, param); - if (mode == RecordMode.COMPILE) { - return; - } - } - - if (isCachingEnabled()) { - mod(glCtx.lightModel); - final boolean changed = switch (pname) { - case GL12.GL_LIGHT_MODEL_COLOR_CONTROL -> glCtx.lightModel.setColorControl(param); - case GL11.GL_LIGHT_MODEL_LOCAL_VIEWER -> glCtx.lightModel.setLocalViewer(param); - case GL11.GL_LIGHT_MODEL_TWO_SIDE -> glCtx.lightModel.setTwoSide(param); - default -> false; - }; - if (changed) glCtx.lightingGeneration++; - } - } - - public static void glColorMaterial(int face, int mode) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.COLOR_MATERIAL_SETTINGS); - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - DisplayListManager.recordColorMaterial(face, mode); - if (recordMode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.colorMaterialFace.getValue() != face || glCtx.colorMaterialParameter.getValue() != mode) { - mod(glCtx.colorMaterialFace).setValue(face); - mod(glCtx.colorMaterialParameter).setValue(mode); - glCtx.lightingGeneration++; - } - } - - public static void glDepthRange(double near, double far) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (!isCachingEnabled() || glCtx.viewportState.depthRangeNear != near || glCtx.viewportState.depthRangeFar != far) beforeUncapturedStateChange(); - if (isCachingEnabled()) mod(glCtx.viewportState).setDepthRange(near, far); - RENDER_BACKEND.depthRange(near, far); - } - - public static void glUseProgram(int program) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordUseProgram(program); - if (mode == RecordMode.COMPILE) { - return; - } - } - - final ShaderManager ffp = glCtx.ffp; - if (program == 0 && ffp.isEnabled()) { - final int prev = glCtx.activeProgram; - final boolean changed = prev != 0; - if (changed) glCtx.programGeneration++; - glCtx.activeProgram = 0; // Track that FFP was requested - if (changed && GLSMHooks.PROGRAM_CHANGE.hasListeners()) { - GLSMHooks.programChangeEvent.previousProgram = prev; - GLSMHooks.programChangeEvent.newProgram = 0; - GLSMHooks.programChangeEvent.postBind = false; - GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent); - } - ffp.activate(); - if (changed && GLSMHooks.PROGRAM_CHANGE.hasListeners()) { - GLSMHooks.programChangeEvent.previousProgram = prev; - GLSMHooks.programChangeEvent.newProgram = 0; - GLSMHooks.programChangeEvent.postBind = true; - GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent); - } - return; - } - - // Non-zero program or FFP emulation not enabled - if (program == 0) { - warnOnce("useprogram-zero-ffp-disabled", - "[FFP] glUseProgram(0) reached the driver because emulation is disabled"); - } - if (ffp.isActive()) { - ffp.deactivate(); - } - - final boolean caching = isCachingEnabled(); - if (!caching || program != glCtx.activeProgram) { - if (Tracy.ENABLED) programSwitches++; - glCtx.programGeneration++; - final int prev = glCtx.activeProgram; - glCtx.activeProgram = program; - if (GLSMHooks.PROGRAM_CHANGE.hasListeners()) { - GLSMHooks.programChangeEvent.previousProgram = prev; - GLSMHooks.programChangeEvent.newProgram = program; - GLSMHooks.programChangeEvent.postBind = false; - GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent); - } - if (initConfig != null && initConfig.isLwjglDebug()) { - final String programName = GLDebug.getObjectLabel(KHRDebug.GL_PROGRAM, program); - GLDebug.debugMessage("Activating Program - " + program + ":" + programName); - } - RENDER_BACKEND.useProgram(program); - if (GLSMHooks.PROGRAM_CHANGE.hasListeners()) { - GLSMHooks.programChangeEvent.previousProgram = prev; - GLSMHooks.programChangeEvent.newProgram = program; - GLSMHooks.programChangeEvent.postBind = true; - GLSMHooks.PROGRAM_CHANGE.post(GLSMHooks.programChangeEvent); - } - } - } - - // Missing GL commands from Mesa cross-check - public static void glTexImage1D(int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) { - rejectExitCapture(); - internalformat = changeFormatIfDeprecated(internalformat); - type = remapPixelTypeForGLES(format, type); - type = remapTypeForRemappedInternalFormat(internalformat, type); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glTexImage1D"); - } - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texImage1D(target, level, internalformat, width, border, format, type, pixels); - restorePixelUnpackBuffer(); - } - - public static void glTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) { - rejectExitCapture(); - internalformat = changeFormatIfDeprecated(internalformat); - type = remapPixelTypeForGLES(format, type); - type = remapTypeForRemappedInternalFormat(internalformat, type); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glTexImage3D"); - } - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); - restorePixelUnpackBuffer(); - } - - public static void glTexImage3D(int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, IntBuffer pixels) { - rejectExitCapture(); - internalformat = changeFormatIfDeprecated(internalformat); - type = remapPixelTypeForGLES(format, type); - type = remapTypeForRemappedInternalFormat(internalformat, type); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glTexImage3D"); - } - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); - restorePixelUnpackBuffer(); - } - - public static void glTexSubImage1D(int target, int level, int xoffset, int width, int format, int type, ByteBuffer pixels) { - rejectExitCapture(); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glTexSubImage1D"); - } - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texSubImage1D(target, level, xoffset, width, format, type, pixels); - restorePixelUnpackBuffer(); - } - - public static void glLineWidth(float width) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordLineWidth(width); - if (mode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.lineState.getWidth() != width) { - mod(glCtx.lineState).setWidth(width); - RENDER_BACKEND.lineWidth(Math.clamp(width, lineWidthMin, lineWidthMax)); - } - } - - public static boolean ffpWidensLineQuads() { - final GLContextState glCtx = ctx(); - return wideLineEmulationEnabled && glCtx.activeProgram == 0 && glCtx.lineState.getWidth() > 1.0f - && !DisplayListManager.isRecording(); - } - - private static boolean widensLineDraw(int mode, int count) { - return LineQuads.isLineMode(mode) && LineQuads.segmentCount(mode, count) > 0 && ffpWidensLineQuads(); - } - - private static void drawLinesAsQuads(GLContextState glCtx, DirectTessellator lines) { - if (lines == null) return; - if (readsBufferObject(glCtx.vaos)) { - warnOnce("line-readback", "Wide GL_LINES drawn from a buffer object; widening them reads the buffer back, which waits for the GPU"); - } - final int vao = glCtx.boundVAO; - final int vbo = glCtx.boundVBO; - TessellatorStreamingDrawer.drawDirect(lines); - glBindVertexArray(vao); - glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - } - - private static DirectTessellator lineElementsFromBuffer(GLContextState glCtx, int mode, int count, int type, long offset) { - if (glCtx.vaos.boundEBO == 0) return null; - final ByteBuffer indices = MemoryUtilities.memAlloc(count * GLTypes.sizeBytes(type)); - try { - glGetBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, offset, indices); - return ImmediateModeRecorder.processDrawElementsFromAttribs(mode, count, type, MemoryUtilities.memAddress0(indices)); - } finally { - MemoryUtilities.memFree(indices); - } - } - - private static void warnIfInstancedWideLines(int mode) { - if (LineQuads.isLineMode(mode) && ffpWidensLineQuads()) { - warnOnce("instanced-wide-lines", "Instanced wide GL_LINES are not widened and draw 1 px wide"); - } - } - - private static boolean readsBufferObject(VAOManager vaos) { - for (int i = 0; i < VAOManager.MAX_ATTRIBS; i++) { - final VAOManager.Attrib attrib = vaos.attrib(i); - if (attrib != null && attrib.enabled && attrib.vboId != 0) return true; - } - return false; - } - - private static void prepareLineEmulation(GLContextState glCtx, int drawMode) { - setLineStippleActive(glCtx, (LineQuads.isLineMode(drawMode) || glCtx.lineQuadsActive) && glCtx.lineStippleState.isEnabled()); - } - - private static void setLineStippleActive(GLContextState glCtx, boolean active) { - if (glCtx.lineStippleActive == active) return; - glCtx.lineStippleActive = active; - RENDER_BACKEND.provokingVertex(active ? GL32.GL_FIRST_VERTEX_CONVENTION : GL32.GL_LAST_VERTEX_CONVENTION); - } - - public static void glFlush() { - rejectExitCapture(); - RENDER_BACKEND.flush(); - } - - public static void glFinish() { - rejectExitCapture(); - RENDER_BACKEND.finish(); - } - public static void setVSyncEnabled(boolean enabled) { RENDER_BACKEND.setVSyncEnabled(enabled); } @@ -7157,1297 +681,6 @@ public class GLStateManager { RENDER_BACKEND.pumpDisplayMessages(); } - public static int glGetError() { - rejectExitCapture(); - if (!RENDER_BACKEND.hasContext()) return 0; - if (initConfig.isNoErrorChecks()) return 0; - return RENDER_BACKEND.getError(); - } - - public static void checkGLError() { - final int error = glGetError(); - if (error != GL11.GL_NO_ERROR) GLErrorReporter.reportError(error); - } - - public static String glGetString(int pname) { - rejectExitCapture(); - if (!RENDER_BACKEND.hasContext()) return "no valid GL/render context"; - return RENDER_BACKEND.getString(pname); - } - - public static String glGetStringi(int name, int index) { - rejectExitCapture(); - if (!RENDER_BACKEND.hasContext()) return "no valid GL/render context"; - return RENDER_BACKEND.getStringi(name, index); - } - - public static void glShaderSource(int shader, CharSequence source) { - rejectExitCapture(); - String src = source.toString(); - // Always rename reserved words for the target GLSL version (e.g. 'sampler' at 460) - src = GlslTransformUtils.renameReservedWords(src, RENDER_BACKEND.getMinGLSLVersion()); - if (ShaderManager.isEnabled()) { - final int shaderType = RENDER_BACKEND.getShaderi(shader, GL20.GL_SHADER_TYPE); - src = CompatShaderTransformer.transform(src, shaderType, shaderType == GL20.GL_FRAGMENT_SHADER); - } - RENDER_BACKEND.shaderSource(shader, src); - } - - public static void nglShaderSource(int shader, int count, long strings, long lengths) { - rejectExitCapture(); - if (count <= 0) return; - final CharSequence source; - if (count == 1) { - source = decodeShaderSourceString(strings, lengths, 0); - } else { - final StringBuilder sb = new StringBuilder(); - for (int i = 0; i < count; i++) sb.append(decodeShaderSourceString(strings, lengths, i)); - source = sb.toString(); - } - glShaderSource(shader, source); - } - - private static String decodeShaderSourceString(long strings, long lengths, int i) { - final long strAddr = MemoryUtilities.memGetAddress(strings + (long) i * Pointer.POINTER_SIZE); - final int len = lengths == MemoryUtilities.NULL ? -1 : MemoryUtilities.memGetInt(lengths + (long) i * 4); - return len < 0 ? MemoryUtilities.memUTF8(strAddr) : MemoryUtilities.memUTF8(strAddr, len); - } - - public static void glShaderSource(int shader, ByteBuffer source) { - final byte[] bytes = new byte[source.remaining()]; - final int pos = source.position(); - source.get(bytes); - source.position(pos); - glShaderSource(shader, new String(bytes, StandardCharsets.UTF_8)); - } - - public static void glShaderSource(int shader, CharSequence[] sources) { - int totalLen = 0; - for (CharSequence s : sources) totalLen += s.length(); - final StringBuilder sb = new StringBuilder(totalLen); - for (CharSequence s : sources) sb.append(s); - glShaderSource(shader, sb.toString()); - } - - /** Check shader type to determine if fragment output transformation is needed. */ - private static boolean isFragmentShader(int shader) { - return RENDER_BACKEND.getShaderi(shader, GL20.GL_SHADER_TYPE) == GL20.GL_FRAGMENT_SHADER; - } - - // Texture commands - public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) { - rejectExitCapture(); - type = remapPixelTypeForGLES(format, type); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordComplexCommand(TexSubImage2DCmd.fromByteBuffer(target, level, xoffset, yoffset, width, height, format, type, pixels, ctx().pixelUnpackState)); - if (mode == RecordMode.COMPILE) { - return; - } - } - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); - restorePixelUnpackBuffer(); - TextureInfoCache.INSTANCE.onTexSubImage2D(target, level); - maybeGenerateMipmap(target, level); - } - - public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) { - rejectExitCapture(); - type = remapPixelTypeForGLES(format, type); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordComplexCommand(TexSubImage2DCmd.fromIntBuffer(target, level, xoffset, yoffset, width, height, format, type, pixels, ctx().pixelUnpackState)); - if (mode == RecordMode.COMPILE) { - return; - } - } - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); - restorePixelUnpackBuffer(); - TextureInfoCache.INSTANCE.onTexSubImage2D(target, level); - maybeGenerateMipmap(target, level); - } - - public static void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, long pixels_buffer_offset) { - rejectExitCapture(); - type = remapPixelTypeForGLES(format, type); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glTexSubImage2D with buffer offset"); - } - RENDER_BACKEND.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels_buffer_offset); - TextureInfoCache.INSTANCE.onTexSubImage2D(target, level); - maybeGenerateMipmap(target, level); - } - - public static TextureStaging beginTextureStaging(int level, int x, int y, int width, int height) { - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("beginTextureStaging"); - } - if (!ctx().pixelUnpackState.isDefault()) { - return null; - } - return RENDER_BACKEND.beginTextureStaging(level, x, y, width, height); - } - - public static boolean commitTextureStaging(TextureStaging staging) { - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("commitTextureStaging"); - } - suspendPixelUnpackBuffer(); - final boolean committed; - try { - committed = RENDER_BACKEND.commitTextureStaging(staging); - } finally { - restorePixelUnpackBuffer(); - } - if (committed) { - TextureInfoCache.INSTANCE.onTexSubImage2D(GL11.GL_TEXTURE_2D, staging.level()); - maybeGenerateMipmap(GL11.GL_TEXTURE_2D, staging.level()); - } - return committed; - } - - public static void abandonTextureStaging(TextureStaging staging) { - RENDER_BACKEND.abandonTextureStaging(staging); - } - - public static void trimTextureStaging() { - RENDER_BACKEND.trimTextureStaging(); - } - - public static void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, ByteBuffer pixels) { - rejectExitCapture(); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glTexSubImage3D"); - } - suspendPixelUnpackBuffer(); - RENDER_BACKEND.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); - restorePixelUnpackBuffer(); - } - - public static void glCopyTexImage1D(int target, int level, int internalFormat, int x, int y, int width, int border) { - rejectExitCapture(); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glCopyTexImage1D"); - } - RENDER_BACKEND.copyTexImage1D(target, level, internalFormat, x, y, width, border); - } - - public static void glCopyTexImage2D(int target, int level, int internalFormat, int x, int y, int width, int height, int border) { - rejectExitCapture(); - internalFormat = changeFormatIfDeprecated(internalFormat); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glCopyTexImage2D"); - } - RENDER_BACKEND.copyTexImage2D(target, level, internalFormat, x, y, width, height, border); - TextureInfoCache.INSTANCE.onCopyTexImage2D(target, level, internalFormat, width, height); - maybeGenerateMipmap(target, level); - } - - public static void glCopyTexSubImage1D(int target, int level, int xoffset, int x, int y, int width) { - rejectExitCapture(); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glCopyTexSubImage1D"); - } - RENDER_BACKEND.copyTexSubImage1D(target, level, xoffset, x, y, width); - } - - public static void glCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) { - rejectExitCapture(); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glCopyTexSubImage2D"); - } - RENDER_BACKEND.copyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); - TextureInfoCache.INSTANCE.onTexSubImage2D(target, level); - maybeGenerateMipmap(target, level); - } - - public static void glCopyTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height) { - rejectExitCapture(); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glCopyTexSubImage3D"); - } - RENDER_BACKEND.copyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); - } - - // State commands - public static void glCullFace(int mode) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.CULL_FACE); - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - DisplayListManager.recordCullFace(mode); - if (recordMode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.polygonState.getCullFaceMode() != mode) { - mod(glCtx.polygonState).setCullFaceMode(mode); - RENDER_BACKEND.cullFace(mode); - } - } - - public static void glFrontFace(int mode) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.FRONT_FACE); - final RecordMode recordMode = DisplayListManager.getRecordMode(); - if (recordMode != RecordMode.NONE) { - DisplayListManager.recordFrontFace(mode); - if (recordMode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.polygonState.getFrontFace() != mode) { - mod(glCtx.polygonState).setFrontFace(mode); - RENDER_BACKEND.frontFace(mode); - } - } - - public static void glHint(int target, int hint) { - rejectExitCapture(); - if (hint != GL11.GL_NICEST && hint != GL11.GL_FASTEST && hint != GL11.GL_DONT_CARE) { - return; - } - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordHint(target, hint); - if (mode == RecordMode.COMPILE) { - return; - } - } - final int shift = hintShift(target); - if (shift >= 0) { - final IntegerStateStack hints = ctx().hintState; - final int code = hint == GL11.GL_FASTEST ? 1 : hint == GL11.GL_NICEST ? 2 : 0; - final int packed = hints.getValue() & ~(3 << shift) | code << shift; - if (packed != hints.getValue()) mod(hints).setValue(packed); - } - if (!isLegacyHint(target)) { - RENDER_BACKEND.hint(target, hint); - } - } - - public static void glLineStipple(int factor, short pattern) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordLineStipple(factor, pattern); - if (mode == RecordMode.COMPILE) { - return; - } - } - mod(glCtx.lineState); - glCtx.lineState.setStippleFactor(factor); - glCtx.lineState.setStipplePattern(pattern); - } - - public static void glPointSize(float size) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordPointSize(size); - if (mode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.pointState.getSize() != size) { - mod(glCtx.pointState).setSize(size); - RENDER_BACKEND.pointSize(size); - } - } - - public static void glPolygonMode(int face, int polygonMode) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordPolygonMode(face, polygonMode); - if (mode == RecordMode.COMPILE) { - return; - } - } - // Track front/back separately in cache (Mesa compat semantics), but always issue GL_FRONT_AND_BACK to the driver (core profile constraint). - final boolean caching = isCachingEnabled(); - final boolean front = face != GL11.GL_BACK; - final boolean back = face != GL11.GL_FRONT; - final boolean needsUpdate = !caching - || (front && glCtx.polygonState.getFrontMode() != polygonMode) - || (back && glCtx.polygonState.getBackMode() != polygonMode); - if (!needsUpdate) return; - beforeUncapturedStateChange(); - if (caching) { - mod(glCtx.polygonState); - if (front) glCtx.polygonState.setFrontMode(polygonMode); - if (back) glCtx.polygonState.setBackMode(polygonMode); - } - RENDER_BACKEND.polygonMode(GL11.GL_FRONT_AND_BACK, polygonMode); - } - - public static void glPolygonOffset(float factor, float units) { - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.OFFSET_VALUES); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordPolygonOffset(factor, units); - if (mode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - - if (!caching || glCtx.polygonState.getOffsetFactor() != factor || glCtx.polygonState.getOffsetUnits() != units || glCtx.polygonState.getOffsetClamp() != 0.0f) { - mod(glCtx.polygonState); - glCtx.polygonState.setOffsetFactor(factor); - glCtx.polygonState.setOffsetUnits(units); - glCtx.polygonState.setOffsetClamp(0.0f); - RENDER_BACKEND.polygonOffset(factor, units); - } - } - - public static void glPolygonOffsetClamp(float factor, float units, float clamp) { - if (clamp == 0.0f) { - glPolygonOffset(factor, units); - return; - } - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glPolygonOffsetClamp"); - } - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.OFFSET_VALUES); - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.polygonState.getOffsetFactor() != factor || glCtx.polygonState.getOffsetUnits() != units || glCtx.polygonState.getOffsetClamp() != clamp) { - mod(glCtx.polygonState); - glCtx.polygonState.setOffsetFactor(factor); - glCtx.polygonState.setOffsetUnits(units); - glCtx.polygonState.setOffsetClamp(clamp); - RENDER_BACKEND.polygonOffsetClamp(factor, units, clamp); - } - } - - public static void glMultiDrawArraysIndirectCount(int mode, long indirect, long drawcount, int maxdrawcount, int stride) { - rejectExitCapture(); - RENDER_BACKEND.multiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride); - } - - public static void glMultiDrawElementsIndirectCount(int mode, int type, long indirect, long drawcount, int maxdrawcount, int stride) { - rejectExitCapture(); - RENDER_BACKEND.multiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride); - } - - public static void glSpecializeShader(int shader, CharSequence entryPoint, IntBuffer constantIndex, IntBuffer constantValue) { - rejectExitCapture(); - RENDER_BACKEND.specializeShader(shader, entryPoint, constantIndex, constantValue); - } - - public static void glReadBuffer(int mode) { - rejectExitCapture(); - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glReadBuffer"); - } - RENDER_BACKEND.readBuffer(mode); - } - - public static void glScissor(int x, int y, int width, int height) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordScissor(x, y, width, height); - if (mode == RecordMode.COMPILE) { - return; - } - } - beforeUncapturedStateChange(); - RENDER_BACKEND.scissor(x, y, width, height); - if (isCachingEnabled()) { - mod(ctx().scissorState).setScissor(x, y, width, height); - } - } - - public static void glStencilFunc(int func, int ref, int mask) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordStencilFunc(func, ref, mask); - if (mode == RecordMode.COMPILE) { - return; - } - } - final int clampedMask = mask & glCtx.stencilBitMask; - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.stencilState.getFuncFront() != func || glCtx.stencilState.getRefFront() != ref || glCtx.stencilState.getValueMaskFront() != clampedMask) { - beforeUncapturedStateChange(); - mod(glCtx.stencilState).setFunc(func, ref, clampedMask); - RENDER_BACKEND.stencilFunc(func, ref, clampedMask); - } - } - - public static void glStencilMask(int mask) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordStencilMask(mask); - if (mode == RecordMode.COMPILE) { - return; - } - } - final int clampedMask = mask & glCtx.stencilBitMask; - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.stencilState.getWriteMaskFront() != clampedMask) { - beforeUncapturedStateChange(); - mod(glCtx.stencilState).setWriteMask(clampedMask); - RENDER_BACKEND.stencilMask(clampedMask); - } - } - - public static void glStencilOp(int fail, int zfail, int zpass) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordStencilOp(fail, zfail, zpass); - if (mode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.stencilState.getFailOpFront() != fail || glCtx.stencilState.getZFailOpFront() != zfail || glCtx.stencilState.getZPassOpFront() != zpass) { - beforeUncapturedStateChange(); - mod(glCtx.stencilState).setOp(fail, zfail, zpass); - RENDER_BACKEND.stencilOp(fail, zfail, zpass); - } - } - - // glPixelStore* isn'tcompiled into display lists, it executes immediately - public static void glPixelStorei(int pname, int param) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (isCachingEnabled()) { - if (PixelStoreState.isPack(pname)) { - glCtx.pixelPackState = glCtx.pixelPackState.with(pname, param); - } else { - glCtx.pixelUnpackState = glCtx.pixelUnpackState.with(pname, param); - } - } - RENDER_BACKEND.pixelStorei(pname, param); - } - - public static void glPixelStoref(int pname, float param) { - glPixelStorei(pname, param < 0 ? -Math.round(-param) : Math.round(param)); - } - - // Display List Commands - public static void glCallLists(IntBuffer lists) { - while (lists.hasRemaining()) { - final int listId = lists.get() + ctx().listBase; - glCallList(listId); - } - } - - public static void glCallLists(ShortBuffer lists) { - while (lists.hasRemaining()) { - final int listId = (lists.get() & 0xFFFF) + ctx().listBase; - glCallList(listId); - } - } - - public static void glCallLists(ByteBuffer lists) { - while (lists.hasRemaining()) { - final int listId = (lists.get() & 0xFF) + ctx().listBase; - glCallList(listId); - } - } - - public static void glListBase(int base) { - rejectExitCapture(); - ctx().listBase = base; - } - - // Clip Plane Commands - public static void glClipPlane(int plane, DoubleBuffer equation) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (DisplayListManager.isRecording()) { - final int pos = equation.position(); - DisplayListManager.recordClipPlane(plane, equation.get(pos), equation.get(pos + 1), equation.get(pos + 2), equation.get(pos + 3)); - return; - } - final int index = plane - GL11.GL_CLIP_PLANE0; - if (index < 0 || index >= MAX_CLIP_PLANES) return; - final int pos = equation.position(); - beforeUncapturedStateChange(); - glCtx.clipPlaneState.setPlane(index, equation.get(pos), equation.get(pos + 1), equation.get(pos + 2), equation.get(pos + 3), glCtx.modelViewMatrix); - glCtx.clipPlaneGeneration++; - } - - /** Returns true if any GL_CLIP_PLANE0..7 is currently enabled. */ - public static boolean anyClipPlaneEnabled() { - return anyClipPlaneEnabled(ctx()); - } - - public static boolean anyClipPlaneEnabled(GLContextState glCtx) { - return glCtx.clipPlaneEnabledMask != 0; - } - - // Clear Commands - public static void glClearStencil(int s) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordClearStencil(s); - if (mode == RecordMode.COMPILE) { - return; - } - } - final boolean caching = isCachingEnabled(); - if (!caching || glCtx.stencilState.getClearValue() != s) { - mod(glCtx.stencilState).setClearValue(s); - RENDER_BACKEND.clearStencil(s); - } - } - - // Draw Buffer Commands (GL 2.0+) - public static void glDrawBuffers(int buffer) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDrawBuffers(1, buffer); - if (mode == RecordMode.COMPILE) { - return; - } - } - beforeUncapturedStateChange(); - RENDER_BACKEND.drawBuffers(buffer); - } - - public static void glDrawBuffers(IntBuffer bufs) { - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordDrawBuffers(bufs.remaining(), bufs); - if (mode == RecordMode.COMPILE) { - return; - } - } - beforeUncapturedStateChange(); - RENDER_BACKEND.drawBuffers(bufs); - } - - // Multisample Commands - public static void glSampleCoverage(float value, boolean invert) { - if (DisplayListManager.isRecording()) { - throw DisplayListManager.unsupportedInList("glSampleCoverage"); - } - beforeUncapturedStateChange(); - RENDER_BACKEND.sampleCoverage(value, invert); - } - - // Stencil Separate Functions (GL 2.0+) - public static void glStencilFuncSeparate(int face, int func, int ref, int mask) { - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordStencilFuncSeparate(face, func, ref, mask); - if (mode == RecordMode.COMPILE) { - return; - } - } - beforeUncapturedStateChange(); - final int clampedMask = mask & glCtx.stencilBitMask; - final boolean caching = isCachingEnabled(); - boolean needsUpdate = !caching; - if (!needsUpdate) { - if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { - needsUpdate = glCtx.stencilState.getFuncFront() != func || glCtx.stencilState.getRefFront() != ref || glCtx.stencilState.getValueMaskFront() != clampedMask; - } - if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) { - needsUpdate = glCtx.stencilState.getFuncBack() != func || glCtx.stencilState.getRefBack() != ref || glCtx.stencilState.getValueMaskBack() != clampedMask; - } - } - if (needsUpdate) { - mod(glCtx.stencilState); - if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { - glCtx.stencilState.setFuncFront(func); - glCtx.stencilState.setRefFront(ref); - glCtx.stencilState.setValueMaskFront(clampedMask); - } - if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) { - glCtx.stencilState.setFuncBack(func); - glCtx.stencilState.setRefBack(ref); - glCtx.stencilState.setValueMaskBack(clampedMask); - } - RENDER_BACKEND.stencilFuncSeparate(face, func, ref, clampedMask); - } - } - - public static void glStencilMaskSeparate(int face, int mask) { - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordStencilMaskSeparate(face, mask); - if (mode == RecordMode.COMPILE) { - return; - } - } - beforeUncapturedStateChange(); - final int clampedMask = mask & glCtx.stencilBitMask; - final boolean caching = isCachingEnabled(); - boolean needsUpdate = !caching; - if (!needsUpdate) { - if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { - needsUpdate = glCtx.stencilState.getWriteMaskFront() != clampedMask; - } - if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) { - needsUpdate = glCtx.stencilState.getWriteMaskBack() != clampedMask; - } - } - if (needsUpdate) { - mod(glCtx.stencilState); - if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { - glCtx.stencilState.setWriteMaskFront(clampedMask); - } - if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) { - glCtx.stencilState.setWriteMaskBack(clampedMask); - } - RENDER_BACKEND.stencilMaskSeparate(face, clampedMask); - } - } - - public static void glStencilOpSeparate(int face, int sfail, int dpfail, int dppass) { - final GLContextState glCtx = ctx(); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordStencilOpSeparate(face, sfail, dpfail, dppass); - if (mode == RecordMode.COMPILE) { - return; - } - } - beforeUncapturedStateChange(); - final boolean caching = isCachingEnabled(); - boolean needsUpdate = !caching; - if (!needsUpdate) { - if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { - needsUpdate = glCtx.stencilState.getFailOpFront() != sfail || glCtx.stencilState.getZFailOpFront() != dpfail || glCtx.stencilState.getZPassOpFront() != dppass; - } - if (!needsUpdate && (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK)) { - needsUpdate = glCtx.stencilState.getFailOpBack() != sfail || glCtx.stencilState.getZFailOpBack() != dpfail || glCtx.stencilState.getZPassOpBack() != dppass; - } - } - if (needsUpdate) { - mod(glCtx.stencilState); - if (face == GL11.GL_FRONT || face == GL11.GL_FRONT_AND_BACK) { - glCtx.stencilState.setFailOpFront(sfail); - glCtx.stencilState.setZFailOpFront(dpfail); - glCtx.stencilState.setZPassOpFront(dppass); - } - if (face == GL11.GL_BACK || face == GL11.GL_FRONT_AND_BACK) { - glCtx.stencilState.setFailOpBack(sfail); - glCtx.stencilState.setZFailOpBack(dpfail); - glCtx.stencilState.setZPassOpBack(dppass); - } - RENDER_BACKEND.stencilOpSeparate(face, sfail, dpfail, dppass); - } - } - - public static void glDeleteBuffers(int buffer) { - rejectExitCapture(); - if (buffer == 0) return; - invalidateDeletedBuffer(buffer); - RENDER_BACKEND.deleteBuffers(buffer); - } - - public static void glDeleteSync(long sync) { - rejectExitCapture(); - RENDER_BACKEND.deleteSync(sync); - } - - public static long glFenceSync(int condition, int flags) { rejectExitCapture(); return RENDER_BACKEND.fenceSync(condition, flags); } - public static int glClientWaitSync(long sync, int flags, long timeout) { rejectExitCapture(); return RENDER_BACKEND.clientWaitSync(sync, flags, timeout); } - public static void glWaitSync(long sync, int flags, long timeout) { rejectExitCapture(); RENDER_BACKEND.waitSync(sync, flags, timeout); } - public static int glGetSynci(long sync, int pname, IntBuffer length) { rejectExitCapture(); return RENDER_BACKEND.getSynci(sync, pname, length); } - - public static void glDeleteBuffers(IntBuffer buffers) { - rejectExitCapture(); - for (int i = buffers.position(); i < buffers.limit(); i++) { - invalidateDeletedBuffer(buffers.get(i)); - } - RENDER_BACKEND.deleteBuffers(buffers); - } - - public static void glDeleteBuffers(int[] buffers) { - for (int buffer : buffers) { - glDeleteBuffers(buffer); - } - } - - private static void invalidateDeletedBuffer(int buffer) { - final GLContextState glCtx = ctx(); - if (buffer == 0) return; - final boolean locked = acquireDrawLock(); - try { - FfpExtendedAttribs.onDeleteBuffer(glCtx, buffer); - if (glCtx.boundVBO == buffer) glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - if (glCtx.vaos.boundEBO == buffer) glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - if (glCtx.boundPixelUnpackBuffer == buffer) glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); - if (glCtx.boundPixelPackBuffer == buffer) glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); - if (glCtx.boundCopyReadBuffer == buffer) glBindBuffer(GL31.GL_COPY_READ_BUFFER, 0); - if (glCtx.boundCopyWriteBuffer == buffer) glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, 0); - for (Int2IntMap.Entry e : glCtx.boundOtherBuffers.int2IntEntrySet()) { - if (e.getIntValue() != buffer) continue; - e.setValue(0); - RENDER_BACKEND.bindBuffer(e.getIntKey(), 0); - } - for (int i = 0; i < INDEXED_BUFFER_SLOTS; i++) { - if (glCtx.uniformBufferBindings[i] == buffer) glCtx.uniformBufferBindings[i] = 0; - if (glCtx.storageBufferBindings[i] == buffer) glCtx.storageBufferBindings[i] = 0; - } - writeMappedBuffers.remove(buffer); - - glCtx.vaos.onDeleteBuffer(buffer); - } finally { - if (locked) releaseDrawLock(); - } - } - - /** glBindBufferBase/Range also set the generic binding point, so they share this. */ - private static void trackBufferBinding(GLContextState glCtx, int target, int buffer) { - if (target == GL15.GL_ARRAY_BUFFER) { - // if (boundVBO == buffer) return; TODO figure out why this breaks switching async occlusion mode - glCtx.boundVBO = buffer; - } else if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) { - glCtx.vaos.onBindEBO(buffer); - } else if (target == GL21.GL_PIXEL_UNPACK_BUFFER) { - glCtx.boundPixelUnpackBuffer = buffer; - } else if (target == GL21.GL_PIXEL_PACK_BUFFER) { - glCtx.boundPixelPackBuffer = buffer; - } else if (target == GL31.GL_COPY_READ_BUFFER) { - glCtx.boundCopyReadBuffer = buffer; - } else if (target == GL31.GL_COPY_WRITE_BUFFER) { - glCtx.boundCopyWriteBuffer = buffer; - } else { - glCtx.boundOtherBuffers.put(target, buffer); - } - } - - public static void glBindBuffer(int target, int buffer) { - rejectExitCapture(); - final boolean locked = acquireDrawLock(); - try { - trackBufferBinding(ctx(), target, buffer); - RENDER_BACKEND.bindBuffer(target, buffer); - } finally { - if (locked) releaseDrawLock(); - } - } - - public static void forcePixelUnpackState(PixelStoreState target) { - PixelStoreState.applyDiff(ctx().pixelUnpackState, target, false); - } - - public static void restorePixelUnpackState(PixelStoreState applied) { - PixelStoreState.applyDiff(applied, ctx().pixelUnpackState, false); - } - - private static boolean warnedUntrackedPixelBuffer; - - private static void warnUntrackedPixelBuffer(int binding, String name) { - if (warnedUntrackedPixelBuffer || initConfig == null || !initConfig.isLwjglDebug()) return; - final int actual = RENDER_BACKEND.getInteger(binding); - if (actual == 0) return; - warnedUntrackedPixelBuffer = true; - LOGGER.warn("{} is bound to {} but GLSM's cache says 0; a call site bypassed GLStateManager.glBindBuffer", name, actual, new Throwable()); - } - - static void suspendPixelUnpackBuffer() { - if (ctx().boundPixelUnpackBuffer != 0) { - RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); - } else { - warnUntrackedPixelBuffer(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING, "GL_PIXEL_UNPACK_BUFFER"); - } - } - - static void restorePixelUnpackBuffer() { - final GLContextState glCtx = ctx(); - if (glCtx.boundPixelUnpackBuffer != 0) { - RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, glCtx.boundPixelUnpackBuffer); - } - } - - static void suspendPixelPackBuffer() { - if (ctx().boundPixelPackBuffer != 0) { - RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); - } else { - warnUntrackedPixelBuffer(GL21.GL_PIXEL_PACK_BUFFER_BINDING, "GL_PIXEL_PACK_BUFFER"); - } - } - - static void restorePixelPackBuffer() { - final GLContextState glCtx = ctx(); - if (glCtx.boundPixelPackBuffer != 0) { - RENDER_BACKEND.bindBuffer(GL21.GL_PIXEL_PACK_BUFFER, glCtx.boundPixelPackBuffer); - } - } - - public static int glGenBuffers() { - requireContext("glGenBuffers"); - return RENDER_BACKEND.genBuffers(); - } - - public static void glGenBuffers(IntBuffer buffers) { - requireContext("glGenBuffers"); - for (int i = buffers.position(); i < buffers.limit(); i++) buffers.put(i, RENDER_BACKEND.genBuffers()); - } - - public static void glGenBuffers(int[] buffers) { - requireContext("glGenBuffers"); - for (int i = 0; i < buffers.length; i++) buffers[i] = RENDER_BACKEND.genBuffers(); - } - - public static int glCreateBuffers() { - requireContext("glCreateBuffers"); - return RENDER_BACKEND.createBuffers(); - } - - public static void glCreateBuffers(IntBuffer buffers) { - requireContext("glCreateBuffers"); - for (int i = buffers.position(); i < buffers.limit(); i++) buffers.put(i, RENDER_BACKEND.createBuffers()); - } - - public static void glCreateBuffers(int[] buffers) { - requireContext("glCreateBuffers"); - for (int i = 0; i < buffers.length; i++) buffers[i] = RENDER_BACKEND.createBuffers(); - } - - private static final int MAP_PERSISTENT_BIT = 0x40; - - private static int bufferForTarget(GLContextState glCtx, int target) { - if (target == GL15.GL_ARRAY_BUFFER) return glCtx.boundVBO; - if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) return glCtx.vaos.boundEBO; - if (target == GL31.GL_COPY_READ_BUFFER) return glCtx.boundCopyReadBuffer; - if (target == GL31.GL_COPY_WRITE_BUFFER) return glCtx.boundCopyWriteBuffer; - if (target == GL21.GL_PIXEL_UNPACK_BUFFER) return glCtx.boundPixelUnpackBuffer; - if (target == GL21.GL_PIXEL_PACK_BUFFER) return glCtx.boundPixelPackBuffer; - return glCtx.boundOtherBuffers.get(target); - } - - private static void onBufferRespec(int target) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final int buffer = bufferForTarget(glCtx, target); - if (buffer != 0) onNamedBufferRespec(glCtx, buffer); - } - - private static void onNamedBufferRespec(GLContextState glCtx, int buffer) { - rejectExitCapture(); - final boolean locked = acquireDrawLock(); - try { - if (!FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer); - } finally { - if (locked) releaseDrawLock(); - } - } - - private static void onBufferMap(int target, int access) { - if (access == GL15.GL_READ_ONLY) return; - onBufferWriteMap(target); - } - - private static void onBufferMapRange(int target, int access) { - if ((access & GL30.GL_MAP_WRITE_BIT) == 0) return; - if ((access & MAP_PERSISTENT_BIT) != 0) { - markPersistentlyMapped(target); - return; - } - onBufferWriteMap(target); - } - - private static void onBufferWriteMap(int target) { - final GLContextState glCtx = ctx(); - final int buffer = bufferForTarget(glCtx, target); - if (buffer == 0) return; - final boolean locked = acquireDrawLock(); - try { - writeMappedBuffers.add(buffer); - if (!FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer); - } finally { - if (locked) releaseDrawLock(); - } - } - - private static void onBufferUnmap(int target) { - final GLContextState glCtx = ctx(); - final int buffer = bufferForTarget(glCtx, target); - if (buffer == 0) return; - final boolean locked = acquireDrawLock(); - try { - if (writeMappedBuffers.remove(buffer) && !FfpExtendedAttribs.isEmpty()) FfpExtendedAttribs.onBufferRespecified(glCtx, buffer); - } finally { - if (locked) releaseDrawLock(); - } - } - - private static void onBufferStorage(int target, int flags) { - rejectExitCapture(); - if ((flags & MAP_PERSISTENT_BIT) != 0) { - if (!RENDER_BACKEND.isBufferImmutable(bufferForTarget(ctx(), target))) markPersistentlyMapped(target); - return; - } - onBufferRespec(target); - } - - private static void markPersistentlyMapped(int target) { - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - FfpExtendedAttribs.markPersistent(glCtx, bufferForTarget(glCtx, target)); - } finally { - if (locked) releaseDrawLock(); - } - } - - public static void glBufferData(int target, long size, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, size, usage); } - public static void glBufferData(int target, ByteBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } - public static void glBufferData(int target, ShortBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } - public static void glBufferData(int target, IntBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } - public static void glBufferData(int target, FloatBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } - public static void glBufferData(int target, DoubleBuffer data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } - public static void glBufferData(int target, LongBuffer data, int usage) { glBufferData(target, MemoryUtilities.memByteBuffer(data), usage); } - public static void glBufferData(int target, int[] data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } - public static void glBufferData(int target, float[] data, int usage) { onBufferRespec(target); RENDER_BACKEND.bufferData(target, data, usage); } - public static void glBufferData(int target, short[] data, int usage) { - final ByteBuffer copy = copyOf(data); - glBufferData(target, copy, usage); - MemoryUtilities.memFree(copy); - } - public static void glBufferData(int target, long[] data, int usage) { - final ByteBuffer copy = copyOf(data); - glBufferData(target, copy, usage); - MemoryUtilities.memFree(copy); - } - public static void glBufferData(int target, double[] data, int usage) { - final ByteBuffer copy = copyOf(data); - glBufferData(target, copy, usage); - MemoryUtilities.memFree(copy); - } - - public static void nglBufferData(int target, long size, long data, int usage) { - if (data == 0L) { - glBufferData(target, size, usage); - return; - } - glBufferData(target, MemoryUtilities.memByteBuffer(data, checkedSize(size)), usage); - } - - public static void glBufferSubData(int target, long offset, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); } - public static void glBufferSubData(int target, long offset, ShortBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); } - public static void glBufferSubData(int target, long offset, IntBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); } - public static void glBufferSubData(int target, long offset, FloatBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); } - public static void glBufferSubData(int target, long offset, DoubleBuffer data) { onBufferRespec(target); RENDER_BACKEND.bufferSubData(target, offset, data); } - public static void glBufferSubData(int target, long offset, LongBuffer data) { glBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data)); } - public static void glBufferSubData(int target, long offset, short[] data) { - final ByteBuffer copy = copyOf(data); - glBufferSubData(target, offset, copy); - MemoryUtilities.memFree(copy); - } - public static void glBufferSubData(int target, long offset, int[] data) { - final ByteBuffer copy = copyOf(data); - glBufferSubData(target, offset, copy); - MemoryUtilities.memFree(copy); - } - public static void glBufferSubData(int target, long offset, long[] data) { - final ByteBuffer copy = copyOf(data); - glBufferSubData(target, offset, copy); - MemoryUtilities.memFree(copy); - } - public static void glBufferSubData(int target, long offset, float[] data) { - final ByteBuffer copy = copyOf(data); - glBufferSubData(target, offset, copy); - MemoryUtilities.memFree(copy); - } - public static void glBufferSubData(int target, long offset, double[] data) { - final ByteBuffer copy = copyOf(data); - glBufferSubData(target, offset, copy); - MemoryUtilities.memFree(copy); - } - - public static void nglBufferSubData(int target, long offset, long size, long data) { glBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data, checkedSize(size))); } - - public static ByteBuffer glMapBuffer(int target, int access) { - rejectExitCapture(); - final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access); - if (buf != null) onBufferMap(target, access); - return buf; - } - public static ByteBuffer glMapBuffer(int target, int access, ByteBuffer old_buffer) { return glMapBuffer(target, access); } - public static ByteBuffer glMapBuffer(int target, int access, long length, ByteBuffer old_buffer) { - rejectExitCapture(); - final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access, length, old_buffer); - if (buf != null) onBufferMap(target, access); - return buf; - } - public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access) { - rejectExitCapture(); - final ByteBuffer buf = RENDER_BACKEND.mapBufferRange(target, offset, length, access); - if (buf != null) onBufferMapRange(target, access); - return buf; - } - public static ByteBuffer glMapBufferRange(int target, long offset, long length, int access, ByteBuffer old_buffer) { return glMapBufferRange(target, offset, length, access); } - public static long glMapBufferRangeAddress(int target, long offset, long length, int access) { - rejectExitCapture(); - final long address = RENDER_BACKEND.mapBufferRangeAddress(target, offset, length, access); - if (address != 0L) onBufferMapRange(target, access); - return address; - } - public static void glFlushMappedBufferRange(int target, long offset, long length) { rejectExitCapture(); RENDER_BACKEND.flushMappedBufferRange(target, offset, length); } - public static boolean glUnmapBuffer(int target) { - rejectExitCapture(); - onBufferUnmap(target); - return RENDER_BACKEND.unmapBuffer(target); - } - - public static void glGetBufferSubData(int target, long offset, ByteBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); } - public static void glGetBufferSubData(int target, long offset, ShortBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); } - public static void glGetBufferSubData(int target, long offset, IntBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); } - public static void glGetBufferSubData(int target, long offset, FloatBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); } - public static void glGetBufferSubData(int target, long offset, DoubleBuffer data) { rejectExitCapture(); RENDER_BACKEND.getBufferSubData(target, offset, data); } - public static void glGetBufferSubData(int target, long offset, LongBuffer data) { glGetBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data)); } - public static void glGetBufferSubData(int target, long offset, short[] data) { - final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 1); - glGetBufferSubData(target, offset, copy); - copy.asShortBuffer().get(data); - MemoryUtilities.memFree(copy); - } - public static void glGetBufferSubData(int target, long offset, int[] data) { - final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 2); - glGetBufferSubData(target, offset, copy); - copy.asIntBuffer().get(data); - MemoryUtilities.memFree(copy); - } - public static void glGetBufferSubData(int target, long offset, long[] data) { - final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 3); - glGetBufferSubData(target, offset, copy); - copy.asLongBuffer().get(data); - MemoryUtilities.memFree(copy); - } - public static void glGetBufferSubData(int target, long offset, float[] data) { - final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 2); - glGetBufferSubData(target, offset, copy); - copy.asFloatBuffer().get(data); - MemoryUtilities.memFree(copy); - } - public static void glGetBufferSubData(int target, long offset, double[] data) { - final ByteBuffer copy = MemoryUtilities.memAlloc(data.length << 3); - glGetBufferSubData(target, offset, copy); - copy.asDoubleBuffer().get(data); - MemoryUtilities.memFree(copy); - } - - public static void nglGetBufferSubData(int target, long offset, long size, long data) { glGetBufferSubData(target, offset, MemoryUtilities.memByteBuffer(data, checkedSize(size))); } - - public static int glGetBufferParameteri(int target, int pname) { rejectExitCapture(); return RENDER_BACKEND.getBufferParameteri(target, pname); } - public static int glGetBufferParameter(int target, int pname) { return glGetBufferParameteri(target, pname); } - public static void glGetBufferParameter(int target, int pname, IntBuffer params) { params.put(params.position(), glGetBufferParameteri(target, pname)); } - public static void glGetBufferParameteriv(int target, int pname, IntBuffer params) { params.put(params.position(), glGetBufferParameteri(target, pname)); } - public static void glGetBufferParameteriv(int target, int pname, int[] params) { params[0] = glGetBufferParameteri(target, pname); } - - public static void glBufferStorage(int target, long size, int flags) { onBufferStorage(target, flags); RENDER_BACKEND.bufferStorage(target, size, flags); } - public static void glBufferStorage(int target, ByteBuffer data, int flags) { onBufferStorage(target, flags); RENDER_BACKEND.bufferStorage(target, data, flags); } - public static void glBufferStorage(int target, ShortBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); } - public static void glBufferStorage(int target, IntBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); } - public static void glBufferStorage(int target, FloatBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); } - public static void glBufferStorage(int target, DoubleBuffer data, int flags) { glBufferStorage(target, MemoryUtilities.memByteBuffer(data), flags); } - public static void glBufferStorage(int target, short[] data, int flags) { - final ByteBuffer copy = copyOf(data); - glBufferStorage(target, copy, flags); - MemoryUtilities.memFree(copy); - } - public static void glBufferStorage(int target, int[] data, int flags) { - final ByteBuffer copy = copyOf(data); - glBufferStorage(target, copy, flags); - MemoryUtilities.memFree(copy); - } - public static void glBufferStorage(int target, float[] data, int flags) { - final ByteBuffer copy = copyOf(data); - glBufferStorage(target, copy, flags); - MemoryUtilities.memFree(copy); - } - public static void glBufferStorage(int target, double[] data, int flags) { - final ByteBuffer copy = copyOf(data); - glBufferStorage(target, copy, flags); - MemoryUtilities.memFree(copy); - } - - public static void glNamedBufferData(int buffer, long size, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, size, usage); } - public static void glNamedBufferData(int buffer, ByteBuffer data, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, data, usage); } - public static void glNamedBufferData(int buffer, FloatBuffer data, int usage) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferData(buffer, data, usage); } - public static void glNamedBufferData(int buffer, ShortBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); } - public static void glNamedBufferData(int buffer, IntBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); } - public static void glNamedBufferData(int buffer, LongBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); } - public static void glNamedBufferData(int buffer, DoubleBuffer data, int usage) { glNamedBufferData(buffer, MemoryUtilities.memByteBuffer(data), usage); } - public static void glNamedBufferData(int buffer, short[] data, int usage) { - final ByteBuffer copy = copyOf(data); - glNamedBufferData(buffer, copy, usage); - MemoryUtilities.memFree(copy); - } - public static void glNamedBufferData(int buffer, int[] data, int usage) { - final ByteBuffer copy = copyOf(data); - glNamedBufferData(buffer, copy, usage); - MemoryUtilities.memFree(copy); - } - public static void glNamedBufferData(int buffer, long[] data, int usage) { - final ByteBuffer copy = copyOf(data); - glNamedBufferData(buffer, copy, usage); - MemoryUtilities.memFree(copy); - } - public static void glNamedBufferData(int buffer, float[] data, int usage) { - final ByteBuffer copy = copyOf(data); - glNamedBufferData(buffer, copy, usage); - MemoryUtilities.memFree(copy); - } - public static void glNamedBufferData(int buffer, double[] data, int usage) { - final ByteBuffer copy = copyOf(data); - glNamedBufferData(buffer, copy, usage); - MemoryUtilities.memFree(copy); - } - - public static void glNamedBufferSubData(int buffer, long offset, ByteBuffer data) { onNamedBufferRespec(ctx(), buffer); RENDER_BACKEND.namedBufferSubData(buffer, offset, data); } - public static void glNamedBufferSubData(int buffer, long offset, ShortBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); } - public static void glNamedBufferSubData(int buffer, long offset, IntBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); } - public static void glNamedBufferSubData(int buffer, long offset, LongBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); } - public static void glNamedBufferSubData(int buffer, long offset, FloatBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); } - public static void glNamedBufferSubData(int buffer, long offset, DoubleBuffer data) { glNamedBufferSubData(buffer, offset, MemoryUtilities.memByteBuffer(data)); } - public static void glNamedBufferSubData(int buffer, long offset, short[] data) { - final ByteBuffer copy = copyOf(data); - glNamedBufferSubData(buffer, offset, copy); - MemoryUtilities.memFree(copy); - } - public static void glNamedBufferSubData(int buffer, long offset, int[] data) { - final ByteBuffer copy = copyOf(data); - glNamedBufferSubData(buffer, offset, copy); - MemoryUtilities.memFree(copy); - } - public static void glNamedBufferSubData(int buffer, long offset, long[] data) { - final ByteBuffer copy = copyOf(data); - glNamedBufferSubData(buffer, offset, copy); - MemoryUtilities.memFree(copy); - } - public static void glNamedBufferSubData(int buffer, long offset, float[] data) { - final ByteBuffer copy = copyOf(data); - glNamedBufferSubData(buffer, offset, copy); - MemoryUtilities.memFree(copy); - } - public static void glNamedBufferSubData(int buffer, long offset, double[] data) { - final ByteBuffer copy = copyOf(data); - glNamedBufferSubData(buffer, offset, copy); - MemoryUtilities.memFree(copy); - } - - public static void glClearBufferSubData(int target, int internalFormat, long offset, long size, int format, int type, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.clearBufferSubData(target, internalFormat, offset, size, format, type, data); } - public static void glClearBufferData(int target, int internalformat, int format, int type, ByteBuffer data) { onBufferRespec(target); RENDER_BACKEND.clearBufferData(target, internalformat, format, type, data); } - public static boolean glIsBuffer(int buffer) { rejectExitCapture(); return RENDER_BACKEND.isBuffer(buffer); } - public static boolean glIsTexture(int texture) { rejectExitCapture(); return !isDeferredDelete(texture) && RENDER_BACKEND.isTexture(texture); } - public static boolean glIsFramebuffer(int framebuffer) { rejectExitCapture(); return RENDER_BACKEND.isFramebuffer(framebuffer); } - public static boolean glIsRenderbuffer(int renderbuffer) { rejectExitCapture(); return RENDER_BACKEND.isRenderbuffer(renderbuffer); } - public static boolean glIsSampler(int sampler) { rejectExitCapture(); return RENDER_BACKEND.isSampler(sampler); } - public static boolean glIsQuery(int query) { rejectExitCapture(); return RENDER_BACKEND.isQuery(query); } - public static void glCopyBufferSubData(int readTarget, int writeTarget, long readOffset, long writeOffset, long size) { onBufferRespec(writeTarget); RENDER_BACKEND.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); } - - private static int checkedSize(long size) { - if (size < 0 || size > Integer.MAX_VALUE) { - throw new IllegalArgumentException("Buffer range does not fit a ByteBuffer wrapper: " + size); - } - return (int) size; - } - - private static ByteBuffer copyOf(short[] data) { - final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 1); - bb.asShortBuffer().put(data); - return bb; - } - - private static ByteBuffer copyOf(int[] data) { - final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 2); - bb.asIntBuffer().put(data); - return bb; - } - - private static ByteBuffer copyOf(long[] data) { - final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 3); - bb.asLongBuffer().put(data); - return bb; - } - - private static ByteBuffer copyOf(float[] data) { - final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 2); - bb.asFloatBuffer().put(data); - return bb; - } - - private static ByteBuffer copyOf(double[] data) { - final ByteBuffer bb = MemoryUtilities.memAlloc(data.length << 3); - bb.asDoubleBuffer().put(data); - return bb; - } - - public static void glBindVertexArray(int array) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (DisplayListManager.isRecording()) { - DisplayListManager.recordBindVAO(array); - // Since the vao needs to be bound to do stuff like state setup & data upload, it'll still execute the bind call. - // This is technically wrong, but I'm not sure if there's a better solution here. - } - bindVertexArrayInternal(glCtx, array == 0 ? glCtx.defaultVAO : array); - } - - private static void bindVertexArrayInternal(GLContextState glCtx, int array) { - final boolean locked = acquireDrawLock(); - try { - if (glCtx.boundVAO != array) { - glCtx.boundVAO = array; - glCtx.vaos.onBindVertexArrayPre(array); - RENDER_BACKEND.bindVertexArray(array); - } - } finally { - if (locked) releaseDrawLock(); - } - } - - public static void glDeleteVertexArrays(int array) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final boolean locked = acquireDrawLock(); - try { - glCtx.vaos.onDeleteVertexArray(array); - if (array == glCtx.boundVAO) { - // Deleting the bound VAO implicitly unbinds it. Rebind the default VAO. - bindVertexArrayInternal(glCtx, glCtx.defaultVAO); - } - RENDER_BACKEND.deleteVertexArrays(array); - } finally { - if (locked) releaseDrawLock(); - } - } - - public static int glGenVertexArrays() { - requireContext("glGenVertexArrays"); - return RENDER_BACKEND.genVertexArrays(); - } - - public static boolean glIsVertexArray(int array) { - rejectExitCapture(); - return RENDER_BACKEND.isVertexArray(array); - } - - public static void glBindVertexArrayAPPLE(int array) { - glBindVertexArray(array); - } - public static boolean vendorIsAMD() { return VENDOR == AMD; } @@ -8464,390 +697,6 @@ public class GLStateManager { return VENDOR == NVIDIA; } - public static void glBindFramebuffer(int target, int framebuffer) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (target == GL30.GL_FRAMEBUFFER) { - if (glCtx.drawFramebuffer == framebuffer && glCtx.readFramebuffer == framebuffer) return; - if (glCtx.drawFramebuffer != framebuffer) glCtx.drawFramebufferGeneration++; - glCtx.drawFramebuffer = framebuffer; - glCtx.readFramebuffer = framebuffer; - } else if (target == GL30.GL_DRAW_FRAMEBUFFER) { - if (glCtx.drawFramebuffer == framebuffer) return; - glCtx.drawFramebufferGeneration++; - glCtx.drawFramebuffer = framebuffer; - } else if (target == GL30.GL_READ_FRAMEBUFFER) { - if (glCtx.readFramebuffer == framebuffer) return; - glCtx.readFramebuffer = framebuffer; - } - RENDER_BACKEND.bindFramebuffer(target, framebuffer); - } - - public static void glDeleteFramebuffers(int framebuffer) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (glCtx.drawFramebuffer == framebuffer) { glCtx.drawFramebuffer = 0; glCtx.drawFramebufferGeneration++; } - if (glCtx.readFramebuffer == framebuffer) glCtx.readFramebuffer = 0; - final int[] slots = glCtx.framebufferTextures.remove(framebuffer); - if (slots != null) { - for (int slot = 0; slot < slots.length; slot++) setFramebufferSlot(slots, slot, 0); - } - RENDER_BACKEND.deleteFramebuffers(framebuffer); - } - - public static void glDeleteFramebuffers(IntBuffer framebuffers) { - for (int i = framebuffers.position(); i < framebuffers.limit(); i++) glDeleteFramebuffers(framebuffers.get(i)); - } - - public static void glDeleteFramebuffers(int[] framebuffers) { - for (int framebuffer : framebuffers) glDeleteFramebuffers(framebuffer); - } - - public static int glGenFramebuffers() { - requireContext("glGenFramebuffers"); - return RENDER_BACKEND.genFramebuffers(); - } - - public static int glCheckFramebufferStatus(int target) { - rejectExitCapture(); - return RENDER_BACKEND.checkFramebufferStatus(target); - } - - public static int glGetFramebufferAttachmentParameteri(int target, int attachment, int pname) { - rejectExitCapture(); - return RENDER_BACKEND.getFramebufferAttachmentParameteri(target, attachment, pname); - } - - public static void glFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level) { - rejectExitCapture(); - if (!beginAttach(target, attachment, texture)) return; - RENDER_BACKEND.framebufferTexture2D(target, attachment, textarget, texture, level); - } - - public static void glFramebufferTexture1D(int target, int attachment, int textarget, int texture, int level) { - rejectExitCapture(); - if (!beginAttach(target, attachment, texture)) return; - RENDER_BACKEND.framebufferTexture1D(target, attachment, textarget, texture, level); - } - - public static void glFramebufferTexture3D(int target, int attachment, int textarget, int texture, int level, int zoffset) { - rejectExitCapture(); - if (!beginAttach(target, attachment, texture)) return; - RENDER_BACKEND.framebufferTexture3D(target, attachment, textarget, texture, level, zoffset); - } - - public static void glFramebufferTextureLayer(int target, int attachment, int texture, int level, int layer) { - rejectExitCapture(); - if (!beginAttach(target, attachment, texture)) return; - RENDER_BACKEND.framebufferTextureLayer(target, attachment, texture, level, layer); - } - - public static void glFramebufferTexture(int target, int attachment, int texture, int level) { - rejectExitCapture(); - if (!beginAttach(target, attachment, texture)) return; - RENDER_BACKEND.framebufferTexture(target, attachment, texture, level); - } - - public static void glFramebufferTextureFace(int target, int attachment, int texture, int level, int face) { - glFramebufferTexture2D(target, attachment, face, texture, level); - } - - public static void glNamedFramebufferTexture(int framebuffer, int attachment, int texture, int level) { - rejectExitCapture(); - if (!beginAttach(ctx(), framebuffer, attachment, texture)) return; - RENDER_BACKEND.namedFramebufferTexture(framebuffer, attachment, texture, level); - } - - private static int swapDrawFramebuffer(int framebuffer) { - final GLContextState glCtx = ctx(); - final int previous = glCtx.drawFramebuffer; - glCtx.drawFramebuffer = framebuffer; - RENDER_BACKEND.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, framebuffer); - return previous; - } - - public static void glNamedFramebufferTextureLayer(int framebuffer, int attachment, int texture, int level, int layer) { - final int previous = swapDrawFramebuffer(framebuffer); - glFramebufferTextureLayer(GL30.GL_DRAW_FRAMEBUFFER, attachment, texture, level, layer); - swapDrawFramebuffer(previous); - } - - public static void glNamedFramebufferRenderbuffer(int framebuffer, int attachment, int renderbuffertarget, int renderbuffer) { - final int previous = swapDrawFramebuffer(framebuffer); - glFramebufferRenderbuffer(GL30.GL_DRAW_FRAMEBUFFER, attachment, renderbuffertarget, renderbuffer); - swapDrawFramebuffer(previous); - } - - public static void glNamedFramebufferTexture1DEXT(int framebuffer, int attachment, int textarget, int texture, int level) { - final int previous = swapDrawFramebuffer(framebuffer); - glFramebufferTexture1D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level); - swapDrawFramebuffer(previous); - } - - public static void glNamedFramebufferTexture2DEXT(int framebuffer, int attachment, int textarget, int texture, int level) { - final int previous = swapDrawFramebuffer(framebuffer); - glFramebufferTexture2D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level); - swapDrawFramebuffer(previous); - } - - public static void glNamedFramebufferTexture3DEXT(int framebuffer, int attachment, int textarget, int texture, int level, int zoffset) { - final int previous = swapDrawFramebuffer(framebuffer); - glFramebufferTexture3D(GL30.GL_DRAW_FRAMEBUFFER, attachment, textarget, texture, level, zoffset); - swapDrawFramebuffer(previous); - } - - public static void glNamedFramebufferTextureEXT(int framebuffer, int attachment, int texture, int level) { - final int previous = swapDrawFramebuffer(framebuffer); - glFramebufferTexture(GL30.GL_DRAW_FRAMEBUFFER, attachment, texture, level); - swapDrawFramebuffer(previous); - } - - public static void glNamedFramebufferTextureFaceEXT(int framebuffer, int attachment, int texture, int level, int face) { - glNamedFramebufferTexture2DEXT(framebuffer, attachment, face, texture, level); - } - - public static void attachTextureForReading(int attachment, int texture) { - if (isDeferredDelete(texture)) return; - final GLContextState glCtx = ctx(); - trackFramebufferAttachment(glCtx, glCtx.readFramebuffer, attachment, texture); - RENDER_BACKEND.framebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, attachment, GL11.GL_TEXTURE_2D, texture, 0); - } - - public static int glGenRenderbuffers() { - requireContext("glGenRenderbuffers"); - return RENDER_BACKEND.genRenderbuffers(); - } - public static void glDeleteRenderbuffers(int renderbuffer) { rejectExitCapture(); RENDER_BACKEND.deleteRenderbuffers(renderbuffer); } - public static void glBindRenderbuffer(int target, int renderbuffer) { rejectExitCapture(); RENDER_BACKEND.bindRenderbuffer(target, renderbuffer); } - public static void glRenderbufferStorage(int target, int internalformat, int width, int height) { rejectExitCapture(); RENDER_BACKEND.renderbufferStorage(target, internalformat, width, height); } - public static void glRenderbufferStorageMultisample(int target, int samples, int internalformat, int width, int height) { rejectExitCapture(); RENDER_BACKEND.renderbufferStorageMultisample(target, samples, internalformat, width, height); } - public static void glFramebufferRenderbuffer(int target, int attachment, int renderbuffertarget, int renderbuffer) { - rejectExitCapture(); - beginAttach(target, attachment, 0); - RENDER_BACKEND.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); - } - - public static void glGenQueries(IntBuffer ids) { - requireContext("glGenQueries"); - RENDER_BACKEND.genQueries(ids); - } - public static int glGenQueries() { - requireContext("glGenQueries"); - return RENDER_BACKEND.genQueries(); - } - public static void glDeleteQueries(int id) { rejectExitCapture(); RENDER_BACKEND.deleteQueries(id); } - public static void glBeginQuery(int target, int id) { rejectExitCapture(); RENDER_BACKEND.beginQuery(target, id); } - public static void glEndQuery(int target) { rejectExitCapture(); RENDER_BACKEND.endQuery(target); } - public static void glGetQueryObjectui(int id, int pname, IntBuffer params) { rejectExitCapture(); RENDER_BACKEND.getQueryObjectui(id, pname, params); } - public static int glGetQueryObjecti(int id, int pname) { rejectExitCapture(); return RENDER_BACKEND.getQueryObjecti(id, pname); } - - public static void glBindBufferBase(int target, int index, int buffer) { - rejectExitCapture(); - final boolean locked = acquireDrawLock(); - try { - final GLContextState glCtx = ctx(); - trackBufferBinding(glCtx, target, buffer); - trackIndexedBufferBinding(glCtx, target, index, buffer); - RENDER_BACKEND.bindBufferBase(target, index, buffer); - } finally { - if (locked) releaseDrawLock(); - } - } - - public static void glBindBufferRange(int target, int index, int buffer, long offset, long size) { - rejectExitCapture(); - final boolean locked = acquireDrawLock(); - try { - final GLContextState glCtx = ctx(); - trackBufferBinding(glCtx, target, buffer); - trackIndexedBufferBinding(glCtx, target, index, buffer); - RENDER_BACKEND.bindBufferRange(target, index, buffer, offset, size); - } finally { - if (locked) releaseDrawLock(); - } - } - - private static int[] indexedBufferBindings(GLContextState glCtx, int target, int index) { - if (index < 0 || index >= INDEXED_BUFFER_SLOTS) return null; - if (target == GL31.GL_UNIFORM_BUFFER) return glCtx.uniformBufferBindings; - if (target == GL43.GL_SHADER_STORAGE_BUFFER) return glCtx.storageBufferBindings; - return null; - } - - private static void trackIndexedBufferBinding(GLContextState glCtx, int target, int index, int buffer) { - final int[] bindings = indexedBufferBindings(glCtx, target, index); - if (bindings != null) bindings[index] = buffer; - } - - public static int getIndexedBufferBinding(int target, int index) { - if (isCachingEnabled()) { - final int[] bindings = indexedBufferBindings(ctx(), target, index); - if (bindings != null) return bindings[index]; - } - return RENDER_BACKEND.getIndexedBufferBinding(target, index); - } - - public static int glGetUniformBlockIndex(int program, CharSequence name) { rejectExitCapture(); return RENDER_BACKEND.getUniformBlockIndex(program, name); } - public static void glUniformBlockBinding(int program, int blockIndex, int binding) { rejectExitCapture(); RENDER_BACKEND.uniformBlockBinding(program, blockIndex, binding); } - public static void glBindFragDataLocation(int program, int colorNumber, CharSequence name) { rejectExitCapture(); RENDER_BACKEND.bindFragDataLocation(program, colorNumber, name); } - public static void glQueryCounter(int id, int target) { rejectExitCapture(); RENDER_BACKEND.queryCounter(id, target); } - public static long glGetQueryObjectui64(int id, int pname) { rejectExitCapture(); return RENDER_BACKEND.getQueryObjectui64(id, pname); } - public static void glUniform3(int location, float[] values) { rejectExitCapture(); RENDER_BACKEND.uniform3fv(location, values); } - public static void glUniform4(int location, float[] values) { rejectExitCapture(); RENDER_BACKEND.uniform4fv(location, values); } - - public static void glGetInteger(int pname, int[] params) { - rejectExitCapture(); - if (!isCachingEnabled() || params.length == 0) { - RENDER_BACKEND.getInteger(pname, params); - return; - } - - switch (pname) { - case GL11.GL_VIEWPORT -> { - if (params.length < 4) { - RENDER_BACKEND.getInteger(pname, params); - } else { - ctx().viewportState.get(params); - } - } - case GL11.GL_SCISSOR_BOX -> { - if (params.length < 4) { - RENDER_BACKEND.getInteger(pname, params); - } else { - ctx().scissorState.get(params); - } - } - case GL11.GL_POLYGON_MODE -> { - final PolygonState polygon = ctx().polygonState; - params[0] = polygon.getFrontMode(); - if (params.length > 1) params[1] = polygon.getBackMode(); - } - default -> { - final GLContextState glCtx = ctx(); - if (!HAS_MULTIPLE_SET.contains(pname)) { - params[0] = glGetInteger(glCtx, pname); - } else if (!LegacyQueries.getIntegerv(glCtx, pname, params)) { - RENDER_BACKEND.getInteger(pname, params); - } - } - } - } - public static long nglMapBuffer(int target, int access) { - rejectExitCapture(); - final ByteBuffer buf = RENDER_BACKEND.mapBuffer(target, access); - if (buf != null) onBufferMap(target, access); - return buf == null ? 0L : MemoryUtilities.memAddress0(buf); - } - public static void nglMultiDrawElementsBaseVertex(int mode, long count, int type, long indices, int primcount, long basevertex) { - rejectExitCapture(); - RENDER_BACKEND.multiDrawElementsBaseVertex(mode, count, type, indices, primcount, basevertex); - } - - public static void glObjectLabel(int identifier, int name, CharSequence label) { RENDER_BACKEND.objectLabel(identifier, name, label); } - public static String glGetObjectLabel(int identifier, int name, int bufSize) { rejectExitCapture(); return RENDER_BACKEND.getObjectLabel(identifier, name); } - public static void glPushDebugGroup(int source, int id, CharSequence message) { RENDER_BACKEND.pushDebugGroup(source, id, message); } - public static void glPopDebugGroup() { RENDER_BACKEND.popDebugGroup(); } - public static void glDebugMessageInsert(int source, int type, int id, int severity, CharSequence buf) { RENDER_BACKEND.debugMessageInsert(source, type, id, severity, buf); } - public static void glDebugMessageControl(int source, int type, int severity, IntBuffer ids, boolean enabled) { RENDER_BACKEND.debugMessageControl(source, type, severity, ids, enabled); } - - public static int glGetDebugMessageLog(int count, IntBuffer sources, IntBuffer types, IntBuffer ids, IntBuffer severities, IntBuffer lengths, ByteBuffer messageLog) { - rejectExitCapture(); - return RENDER_BACKEND.getDebugMessageLog(count, sources, types, ids, severities, lengths, messageLog); - } - - public static void registerDebugMessageListener(GLDebugMessageListener listener, long userParam) { - RENDER_BACKEND.debugMessageCallback(listener, userParam); - } - - public static void glDebugMessageCallback(KHRDebugCallback callback) { - RENDER_BACKEND.debugMessageCallback(GLDebug.adaptDebugCallback(callback), 0L); - } - - public static void glGenerateMipmap(int target) { - rejectExitCapture(); - RENDER_BACKEND.generateMipmap(target); - } - - public static void glBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { - rejectExitCapture(); - RENDER_BACKEND.blitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); - } - - public static void setActiveTexture(int textureUnit) { - glActiveTexture(textureUnit); - } - - public static void glMultiTexCoord2f(int target, float s, float t) { - final GLContextState glCtx = ctx(); - if (target == GL13.GL_TEXTURE0) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setTexCoord(s, t); - return; - } - glCtx.ffp.setTexCoord(s, t, 0.0f, 1.0f); - glCtx.dirtyTexCoordAttrib = true; - } else if (target == GL13.GL_TEXTURE1) { - if (ImmediateModeRecorder.isDrawing()) { - ImmediateModeRecorder.setLightmapCoord(s, t); - return; - } - setLightmapTextureCoords(target, s, t); - } else { - final int unit = target - GL13.GL_TEXTURE0; - if (unit >= 2 && unit < 4) { - if (DisplayListManager.isRecording() || ImmediateModeRecorder.isDrawing()) { - glCtx.unit23TexCoordSetDuringDraw = true; - } - beforeUncapturedStateChange(); - glCtx.ffp.setTexCoord(unit, s, t, 0.0f, 1.0f); - } else { - glCtx.exitCapture.reject(); - } - } - } - - public static void glMultiTexCoord2d(int target, double s, double t) { - glMultiTexCoord2f(target, (float) s, (float) t); - } - - public static void glMultiTexCoord2s(int target, short s, short t) { - glMultiTexCoord2f(target, s, t); - } - - public static void setLightmapTextureCoords(int unit, float x, float y) { - if (unit != GL13.GL_TEXTURE1) { - rejectExitCapture(); - return; - } - final GLContextState glCtx = ctx(); - glCtx.exitCapture.write(ExitStateCapture.LIGHTMAP); - final RecordMode mode = DisplayListManager.getRecordMode(); - if (mode != RecordMode.NONE) { - DisplayListManager.recordStateCommand(() -> setLightmapTextureCoords(unit, x, y)); - if (mode == RecordMode.COMPILE) return; - } - glCtx.lastBrightnessX = x; - glCtx.lastBrightnessY = y; - glCtx.dirtyLightmapAttrib = true; - if (GLSMHooks.LIGHTMAP_COORDS.hasListeners()) { - GLSMHooks.lightmapCoordsEvent.x = x; - GLSMHooks.lightmapCoordsEvent.y = y; - GLSMHooks.LIGHTMAP_COORDS.post(GLSMHooks.lightmapCoordsEvent); - } - } - - private static void checkMismatch(int cap) { - final int cached = GLStateManager.glGetInteger(cap); - final int actual = RENDER_BACKEND.getInteger(cap); - if (actual != cached) { - throw new IllegalStateException("GLSM Mismatch! cap=" + cap + " cached=" + cached + " actual=" + actual); - } - } - - public static boolean isFramebufferEnabled() { - return true; - } - /** * Guards against FFP features not supported in core profile. @@ -8855,7 +704,7 @@ public class GLStateManager { * With {@code -Dangelica.ffp.warnOnUnsupported=true}: warns once per function (diagnostic mode). * @return true (always - caller should skip the GL call) */ - private static boolean guardUnsupportedFFP(String function, String explanation) { + static boolean guardUnsupportedFFP(String function, String explanation) { rejectExitCapture(); if (!SystemProperties.FFP_WARN_ON_UNSUPPORTED) { throw new UnsupportedOperationException(function + ": " + explanation); @@ -8866,1476 +715,10 @@ public class GLStateManager { return true; } - /** - * In core profile, GL_CLAMP (0x2900) is removed. Remap to GL_CLAMP_TO_EDGE for wrap modes. Semantically equivalent when texture border is not used (border - * textures are also removed in core). - */ - public static int remapTexClamp(int pname, int param) { - if (param == GL11.GL_CLAMP && (pname == GL11.GL_TEXTURE_WRAP_S || pname == GL11.GL_TEXTURE_WRAP_T || pname == GL12.GL_TEXTURE_WRAP_R)) { - return GL12.GL_CLAMP_TO_EDGE; - } - return param; - } - - public static float remapTexClamp(int pname, float param) { - if ((int) param == GL11.GL_CLAMP && (pname == GL11.GL_TEXTURE_WRAP_S || pname == GL11.GL_TEXTURE_WRAP_T || pname == GL12.GL_TEXTURE_WRAP_R)) { - return (float) GL12.GL_CLAMP_TO_EDGE; - } - return param; - } - - public static void remapTexClampBuffer(int pname, IntBuffer params) { - if (params.remaining() >= 1) { - final int val = params.get(params.position()); - final int remapped = remapTexClamp(pname, val); - if (remapped != val) params.put(params.position(), remapped); - } - } - - public static void glTexEnvi(int target, int pname, int param) { - handleTexEnvScalar(target, pname, param); - } - - public static void glTexEnvf(int target, int pname, float param) { - handleTexEnvScalar(target, pname, param); - } - - public static void glTexEnv(int target, int pname, FloatBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (target == GL11.GL_TEXTURE_ENV && pname == GL11.GL_TEXTURE_ENV_COLOR && params.remaining() >= 4) { - beforeUncapturedStateChange(); - final int pos = params.position(); - final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue()); - envState.beforeModify(); - envState.envColorR = params.get(pos); - envState.envColorG = params.get(pos + 1); - envState.envColorB = params.get(pos + 2); - envState.envColorA = params.get(pos + 3); - glCtx.fragmentGeneration++; - return; - } - if (target == GL14.GL_TEXTURE_FILTER_CONTROL) { - guardUnsupportedFFP( - "glTexEnv", - "LOD bias via buffer glTexEnv is not supported; use glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, value) instead."); - return; - } - // Silently ignore other buffer glTexEnv calls (some mods pass combine params via buffers) - } - - public static void glTexEnv(int target, int pname, IntBuffer params) { - rejectExitCapture(); - if (target == GL11.GL_TEXTURE_ENV) { - handleTexEnvScalar(target, pname, (float) params.get(params.position())); - } - } - - /** - * Scalar glTexEnvi/glTexEnvf dispatch. glTexEnv is removed in core profile. GL_TEXTURE_FILTER_CONTROL (LOD bias) is remapped to glTexParameterf. All - * GL_TEXTURE_ENV parameters including GL_COMBINE sub-params are tracked in per-unit TexEnvState. - */ - private static void handleTexEnvScalar(int target, int pname, float param) { - beforeUncapturedStateChange(); - final GLContextState glCtx = ctx(); - if (target == GL14.GL_TEXTURE_FILTER_CONTROL) { - // LOD bias via legacy glTexEnv path - remap to core-profile glTexParameterf - glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, param); - return; - } - if (target != GL11.GL_TEXTURE_ENV) return; - - final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue()); - envState.beforeModify(); - final int iparam = (int) param; - - switch (pname) { - case GL11.GL_TEXTURE_ENV_MODE -> { - envState.mode = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_COMBINE_RGB -> { - envState.combineRgb = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_COMBINE_ALPHA -> { - envState.combineAlpha = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_SOURCE0_RGB -> { - envState.sourceRgb[0] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_SOURCE1_RGB -> { - envState.sourceRgb[1] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_SOURCE2_RGB -> { - envState.sourceRgb[2] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_SOURCE0_ALPHA -> { - envState.sourceAlpha[0] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_SOURCE1_ALPHA -> { - envState.sourceAlpha[1] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_SOURCE2_ALPHA -> { - envState.sourceAlpha[2] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_OPERAND0_RGB -> { - envState.operandRgb[0] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_OPERAND1_RGB -> { - envState.operandRgb[1] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_OPERAND2_RGB -> { - envState.operandRgb[2] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_OPERAND0_ALPHA -> { - envState.operandAlpha[0] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_OPERAND1_ALPHA -> { - envState.operandAlpha[1] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_OPERAND2_ALPHA -> { - envState.operandAlpha[2] = iparam; - glCtx.fragmentGeneration++; - } - case GL13.GL_RGB_SCALE -> { - envState.scaleRgb = param; - glCtx.fragmentGeneration++; - } - case GL11.GL_ALPHA_SCALE -> { - envState.scaleAlpha = param; - glCtx.fragmentGeneration++; - } - // Silently ignore unknown pname - other mods may pass unrecognized params - } - } - - public static float glGetTexEnvf(int target, int pname) { - return (float) glGetTexEnvi(target, pname); - } - - public static int glGetTexEnvi(int target, int pname) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (target != GL11.GL_TEXTURE_ENV) return 0; - - final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue()); - return switch (pname) { - case GL11.GL_TEXTURE_ENV_MODE -> envState.mode; - case GL13.GL_COMBINE_RGB -> envState.combineRgb; - case GL13.GL_COMBINE_ALPHA -> envState.combineAlpha; - case GL13.GL_SOURCE0_RGB -> envState.sourceRgb[0]; - case GL13.GL_SOURCE1_RGB -> envState.sourceRgb[1]; - case GL13.GL_SOURCE2_RGB -> envState.sourceRgb[2]; - case GL13.GL_SOURCE0_ALPHA -> envState.sourceAlpha[0]; - case GL13.GL_SOURCE1_ALPHA -> envState.sourceAlpha[1]; - case GL13.GL_SOURCE2_ALPHA -> envState.sourceAlpha[2]; - case GL13.GL_OPERAND0_RGB -> envState.operandRgb[0]; - case GL13.GL_OPERAND1_RGB -> envState.operandRgb[1]; - case GL13.GL_OPERAND2_RGB -> envState.operandRgb[2]; - case GL13.GL_OPERAND0_ALPHA -> envState.operandAlpha[0]; - case GL13.GL_OPERAND1_ALPHA -> envState.operandAlpha[1]; - case GL13.GL_OPERAND2_ALPHA -> envState.operandAlpha[2]; - case GL13.GL_RGB_SCALE -> (int) envState.scaleRgb; - case GL11.GL_ALPHA_SCALE -> (int) envState.scaleAlpha; - default -> 0; - }; - } - - public static void glGetTexEnv(int target, int pname, IntBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (target != GL11.GL_TEXTURE_ENV) return; - if (pname == GL11.GL_TEXTURE_ENV_COLOR) { - final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue()); - params.put(params.position(), (int) (envState.envColorR * 2147483647.0f)); - params.put(params.position() + 1, (int) (envState.envColorG * 2147483647.0f)); - params.put(params.position() + 2, (int) (envState.envColorB * 2147483647.0f)); - params.put(params.position() + 3, (int) (envState.envColorA * 2147483647.0f)); - } else { - params.put(params.position(), glGetTexEnvi(target, pname)); - } - } - - public static void glGetTexEnv(int target, int pname, FloatBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (target != GL11.GL_TEXTURE_ENV) return; - if (pname == GL11.GL_TEXTURE_ENV_COLOR) { - final var envState = glCtx.textures.getTexEnvState(glCtx.activeTextureUnit.getValue()); - params.put(params.position(), envState.envColorR); - params.put(params.position() + 1, envState.envColorG); - params.put(params.position() + 2, envState.envColorB); - params.put(params.position() + 3, envState.envColorA); - } else { - params.put(params.position(), (float) glGetTexEnvi(target, pname)); - } - } - - - public static void glTexGeni(int coord, int pname, int param) { - beforeUncapturedStateChange(); - final GLContextState glCtx = ctx(); - if (!isCachingEnabled()) return; - if (pname == GL11.GL_TEXTURE_GEN_MODE) { - final int unit = glCtx.activeTextureUnit.getValue(); - glCtx.textures.getTexGenState(unit).setMode(coord, param); - glCtx.texGenGeneration++; - } - } - - public static void glTexGenf(int coord, int pname, float param) { - // Single-float form only valid for GL_TEXTURE_GEN_MODE - glTexGeni(coord, pname, (int) param); - } - - public static void glTexGend(int coord, int pname, double param) { - glTexGeni(coord, pname, (int) param); - } - - public static void glTexGen(int coord, int pname, FloatBuffer params) { - beforeUncapturedStateChange(); - final GLContextState glCtx = ctx(); - if (!isCachingEnabled()) return; - final int unit = glCtx.activeTextureUnit.getValue(); - final var texGenState = glCtx.textures.getTexGenState(unit); - final int pos = params.position(); - switch (pname) { - case GL11.GL_TEXTURE_GEN_MODE -> { - texGenState.setMode(coord, (int) params.get(pos)); - glCtx.texGenGeneration++; - } - case GL11.GL_OBJECT_PLANE -> { - glCtx.texGenTempPlane[0] = params.get(pos); - glCtx.texGenTempPlane[1] = params.get(pos + 1); - glCtx.texGenTempPlane[2] = params.get(pos + 2); - glCtx.texGenTempPlane[3] = params.get(pos + 3); - texGenState.setObjectPlane(coord, glCtx.texGenTempPlane); - glCtx.texGenGeneration++; - } - case GL11.GL_EYE_PLANE -> { - glCtx.texGenTempPlane[0] = params.get(pos); - glCtx.texGenTempPlane[1] = params.get(pos + 1); - glCtx.texGenTempPlane[2] = params.get(pos + 2); - glCtx.texGenTempPlane[3] = params.get(pos + 3); - texGenState.setEyePlane(coord, glCtx.texGenTempPlane, glCtx.modelViewMatrix); - glCtx.texGenGeneration++; - } - } - } - - public static void glTexGen(int coord, int pname, DoubleBuffer params) { - beforeUncapturedStateChange(); - final GLContextState glCtx = ctx(); - if (!isCachingEnabled()) return; - final int pos = params.position(); - glCtx.texGenTempPlane[0] = (float) params.get(pos); - glCtx.texGenTempPlane[1] = (float) params.get(pos + 1); - glCtx.texGenTempPlane[2] = (float) params.get(pos + 2); - glCtx.texGenTempPlane[3] = (float) params.get(pos + 3); - final int unit = glCtx.activeTextureUnit.getValue(); - final var texGenState = glCtx.textures.getTexGenState(unit); - switch (pname) { - case GL11.GL_TEXTURE_GEN_MODE -> { - texGenState.setMode(coord, (int) params.get(pos)); - glCtx.texGenGeneration++; - } - case GL11.GL_OBJECT_PLANE -> { - texGenState.setObjectPlane(coord, glCtx.texGenTempPlane); - glCtx.texGenGeneration++; - } - case GL11.GL_EYE_PLANE -> { - texGenState.setEyePlane(coord, glCtx.texGenTempPlane, glCtx.modelViewMatrix); - glCtx.texGenGeneration++; - } - } - } - - public static void glTexGen(int coord, int pname, IntBuffer params) { - beforeUncapturedStateChange(); - final GLContextState glCtx = ctx(); - if (!isCachingEnabled()) return; - if (pname == GL11.GL_TEXTURE_GEN_MODE) { - final int unit = glCtx.activeTextureUnit.getValue(); - glCtx.textures.getTexGenState(unit).setMode(coord, params.get(params.position())); - glCtx.texGenGeneration++; - } - } - - public static int glGetTexGeni(int coord, int pname) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - if (pname == GL11.GL_TEXTURE_GEN_MODE) { - return glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue()).getMode(coord); - } - return 0; - } - - public static float glGetTexGenf(int coord, int pname) { - return (float) glGetTexGeni(coord, pname); - } - - public static double glGetTexGend(int coord, int pname) { - return glGetTexGeni(coord, pname); - } - - public static void glGetTexGen(int coord, int pname, IntBuffer params) { - if (pname == GL11.GL_TEXTURE_GEN_MODE) { - params.put(params.position(), glGetTexGeni(coord, pname)); - } - } - - public static void glGetTexGen(int coord, int pname, FloatBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final var state = glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue()); - if (pname == GL11.GL_TEXTURE_GEN_MODE) { - params.put(params.position(), (float) state.getMode(coord)); - } else if (pname == GL11.GL_OBJECT_PLANE) { - final float[] plane = state.getObjectPlane(coord); - params.put(params.position(), plane[0]); - params.put(params.position() + 1, plane[1]); - params.put(params.position() + 2, plane[2]); - params.put(params.position() + 3, plane[3]); - } else if (pname == GL11.GL_EYE_PLANE) { - final float[] plane = state.getEyePlane(coord); - params.put(params.position(), plane[0]); - params.put(params.position() + 1, plane[1]); - params.put(params.position() + 2, plane[2]); - params.put(params.position() + 3, plane[3]); - } - } - - public static void glGetTexGen(int coord, int pname, DoubleBuffer params) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - final var state = glCtx.textures.getTexGenState(glCtx.activeTextureUnit.getValue()); - if (pname == GL11.GL_TEXTURE_GEN_MODE) { - params.put(params.position(), state.getMode(coord)); - } else if (pname == GL11.GL_OBJECT_PLANE) { - final float[] plane = state.getObjectPlane(coord); - params.put(params.position(), plane[0]); - params.put(params.position() + 1, plane[1]); - params.put(params.position() + 2, plane[2]); - params.put(params.position() + 3, plane[3]); - } else if (pname == GL11.GL_EYE_PLANE) { - final float[] plane = state.getEyePlane(coord); - params.put(params.position(), plane[0]); - params.put(params.position() + 1, plane[1]); - params.put(params.position() + 2, plane[2]); - params.put(params.position() + 3, plane[3]); - } - } - - public static void glPolygonStipple(ByteBuffer pattern) { - guardUnsupportedFFP("glPolygonStipple", "glPolygonStipple is not available in GL 3.3 core profile."); - } - - public static void glAccum(int op, float value) { - guardUnsupportedFFP("glAccum", "The accumulation buffer is not available in GL 3.3 core profile."); - } - - public static void glFeedbackBuffer(int type, FloatBuffer buffer) { - rejectExitCapture(); - FeedbackManager.glFeedbackBuffer(type, buffer); - } - - public static int glRenderMode(int mode) { - rejectExitCapture(); - return FeedbackManager.glRenderMode(mode); - } - - public static void glPassThrough(float token) { - rejectExitCapture(); - FeedbackManager.glPassThrough(token); - } - - private static boolean selectWarned = false; - - public static void glSelectBuffer(IntBuffer buffer) { - rejectExitCapture(); - if (!selectWarned) { - LOGGER.warn("glSelectBuffer: selection mode not emulated"); - selectWarned = true; - } - } - - public static void glInitNames() { /* no-op: ignored outside GL_SELECT */ } - - public static void glPushName(int name) { /* no-op */ } - - public static void glPopName() { /* no-op */ } - - public static void glLoadName(int name) { /* no-op */ } - - public static void glLinkProgram(int program) { - rejectExitCapture(); - if (ShaderManager.isEnabled()) { - generateVertexShaderIfNeeded(program); - } - if (ProgramBinaryCache.isEnabled()) { - ProgramBinaryCache.markRetrievable(program); - } - RENDER_BACKEND.linkProgram(program); - if (ShaderManager.isEnabled() && RENDER_BACKEND.getProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) { - LOGGER.warn("Program {} failed to link: {}", program, RENDER_BACKEND.getProgramInfoLog(program)); - } - CompatUniformManager.onLinkProgram(program); - } - - public static void glProgramParameteri(int program, int pname, int value) { - rejectExitCapture(); - RENDER_BACKEND.programParameteri(program, pname, value); - } - - public static void glGetProgramBinary(int program, IntBuffer length, IntBuffer binaryFormat, ByteBuffer binary) { - rejectExitCapture(); - RENDER_BACKEND.getProgramBinary(program, length, binaryFormat, binary); - } - - public static void glProgramBinary(int program, int binaryFormat, ByteBuffer binary) { - rejectExitCapture(); - RENDER_BACKEND.programBinary(program, binaryFormat, binary); - if (RENDER_BACKEND.getProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_TRUE) { - CompatUniformManager.onLinkProgram(program); - } - } - - /** - * If a program has a fragment shader but no vertex shader, generate a passthrough vertex shader from the fragment's in declarations and attach it. - */ - private static void generateVertexShaderIfNeeded(int program) { - final GLContextState glCtx = ctx(); - final int shaderCount = RENDER_BACKEND.getProgrami(program, GL20.GL_ATTACHED_SHADERS); - if (shaderCount == 0 || shaderCount > glCtx.shaderBuf.capacity()) return; - - glCtx.shaderBuf.clear().limit(shaderCount); - RENDER_BACKEND.getAttachedShaders(program, null, glCtx.shaderBuf); - - int fragmentShader = 0; - boolean hasVertex = false; - for (int i = 0; i < shaderCount; i++) { - final int shader = glCtx.shaderBuf.get(i); - final int type = RENDER_BACKEND.getShaderi(shader, GL20.GL_SHADER_TYPE); - if (type == GL20.GL_VERTEX_SHADER) { - hasVertex = true; - break; - } else if (type == GL20.GL_FRAGMENT_SHADER) { - fragmentShader = shader; - } - } - - if (hasVertex || fragmentShader == 0) return; - - // Fragment-only program - generate a passthrough vertex shader - final String fragSource = RENDER_BACKEND.getShaderSource(fragmentShader, 65536); - String vertSource = CompatShaderTransformer.generatePassthroughVertexShader(fragSource); - if (RenderSystem.isGLES()) { - vertSource = CompatShaderTransformer.toGLES(vertSource, GL20.GL_VERTEX_SHADER, false); - } - - final int vertShader = RENDER_BACKEND.createShader(GL20.GL_VERTEX_SHADER); - RENDER_BACKEND.shaderSource(vertShader, vertSource); - RENDER_BACKEND.compileShader(vertShader); - - if (RENDER_BACKEND.getShaderi(vertShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) { - final String log = RENDER_BACKEND.getShaderInfoLog(vertShader, 8192); - LOGGER.warn("CompatShaderTransformer: Generated passthrough vertex shader failed to compile:\n{}\nSource:\n{}", log, vertSource); - RENDER_BACKEND.deleteShader(vertShader); - return; - } - - LOGGER.debug("CompatShaderTransformer: Generated passthrough vertex shader for fragment-only program {}", program); - RENDER_BACKEND.attachShader(program, vertShader); - RENDER_BACKEND.deleteShader(vertShader); - } - - @Getter - private static long programLifetimeGeneration; - private static final IntOpenHashSet programsPendingDeletion = new IntOpenHashSet(); - - public static boolean isProgramPendingDeletion(int program) { - return programsPendingDeletion.contains(program); - } - - public static void glDeleteProgram(int program) { - rejectExitCapture(); - if (program == 0) return; - CompatUniformManager.onDeleteProgram(program); - - // GL defers deletion of a bound program until unbind; activeProgram stays set so the - // cache matches GL_CURRENT_PROGRAM and the next glUseProgram is not skipped as redundant. - if (GLSMHooks.PROGRAM_DELETE.hasListeners()) { - GLSMHooks.programDeleteEvent.program = program; - GLSMHooks.PROGRAM_DELETE.post(GLSMHooks.programDeleteEvent); - } - RENDER_BACKEND.deleteProgram(program); - programsPendingDeletion.add(program); - programsPendingDeletion.removeIf((int id) -> !RENDER_BACKEND.isProgram(id)); - programLifetimeGeneration++; - } - - public static int glCreateShader(int type) { - requireContext("glCreateShader"); - return RENDER_BACKEND.createShader(type); - } - - public static void glCompileShader(int shader) { - rejectExitCapture(); - RENDER_BACKEND.compileShader(shader); - } - - public static int glCreateProgram() { - requireContext("glCreateProgram"); - final int program = RENDER_BACKEND.createProgram(); - programsPendingDeletion.remove(program); - programLifetimeGeneration++; - return program; - } - - public static void glAttachShader(int program, int shader) { - rejectExitCapture(); - RENDER_BACKEND.attachShader(program, shader); - } - - public static void glDetachShader(int program, int shader) { - rejectExitCapture(); - RENDER_BACKEND.detachShader(program, shader); - } - - public static void glDeleteShader(int shader) { - rejectExitCapture(); - RENDER_BACKEND.deleteShader(shader); - } - - public static void glBindAttribLocation(int program, int index, CharSequence name) { - rejectExitCapture(); - RENDER_BACKEND.bindAttribLocation(program, index, name); - } - - public static void glValidateProgram(int program) { - rejectExitCapture(); - RENDER_BACKEND.validateProgram(program); - } - - public static int glGetShaderi(int shader, int pname) { - rejectExitCapture(); - return RENDER_BACKEND.getShaderi(shader, pname); - } - - public static String glGetShaderInfoLog(int shader, int maxLength) { - rejectExitCapture(); - return RENDER_BACKEND.getShaderInfoLog(shader, maxLength); - } - - public static String glGetShaderInfoLog(int shader) { - rejectExitCapture(); - return RENDER_BACKEND.getShaderInfoLog(shader); - } - - public static int glGetProgrami(int program, int pname) { - rejectExitCapture(); - return RENDER_BACKEND.getProgrami(program, pname); - } - - public static String glGetProgramInfoLog(int program, int maxLength) { - rejectExitCapture(); - return RENDER_BACKEND.getProgramInfoLog(program, maxLength); - } - - public static String glGetProgramInfoLog(int program) { - rejectExitCapture(); - return RENDER_BACKEND.getProgramInfoLog(program); - } - - public static boolean glIsProgram(int obj) { - rejectExitCapture(); - final boolean valid = RENDER_BACKEND.isProgram(obj); - if (!valid) programsPendingDeletion.remove(obj); - return valid; - } - - public static boolean glIsShader(int obj) { - rejectExitCapture(); - return RENDER_BACKEND.isShader(obj); - } - - public static void glBindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format) { - rejectExitCapture(); - if (isDeferredDelete(texture)) return; - final GLContextState glCtx = ctx(); - final ImageUnitBinding binding = glCtx.imageUnits.get(unit); - if (binding == null) { - warnOnce("imageUnitRange", "glBindImageTexture unit {} exceeds GL_MAX_IMAGE_UNITS {}", unit, glCtx.imageUnits.size()); - } else { - binding.setBinding(texture, level, texture != 0 && layered, texture != 0 ? layer : 0, access, format); - if (texture != 0 && unit > glCtx.maxBoundImageUnit) glCtx.maxBoundImageUnit = unit; - } - if (access != GL15.GL_READ_ONLY) TextureInfoCache.INSTANCE.onWrittenOutsideUploads(texture); - RENDER_BACKEND.bindImageTexture(unit, texture, level, layered, layer, access, format); - } - - public static void glBindImageTextures(int first, int count, IntBuffer textures) { - if (first < 0 || first + count > ctx().imageUnits.size()) return; - if (textures == null) { - for (int i = 0; i < count; i++) bindImageUnitByName(first + i, 0); - return; - } - requireRemaining(textures, count); - for (int i = 0; i < count; i++) bindImageUnitByName(first + i, textures.get(textures.position() + i)); - } - - public static void glBindImageTextures(int first, IntBuffer textures) { - if (textures != null) glBindImageTextures(first, textures.remaining(), textures); - } - - public static void glBindImageTextures(int first, int[] textures) { - if (textures != null) glBindImageTextures(first, textures.length, IntBuffer.wrap(textures)); - } - - private static void bindImageUnitByName(int unit, int texture) { - if (texture == 0) { - glBindImageTexture(unit, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8); - return; - } - if (isDeferredDelete(texture)) return; - final int format = TextureInfoCache.INSTANCE.getInfo(texture).getInternalFormat(); - if (!isImageFormat(format)) return; - final boolean layered = switch (non2DTextureTargets.get(texture)) { - case GL30.GL_TEXTURE_1D_ARRAY, GL30.GL_TEXTURE_2D_ARRAY, GL12.GL_TEXTURE_3D, GL13.GL_TEXTURE_CUBE_MAP, GL40.GL_TEXTURE_CUBE_MAP_ARRAY, GL32.GL_TEXTURE_2D_MULTISAMPLE_ARRAY -> true; - default -> false; - }; - glBindImageTexture(unit, texture, 0, layered, 0, GL15.GL_READ_WRITE, format); - } - - private static boolean isImageFormat(int format) { - return switch (format) { - case GL30.GL_RGBA32F, GL30.GL_RGBA16F, GL30.GL_RG32F, GL30.GL_RG16F, GL30.GL_R11F_G11F_B10F, GL30.GL_R32F, GL30.GL_R16F, - GL30.GL_RGBA32UI, GL30.GL_RGBA16UI, GL33.GL_RGB10_A2UI, GL30.GL_RGBA8UI, GL30.GL_RG32UI, GL30.GL_RG16UI, GL30.GL_RG8UI, GL30.GL_R32UI, GL30.GL_R16UI, GL30.GL_R8UI, - GL30.GL_RGBA32I, GL30.GL_RGBA16I, GL30.GL_RGBA8I, GL30.GL_RG32I, GL30.GL_RG16I, GL30.GL_RG8I, GL30.GL_R32I, GL30.GL_R16I, GL30.GL_R8I, - GL11.GL_RGBA16, GL11.GL_RGB10_A2, GL11.GL_RGBA8, GL30.GL_RG16, GL30.GL_RG8, GL30.GL_R16, GL30.GL_R8, - GL31.GL_RGBA16_SNORM, GL31.GL_RGBA8_SNORM, GL31.GL_RG16_SNORM, GL31.GL_RG8_SNORM, GL31.GL_R16_SNORM, GL31.GL_R8_SNORM -> true; - default -> false; - }; - } - - public static ImageUnitBinding getImageUnitBinding(int unit) { - return ctx().imageUnits.get(unit); - } - - private static int indexedIntegerOrBackend(int pname, int index) { - if (pname == GL31.GL_UNIFORM_BUFFER_BINDING) return getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index); - if (pname == GL43.GL_SHADER_STORAGE_BUFFER_BINDING) return getIndexedBufferBinding(GL43.GL_SHADER_STORAGE_BUFFER, index); - final ImageUnitBinding binding = !isCachingEnabled() ? null : ctx().imageUnits.get(index); - if (binding == null) return RENDER_BACKEND.getIntegerIndexed(pname, index); - return switch (pname) { - case GL42.GL_IMAGE_BINDING_NAME -> binding.getTexture(); - case GL42.GL_IMAGE_BINDING_LEVEL -> binding.getLevel(); - case GL42.GL_IMAGE_BINDING_LAYERED -> binding.isLayered() ? GL11.GL_TRUE : GL11.GL_FALSE; - case GL42.GL_IMAGE_BINDING_LAYER -> binding.getLayer(); - case GL42.GL_IMAGE_BINDING_ACCESS -> binding.getAccess(); - case GL42.GL_IMAGE_BINDING_FORMAT -> binding.getFormat(); - default -> RENDER_BACKEND.getIntegerIndexed(pname, index); - }; - } - - public static int glGetInteger(int pname, int index) { - rejectExitCapture(); - return indexedIntegerOrBackend(pname, index); - } - - public static int glGetIntegeri(int pname, int index) { - rejectExitCapture(); - return indexedIntegerOrBackend(pname, index); - } - - public static void glGetIntegeri(int pname, int index, IntBuffer params) { - glGetIntegeri_v(pname, index, params); - } - - public static void glGetIntegeri_v(int pname, int index, IntBuffer params) { - rejectExitCapture(); - params.put(params.position(), indexedIntegerOrBackend(pname, index)); - } - - public static void glGetBooleani_v(int pname, int index, ByteBuffer params) { - rejectExitCapture(); - params.put(params.position(), (byte) (indexedIntegerOrBackend(pname, index) != 0 ? GL11.GL_TRUE : GL11.GL_FALSE)); - } - - public static void glGetBooleani(int pname, int index, ByteBuffer params) { - glGetBooleani_v(pname, index, params); - } - - public static void glMemoryBarrier(int barriers) { rejectExitCapture(); RENDER_BACKEND.memoryBarrier(barriers); } - public static void glCopyImageSubData(int srcName, int srcTarget, int srcLevel, int srcX, int srcY, int srcZ, - int dstName, int dstTarget, int dstLevel, int dstX, int dstY, int dstZ, - int srcWidth, int srcHeight, int srcDepth) { - rejectExitCapture(); - RENDER_BACKEND.copyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, - dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); - if (dstTarget != GL30.GL_RENDERBUFFER && dstLevel == 0) TextureInfoCache.INSTANCE.onContentsChanged(dstName); - } - public static void glDispatchCompute(int x, int y, int z) { rejectExitCapture(); RENDER_BACKEND.dispatchCompute(x, y, z); } - - public static int glGetUniformLocation(int program, CharSequence name) { - rejectExitCapture(); - int loc = RENDER_BACKEND.getUniformLocation(program, name); - if (loc == -1 && TEXTURE.contentEquals(name)) { - loc = RENDER_BACKEND.getUniformLocation(program, TEXTURE_RENAMED); - } - return loc; - } - - public static int glGetUniformLocation(int program, ByteBuffer name) { - rejectExitCapture(); - int loc = RENDER_BACKEND.getUniformLocation(program, name); - if (loc == -1 && isTextureBuffer(name)) { - loc = RENDER_BACKEND.getUniformLocation(program, TEXTURE_RENAMED); - } - return loc; - } - - public static int glGetAttribLocation(int program, CharSequence name) { - rejectExitCapture(); - int loc = RENDER_BACKEND.getAttribLocation(program, name); - if (loc == -1 && TEXTURE.contentEquals(name)) { - loc = RENDER_BACKEND.getAttribLocation(program, TEXTURE_RENAMED); - } - return loc; - } - - public static int glGetAttribLocation(int program, ByteBuffer name) { - rejectExitCapture(); - int loc = RENDER_BACKEND.getAttribLocation(program, name); - if (loc == -1 && isTextureBuffer(name)) { - loc = RENDER_BACKEND.getAttribLocation(program, TEXTURE_RENAMED); - } - return loc; - } - - private static final ByteBuffer TEXTURE_BYTES = ByteBuffer.wrap(TEXTURE.getBytes(StandardCharsets.US_ASCII)); - - private static boolean isTextureBuffer(ByteBuffer buf) { - final int len = buf.remaining(); - if (len != 7 && len != 8) return false; - // I believe the driver accepts null terminated or not - if (len == 8 && buf.get(buf.position() + 7) != 0) return false; - return buf.slice(buf.position(), 7).equals(TEXTURE_BYTES); - } - - public static void glDeleteObjectARB(int obj) { - rejectExitCapture(); - if (RENDER_BACKEND.isShader(obj)) { - RENDER_BACKEND.deleteShader(obj); - } else { - glDeleteProgram(obj); - } - } - - public static int glGetHandleARB(int pname) { - rejectExitCapture(); - return pname == ARBShaderObjects.GL_PROGRAM_OBJECT_ARB ? glGetInteger(GL20.GL_CURRENT_PROGRAM) : RENDER_BACKEND.getInteger(pname); - } - - public static void glGetObjectParameterARB(int obj, int pname, IntBuffer params) { - rejectExitCapture(); - final var backend = RENDER_BACKEND; - if (backend.isShader(obj)) { - params.put(params.position(), backend.getShaderi(obj, pname)); - } else { - backend.getProgramiv(obj, pname, params); - } - } - - public static void glGetObjectParameterARB(int obj, int pname, FloatBuffer params) { - rejectExitCapture(); - final var backend = RENDER_BACKEND; - params.put(params.position(), (float) (backend.isShader(obj) ? backend.getShaderi(obj, pname) : backend.getProgrami(obj, pname))); - } - - public static int glGetObjectParameteriARB(int obj, int pname) { - rejectExitCapture(); - final var backend = RENDER_BACKEND; - return backend.isShader(obj) ? backend.getShaderi(obj, pname) : backend.getProgrami(obj, pname); - } - - public static String glGetInfoLogARB(int obj, int maxLength) { - rejectExitCapture(); - final var backend = RENDER_BACKEND; - return backend.isShader(obj) ? backend.getShaderInfoLog(obj, maxLength) : backend.getProgramInfoLog(obj, maxLength); - } - - public static void glGetInfoLogARB(int obj, IntBuffer length, ByteBuffer infoLog) { - rejectExitCapture(); - final var backend = RENDER_BACKEND; - if (backend.isShader(obj)) { - backend.getShaderInfoLog(obj, length, infoLog); - } else { - backend.getProgramInfoLog(obj, length, infoLog); - } - } - - public static void glUniform1f(int location, float v0) { - rejectExitCapture(); - RENDER_BACKEND.uniform1f(location, v0); - } - - public static void glUniform2f(int location, float v0, float v1) { - rejectExitCapture(); - RENDER_BACKEND.uniform2f(location, v0, v1); - } - - public static void glUniform3f(int location, float v0, float v1, float v2) { - rejectExitCapture(); - RENDER_BACKEND.uniform3f(location, v0, v1, v2); - } - - public static void glUniform4f(int location, float v0, float v1, float v2, float v3) { - rejectExitCapture(); - RENDER_BACKEND.uniform4f(location, v0, v1, v2, v3); - } - - public static void glUniform1i(int location, int v0) { - rejectExitCapture(); - RENDER_BACKEND.uniform1i(location, v0); - } - - public static void glUniform2i(int location, int v0, int v1) { - rejectExitCapture(); - RENDER_BACKEND.uniform2i(location, v0, v1); - } - - public static void glUniform3i(int location, int v0, int v1, int v2) { - rejectExitCapture(); - RENDER_BACKEND.uniform3i(location, v0, v1, v2); - } - - public static void glUniform4i(int location, int v0, int v1, int v2, int v3) { - rejectExitCapture(); - RENDER_BACKEND.uniform4i(location, v0, v1, v2, v3); - } - - public static void glUniform1(int location, FloatBuffer values) { - rejectExitCapture(); - RENDER_BACKEND.uniform1fv(location, values); - } - - public static void glUniform1(int location, IntBuffer values) { - rejectExitCapture(); - RENDER_BACKEND.uniform1iv(location, values); - } - - public static void glUniform2(int location, FloatBuffer values) { - rejectExitCapture(); - RENDER_BACKEND.uniform2(location, values); - } - - public static void glUniform2(int location, IntBuffer values) { - rejectExitCapture(); - RENDER_BACKEND.uniform2iv(location, values); - } - - public static void glUniform3(int location, FloatBuffer values) { - rejectExitCapture(); - RENDER_BACKEND.uniform3(location, values); - } - - public static void glUniform3(int location, IntBuffer values) { - rejectExitCapture(); - RENDER_BACKEND.uniform3iv(location, values); - } - - public static void glUniform4(int location, FloatBuffer values) { - rejectExitCapture(); - RENDER_BACKEND.uniform4(location, values); - } - - public static void glUniform4(int location, IntBuffer values) { - rejectExitCapture(); - RENDER_BACKEND.uniform4iv(location, values); - } - - public static void glUniformMatrix2(int location, boolean transpose, FloatBuffer matrices) { - rejectExitCapture(); - RENDER_BACKEND.uniformMatrix2(location, transpose, matrices); - } - - public static void glUniformMatrix3(int location, boolean transpose, FloatBuffer matrices) { - rejectExitCapture(); - RENDER_BACKEND.uniformMatrix3(location, transpose, matrices); - } - - public static void glUniformMatrix4(int location, boolean transpose, FloatBuffer matrices) { - rejectExitCapture(); - RENDER_BACKEND.uniformMatrix4(location, transpose, matrices); - } - - public static void glGetActiveUniform(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { - rejectExitCapture(); - RENDER_BACKEND.getActiveUniform(program, index, length, size, type, name); - } - - public static void glGetActiveAttrib(int program, int index, IntBuffer length, IntBuffer size, IntBuffer type, ByteBuffer name) { - rejectExitCapture(); - RENDER_BACKEND.getActiveAttrib(program, index, length, size, type, name); - } - - public static String glGetActiveAttrib(int program, int index, int maxLength, IntBuffer sizeType) { - rejectExitCapture(); - return RENDER_BACKEND.getActiveAttrib(program, index, maxLength, sizeType); - } - - public static void glGetAttachedShaders(int program, IntBuffer count, IntBuffer shaders) { - rejectExitCapture(); - RENDER_BACKEND.getAttachedShaders(program, count, shaders); - } - - public static String glGetShaderSource(int shader, int maxLength) { - rejectExitCapture(); - return RENDER_BACKEND.getShaderSource(shader, maxLength); - } - - public static void glGetShaderSource(int shader, IntBuffer length, ByteBuffer source) { - rejectExitCapture(); - RENDER_BACKEND.getShaderSource(shader, length, source); - } - - public static void glGetUniform(int program, int location, FloatBuffer params) { - rejectExitCapture(); - RENDER_BACKEND.getUniformfv(program, location, params); - } - - public static void glGetUniform(int program, int location, IntBuffer params) { - rejectExitCapture(); - RENDER_BACKEND.getUniformiv(program, location, params); - } - public static void glGetTexImage(int target, int level, int format, int type, long pixels) { - rejectExitCapture(); - RENDER_BACKEND.getTexImage(target, level, format, type, pixels); - } - public static void glReadPixels(int x, int y, int width, int height, int format, int type, long pixels) { - rejectExitCapture(); - RENDER_BACKEND.readPixels(x, y, width, height, format, remapPixelTypeForGLES(format, type), pixels); - } - - /** - * Draw modes that rely on the previous vertex data cannot be merged currently. - * It is possible to merge them using Index Buffers, but currently unimplemented. - */ - public static boolean isContinuousDraw(int drawMode) { - return drawMode == GL11.GL_TRIANGLE_STRIP || drawMode == GL11.GL_TRIANGLE_FAN - || drawMode == GL11.GL_LINE_STRIP || drawMode == GL11.GL_LINE_LOOP - || drawMode == GL11.GL_QUAD_STRIP || drawMode == GL11.GL_POLYGON; - } - - public static int getProgramGeneration() { - return ctx().programGeneration; - } - - public static int getDrawFramebufferGeneration() { - return ctx().drawFramebufferGeneration; - } - - public static boolean isPoppingAttributes() { - return ctx().poppingAttributes; - } - - public static int getMvGeneration() { - return ctx().mvGeneration; - } - - public static int getMvLinearGeneration() { - return ctx().mvLinearGeneration; - } - - public static int getProjGeneration() { - return ctx().projGeneration; - } - - public static int getTexMatrixGeneration() { - return ctx().texMatrixGeneration; - } - - public static int getLightingGeneration() { - return ctx().lightingGeneration; - } - public static int getFragmentGeneration() { return ctx().fragmentGeneration; } - public static int getColorGeneration() { - return ctx().colorGeneration; - } - - public static int getClipPlaneGeneration() { - return ctx().clipPlaneGeneration; - } - - public static float getOverlayR() { - return ctx().overlayR; - } - - public static float getOverlayG() { - return ctx().overlayG; - } - - public static float getOverlayB() { - return ctx().overlayB; - } - - public static float getOverlayA() { - return ctx().overlayA; - } - - public static float getShaderColorR() { - return ctx().shaderColorR; - } - - public static float getShaderColorG() { - return ctx().shaderColorG; - } - - public static float getShaderColorB() { - return ctx().shaderColorB; - } - - public static float getShaderColorA() { - return ctx().shaderColorA; - } - - public static int getAttribDepth() { - return ctx().attribDepth; - } - - public static IntegerStateStack getActiveTextureUnitStack() { - return ctx().activeTextureUnit; - } - - public static IntegerStateStack getProgramStack() { - return ctx().programStack; - } - - public static IntegerStateStack getShadeModelState() { - return ctx().shadeModelState; - } - - public static TextureUnitArray getTextures() { - return ctx().textures; - } - - public static BlendStateStack getBlendState() { - return ctx().blendState; - } - - public static BooleanStateStack getBlendMode() { - return ctx().blendMode; - } - - public static BooleanStateStack getScissorTest() { - return ctx().scissorTest; - } - - public static DepthStateStack getDepthState() { - return ctx().depthState; - } - - public static BooleanStateStack getDepthTest() { - return ctx().depthTest; - } - - public static FogStateStack getFogState() { - return ctx().fogState; - } - - public static BooleanStateStack getFogMode() { - return ctx().fogMode; - } - - public static Color4Stack getColor() { - return ctx().color; - } - - public static Color4Stack getSecondaryColor() { - return ctx().secondaryColor; - } - - public static BooleanStateStack getColorSumState() { - return ctx().colorSumState; - } - - public static Color4Stack getClearColor() { - return ctx().clearColor; - } - - public static ColorMaskStack getColorMask() { - return ctx().colorMask; - } - - public static IntegerStateStack getDrawBuffer() { - return ctx().drawBuffer; - } - - public static IntegerStateStack getLogicOpMode() { - return ctx().logicOpMode; - } - - public static BooleanStateStack getCullState() { - return ctx().cullState; - } - - public static AlphaStateStack getAlphaState() { - return ctx().alphaState; - } - - public static BooleanStateStack getAlphaTest() { - return ctx().alphaTest; - } - - public static BooleanStateStack getLightingState() { - return ctx().lightingState; - } - - public static BooleanStateStack getRescaleNormalState() { - return ctx().rescaleNormalState; - } - - public static BooleanStateStack getNormalizeState() { - return ctx().normalizeState; - } - - public static BooleanStateStack getDitherState() { - return ctx().ditherState; - } - - public static BooleanStateStack getStencilTest() { - return ctx().stencilTest; - } - - public static BooleanStateStack getLineSmoothState() { - return ctx().lineSmoothState; - } - - public static BooleanStateStack getLineStippleState() { - return ctx().lineStippleState; - } - - public static BooleanStateStack getPointSmoothState() { - return ctx().pointSmoothState; - } - - public static BooleanStateStack getPolygonSmoothState() { - return ctx().polygonSmoothState; - } - - public static BooleanStateStack getPolygonStippleState() { - return ctx().polygonStippleState; - } - - public static BooleanStateStack getMultisampleState() { - return ctx().multisampleState; - } - - public static BooleanStateStack getSampleAlphaToCoverageState() { - return ctx().sampleAlphaToCoverageState; - } - - public static BooleanStateStack getSampleAlphaToOneState() { - return ctx().sampleAlphaToOneState; - } - - public static BooleanStateStack getSampleCoverageState() { - return ctx().sampleCoverageState; - } - - public static BooleanStateStack getColorLogicOpState() { - return ctx().colorLogicOpState; - } - - public static BooleanStateStack getIndexLogicOpState() { - return ctx().indexLogicOpState; - } - - public static BooleanStateStack getPolygonOffsetPointState() { - return ctx().polygonOffsetPointState; - } - - public static BooleanStateStack getPolygonOffsetLineState() { - return ctx().polygonOffsetLineState; - } - - public static BooleanStateStack getPolygonOffsetFillState() { - return ctx().polygonOffsetFillState; - } - - public static LineStateStack getLineState() { - return ctx().lineState; - } - - public static PointStateStack getPointState() { - return ctx().pointState; - } - - public static IntegerStateStack getHintState() { - return ctx().hintState; - } - - public static BooleanStateStack getPointSpriteState() { - return ctx().pointSpriteState; - } - - public static BooleanStateStack getVertexProgramTwoSideState() { - return ctx().vertexProgramTwoSideState; - } - - public static BooleanStateStack getEdgeFlagState() { - return ctx().edgeFlagState; - } - - public static PolygonStateStack getPolygonState() { - return ctx().polygonState; - } - - public static StencilStateStack getStencilState() { - return ctx().stencilState; - } - - public static BooleanStateStack getAutoNormalState() { - return ctx().autoNormalState; - } - - public static BooleanStateStack getMap1Color4State() { - return ctx().map1Color4State; - } - - public static BooleanStateStack getMap1IndexState() { - return ctx().map1IndexState; - } - - public static BooleanStateStack getMap1NormalState() { - return ctx().map1NormalState; - } - - public static BooleanStateStack getMap1TextureCoord1State() { - return ctx().map1TextureCoord1State; - } - - public static BooleanStateStack getMap1TextureCoord2State() { - return ctx().map1TextureCoord2State; - } - - public static BooleanStateStack getMap1TextureCoord3State() { - return ctx().map1TextureCoord3State; - } - - public static BooleanStateStack getMap1TextureCoord4State() { - return ctx().map1TextureCoord4State; - } - - public static BooleanStateStack getMap1Vertex3State() { - return ctx().map1Vertex3State; - } - - public static BooleanStateStack getMap1Vertex4State() { - return ctx().map1Vertex4State; - } - - public static BooleanStateStack getMap2Color4State() { - return ctx().map2Color4State; - } - - public static BooleanStateStack getMap2IndexState() { - return ctx().map2IndexState; - } - - public static BooleanStateStack getMap2NormalState() { - return ctx().map2NormalState; - } - - public static BooleanStateStack getMap2TextureCoord1State() { - return ctx().map2TextureCoord1State; - } - - public static BooleanStateStack getMap2TextureCoord2State() { - return ctx().map2TextureCoord2State; - } - - public static BooleanStateStack getMap2TextureCoord3State() { - return ctx().map2TextureCoord3State; - } - - public static BooleanStateStack getMap2TextureCoord4State() { - return ctx().map2TextureCoord4State; - } - - public static BooleanStateStack getMap2Vertex3State() { - return ctx().map2Vertex3State; - } - - public static BooleanStateStack getMap2Vertex4State() { - return ctx().map2Vertex4State; - } - - public static BooleanStateStack[] getClipPlaneStates() { - return ctx().clipPlaneStates; - } - - public static ClipPlaneState getClipPlaneState() { - return ctx().clipPlaneState; - } - - public static MatrixModeStack getMatrixMode() { - return ctx().matrixMode; - } - - public static Matrix4fStack getModelViewMatrix() { - return ctx().modelViewMatrix; - } - - public static Matrix4fStack getProjectionMatrix() { - return ctx().projectionMatrix; - } - - public static BooleanStateStack[] getLightStates() { - return ctx().lightStates; - } - - public static LightStateStack[] getLightDataStates() { - return ctx().lightDataStates; - } - - public static BooleanStateStack getColorMaterial() { - return ctx().colorMaterial; - } - - public static IntegerStateStack getColorMaterialFace() { - return ctx().colorMaterialFace; - } - - public static IntegerStateStack getColorMaterialParameter() { - return ctx().colorMaterialParameter; - } - - public static LightModelStateStack getLightModel() { - return ctx().lightModel; - } - - public static MaterialStateStack getFrontMaterial() { - return ctx().frontMaterial; - } - - public static MaterialStateStack getBackMaterial() { - return ctx().backMaterial; - } - - public static void captureLighting(LightingSnapshot out) { - final GLContextState glCtx = ctx(); - for (int i = 0; i < out.lights.length; i++) { - out.lightEnabled[i] = glCtx.lightStates[i].isEnabled(); - out.lights[i].set(glCtx.lightDataStates[i]); - } - out.lightModel.set(glCtx.lightModel); - out.frontMaterial.set(glCtx.frontMaterial); - out.backMaterial.set(glCtx.backMaterial); - out.colorMaterial = glCtx.colorMaterial.isEnabled(); - out.colorMaterialFace = glCtx.colorMaterialFace.getValue(); - out.colorMaterialParameter = glCtx.colorMaterialParameter.getValue(); - out.normalize = glCtx.normalizeState.isEnabled(); - out.rescaleNormal = glCtx.rescaleNormalState.isEnabled(); - } - - public static void applyLighting(LightingSnapshot in) { - rejectExitCapture(); - final GLContextState glCtx = ctx(); - boolean changed = false; - for (int i = 0; i < in.lights.length; i++) { - glCtx.lightStates[i].setEnabled(in.lightEnabled[i]); - if (!glCtx.lightDataStates[i].sameAs(in.lights[i])) { - mod(glCtx.lightDataStates[i]).set(in.lights[i]); - changed = true; - } - } - if (!glCtx.lightModel.sameAs(in.lightModel)) { - mod(glCtx.lightModel).set(in.lightModel); - changed = true; - } - if (!glCtx.frontMaterial.sameAs(in.frontMaterial)) { - mod(glCtx.frontMaterial).set(in.frontMaterial); - changed = true; - } - if (!glCtx.backMaterial.sameAs(in.backMaterial)) { - mod(glCtx.backMaterial).set(in.backMaterial); - changed = true; - } - if (glCtx.colorMaterialFace.getValue() != in.colorMaterialFace || glCtx.colorMaterialParameter.getValue() != in.colorMaterialParameter) { - mod(glCtx.colorMaterialFace).setValue(in.colorMaterialFace); - mod(glCtx.colorMaterialParameter).setValue(in.colorMaterialParameter); - changed = true; - } - // Direct set: glEnable(GL_COLOR_MATERIAL) would bake the current color over the captured material. - glCtx.colorMaterial.setEnabled(in.colorMaterial); - glCtx.normalizeState.setEnabled(in.normalize); - glCtx.rescaleNormalState.setEnabled(in.rescaleNormal); - if (changed) glCtx.lightingGeneration++; - } - - public static ViewPortStateStack getViewportState() { - return ctx().viewportState; - } - - public static ScissorStateStack getScissorState() { - return ctx().scissorState; - } - - public static int getActiveProgram() { - return ctx().activeProgram; - } - - public static int getListBase() { - return ctx().listBase; - } - - public static int getBoundVBO() { - return ctx().boundVBO; - } - - public static int getBoundCopyReadBuffer() { - return ctx().boundCopyReadBuffer; - } - - public static int getBoundCopyWriteBuffer() { - return ctx().boundCopyWriteBuffer; - } - - public static int getBoundVAO() { - return ctx().boundVAO; - } - - public static int getDrawFramebuffer() { - return ctx().drawFramebuffer; - } - - public static int getReadFramebuffer() { - return ctx().readFramebuffer; - } - - public static int getTexGenGeneration() { - return ctx().texGenGeneration; - } - public static void incrementFragmentGeneration() { ctx().fragmentGeneration++; } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LTWWorkaround.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LTWWorkaround.java index a98aa2e21..76f422502 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LTWWorkaround.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LTWWorkaround.java @@ -25,10 +25,10 @@ public final class LTWWorkaround { oneTexel = BufferUtils.createByteBuffer(4); } oneTexel.clear(); - GLStateManager.forcePixelUnpackState(PixelStoreState.DEFAULT); - GLStateManager.suspendPixelUnpackBuffer(); + GLSMTextures.forcePixelUnpackState(PixelStoreState.DEFAULT); + GLSMBuffers.suspendPixelUnpackBuffer(); RENDER_BACKEND.texSubImage2D(target, level, 0, 0, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, oneTexel); - GLStateManager.restorePixelUnpackBuffer(); - GLStateManager.restorePixelUnpackState(PixelStoreState.DEFAULT); + GLSMBuffers.restorePixelUnpackBuffer(); + GLSMTextures.restorePixelUnpackState(PixelStoreState.DEFAULT); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LegacyQueries.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LegacyQueries.java index d2bb50fbb..1a3212f7f 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LegacyQueries.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/LegacyQueries.java @@ -88,7 +88,7 @@ final class LegacyQueries { private static FloatBuffer fillScratch(GLContextState glCtx, int pname) { final FloatBuffer scratch = glCtx.queryScratch; scratch.clear(); - GLStateManager.glGetFloat(pname, scratch); + GLSMQueries.glGetFloat(pname, scratch); return scratch; } @@ -102,9 +102,9 @@ final class LegacyQueries { return toInt(type, fillScratch(glCtx, pname).get(0)); } return switch (type) { - case BOOL -> GLStateManager.glGetBoolean(glCtx, pname) ? GL11.GL_TRUE : GL11.GL_FALSE; - case FLOAT -> lround(GLStateManager.glGetFloat(glCtx, pname)); - case FLOATN -> floatToInt(GLStateManager.glGetFloat(glCtx, pname)); + case BOOL -> GLSMQueries.glGetBoolean(glCtx, pname) ? GL11.GL_TRUE : GL11.GL_FALSE; + case FLOAT -> lround(GLSMQueries.glGetFloat(glCtx, pname)); + case FLOATN -> floatToInt(GLSMQueries.glGetFloat(glCtx, pname)); default -> throw uncached(pname); }; } @@ -114,8 +114,8 @@ final class LegacyQueries { return fillScratch(glCtx, pname).get(0); } return switch (type(desc)) { - case BOOL -> GLStateManager.glGetBoolean(glCtx, pname) ? 1.0f : 0.0f; - case INT -> (float) GLStateManager.glGetInteger(glCtx, pname); + case BOOL -> GLSMQueries.glGetBoolean(glCtx, pname) ? 1.0f : 0.0f; + case INT -> (float) GLSMQueries.glGetInteger(glCtx, pname); default -> throw uncached(pname); }; } @@ -125,8 +125,8 @@ final class LegacyQueries { return fillScratch(glCtx, pname).get(0) != 0.0f; } return switch (type(desc)) { - case INT -> GLStateManager.glGetInteger(glCtx, pname) != 0; - case FLOAT, FLOATN -> GLStateManager.glGetFloat(glCtx, pname) != 0.0f; + case INT -> GLSMQueries.glGetInteger(glCtx, pname) != 0; + case FLOAT, FLOATN -> GLSMQueries.glGetFloat(glCtx, pname) != 0.0f; default -> throw uncached(pname); }; } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java index d0bf40b5e..b6f5b8445 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/QuadConverter.java @@ -114,7 +114,7 @@ public final class QuadConverter { uploadAndDraw(glCtx, dst, quadCount * 6, GL11.GL_UNSIGNED_INT, 4, primcount, instanced); return; } - GLStateManager.preDraw(glCtx, GL11.GL_TRIANGLES); + GLSMDraws.preDraw(glCtx, GL11.GL_TRIANGLES); final int prevEbo = glCtx.vaos.boundEBO; ensureCapacity(first / 4 + quadCount); RENDER_BACKEND.bindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId); @@ -143,7 +143,7 @@ public final class QuadConverter { } private static void uploadAndDraw(GLContextState glCtx, ByteBuffer dst, int triIndexCount, int indexType, int bytesPerIndex, int primcount, boolean instanced) { - GLStateManager.preDraw(glCtx, GL11.GL_TRIANGLES); + GLSMDraws.preDraw(glCtx, GL11.GL_TRIANGLES); final int needed = triIndexCount * bytesPerIndex; final int prevEbo = glCtx.vaos.boundEBO; diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java index 170d1dcd7..208af9cf7 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/RenderSystem.java @@ -209,14 +209,14 @@ public class RenderSystem { public static void texImage2D(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, @Nullable ByteBuffer pixels) { GLStateManager.rejectExitCapture(); - final GLStateManager.GLESTexImageRemap remap = GLStateManager.remapTexImageForGLES(internalformat, format, type); + final GLSMTextures.GLESTexImageRemap remap = GLSMTextures.remapTexImageForGLES(internalformat, format, type); internalformat = remap.internalFormat(); format = remap.format(); type = remap.type(); - GLStateManager.glBindTexture(target, texture); - GLStateManager.suspendPixelUnpackBuffer(); + GLSMTextures.glBindTexture(target, texture); + GLSMBuffers.suspendPixelUnpackBuffer(); RENDER_BACKEND.texImage2D(target, level, internalformat, width, height, border, format, type, pixels); - GLStateManager.restorePixelUnpackBuffer(); + GLSMBuffers.restorePixelUnpackBuffer(); if (target == GL11.GL_TEXTURE_2D && level == 0) { TextureInfoCache.INSTANCE.onTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); } @@ -228,7 +228,7 @@ public class RenderSystem { } public static void copyTexImage2D(int target, int level, int internalFormat, int x, int y, int width, int height, int border) { - GLStateManager.glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border); + GLSMTextures.glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border); } public static void uniform1f(int location, float v0) { @@ -304,50 +304,50 @@ public class RenderSystem { public static void textureImage2D(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, ByteBuffer pixels) { GLStateManager.rejectExitCapture(); - GLStateManager.suspendPixelUnpackBuffer(); + GLSMBuffers.suspendPixelUnpackBuffer(); dsaState.textureImage2D(texture, target, level, internalformat, width, height, border, format, type, pixels); - GLStateManager.restorePixelUnpackBuffer(); + GLSMBuffers.restorePixelUnpackBuffer(); TextureInfoCache.INSTANCE.onTextureImage2D(texture, target, level, internalformat, width, height); } public static void textureImage2D(int texture, int target, int level, int internalformat, int width, int height, int border, int format, int type, IntBuffer pixels) { GLStateManager.rejectExitCapture(); - GLStateManager.suspendPixelUnpackBuffer(); + GLSMBuffers.suspendPixelUnpackBuffer(); dsaState.textureImage2D(texture, target, level, internalformat, width, height, border, format, type, pixels); - GLStateManager.restorePixelUnpackBuffer(); + GLSMBuffers.restorePixelUnpackBuffer(); TextureInfoCache.INSTANCE.onTextureImage2D(texture, target, level, internalformat, width, height); } public static void textureSubImage2D(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer pixels) { GLStateManager.rejectExitCapture(); - GLStateManager.suspendPixelUnpackBuffer(); + GLSMBuffers.suspendPixelUnpackBuffer(); dsaState.textureSubImage2D(texture, target, level, xoffset, yoffset, width, height, format, type, pixels); - GLStateManager.restorePixelUnpackBuffer(); + GLSMBuffers.restorePixelUnpackBuffer(); if (level == 0) TextureInfoCache.INSTANCE.onContentsChanged(texture); } public static void textureSubImage2D(int texture, int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, IntBuffer pixels) { GLStateManager.rejectExitCapture(); - GLStateManager.suspendPixelUnpackBuffer(); + GLSMBuffers.suspendPixelUnpackBuffer(); dsaState.textureSubImage2D(texture, target, level, xoffset, yoffset, width, height, format, type, pixels); - GLStateManager.restorePixelUnpackBuffer(); + GLSMBuffers.restorePixelUnpackBuffer(); if (level == 0) TextureInfoCache.INSTANCE.onContentsChanged(texture); } public static void texImage1D(int texture, int target, int level, int internalformat, int width, int border, int format, int type, ByteBuffer pixels) { GLStateManager.rejectExitCapture(); - GLStateManager.glBindTexture(target, texture); - GLStateManager.suspendPixelUnpackBuffer(); + GLSMTextures.glBindTexture(target, texture); + GLSMBuffers.suspendPixelUnpackBuffer(); RENDER_BACKEND.texImage1D(target, level, internalformat, width, border, format, type, pixels); - GLStateManager.restorePixelUnpackBuffer(); + GLSMBuffers.restorePixelUnpackBuffer(); } public static void texImage3D(int texture, int target, int level, int internalformat, int width, int height, int depth, int border, int format, int type, ByteBuffer pixels) { GLStateManager.rejectExitCapture(); - GLStateManager.glBindTexture(target, texture); - GLStateManager.suspendPixelUnpackBuffer(); + GLSMTextures.glBindTexture(target, texture); + GLSMBuffers.suspendPixelUnpackBuffer(); RENDER_BACKEND.texImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); - GLStateManager.restorePixelUnpackBuffer(); + GLSMBuffers.restorePixelUnpackBuffer(); } public static String getProgramInfoLog(int program) { @@ -377,13 +377,13 @@ public class RenderSystem { public static void readPixels(int x, int y, int width, int height, int format, int type, FloatBuffer pixels) { GLStateManager.rejectExitCapture(); - GLStateManager.suspendPixelPackBuffer(); + GLSMBuffers.suspendPixelPackBuffer(); RENDER_BACKEND.readPixels(x, y, width, height, format, type, pixels); - GLStateManager.restorePixelPackBuffer(); + GLSMBuffers.restorePixelPackBuffer(); } public static void bufferData(int target, FloatBuffer data, int usage) { - GLStateManager.glBufferData(target, data, usage); + GLSMBuffers.glBufferData(target, data, usage); } public static int bufferStorage(int target, FloatBuffer data, int usage) { @@ -422,7 +422,7 @@ public class RenderSystem { } public static void bindImageTexture(int unit, int texture, int level, boolean layered, int layer, int access, int format) { - GLStateManager.glBindImageTexture(unit, texture, level, layered, layer, access, format); + GLSMTextures.glBindImageTexture(unit, texture, level, layered, layer, access, format); } public static int getMaxImageUnits() { @@ -439,9 +439,9 @@ public class RenderSystem { } private static boolean hasExtension(String name) { - final int count = GLStateManager.glGetInteger(GL30.GL_NUM_EXTENSIONS); + final int count = GLSMQueries.glGetInteger(GL30.GL_NUM_EXTENSIONS); for (int i = 0; i < count; i++) { - if (name.equals(GLStateManager.glGetStringi(GL11.GL_EXTENSIONS, i))) return true; + if (name.equals(GLSMQueries.glGetStringi(GL11.GL_EXTENSIONS, i))) return true; } return false; } @@ -533,7 +533,7 @@ public class RenderSystem { } public static void bindBuffer(int target, int buffer) { - GLStateManager.glBindBuffer(target, buffer); + GLSMBuffers.glBindBuffer(target, buffer); } public static void memoryBarrier(int barriers) { @@ -548,52 +548,52 @@ public class RenderSystem { } public static void disableBufferBlend(int buffer) { - GLStateManager.glDisablei(GL11.GL_BLEND, buffer); + GLSMEnable.glDisablei(GL11.GL_BLEND, buffer); } public static void enableBufferBlend(int buffer) { - GLStateManager.glEnablei(GL11.GL_BLEND, buffer); + GLSMEnable.glEnablei(GL11.GL_BLEND, buffer); } public static void blendFuncSeparatei(int buffer, int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { - GLStateManager.glBlendFuncSeparatei(buffer, srcRGB, dstRGB, srcAlpha, dstAlpha); + GLSMBlend.glBlendFuncSeparatei(buffer, srcRGB, dstRGB, srcAlpha, dstAlpha); } public static void bindTextureToUnit(int unit, int texture) { if (unit == 0) GLStateManager.recordExitTextureBind(GL11.GL_TEXTURE_2D, 0); - else if (GLStateManager.getBoundTextureForServerState(unit) != texture) GLStateManager.beforeUncapturedStateChange(); + else if (GLSMTextures.getBoundTextureForServerState(unit) != texture) GLStateManager.beforeUncapturedStateChange(); dsaState.bindTextureToUnit(unit, texture); } public static void bindTextureToUnit(int target, int unit, int texture) { if (unit == 0) GLStateManager.recordExitTextureBind(target, 0); - else if (GLStateManager.getBoundTextureForServerState(unit) != texture) GLStateManager.beforeUncapturedStateChange(); + else if (GLSMTextures.getBoundTextureForServerState(unit) != texture) GLStateManager.beforeUncapturedStateChange(); dsaState.bindTextureToUnit(target, unit, texture); } public static void setupProjectionMatrix(Matrix4f matrix) { final FloatBuffer projectionMatrixBuffer = GLStateManager.ctx().projectionMatrixBuffer; - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPushMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPushMatrix(); matrix.get(0, projectionMatrixBuffer); - GLStateManager.glLoadMatrix(projectionMatrixBuffer); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadMatrix(projectionMatrixBuffer); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } public static void restoreProjectionMatrix() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } public static void blitFramebuffer(int source, int dest, int offsetX, int offsetY, int width, int height, int offsetX2, int offsetY2, int width2, int height2, int bufferChoice, int filter) { GLStateManager.rejectExitCapture(); - final boolean scissor = GLStateManager.glIsEnabled(GL11.GL_SCISSOR_TEST); - if (scissor) GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + final boolean scissor = GLSMEnable.glIsEnabled(GL11.GL_SCISSOR_TEST); + if (scissor) GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); try { dsaState.blitFramebuffer(source, dest, offsetX, offsetY, width, height, offsetX2, offsetY2, width2, height2, bufferChoice, filter); } finally { - if (scissor) GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); + if (scissor) GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); } } @@ -617,30 +617,30 @@ public class RenderSystem { } public static int createBuffers() { - return GLStateManager.glGenBuffers(); + return GLSMBuffers.glGenBuffers(); } public static int getIndexedBufferBinding(int target, int index) { GLStateManager.rejectExitCapture(); - return GLStateManager.getIndexedBufferBinding(target, index); + return GLSMBuffers.getIndexedBufferBinding(target, index); } public static void bindBufferBase(int target, int index, int buffer) { - GLStateManager.glBindBufferBase(target, index, buffer); + GLSMBuffers.glBindBufferBase(target, index, buffer); } public static void bufferStorage(int target, long size, int flags) { - GLStateManager.glBufferStorage(target, size, flags); + GLSMBuffers.glBufferStorage(target, size, flags); } public static void clearBufferSubData(int target, int internalFormat, long offset, long size, int format, int type, int[] data) { final ByteBuffer buf = BufferUtils.createByteBuffer(data.length * 4); buf.asIntBuffer().put(data); - GLStateManager.glClearBufferSubData(target, internalFormat, offset, size, format, type, buf); + GLSMBuffers.glClearBufferSubData(target, internalFormat, offset, size, format, type, buf); } public static void deleteBuffers(int buffer) { - GLStateManager.glDeleteBuffers(buffer); + GLSMBuffers.glDeleteBuffers(buffer); } public static long getVRAM() { @@ -688,32 +688,32 @@ public class RenderSystem { public static int genSampler() { if (!supportsSamplerObjects) return 0; - return GLStateManager.glGenSamplers(); + return GLSMTextures.glGenSamplers(); } public static void destroySampler(int sampler) { if (!supportsSamplerObjects || sampler == 0) return; - GLStateManager.glDeleteSamplers(sampler); + GLSMTextures.glDeleteSamplers(sampler); } public static void samplerParameteri(int sampler, int pname, int param) { if (!supportsSamplerObjects || sampler == 0) return; - GLStateManager.glSamplerParameteri(sampler, pname, param); + GLSMTextures.glSamplerParameteri(sampler, pname, param); } public static void samplerParameterf(int sampler, int pname, float param) { if (!supportsSamplerObjects || sampler == 0) return; - GLStateManager.glSamplerParameterf(sampler, pname, param); + GLSMTextures.glSamplerParameterf(sampler, pname, param); } public static void bindSamplerToUnit(int unit, int sampler) { if (!supportsSamplerObjects) return; - GLStateManager.glBindSampler(unit, sampler); + GLSMTextures.glBindSampler(unit, sampler); } public static void unbindAllSamplers() { if (!supportsSamplerObjects) return; - GLStateManager.unbindAllSamplers(); + GLSMTextures.unbindAllSamplers(); } /** Parse a GL version string (e.g. "4.6.0 NVIDIA ...") into concatenated digits "460". Strips diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/StateSet.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/StateSet.java index f6ec54420..439a0900b 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/StateSet.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/StateSet.java @@ -49,7 +49,7 @@ public final class StateSet { this.restore = restore; this.bump = bump; this.blendSnapshot = blendSnapshot; - this.pushCommand = () -> GLStateManager.pushStateLive(this); + this.pushCommand = () -> GLSMAttribStack.pushStateLive(this); } public boolean contains(int id) { @@ -83,18 +83,18 @@ public final class StateSet { private static StateSet buildBatch() { return new StateSet(0, ids( - GLStateManager.getBlendState(), GLStateManager.getAlphaState(), GLStateManager.getDepthState(), - GLStateManager.getColorMask(), GLStateManager.getPolygonState(), - GLStateManager.getTextures().getTextureUnitBindings(0), GLStateManager.getTextures().getTextureUnitBindings(1), - GLStateManager.getActiveTextureUnitStack(), - GLStateManager.getBlendMode(), GLStateManager.getAlphaTest(), GLStateManager.getDepthTest(), - GLStateManager.getLightingState(), GLStateManager.getCullState(), GLStateManager.getPolygonOffsetFillState(), - GLStateManager.getTextures().getTextureUnitStates(0), GLStateManager.getTextures().getTextureUnitStates(1), - GLStateManager.getLightStates()[0], GLStateManager.getLightStates()[1], - GLStateManager.getLightDataStates()[0], GLStateManager.getLightDataStates()[1], - GLStateManager.getColorMaterial(), GLStateManager.getColorMaterialFace(), GLStateManager.getColorMaterialParameter(), - GLStateManager.getLightModel(), GLStateManager.getFrontMaterial(), GLStateManager.getBackMaterial(), - GLStateManager.getNormalizeState(), GLStateManager.getRescaleNormalState() + GLSMBlend.getBlendState(), GLSMDepthStencilAlpha.getAlphaState(), GLSMDepthStencilAlpha.getDepthState(), + GLSMBlend.getColorMask(), GLSMRasterizer.getPolygonState(), + GLSMTextures.getTextures().getTextureUnitBindings(0), GLSMTextures.getTextures().getTextureUnitBindings(1), + GLSMTextures.getActiveTextureUnitStack(), + GLSMBlend.getBlendMode(), GLSMDepthStencilAlpha.getAlphaTest(), GLSMDepthStencilAlpha.getDepthTest(), + GLSMLighting.getLightingState(), GLSMRasterizer.getCullState(), GLSMRasterizer.getPolygonOffsetFillState(), + GLSMTextures.getTextures().getTextureUnitStates(0), GLSMTextures.getTextures().getTextureUnitStates(1), + GLSMLighting.getLightStates()[0], GLSMLighting.getLightStates()[1], + GLSMLighting.getLightDataStates()[0], GLSMLighting.getLightDataStates()[1], + GLSMLighting.getColorMaterial(), GLSMLighting.getColorMaterialFace(), GLSMLighting.getColorMaterialParameter(), + GLSMLighting.getLightModel(), GLSMLighting.getFrontMaterial(), GLSMLighting.getBackMaterial(), + GLSMLighting.getNormalizeState(), GLSMLighting.getRescaleNormalState() ), R_BLEND | R_DEPTH | R_COLOR_MASK | R_POLYGON | R_TEXTURE | R_ACTIVE_UNIT, B_FRAG_COLORBUF | B_LIGHTING, @@ -104,13 +104,13 @@ public final class StateSet { private static StateSet buildFont() { return new StateSet(0, ids( - GLStateManager.getBlendState(), GLStateManager.getDepthState(), GLStateManager.getShadeModelState(), - GLStateManager.getTextures().getTextureUnitBindings(0), GLStateManager.getTextures().getTextureUnitBindings(1), - GLStateManager.getActiveTextureUnitStack(), GLStateManager.getProgramStack(), - GLStateManager.getBlendMode(), GLStateManager.getAlphaTest(), GLStateManager.getDepthTest(), - GLStateManager.getTextures().getTextureUnitStates(0), - GLStateManager.getColorMask(), GLStateManager.getCullState(), - GLStateManager.getPolygonState(), GLStateManager.getPolygonOffsetFillState() + GLSMBlend.getBlendState(), GLSMDepthStencilAlpha.getDepthState(), GLSMRasterizer.getShadeModelState(), + GLSMTextures.getTextures().getTextureUnitBindings(0), GLSMTextures.getTextures().getTextureUnitBindings(1), + GLSMTextures.getActiveTextureUnitStack(), GLSMPrograms.getProgramStack(), + GLSMBlend.getBlendMode(), GLSMDepthStencilAlpha.getAlphaTest(), GLSMDepthStencilAlpha.getDepthTest(), + GLSMTextures.getTextures().getTextureUnitStates(0), + GLSMBlend.getColorMask(), GLSMRasterizer.getCullState(), + GLSMRasterizer.getPolygonState(), GLSMRasterizer.getPolygonOffsetFillState() ), R_BLEND | R_DEPTH | R_COLOR_MASK | R_TEXTURE | R_ACTIVE_UNIT | R_PROGRAM | R_POLYGON, 0, @@ -120,13 +120,13 @@ public final class StateSet { private static StateSet buildFontPipeline() { return new StateSet(0, ids( - GLStateManager.getBlendState(), GLStateManager.getDepthState(), - GLStateManager.getTextures().getTextureUnitBindings(0), GLStateManager.getTextures().getTextureUnitBindings(1), - GLStateManager.getActiveTextureUnitStack(), - GLStateManager.getBlendMode(), GLStateManager.getAlphaTest(), GLStateManager.getDepthTest(), - GLStateManager.getTextures().getTextureUnitStates(0), - GLStateManager.getColorMask(), GLStateManager.getCullState(), - GLStateManager.getPolygonState(), GLStateManager.getPolygonOffsetFillState() + GLSMBlend.getBlendState(), GLSMDepthStencilAlpha.getDepthState(), + GLSMTextures.getTextures().getTextureUnitBindings(0), GLSMTextures.getTextures().getTextureUnitBindings(1), + GLSMTextures.getActiveTextureUnitStack(), + GLSMBlend.getBlendMode(), GLSMDepthStencilAlpha.getAlphaTest(), GLSMDepthStencilAlpha.getDepthTest(), + GLSMTextures.getTextures().getTextureUnitStates(0), + GLSMBlend.getColorMask(), GLSMRasterizer.getCullState(), + GLSMRasterizer.getPolygonState(), GLSMRasterizer.getPolygonOffsetFillState() ), R_BLEND | R_DEPTH | R_COLOR_MASK | R_TEXTURE | R_ACTIVE_UNIT | R_POLYGON, 0, @@ -136,8 +136,8 @@ public final class StateSet { private static StateSet buildHand() { return new StateSet(0, ids( - GLStateManager.getBlendState(), GLStateManager.getAlphaState(), GLStateManager.getDepthState(), - GLStateManager.getBlendMode(), GLStateManager.getAlphaTest(), GLStateManager.getTextures().getTextureUnitStates(1) + GLSMBlend.getBlendState(), GLSMDepthStencilAlpha.getAlphaState(), GLSMDepthStencilAlpha.getDepthState(), + GLSMBlend.getBlendMode(), GLSMDepthStencilAlpha.getAlphaTest(), GLSMTextures.getTextures().getTextureUnitStates(1) ), R_BLEND | R_DEPTH, B_FRAG_COLORBUF, @@ -146,7 +146,7 @@ public final class StateSet { private static StateSet buildBlend() { return new StateSet(0, - ids(GLStateManager.getBlendState(), GLStateManager.getBlendMode()), + ids(GLSMBlend.getBlendState(), GLSMBlend.getBlendMode()), R_BLEND, 0, true); @@ -154,7 +154,7 @@ public final class StateSet { private static StateSet buildAlpha() { return new StateSet(0, - ids(GLStateManager.getAlphaState(), GLStateManager.getAlphaTest()), + ids(GLSMDepthStencilAlpha.getAlphaState(), GLSMDepthStencilAlpha.getAlphaTest()), 0, B_FRAG_COLORBUF, false); @@ -162,7 +162,7 @@ public final class StateSet { private static StateSet buildCutout() { return new StateSet(0, - ids(GLStateManager.getAlphaState(), GLStateManager.getAlphaTest(), GLStateManager.getTextures().getTextureUnitStates(1)), + ids(GLSMDepthStencilAlpha.getAlphaState(), GLSMDepthStencilAlpha.getAlphaTest(), GLSMTextures.getTextures().getTextureUnitStates(1)), 0, B_FRAG_COLORBUF, false); @@ -170,7 +170,7 @@ public final class StateSet { private static StateSet buildMasks() { return new StateSet(0, - ids(GLStateManager.getDepthState(), GLStateManager.getColorMask()), + ids(GLSMDepthStencilAlpha.getDepthState(), GLSMBlend.getColorMask()), R_DEPTH | R_COLOR_MASK, 0, false); @@ -178,7 +178,7 @@ public final class StateSet { private static StateSet buildCull() { return new StateSet(0, - ids(GLStateManager.getPolygonState(), GLStateManager.getCullState()), + ids(GLSMRasterizer.getPolygonState(), GLSMRasterizer.getCullState()), R_POLYGON, 0, false); diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/backend/RenderBackend.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/backend/RenderBackend.java index b133f7459..9775bc7fb 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/backend/RenderBackend.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/backend/RenderBackend.java @@ -2,6 +2,7 @@ package com.gtnewhorizons.angelica.glsm.backend; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; import com.gtnewhorizons.angelica.glsm.GLESFormatRemap; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.texture.TextureStaging; @@ -249,7 +250,7 @@ public abstract class RenderBackend { public void onFrameBegin() { if (GLStateManager.takeStateSeedPending()) { - GLStateManager.replayStateToBackend(); + GLSMAttribStack.replayStateToBackend(); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java index 5063a98a0..3e30d312c 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaCylinder.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.compat.lwjgl; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import org.lwjgl.util.glu.Cylinder; import static org.lwjgl.opengl.GL11.GL_LINES; @@ -28,11 +29,11 @@ public class AngelicaCylinder extends Cylinder { y /= mag; z /= mag; } - GLStateManager.glNormal3f(x, y, z); + GLSMCurrentAttribs.glNormal3f(x, y, z); } private void emitTexCoord(float x, float y) { - if (super.textureFlag) GLStateManager.glTexCoord2f(x, y); + if (super.textureFlag) GLSMCurrentAttribs.glTexCoord2f(x, y); } @Override @@ -48,7 +49,7 @@ public class AngelicaCylinder extends Cylinder { nz = (baseRadius - topRadius) / height; if (super.drawStyle == GLU_POINT) { - GLStateManager.glBegin(GL_POINTS); + GLSMDraws.glBegin(GL_POINTS); for (int i = 0; i < slices; i++) { x = cos(i * da); y = sin(i * da); @@ -57,60 +58,60 @@ public class AngelicaCylinder extends Cylinder { z = 0.0f; r = baseRadius; for (int j = 0; j <= stacks; j++) { - GLStateManager.glVertex3f(x * r, y * r, z); + GLSMDraws.glVertex3f(x * r, y * r, z); z += dz; r += dr; } } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } else if (super.drawStyle == GLU_LINE || super.drawStyle == GLU_SILHOUETTE) { // Draw rings if (super.drawStyle == GLU_LINE) { z = 0.0f; r = baseRadius; for (int j = 0; j <= stacks; j++) { - GLStateManager.glBegin(GL_LINE_LOOP); + GLSMDraws.glBegin(GL_LINE_LOOP); for (int i = 0; i < slices; i++) { x = cos(i * da); y = sin(i * da); emitNormal(x * nsign, y * nsign, nz * nsign); - GLStateManager.glVertex3f(x * r, y * r, z); + GLSMDraws.glVertex3f(x * r, y * r, z); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); z += dz; r += dr; } } else { // draw one ring at each end if (baseRadius != 0.0) { - GLStateManager.glBegin(GL_LINE_LOOP); + GLSMDraws.glBegin(GL_LINE_LOOP); for (int i = 0; i < slices; i++) { x = cos(i * da); y = sin(i * da); emitNormal(x * nsign, y * nsign, nz * nsign); - GLStateManager.glVertex3f(x * baseRadius, y * baseRadius, 0.0f); + GLSMDraws.glVertex3f(x * baseRadius, y * baseRadius, 0.0f); } - GLStateManager.glEnd(); - GLStateManager.glBegin(GL_LINE_LOOP); + GLSMDraws.glEnd(); + GLSMDraws.glBegin(GL_LINE_LOOP); for (int i = 0; i < slices; i++) { x = cos(i * da); y = sin(i * da); emitNormal(x * nsign, y * nsign, nz * nsign); - GLStateManager.glVertex3f(x * topRadius, y * topRadius, height); + GLSMDraws.glVertex3f(x * topRadius, y * topRadius, height); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } } // draw length lines - GLStateManager.glBegin(GL_LINES); + GLSMDraws.glBegin(GL_LINES); for (int i = 0; i < slices; i++) { x = cos(i * da); y = sin(i * da); emitNormal(x * nsign, y * nsign, nz * nsign); - GLStateManager.glVertex3f(x * baseRadius, y * baseRadius, 0.0f); - GLStateManager.glVertex3f(x * topRadius, y * topRadius, height); + GLSMDraws.glVertex3f(x * baseRadius, y * baseRadius, 0.0f); + GLSMDraws.glVertex3f(x * topRadius, y * topRadius, height); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } else if (super.drawStyle == GLU_FILL) { final float ds = 1.0f / slices; final float dt = 1.0f / stacks; @@ -119,20 +120,20 @@ public class AngelicaCylinder extends Cylinder { r = baseRadius; for (int j = 0; j < stacks; j++) { float s = 0.0f; - GLStateManager.glBegin(GL_TRIANGLE_STRIP); + GLSMDraws.glBegin(GL_TRIANGLE_STRIP); for (int i = 0; i <= slices; i++) { final float angle = (i == slices) ? 0.0f : i * da; x = sin(angle); y = cos(angle); emitNormal(x * nsign, y * nsign, nz * nsign); emitTexCoord(s, t); - GLStateManager.glVertex3f(x * r, y * r, z); + GLSMDraws.glVertex3f(x * r, y * r, z); emitNormal(x * nsign, y * nsign, nz * nsign); emitTexCoord(s, t + dt); - GLStateManager.glVertex3f(x * (r + dr), y * (r + dr), z + dz); + GLSMDraws.glVertex3f(x * (r + dr), y * (r + dr), z + dz); s += ds; } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); r += dr; t += dt; z += dz; diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java index 1c6e59dd2..7dc48d047 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaDisk.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.compat.lwjgl; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import org.lwjgl.util.glu.Disk; import static org.lwjgl.opengl.GL11.GL_LINE_LOOP; @@ -23,7 +24,7 @@ public class AngelicaDisk extends Disk { private static final float PI = (float) Math.PI; private void emitTexCoord(float x, float y) { - if (super.textureFlag) GLStateManager.glTexCoord2f(x, y); + if (super.textureFlag) GLSMCurrentAttribs.glTexCoord2f(x, y); } @Override @@ -31,7 +32,7 @@ public class AngelicaDisk extends Disk { final float da, dr; if (super.normals != GLU_NONE) { - GLStateManager.glNormal3f(0.0f, 0.0f, (super.orientation == GLU_OUTSIDE) ? 1.0f : -1.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, (super.orientation == GLU_OUTSIDE) ? 1.0f : -1.0f); } da = 2.0f * PI / slices; @@ -45,29 +46,29 @@ public class AngelicaDisk extends Disk { for (int l = 0; l < loops; l++) { final float r2 = r1 + dr; if (super.orientation == GLU_OUTSIDE) { - GLStateManager.glBegin(GL_TRIANGLE_STRIP); + GLSMDraws.glBegin(GL_TRIANGLE_STRIP); for (int s = 0; s <= slices; s++) { final float a = (s == slices) ? 0.0f : s * da; sa = sin(a); ca = cos(a); emitTexCoord(0.5f + sa * r2 / dtc, 0.5f + ca * r2 / dtc); - GLStateManager.glVertex2f(r2 * sa, r2 * ca); + GLSMDraws.glVertex2f(r2 * sa, r2 * ca); emitTexCoord(0.5f + sa * r1 / dtc, 0.5f + ca * r1 / dtc); - GLStateManager.glVertex2f(r1 * sa, r1 * ca); + GLSMDraws.glVertex2f(r1 * sa, r1 * ca); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } else { - GLStateManager.glBegin(GL_TRIANGLE_STRIP); + GLSMDraws.glBegin(GL_TRIANGLE_STRIP); for (int s = slices; s >= 0; s--) { final float a = (s == slices) ? 0.0f : s * da; sa = sin(a); ca = cos(a); emitTexCoord(0.5f - sa * r2 / dtc, 0.5f + ca * r2 / dtc); - GLStateManager.glVertex2f(r2 * sa, r2 * ca); + GLSMDraws.glVertex2f(r2 * sa, r2 * ca); emitTexCoord(0.5f - sa * r1 / dtc, 0.5f + ca * r1 / dtc); - GLStateManager.glVertex2f(r1 * sa, r1 * ca); + GLSMDraws.glVertex2f(r1 * sa, r1 * ca); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } r1 = r2; } @@ -76,56 +77,56 @@ public class AngelicaDisk extends Disk { /* draw loops */ for (int l = 0; l <= loops; l++) { final float r = innerRadius + l * dr; - GLStateManager.glBegin(GL_LINE_LOOP); + GLSMDraws.glBegin(GL_LINE_LOOP); for (int s = 0; s < slices; s++) { final float a = s * da; - GLStateManager.glVertex2f(r * sin(a), r * cos(a)); + GLSMDraws.glVertex2f(r * sin(a), r * cos(a)); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } /* draw spokes */ for (int s = 0; s < slices; s++) { final float a = s * da; final float x = sin(a); final float y = cos(a); - GLStateManager.glBegin(GL_LINE_STRIP); + GLSMDraws.glBegin(GL_LINE_STRIP); for (int l = 0; l <= loops; l++) { final float r = innerRadius + l * dr; - GLStateManager.glVertex2f(r * x, r * y); + GLSMDraws.glVertex2f(r * x, r * y); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } } case GLU_POINT -> { - GLStateManager.glBegin(GL_POINTS); + GLSMDraws.glBegin(GL_POINTS); for (int s = 0; s < slices; s++) { final float a = s * da; final float x = sin(a); final float y = cos(a); for (int l = 0; l <= loops; l++) { final float r = innerRadius * l * dr; - GLStateManager.glVertex2f(r * x, r * y); + GLSMDraws.glVertex2f(r * x, r * y); } } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } case GLU_SILHOUETTE -> { if (innerRadius != 0.0) { - GLStateManager.glBegin(GL_LINE_LOOP); + GLSMDraws.glBegin(GL_LINE_LOOP); for (float a = 0.0f; a < 2.0 * PI; a += da) { final float x = innerRadius * sin(a); final float y = innerRadius * cos(a); - GLStateManager.glVertex2f(x, y); + GLSMDraws.glVertex2f(x, y); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } - GLStateManager.glBegin(GL_LINE_LOOP); + GLSMDraws.glBegin(GL_LINE_LOOP); for (float a = 0; a < 2.0f * PI; a += da) { final float x = outerRadius * sin(a); final float y = outerRadius * cos(a); - GLStateManager.glVertex2f(x, y); + GLSMDraws.glVertex2f(x, y); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } default -> { } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java index c3fcd4d2e..d00d6f779 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaPartialDisk.java @@ -1,5 +1,7 @@ package com.gtnewhorizons.angelica.glsm.compat.lwjgl; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.glsm.GLStateManager; import org.lwjgl.util.glu.PartialDisk; @@ -63,7 +65,7 @@ public class AngelicaPartialDisk extends PartialDisk { } switch (super.normals) { - case GLU_FLAT, GLU_SMOOTH -> GLStateManager.glNormal3f(0.0f, 0.0f, (super.orientation == GLU_OUTSIDE) ? 1.0f : -1.0f); + case GLU_FLAT, GLU_SMOOTH -> GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, (super.orientation == GLU_OUTSIDE) ? 1.0f : -1.0f); default -> { } } @@ -73,11 +75,11 @@ public class AngelicaPartialDisk extends PartialDisk { if (innerRadius == .0f) { finish = loops - 1; /* Triangle strip for inner polygons */ - GLStateManager.glBegin(GL_TRIANGLE_FAN); + GLSMDraws.glBegin(GL_TRIANGLE_FAN); if (super.textureFlag) { - GLStateManager.glTexCoord2f(0.5f, 0.5f); + GLSMCurrentAttribs.glTexCoord2f(0.5f, 0.5f); } - GLStateManager.glVertex3f(0.0f, 0.0f, 0.0f); + GLSMDraws.glVertex3f(0.0f, 0.0f, 0.0f); radiusLow = outerRadius - deltaRadius * ((float) (loops - 1) / loops); if (super.textureFlag) { texLow = radiusLow / outerRadius / 2; @@ -86,19 +88,19 @@ public class AngelicaPartialDisk extends PartialDisk { if (super.orientation == GLU_OUTSIDE) { for (int i = slices; i >= 0; i--) { if (super.textureFlag) { - GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); } } else { for (int i = 0; i <= slices; i++) { if (super.textureFlag) { - GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); } } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } else { finish = loops; } @@ -110,35 +112,35 @@ public class AngelicaPartialDisk extends PartialDisk { texHigh = radiusHigh / outerRadius / 2; } - GLStateManager.glBegin(GL_TRIANGLE_STRIP); + GLSMDraws.glBegin(GL_TRIANGLE_STRIP); for (int i = 0; i <= slices; i++) { if (super.orientation == GLU_OUTSIDE) { if (super.textureFlag) { - GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); if (super.textureFlag) { - GLStateManager.glTexCoord2f(texHigh * sinCache[i] + 0.5f, texHigh * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texHigh * sinCache[i] + 0.5f, texHigh * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusHigh * sinCache[i], radiusHigh * cosCache[i], 0.0f); + GLSMDraws.glVertex3f(radiusHigh * sinCache[i], radiusHigh * cosCache[i], 0.0f); } else { if (super.textureFlag) { - GLStateManager.glTexCoord2f(texHigh * sinCache[i] + 0.5f, texHigh * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texHigh * sinCache[i] + 0.5f, texHigh * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusHigh * sinCache[i], radiusHigh * cosCache[i], 0.0f); + GLSMDraws.glVertex3f(radiusHigh * sinCache[i], radiusHigh * cosCache[i], 0.0f); if (super.textureFlag) { - GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); } } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } } case GLU_POINT -> { - GLStateManager.glBegin(GL_POINTS); + GLSMDraws.glBegin(GL_POINTS); for (int i = 0; i < slices2; i++) { sintemp = sinCache[i]; costemp = cosCache[i]; @@ -148,24 +150,24 @@ public class AngelicaPartialDisk extends PartialDisk { if (super.textureFlag) { texLow = radiusLow / outerRadius / 2; - GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); + GLSMDraws.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); } } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } case GLU_LINE -> { if (innerRadius == outerRadius) { - GLStateManager.glBegin(GL_LINE_STRIP); + GLSMDraws.glBegin(GL_LINE_STRIP); for (int i = 0; i <= slices; i++) { if (super.textureFlag) { - GLStateManager.glTexCoord2f(sinCache[i] / 2 + 0.5f, cosCache[i] / 2 + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(sinCache[i] / 2 + 0.5f, cosCache[i] / 2 + 0.5f); } - GLStateManager.glVertex3f(innerRadius * sinCache[i], innerRadius * cosCache[i], 0.0f); + GLSMDraws.glVertex3f(innerRadius * sinCache[i], innerRadius * cosCache[i], 0.0f); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); break; } for (int j = 0; j <= loops; j++) { @@ -174,19 +176,19 @@ public class AngelicaPartialDisk extends PartialDisk { texLow = radiusLow / outerRadius / 2; } - GLStateManager.glBegin(GL_LINE_STRIP); + GLSMDraws.glBegin(GL_LINE_STRIP); for (int i = 0; i <= slices; i++) { if (super.textureFlag) { - GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } for (int i = 0; i < slices2; i++) { sintemp = sinCache[i]; costemp = cosCache[i]; - GLStateManager.glBegin(GL_LINE_STRIP); + GLSMDraws.glBegin(GL_LINE_STRIP); for (int j = 0; j <= loops; j++) { radiusLow = outerRadius - deltaRadius * ((float) j / loops); if (super.textureFlag) { @@ -194,11 +196,11 @@ public class AngelicaPartialDisk extends PartialDisk { } if (super.textureFlag) { - GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); + GLSMDraws.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } } case GLU_SILHOUETTE -> { @@ -206,17 +208,17 @@ public class AngelicaPartialDisk extends PartialDisk { for (int i = 0; i <= slices; i += slices) { sintemp = sinCache[i]; costemp = cosCache[i]; - GLStateManager.glBegin(GL_LINE_STRIP); + GLSMDraws.glBegin(GL_LINE_STRIP); for (int j = 0; j <= loops; j++) { radiusLow = outerRadius - deltaRadius * ((float) j / loops); if (super.textureFlag) { texLow = radiusLow / outerRadius / 2; - GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); + GLSMDraws.glVertex3f(radiusLow * sintemp, radiusLow * costemp, 0.0f); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } } for (int j = 0; j <= loops; j += loops) { @@ -225,14 +227,14 @@ public class AngelicaPartialDisk extends PartialDisk { texLow = radiusLow / outerRadius / 2; } - GLStateManager.glBegin(GL_LINE_STRIP); + GLSMDraws.glBegin(GL_LINE_STRIP); for (int i = 0; i <= slices; i++) { if (super.textureFlag) { - GLStateManager.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); + GLSMCurrentAttribs.glTexCoord2f(texLow * sinCache[i] + 0.5f, texLow * cosCache[i] + 0.5f); } - GLStateManager.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); + GLSMDraws.glVertex3f(radiusLow * sinCache[i], radiusLow * cosCache[i], 0.0f); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); if (innerRadius == outerRadius) break; } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java index deca48e9c..8697fe7c5 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/compat/lwjgl/AngelicaSphere.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.compat.lwjgl; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import org.lwjgl.util.glu.Sphere; import static org.lwjgl.opengl.GL11.GL_LINE_LOOP; @@ -30,11 +31,11 @@ public class AngelicaSphere extends Sphere { y /= mag; z /= mag; } - GLStateManager.glNormal3f(x, y, z); + GLSMCurrentAttribs.glNormal3f(x, y, z); } private void emitTexCoord(float x, float y) { - if (super.textureFlag) GLStateManager.glTexCoord2f(x, y); + if (super.textureFlag) GLSMCurrentAttribs.glTexCoord2f(x, y); } @Override @@ -54,9 +55,9 @@ public class AngelicaSphere extends Sphere { if (super.drawStyle == GLU_FILL) { if (!super.textureFlag) { // draw +Z end as a triangle fan - GLStateManager.glBegin(GL_TRIANGLE_FAN); - GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f); - GLStateManager.glVertex3f(0.0f, 0.0f, nsign * radius); + GLSMDraws.glBegin(GL_TRIANGLE_FAN); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f); + GLSMDraws.glVertex3f(0.0f, 0.0f, nsign * radius); for (int j = 0; j <= slices; j++) { theta = (j == slices) ? 0.0f : j * dtheta; x = -sin(theta) * sin(drho); @@ -65,9 +66,9 @@ public class AngelicaSphere extends Sphere { if (normals) { emitNormal(x * nsign, y * nsign, z * nsign); } - GLStateManager.glVertex3f(x * radius, y * radius, z * radius); + GLSMDraws.glVertex3f(x * radius, y * radius, z * radius); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } ds = 1.0f / slices; @@ -84,7 +85,7 @@ public class AngelicaSphere extends Sphere { // draw intermediate stacks as triangle strips (GL_QUAD_STRIP removed in core profile) for (int i = imin; i < imax; i++) { rho = i * drho; - GLStateManager.glBegin(GL_TRIANGLE_STRIP); + GLSMDraws.glBegin(GL_TRIANGLE_STRIP); s = 0.0f; for (int j = 0; j <= slices; j++) { theta = (j == slices) ? 0.0f : j * dtheta; @@ -95,7 +96,7 @@ public class AngelicaSphere extends Sphere { emitNormal(x * nsign, y * nsign, z * nsign); } emitTexCoord(s, t); - GLStateManager.glVertex3f(x * radius, y * radius, z * radius); + GLSMDraws.glVertex3f(x * radius, y * radius, z * radius); x = -sin(theta) * sin(rho + drho); y = cos(theta) * sin(rho + drho); z = nsign * cos(rho + drho); @@ -104,17 +105,17 @@ public class AngelicaSphere extends Sphere { } emitTexCoord(s, t - dt); s += ds; - GLStateManager.glVertex3f(x * radius, y * radius, z * radius); + GLSMDraws.glVertex3f(x * radius, y * radius, z * radius); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); t -= dt; } if (!super.textureFlag) { // draw -Z end as a triangle fan - GLStateManager.glBegin(GL_TRIANGLE_FAN); - GLStateManager.glNormal3f(0.0f, 0.0f, -1.0f); - GLStateManager.glVertex3f(0.0f, 0.0f, -radius * nsign); + GLSMDraws.glBegin(GL_TRIANGLE_FAN); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, -1.0f); + GLSMDraws.glVertex3f(0.0f, 0.0f, -radius * nsign); rho = PI - drho; s = 1.0f; for (int j = slices; j >= 0; j--) { @@ -124,46 +125,46 @@ public class AngelicaSphere extends Sphere { z = nsign * cos(rho); if (normals) emitNormal(x * nsign, y * nsign, z * nsign); s -= ds; - GLStateManager.glVertex3f(x * radius, y * radius, z * radius); + GLSMDraws.glVertex3f(x * radius, y * radius, z * radius); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } } else if (super.drawStyle == GLU_LINE || super.drawStyle == GLU_SILHOUETTE) { // draw stack lines for (int i = 1; i < stacks; i++) { rho = i * drho; - GLStateManager.glBegin(GL_LINE_LOOP); + GLSMDraws.glBegin(GL_LINE_LOOP); for (int j = 0; j < slices; j++) { theta = j * dtheta; x = cos(theta) * sin(rho); y = sin(theta) * sin(rho); z = cos(rho); if (normals) emitNormal(x * nsign, y * nsign, z * nsign); - GLStateManager.glVertex3f(x * radius, y * radius, z * radius); + GLSMDraws.glVertex3f(x * radius, y * radius, z * radius); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } // draw slice lines for (int j = 0; j < slices; j++) { theta = j * dtheta; - GLStateManager.glBegin(GL_LINE_STRIP); + GLSMDraws.glBegin(GL_LINE_STRIP); for (int i = 0; i <= stacks; i++) { rho = i * drho; x = cos(theta) * sin(rho); y = sin(theta) * sin(rho); z = cos(rho); if (normals) emitNormal(x * nsign, y * nsign, z * nsign); - GLStateManager.glVertex3f(x * radius, y * radius, z * radius); + GLSMDraws.glVertex3f(x * radius, y * radius, z * radius); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } } else if (super.drawStyle == GLU_POINT) { // top and bottom-most points - GLStateManager.glBegin(GL_POINTS); - if (normals) GLStateManager.glNormal3f(0.0f, 0.0f, nsign); - GLStateManager.glVertex3f(0.0f, 0.0f, radius); - if (normals) GLStateManager.glNormal3f(0.0f, 0.0f, -nsign); - GLStateManager.glVertex3f(0.0f, 0.0f, -radius); + GLSMDraws.glBegin(GL_POINTS); + if (normals) GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, nsign); + GLSMDraws.glVertex3f(0.0f, 0.0f, radius); + if (normals) GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, -nsign); + GLSMDraws.glVertex3f(0.0f, 0.0f, -radius); // loop over stacks for (int i = 1; i < stacks - 1; i++) { @@ -174,10 +175,10 @@ public class AngelicaSphere extends Sphere { y = sin(theta) * sin(rho); z = cos(rho); if (normals) emitNormal(x * nsign, y * nsign, z * nsign); - GLStateManager.glVertex3f(x * radius, y * radius, z * radius); + GLSMDraws.glVertex3f(x * radius, y * radius, z * radius); } } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java index 02a561844..63f601b20 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAARB.java @@ -1,5 +1,8 @@ package com.gtnewhorizons.angelica.glsm.dsa; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache; import org.lwjgl.opengl.GL11; @@ -42,23 +45,23 @@ public class DSAARB extends DSAUnsupported { @Override public void texParameteri(int texture, int target, int pname, int param) { - param = GLStateManager.remapTexClamp(pname, param); - if(!GLStateManager.updateTexParameteriCache(target, texture, pname, param)) return; + param = GLSMTextures.remapTexClamp(pname, param); + if(!GLSMTextures.updateTexParameteriCache(target, texture, pname, param)) return; RENDER_BACKEND.textureParameteri(texture, target, pname, param); } @Override public void texParameterf(int texture, int target, int pname, float param) { - param = GLStateManager.remapTexClamp(pname, param); - if(!GLStateManager.updateTexParameterfCache(target, texture, pname, param)) return; + param = GLSMTextures.remapTexClamp(pname, param); + if(!GLSMTextures.updateTexParameterfCache(target, texture, pname, param)) return; RENDER_BACKEND.textureParameterf(texture, target, pname, param); } @Override public void texParameteriv(int texture, int target, int pname, IntBuffer params) { - GLStateManager.remapTexClampBuffer(pname, params); + GLSMTextures.remapTexClampBuffer(pname, params); RENDER_BACKEND.textureParameteriv(texture, target, pname, params); } @@ -74,8 +77,8 @@ public class DSAARB extends DSAUnsupported { @Override public int getTexParameteri(int texture, int target, int pname) { - final long v = GLStateManager.lookupTexParameteri(TextureInfoCache.INSTANCE.getInfo(texture), pname); - return v != GLStateManager.TEX_PARAM_MISS ? (int) v : RENDER_BACKEND.getTextureParameteri(texture, target, pname); + final long v = GLSMTextures.lookupTexParameteri(TextureInfoCache.INSTANCE.getInfo(texture), pname); + return v != GLSMTextures.TEX_PARAM_MISS ? (int) v : RENDER_BACKEND.getTextureParameteri(texture, target, pname); } @Override @@ -100,23 +103,23 @@ public class DSAARB extends DSAUnsupported { @Override public void bindTextureToUnit(int target, int unit, int texture) { - if(GLStateManager.getBoundTextureForServerState(unit) == texture) return; + if(GLSMTextures.getBoundTextureForServerState(unit) == texture) return; if (texture == 0) { super.bindTextureToUnit(target != 0 ? target : GL11.GL_TEXTURE_2D, unit, texture); } else { RENDER_BACKEND.bindTextureUnit(unit, texture); - final var binding = GLStateManager.getTextures().getTextureUnitBindings(unit); + final var binding = GLSMTextures.getTextures().getTextureUnitBindings(unit); binding.beforeModify(); binding.setBinding(texture, target); - GLStateManager.trackMaxBoundTextureUnit(unit); + GLSMTextures.trackMaxBoundTextureUnit(unit); } } @Override public int bufferStorage(int target, FloatBuffer data, int usage) { - final int buffer = GLStateManager.glCreateBuffers(); - GLStateManager.glNamedBufferData(buffer, data, usage); + final int buffer = GLSMBuffers.glCreateBuffers(); + GLSMBuffers.glNamedBufferData(buffer, data, usage); return buffer; } @@ -128,7 +131,7 @@ public class DSAARB extends DSAUnsupported { @Override public void framebufferTexture2D(int fb, int fbtarget, int attachment, int target, int texture, int levels) { - GLStateManager.glNamedFramebufferTexture(fb, attachment, texture, levels); + GLSMFramebuffer.glNamedFramebufferTexture(fb, attachment, texture, levels); } @Override @@ -139,6 +142,6 @@ public class DSAARB extends DSAUnsupported { @Override public int createTexture(int target) { - return GLStateManager.glCreateTextures(target); + return GLSMTextures.glCreateTextures(target); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java index 4afbef548..1d601a212 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupported.java @@ -1,5 +1,8 @@ package com.gtnewhorizons.angelica.glsm.dsa; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.stacks.TextureBindingStack; import com.gtnewhorizons.angelica.glsm.texture.TextureTargets; @@ -17,7 +20,7 @@ public class DSAUnsupported implements DSAAccess { @Override public void generateMipmaps(int texture, int target) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); RENDER_BACKEND.generateMipmap(target); } @@ -56,40 +59,40 @@ public class DSAUnsupported implements DSAAccess { @Override public void texParameteri(int texture, int target, int pname, int param) { final int previous = bindForEdit(target, texture); - GLStateManager.glTexParameteri(target, pname, param); + GLSMTextures.glTexParameteri(target, pname, param); restoreBinding(target, previous); } @Override public void texParameterf(int texture, int target, int pname, float param) { final int previous = bindForEdit(target, texture); - GLStateManager.glTexParameterf(target, pname, param); + GLSMTextures.glTexParameterf(target, pname, param); restoreBinding(target, previous); } @Override public void texParameteriv(int texture, int target, int pname, IntBuffer params) { final int previous = bindForEdit(target, texture); - GLStateManager.glTexParameter(target, pname, params); + GLSMTextures.glTexParameter(target, pname, params); restoreBinding(target, previous); } @Override public void readBuffer(int framebuffer, int buffer) { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer); RENDER_BACKEND.readBuffer(buffer); } @Override public void drawBuffers(int framebuffer, IntBuffer buffers) { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer); RENDER_BACKEND.drawBuffers(buffers); } @Override public int getTexParameteri(int texture, int target, int pname) { final int previous = bindForEdit(target, texture); - final int result = GLStateManager.glGetTexParameteri(target, pname); + final int result = GLSMTextures.glGetTexParameteri(target, pname); restoreBinding(target, previous); return result; } @@ -97,7 +100,7 @@ public class DSAUnsupported implements DSAAccess { @Override public float getTexParameterf(int texture, int target, int pname) { final int previous = bindForEdit(target, texture); - final float result = GLStateManager.glGetTexParameterf(target, pname); + final float result = GLSMTextures.glGetTexParameterf(target, pname); restoreBinding(target, previous); return result; } @@ -114,29 +117,29 @@ public class DSAUnsupported implements DSAAccess { @Override public void copyTexSubImage2D(int destTexture, int target, int i, int i1, int i2, int i3, int i4, int width, int height) { final int previous = previous2D(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, destTexture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, destTexture); RENDER_BACKEND.copyTexSubImage2D(target, i, i1, i2, i3, i4, width, height); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previous); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previous); } @Override public void bindTextureToUnit(int unit, int texture) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); } @Override public void bindTextureToUnit(int target, int unit, int texture) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - GLStateManager.glBindTexture(target, texture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMTextures.glBindTexture(target, texture); } @Override public int bufferStorage(int target, FloatBuffer data, int usage) { - final int buffer = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(target, buffer); - GLStateManager.glBufferData(target, data, usage); - GLStateManager.glBindBuffer(target, 0); + final int buffer = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(target, buffer); + GLSMBuffers.glBufferData(target, data, usage); + GLSMBuffers.glBindBuffer(target, 0); return buffer; } @@ -144,28 +147,28 @@ public class DSAUnsupported implements DSAAccess { @Override public void blitFramebuffer(int source, int dest, int offsetX, int offsetY, int width, int height, int offsetX2, int offsetY2, int width2, int height2, int bufferChoice, int filter) { - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, source); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, dest); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, source); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, dest); RENDER_BACKEND.blitFramebuffer(offsetX, offsetY, width, height, offsetX2, offsetY2, width2, height2, bufferChoice, filter); } @Override public void framebufferTexture2D(int fb, int fbtarget, int attachment, int target, int texture, int levels) { - GLStateManager.glBindFramebuffer(fbtarget, fb); - GLStateManager.glFramebufferTexture2D(fbtarget, attachment, target, texture, levels); + GLSMFramebuffer.glBindFramebuffer(fbtarget, fb); + GLSMFramebuffer.glFramebufferTexture2D(fbtarget, attachment, target, texture, levels); } @Override public int createFramebuffer() { - final int framebuffer = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer); + final int framebuffer = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer); return framebuffer; } @Override public int createTexture(int target) { - final int texture = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(target, texture); + final int texture = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(target, texture); return texture; } @@ -175,7 +178,7 @@ public class DSAUnsupported implements DSAAccess { private static int previous2D() { if (GLStateManager.isCachingEnabled()) { - final TextureBindingStack slot = GLStateManager.getTextures().getTextureUnitBindings(GLStateManager.getActiveTextureUnit()); + final TextureBindingStack slot = GLSMTextures.getTextures().getTextureUnitBindings(GLSMTextures.getActiveTextureUnit()); final int t = slot.getTarget(); if (t == 0 || t == GL11.GL_TEXTURE_2D) return slot.getBinding(); } @@ -184,13 +187,13 @@ public class DSAUnsupported implements DSAAccess { private static int bindForEdit(int target, int texture) { final int previous = previousBinding(target); - if (target == GL11.GL_TEXTURE_2D) GLStateManager.glBindTexture(target, texture); + if (target == GL11.GL_TEXTURE_2D) GLSMTextures.glBindTexture(target, texture); else RENDER_BACKEND.bindTexture(target, texture); return previous; } private static void restoreBinding(int target, int previous) { - if (target == GL11.GL_TEXTURE_2D) GLStateManager.glBindTexture(target, previous); + if (target == GL11.GL_TEXTURE_2D) GLSMTextures.glBindTexture(target, previous); else RENDER_BACKEND.bindTexture(target, previous); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CombinedGlint.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CombinedGlint.java index 053dc99a0..532b70317 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CombinedGlint.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CombinedGlint.java @@ -1,6 +1,12 @@ package com.gtnewhorizons.angelica.glsm.ffp; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.lwjgl.opengl.GL11; @@ -24,14 +30,14 @@ public final class CombinedGlint { } public static boolean begin(Matrix4fc secondTextureMatrix) { - if (active || GLStateManager.getActiveProgram() != 0 || GLStateManager.getLightingState().isEnabled() || GLStateManager.getColorSumState().isEnabled() || !GLStateManager.glIsEnabled(GL11.GL_BLEND)) return false; - final var blend = GLStateManager.getBlendState(); + if (active || GLSMPrograms.getActiveProgram() != 0 || GLSMLighting.getLightingState().isEnabled() || GLSMCurrentAttribs.getColorSumState().isEnabled() || !GLSMEnable.glIsEnabled(GL11.GL_BLEND)) return false; + final var blend = GLSMBlend.getBlendState(); final boolean lastAlpha = blend.getSrcAlpha() == GL11.GL_ONE && blend.getDstAlpha() == GL11.GL_ZERO && blend.getEquationAlpha() == GL14.GL_FUNC_ADD; final boolean preserveAlpha = blend.getSrcAlpha() == GL11.GL_ZERO && blend.getDstAlpha() == GL11.GL_ONE && (blend.getEquationAlpha() == GL14.GL_FUNC_ADD || blend.getEquationAlpha() == GL14.GL_FUNC_REVERSE_SUBTRACT); if (blend.getSrcRgb() != GL11.GL_SRC_COLOR || blend.getDstRgb() != GL11.GL_ONE || (!lastAlpha && !preserveAlpha && (blend.getSrcAlpha() != GL11.GL_SRC_COLOR || blend.getDstAlpha() != GL11.GL_ONE || blend.getEquationAlpha() != blend.getEquationRgb())) || (blend.getEquationRgb() != GL14.GL_FUNC_ADD && blend.getEquationRgb() != GL14.GL_FUNC_REVERSE_SUBTRACT)) return false; - final var textures = GLStateManager.getTextures(); + final var textures = GLSMTextures.getTextures(); if (!textures.getTextureUnitStates(0).isEnabled() || textures.getTextureUnitBindings(0).getBinding() == 0 || textures.getTexEnvState(0).mode != GL11.GL_MODULATE) return false; if (textures.getTextureUnitStates(1).isEnabled() && textures.getTextureUnitBindings(1).getBinding() != 0 && textures.getTexEnvState(1).mode != GL11.GL_MODULATE) return false; for (int unit = 2; unit < 4; unit++) { @@ -41,7 +47,7 @@ public final class CombinedGlint { relative.set(secondTextureMatrix).mul(inverse); if (!relative.isFinite()) return false; savedMatrix.set(textures.getTextureUnitMatrix(3)); - GLStateManager.setTextureMatrix(3, relative); + GLSMMatrices.setTextureMatrix(3, relative); replaceAlpha = lastAlpha; active = true; return true; @@ -50,6 +56,6 @@ public final class CombinedGlint { public static void end() { if (!active) return; active = false; - GLStateManager.setTextureMatrix(3, savedMatrix); + GLSMMatrices.setTextureMatrix(3, savedMatrix); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CubeInstancedAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CubeInstancedAttribs.java index 65b24c02f..75fa183b5 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CubeInstancedAttribs.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/CubeInstancedAttribs.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.glsm.ffp; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.opengl.GL11; public final class CubeInstancedAttribs { @@ -14,8 +14,8 @@ public final class CubeInstancedAttribs { public static void pointInstanceAttribs(long base) { InstancedAttribs.pointHead(base, STRIDE); - GLStateManager.glVertexAttribPointer(LOC_LIGHTMAP_SCALE, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP_SCALE); - GLStateManager.glVertexAttribPointer(LOC_CUBE_TEX, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_CUBE_TEX); + GLSMVertexInput.glVertexAttribPointer(LOC_LIGHTMAP_SCALE, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP_SCALE); + GLSMVertexInput.glVertexAttribPointer(LOC_CUBE_TEX, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_CUBE_TEX); } static void enableInstanceArrays() { diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLighting.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLighting.java index 3b69aa371..2ad318d6c 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLighting.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLighting.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.ffp; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.states.LightState; import com.gtnewhorizons.angelica.glsm.states.MaterialState; import org.joml.Matrix3f; @@ -20,23 +21,23 @@ public final class FFPVertexLighting { public static boolean modulatesVertexColor(Vector3f destFactor) { destFactor.set(1.0f); - if (!GLStateManager.getLightingState().isEnabled()) return false; - if (!GLStateManager.getColorMaterial().isEnabled()) return false; - if (VertexKey.encodeColorMaterialMode(GLStateManager.getColorMaterialParameter().getValue()) != VertexKey.CM_AMBIENT_AND_DIFFUSE) return false; + if (!GLSMLighting.getLightingState().isEnabled()) return false; + if (!GLSMLighting.getColorMaterial().isEnabled()) return false; + if (VertexKey.encodeColorMaterialMode(GLSMLighting.getColorMaterialParameter().getValue()) != VertexKey.CM_AMBIENT_AND_DIFFUSE) return false; - final MaterialState material = GLStateManager.getFrontMaterial(); + final MaterialState material = GLSMLighting.getFrontMaterial(); if (material.emission.x != 0.0f || material.emission.y != 0.0f || material.emission.z != 0.0f) return false; final boolean materialHasSpecular = material.shininess > 0.0f && (material.specular.x != 0.0f || material.specular.y != 0.0f || material.specular.z != 0.0f); - final Vector4f lightModelAmbient = GLStateManager.getLightModel().ambient; + final Vector4f lightModelAmbient = GLSMLighting.getLightModel().ambient; float r = lightModelAmbient.x; float g = lightModelAmbient.y; float b = lightModelAmbient.z; - final var lightEnables = GLStateManager.getLightStates(); - final var lightData = GLStateManager.getLightDataStates(); + final var lightEnables = GLSMLighting.getLightStates(); + final var lightData = GLSMLighting.getLightDataStates(); boolean normalReady = false; for (int i = 0; i < VertexKey.FFP_LIGHT_COUNT; i++) { @@ -61,12 +62,12 @@ public final class FFPVertexLighting { } private static void transformCurrentNormal() { - GLStateManager.getModelViewMatrix().normal(scratchNormalMat); + GLSMMatrices.getModelViewMatrix().normal(scratchNormalMat); scratchNormal.set(ShaderManager.getCurrentNormal()); scratchNormalMat.transform(scratchNormal); - if (GLStateManager.getNormalizeState().isEnabled()) { + if (GLSMLighting.getNormalizeState().isEnabled()) { scratchNormal.normalize(); - } else if (GLStateManager.getRescaleNormalState().isEnabled()) { + } else if (GLSMLighting.getRescaleNormalState().isEnabled()) { scratchNormal.mul(Uniforms.rescaleFactor(scratchNormalMat, scratchVec)); } } @@ -75,7 +76,7 @@ public final class FFPVertexLighting { if (light.position.w == 0.0f) { scratchLightVec.set(light.position.x, light.position.y, light.position.z); } else { - scratchEyePos.set(0.0f, 0.0f, 0.0f, 1.0f).mul(GLStateManager.getModelViewMatrix()); + scratchEyePos.set(0.0f, 0.0f, 0.0f, 1.0f).mul(GLSMMatrices.getModelViewMatrix()); scratchLightVec.set(light.position.x - scratchEyePos.x, light.position.y - scratchEyePos.y, light.position.z - scratchEyePos.z); } return scratchLightVec.normalize(); diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FfpExtendedAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FfpExtendedAttribs.java index 40d7ed580..660e3ca2a 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FfpExtendedAttribs.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/FfpExtendedAttribs.java @@ -3,6 +3,9 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizon.gtnhlib.client.renderer.cel.api.util.NormI8; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; @@ -213,24 +216,24 @@ public final class FfpExtendedAttribs { final int extVbo = getOrBuild(h, pos, uv, normal, first, count, extPrim, mode); if (extVbo == 0) return false; - final int savedVBO = GLStateManager.getBoundVBO(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); + final int savedVBO = GLSMBuffers.getBoundVBO(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); ImmediateExtendedAttribHandler.setupExtAttribPointers(0L, ImmediateExtendedAttribHandler.EXT_STRIDE); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); return true; } public static void unbind() { - GLStateManager.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_MID_TEX); - GLStateManager.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_TANGENT); + GLSMVertexInput.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_MID_TEX); + GLSMVertexInput.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_TANGENT); setNeutralCurrentValues(); } public static void setNeutralCurrentValues() { BatchStateGuard.suspend(); try { - GLStateManager.glVertexAttrib2f(ImmediateExtendedAttribHandler.LOC_MID_TEX, 0.5f, 0.5f); - GLStateManager.glVertexAttrib4f(ImmediateExtendedAttribHandler.LOC_TANGENT, 1.0f, 0.0f, 0.0f, 1.0f); + GLSMCurrentAttribs.glVertexAttrib2f(ImmediateExtendedAttribHandler.LOC_MID_TEX, 0.5f, 0.5f); + GLSMCurrentAttribs.glVertexAttrib4f(ImmediateExtendedAttribHandler.LOC_TANGENT, 1.0f, 0.0f, 0.0f, 1.0f); } finally { BatchStateGuard.resume(); } @@ -372,22 +375,22 @@ public final class FfpExtendedAttribs { final int newCap = Math.min(MAX_EXT_VERTS, Math.max(neededVerts, buf.capacityVerts * 2)); beginInternalGl(); try { - final int vbo = GLStateManager.glGenBuffers(); + final int vbo = GLSMBuffers.glGenBuffers(); if (vbo == 0) return false; - final int savedVBO = GLStateManager.getBoundVBO(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, (long) newCap * extStride, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); + final int savedVBO = GLSMBuffers.getBoundVBO(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, (long) newCap * extStride, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); if (buf.vbo != 0) { - final int savedRead = GLStateManager.getBoundCopyReadBuffer(); - final int savedWrite = GLStateManager.getBoundCopyWriteBuffer(); - GLStateManager.glBindBuffer(GL31.GL_COPY_READ_BUFFER, buf.vbo); - GLStateManager.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, vbo); - GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0L, 0L, + final int savedRead = GLSMBuffers.getBoundCopyReadBuffer(); + final int savedWrite = GLSMBuffers.getBoundCopyWriteBuffer(); + GLSMBuffers.glBindBuffer(GL31.GL_COPY_READ_BUFFER, buf.vbo); + GLSMBuffers.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, vbo); + GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0L, 0L, (long) buf.capacityVerts * extStride); - GLStateManager.glBindBuffer(GL31.GL_COPY_READ_BUFFER, savedRead); - GLStateManager.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, savedWrite); - GLStateManager.glDeleteBuffers(buf.vbo); + GLSMBuffers.glBindBuffer(GL31.GL_COPY_READ_BUFFER, savedRead); + GLSMBuffers.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, savedWrite); + GLSMBuffers.glDeleteBuffers(buf.vbo); } buf.vbo = vbo; buf.capacityVerts = newCap; @@ -433,11 +436,11 @@ public final class FfpExtendedAttribs { beginInternalGl(); try { - final int savedVBO = GLStateManager.getBoundVBO(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); + final int savedVBO = GLSMBuffers.getBoundVBO(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); ext.position(0).limit(count * extStride); - GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, (long) first * extStride, ext); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); + GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, (long) first * extStride, ext); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); } finally { endInternalGl(); } @@ -454,10 +457,10 @@ public final class FfpExtendedAttribs { final int bytes = (count - 1) * stride + elementBytes; final ByteBuffer dst = memAlloc(bytes).order(ByteOrder.nativeOrder()); dst.position(0).limit(bytes); - final int savedVBO = GLStateManager.getBoundVBO(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId); + final int savedVBO = GLSMBuffers.getBoundVBO(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId); RENDER_BACKEND.getBufferSubData(GL15.GL_ARRAY_BUFFER, a.offset + (long) first * stride, dst); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); dst.position(0).limit(bytes); return dst; } @@ -484,7 +487,7 @@ public final class FfpExtendedAttribs { beginInternalGl(); try { for (int i = 0; i < vbos.size(); i++) { - GLStateManager.glDeleteBuffers(vbos.getInt(i)); + GLSMBuffers.glDeleteBuffers(vbos.getInt(i)); } } finally { endInternalGl(); diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedAttribs.java index 832f1482f..597c1db26 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedAttribs.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedAttribs.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.glsm.ffp; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.opengl.GL11; import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memPutFloat; @@ -68,20 +68,20 @@ public final class InstancedAttribs { public static void pointHead(long base, int stride) { for (int r = 0; r < 3; r++) { - GLStateManager.glVertexAttribPointer(LOC_ROW0 + r, 4, GL11.GL_FLOAT, false, stride, base + OFFSET_ROWS + r * 16L); + GLSMVertexInput.glVertexAttribPointer(LOC_ROW0 + r, 4, GL11.GL_FLOAT, false, stride, base + OFFSET_ROWS + r * 16L); } - GLStateManager.glVertexAttribPointer(LOC_COLOR, 4, GL11.GL_UNSIGNED_BYTE, true, stride, base + OFFSET_COLOR); - GLStateManager.glVertexAttribPointer(LOC_OVERLAY, 4, GL11.GL_UNSIGNED_BYTE, true, stride, base + OFFSET_OVERLAY); + GLSMVertexInput.glVertexAttribPointer(LOC_COLOR, 4, GL11.GL_UNSIGNED_BYTE, true, stride, base + OFFSET_COLOR); + GLSMVertexInput.glVertexAttribPointer(LOC_OVERLAY, 4, GL11.GL_UNSIGNED_BYTE, true, stride, base + OFFSET_OVERLAY); pointEntityIds(LOC_ENTITY, stride, base + OFFSET_ENTITY); } public static void pointEntityIds(int location, int stride, long offset) { - GLStateManager.glVertexAttribPointer(location, 4, GL11.GL_UNSIGNED_SHORT, true, stride, offset); + GLSMVertexInput.glVertexAttribPointer(location, 4, GL11.GL_UNSIGNED_SHORT, true, stride, offset); } public static void pointTemplate(long base) { pointHead(base, STRIDE); - GLStateManager.glVertexAttribPointer(LOC_LIGHTMAP, 2, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP); + GLSMVertexInput.glVertexAttribPointer(LOC_LIGHTMAP, 2, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP); } public static void enableHeadArrays() { @@ -91,8 +91,8 @@ public final class InstancedAttribs { } static void enableInstanced(int loc) { - GLStateManager.glEnableVertexAttribArray(loc); - GLStateManager.glVertexAttribDivisor(loc, 1); + GLSMVertexInput.glEnableVertexAttribArray(loc); + GLSMVertexInput.glVertexAttribDivisor(loc, 1); } private InstancedAttribs() {} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleInstancedAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleInstancedAttribs.java index f3bf10ef1..95f3cc2f3 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleInstancedAttribs.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleInstancedAttribs.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.glsm.ffp; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.opengl.GL11; import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memPutFloat; @@ -20,10 +20,10 @@ public final class ParticleInstancedAttribs { public static final int STRIDE = 48; public static void pointInstanceAttribs(long base) { - GLStateManager.glVertexAttribPointer(LOC_CENTER_HALF, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_CENTER_HALF); - GLStateManager.glVertexAttribPointer(LOC_UV, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_UV); - GLStateManager.glVertexAttribPointer(LOC_COLOR, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, base + OFFSET_COLOR); - GLStateManager.glVertexAttribPointer(LOC_LIGHTMAP, 2, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP); + GLSMVertexInput.glVertexAttribPointer(LOC_CENTER_HALF, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_CENTER_HALF); + GLSMVertexInput.glVertexAttribPointer(LOC_UV, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_UV); + GLSMVertexInput.glVertexAttribPointer(LOC_COLOR, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, base + OFFSET_COLOR); + GLSMVertexInput.glVertexAttribPointer(LOC_LIGHTMAP, 2, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_LIGHTMAP); } static void enableInstanceArrays() { diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleQuadMesh.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleQuadMesh.java index e06d373b9..70c158358 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleQuadMesh.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleQuadMesh.java @@ -3,7 +3,8 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizon.gtnhlib.client.renderer.cel.api.util.NormI8; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; @@ -76,11 +77,11 @@ public final class ParticleQuadMesh { written = true; write(memAddress0(staging), rotX, rotXZ, rotZ, rotYZ, rotXY); - final int savedVBO = GLStateManager.getBoundVBO(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + final int savedVBO = GLSMBuffers.getBoundVBO(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); staging.position(0).limit(VERTEX_COUNT * VERTEX_STRIDE); - GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0L, staging); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); + GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0L, staging); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); } private static void write(long dst, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { @@ -116,13 +117,13 @@ public final class ParticleQuadMesh { } private static void build() { - final int savedVAO = GLStateManager.getBoundVAO(); - final int savedVBO = GLStateManager.getBoundVBO(); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, (long) VERTEX_COUNT * VERTEX_STRIDE, GL15.GL_DYNAMIC_DRAW); + final int savedVAO = GLSMVertexInput.getBoundVAO(); + final int savedVBO = GLSMBuffers.getBoundVBO(); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, (long) VERTEX_COUNT * VERTEX_STRIDE, GL15.GL_DYNAMIC_DRAW); attrib(VertexFormatElement.Usage.POSITION.getAttributeLocation(), 3, GL11.GL_FLOAT, false, OFFSET_OFFSET); attrib(VertexFormatElement.Usage.PRIMARY_UV.getAttributeLocation(), 2, GL11.GL_FLOAT, false, OFFSET_CORNER); @@ -130,25 +131,25 @@ public final class ParticleQuadMesh { ParticleInstancedAttribs.enableInstanceArrays(); - GLStateManager.glBindVertexArray(savedVAO); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); + GLSMVertexInput.glBindVertexArray(savedVAO); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); if (staging == null) staging = memAlloc(VERTEX_COUNT * VERTEX_STRIDE); written = false; } private static void attrib(int loc, int size, int type, boolean normalized, int offset) { - GLStateManager.glEnableVertexAttribArray(loc); - GLStateManager.glVertexAttribPointer(loc, size, type, normalized, VERTEX_STRIDE, offset); + GLSMVertexInput.glEnableVertexAttribArray(loc); + GLSMVertexInput.glVertexAttribPointer(loc, size, type, normalized, VERTEX_STRIDE, offset); } public static void delete() { if (vbo != 0) { - GLStateManager.glDeleteBuffers(vbo); + GLSMBuffers.glDeleteBuffers(vbo); vbo = 0; } if (vao != 0) { - GLStateManager.glDeleteVertexArrays(vao); + GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; } if (staging != null) { diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java index 6934717ff..c6433c045 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Program.java @@ -3,6 +3,7 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.config.SystemProperties; import com.gtnewhorizons.angelica.glsm.CompatShaderTransformer; import com.gtnewhorizons.angelica.glsm.GLDebug; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.backend.RenderBackend; @@ -45,7 +46,7 @@ public class Program { } public void destroy() { - GLStateManager.glDeleteProgram(programId); + GLSMPrograms.glDeleteProgram(programId); } /** @@ -93,7 +94,7 @@ public class Program { backend.uniformBlockBinding(program, blockIndex, FFPUniformBlock.BINDING_POINT); } - final int previousProgram = GLStateManager.getActiveProgram(); + final int previousProgram = GLSMPrograms.getActiveProgram(); backend.useProgram(program); for (int i = 0; i < 4; i++) { if (ffpProgram.locSampler[i] != -1) backend.uniform1i(ffpProgram.locSampler[i], i); diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java index 302574f91..81a306f0c 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/ShaderManager.java @@ -5,6 +5,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; import com.gtnewhorizons.angelica.config.SystemProperties; import com.gtnewhorizons.angelica.glsm.CompatUniformManager; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; @@ -132,14 +133,14 @@ public final class ShaderManager { lastBoundProgramId = -1; currentVertexKeyPacked = Long.MIN_VALUE; currentFKLen = 0; - GLStateManager.forceAttribDefaultsDirty(); + GLSMCurrentAttribs.forceAttribDefaultsDirty(); } public void preDraw(GLContextState glCtx) { GLSMHooks.resolvePendingProgram(); final DeferredBlendHandler bh = GLSMHooks.blendHandler; if (bh != null) bh.flushDeferredBlend(); - GLStateManager.flushEntityIds(glCtx); + GLSMCurrentAttribs.flushEntityIds(glCtx); // Handle FFP & Iris uniforms final int currentProgramId = glCtx.activeProgram; @@ -154,7 +155,7 @@ public final class ShaderManager { final boolean hasNormal = (vertexFlags & VertexFlags.NORMAL_BIT) != 0; final boolean hasTexCoord = (vertexFlags & VertexFlags.TEXTURE_BIT) != 0; final boolean hasLightmap = (vertexFlags & VertexFlags.BRIGHTNESS_BIT) != 0; - GLStateManager.flushDeferredVertexAttribs(glCtx, hasColor, hasNormal, hasTexCoord, hasLightmap); + GLSMCurrentAttribs.flushDeferredVertexAttribs(glCtx, hasColor, hasNormal, hasTexCoord, hasLightmap); if (!active) return; diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java index 6c4040bf0..c50225812 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/Uniforms.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.states.ClipPlaneState; import com.gtnewhorizons.angelica.glsm.states.FogState; @@ -225,7 +226,7 @@ public class Uniforms { ring = new UniformRingBuffer(RING_CAPACITY, FFPUniformBlock.SIZE); } final int offset = ring.writeBlock(staging); - GLStateManager.glBindBufferRange(GL31.GL_UNIFORM_BUFFER, FFPUniformBlock.BINDING_POINT, + GLSMBuffers.glBindBufferRange(GL31.GL_UNIFORM_BUFFER, FFPUniformBlock.BINDING_POINT, ring.getBufferId(), offset, FFPUniformBlock.SIZE); bound = true; blockWrites++; diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/UnitCubeMesh.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/UnitCubeMesh.java index 3b490fd34..acdf200ad 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/UnitCubeMesh.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/UnitCubeMesh.java @@ -3,7 +3,8 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizon.gtnhlib.client.renderer.cel.api.util.NormI8; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; @@ -113,19 +114,19 @@ public final class UnitCubeMesh { } private static void build() { - final int savedVAO = GLStateManager.getBoundVAO(); - final int savedVBO = GLStateManager.getBoundVBO(); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + final int savedVAO = GLSMVertexInput.getBoundVAO(); + final int savedVBO = GLSMBuffers.getBoundVBO(); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); final int bytes = VERTEX_COUNT * VERTEX_STRIDE; final ByteBuffer data = memAlloc(bytes); try { write(memAddress0(data)); data.position(0).limit(bytes); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); } finally { memFree(data); } @@ -139,22 +140,22 @@ public final class UnitCubeMesh { CubeInstancedAttribs.enableInstanceArrays(); - GLStateManager.glBindVertexArray(savedVAO); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); + GLSMVertexInput.glBindVertexArray(savedVAO); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); } private static void attrib(int loc, int size, int type, boolean normalized, int offset) { - GLStateManager.glEnableVertexAttribArray(loc); - GLStateManager.glVertexAttribPointer(loc, size, type, normalized, VERTEX_STRIDE, offset); + GLSMVertexInput.glEnableVertexAttribArray(loc); + GLSMVertexInput.glVertexAttribPointer(loc, size, type, normalized, VERTEX_STRIDE, offset); } public static void delete() { if (vbo != 0) { - GLStateManager.glDeleteBuffers(vbo); + GLSMBuffers.glDeleteBuffers(vbo); vbo = 0; } if (vao != 0) { - GLStateManager.glDeleteVertexArrays(vao); + GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VAOManager.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VAOManager.java index 888ba4430..a6e4f34f1 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VAOManager.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VAOManager.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.GLTypes; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; @@ -630,8 +631,8 @@ public final class VAOManager { clientArraysVBO = RENDER_BACKEND.genBuffers(); } - final int savedVBO = GLStateManager.getBoundVBO(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, clientArraysVBO); + final int savedVBO = GLSMBuffers.getBoundVBO(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, clientArraysVBO); if (totalBytes > clientArraysVBOCapacity) { int newCap = Math.max(4096, clientArraysVBOCapacity); @@ -651,7 +652,7 @@ public final class VAOManager { } } - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, savedVBO); } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java index 6e0c6c0d4..6d72ef2ce 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKey.java @@ -3,6 +3,8 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizon.gtnhlib.client.renderer.MatrixHelper; import com.gtnewhorizons.angelica.glsm.DisplayListManager; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.states.TexGenState; import com.gtnewhorizons.angelica.glsm.states.TextureUnitArray; @@ -230,11 +232,11 @@ public final class VertexKey { if (hasTexCoord) bits |= (1L << BIT_HAS_VERTEX_TEX); if (hasLightmap) bits |= (1L << BIT_HAS_VERTEX_LIGHTMAP); - if (GLStateManager.consumeUnit23TexCoordSetDuringDraw(glCtx) && hasTexCoord) { + if (GLSMCurrentAttribs.consumeUnit23TexCoordSetDuringDraw(glCtx) && hasTexCoord) { bits |= (1L << BIT_UNIT23_UV_FROM_UNIT0); } - if (GLStateManager.anyClipPlaneEnabled(glCtx)) { + if (GLSMRasterizer.anyClipPlaneEnabled(glCtx)) { bits |= (1L << BIT_CLIP_PLANES); } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherInstancedAttribs.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherInstancedAttribs.java index bf89b8ea5..ddf453778 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherInstancedAttribs.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherInstancedAttribs.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.glsm.ffp; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.opengl.GL11; @@ -19,9 +19,9 @@ public final class WeatherInstancedAttribs { public static final int STRIDE = 48; public static void pointInstanceAttribs(long base) { - GLStateManager.glVertexAttribPointer(LOC_COLUMN_SPAN, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_COLUMN_SPAN); - GLStateManager.glVertexAttribPointer(LOC_JITTER, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_JITTER); - GLStateManager.glVertexAttribPointer(LOC_PARAMS, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_PARAMS); + GLSMVertexInput.glVertexAttribPointer(LOC_COLUMN_SPAN, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_COLUMN_SPAN); + GLSMVertexInput.glVertexAttribPointer(LOC_JITTER, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_JITTER); + GLSMVertexInput.glVertexAttribPointer(LOC_PARAMS, 4, GL11.GL_FLOAT, false, STRIDE, base + OFFSET_PARAMS); } static void enableInstanceArrays() { diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherQuadMesh.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherQuadMesh.java index 1da961984..de715ff75 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherQuadMesh.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/ffp/WeatherQuadMesh.java @@ -2,7 +2,8 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; @@ -32,37 +33,37 @@ public final class WeatherQuadMesh { for (float corner : CORNERS) data.putFloat(corner); data.flip(); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); final int corner = VertexFormatElement.Usage.PRIMARY_UV.getAttributeLocation(); - GLStateManager.glEnableVertexAttribArray(corner); - GLStateManager.glVertexAttribPointer(corner, 2, GL11.GL_FLOAT, false, 2 * Float.BYTES, 0L); + GLSMVertexInput.glEnableVertexAttribArray(corner); + GLSMVertexInput.glVertexAttribPointer(corner, 2, GL11.GL_FLOAT, false, 2 * Float.BYTES, 0L); WeatherInstancedAttribs.enableInstanceArrays(); - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); return vao; } public static void bindInstanceBuffer(int bufferId) { - GLStateManager.glBindVertexArray(vao()); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId); + GLSMVertexInput.glBindVertexArray(vao()); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId); WeatherInstancedAttribs.pointInstanceAttribs(0L); - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } public static void delete() { if (vbo != 0) { - GLStateManager.glDeleteBuffers(vbo); + GLSMBuffers.glDeleteBuffers(vbo); vbo = 0; } if (vao != 0) { - GLStateManager.glDeleteVertexArrays(vao); + GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/FrameHooks.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/FrameHooks.java index 69e8e6e47..3266b7a20 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/FrameHooks.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/FrameHooks.java @@ -3,6 +3,7 @@ package com.gtnewhorizons.angelica.glsm.hooks; import com.gtnewhorizons.angelica.glsm.CaptureGate; import com.gtnewhorizons.angelica.glsm.DisplayListManager; import com.gtnewhorizons.angelica.glsm.GLDebug; +import com.gtnewhorizons.angelica.glsm.GLSMTextureLifetime; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; @@ -26,7 +27,7 @@ public final class FrameHooks { } public static void frameEnd() { - GLStateManager.onFrameEnd(); + GLSMTextureLifetime.onFrameEnd(); popFrameGroup(); RENDER_BACKEND.onFrameEnd(); } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/ImmediateExtendedAttribHandler.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/ImmediateExtendedAttribHandler.java index 427e8cd6b..06b60ff87 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/ImmediateExtendedAttribHandler.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/ImmediateExtendedAttribHandler.java @@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.glsm.hooks; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs; import org.lwjgl.opengl.GL11; @@ -65,14 +65,14 @@ public interface ImmediateExtendedAttribHandler { } static void setupExtAttribPointers(long baseOffset, int stride) { - GLStateManager.glEnableVertexAttribArray(LOC_MID_TEX); - GLStateManager.glVertexAttribPointer(LOC_MID_TEX, 2, GL11.GL_FLOAT, false, stride, baseOffset); - GLStateManager.glEnableVertexAttribArray(LOC_TANGENT); - GLStateManager.glVertexAttribPointer(LOC_TANGENT, 4, GL11.GL_BYTE, true, stride, baseOffset + 8); + GLSMVertexInput.glEnableVertexAttribArray(LOC_MID_TEX); + GLSMVertexInput.glVertexAttribPointer(LOC_MID_TEX, 2, GL11.GL_FLOAT, false, stride, baseOffset); + GLSMVertexInput.glEnableVertexAttribArray(LOC_TANGENT); + GLSMVertexInput.glVertexAttribPointer(LOC_TANGENT, 4, GL11.GL_BYTE, true, stride, baseOffset + 8); } static void setupEntityIdsPointer(long offset, int stride) { - GLStateManager.glEnableVertexAttribArray(LOC_ENTITY_IDS); + GLSMVertexInput.glEnableVertexAttribArray(LOC_ENTITY_IDS); InstancedAttribs.pointEntityIds(LOC_ENTITY_IDS, stride, offset); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/TextureUtilHooks.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/TextureUtilHooks.java index 51b632a35..f70f3877f 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/TextureUtilHooks.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/hooks/TextureUtilHooks.java @@ -2,6 +2,7 @@ package com.gtnewhorizons.angelica.glsm.hooks; import com.gtnewhorizons.angelica.glsm.DisplayListManager; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; @@ -26,12 +27,12 @@ public final class TextureUtilHooks { private TextureUtilHooks() {} public static void setMaxLevel(int mipmapLevels) { - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, mipmapLevels); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, mipmapLevels); } public static void captureBoundFilterTexture() { final GLContextState ctx = GLStateManager.ctx(); - final int id = GLStateManager.getBoundTextureForServerState(); + final int id = GLSMTextures.getBoundTextureForServerState(); ctx.savedFilterTextureId = id; final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(id); if (info != null) { @@ -78,8 +79,8 @@ public final class TextureUtilHooks { RenderSystem.texParameteri(id, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, min); RenderSystem.texParameteri(id, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag); } else { - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, min); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, min); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag); } } @@ -88,7 +89,7 @@ public final class TextureUtilHooks { if (id != 0 && DisplayListManager.getRecordMode() == DisplayListManager.RecordMode.NONE) { RenderSystem.texParameterf(id, GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); } else { - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); } } @@ -116,7 +117,7 @@ public final class TextureUtilHooks { /** TextureUtil.func_152777_a(false, false, 1) without using vanilla's single save slot, which the caller may hold. */ public static void forceNearestFilter() { - final int id = GLStateManager.getBoundTextureForServerState(); + final int id = GLSMTextures.getBoundTextureForServerState(); final TextureInfo info = id != 0 ? TextureInfoCache.INSTANCE.getInfo(id) : null; if (info == null) { nearestTexture = 0; @@ -143,9 +144,9 @@ public final class TextureUtilHooks { RenderSystem.texParameteri(id, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag); if (anisotropic) RenderSystem.texParameterf(id, GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); } else { - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, min); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag); - if (anisotropic) GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, min); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, mag); + if (anisotropic) GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); } } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/loading/ModRedirector.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/loading/ModRedirector.java index 076e94f90..65e9a6df9 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/loading/ModRedirector.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/loading/ModRedirector.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.loading; import com.gtnewhorizons.angelica.glsm.redirect.GLSMRedirector; +import com.gtnewhorizons.angelica.glsm.redirect.LegacyRewriter; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.tree.ClassNode; @@ -30,6 +31,14 @@ public class ModRedirector { this.allExclusions = exclusions.toArray(new String[0]); } + public void setLegacyHint(String hint) { + core.setLegacyHint(hint); + } + + public void setLegacyRewriter(LegacyRewriter rewriter) { + core.setLegacyRewriter(rewriter); + } + public ClassDump getDump() { return dump; } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AttribSnapshot.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AttribSnapshot.java index 039cc2f41..a3e3ba821 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AttribSnapshot.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/AttribSnapshot.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.recording; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.GLTypes; import com.gtnewhorizons.angelica.glsm.ffp.VAOManager; @@ -67,7 +68,7 @@ public final class AttribSnapshot { public static AttribSnapshot snapshot(int firstVertex, int vertexCount) { final AttribDesc[] out = new AttribDesc[VAOManager.MAX_ATTRIBS]; final List allocated = new ArrayList<>(); - final int prevVBO = GLStateManager.getBoundVBO(); + final int prevVBO = GLSMBuffers.getBoundVBO(); final VAOManager vaos = GLStateManager.ctx().vaos; boolean success = false; @@ -133,8 +134,8 @@ public final class AttribSnapshot { } if (buf == null) { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId); - final int bufferSize = GLStateManager.glGetBufferParameteri(GL15.GL_ARRAY_BUFFER, GL15.GL_BUFFER_SIZE); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, a.vboId); + final int bufferSize = GLSMBuffers.glGetBufferParameteri(GL15.GL_ARRAY_BUFFER, GL15.GL_BUFFER_SIZE); if (bufferSize <= 0) { warnOnce("vbo-orphaned", "[AttribSnapshot] GL_BUFFER_SIZE={} for VBO {} -- skipping capture", bufferSize, a.vboId); return null; @@ -162,7 +163,7 @@ public final class AttribSnapshot { } buf = MemoryUtilities.memAlloc(rs); - GLStateManager.glGetBufferSubData(GL15.GL_ARRAY_BUFFER, ro, buf); + GLSMBuffers.glGetBufferSubData(GL15.GL_ARRAY_BUFFER, ro, buf); allocated.add(buf); readOffset = ro; @@ -190,7 +191,7 @@ public final class AttribSnapshot { success = true; return new AttribSnapshot(out, allocated); } finally { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO); if (!success) { for (ByteBuffer b : allocated) MemoryUtilities.memFree(b); } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java index 139bfc4ee..9e2080f53 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CommandBufferExecutor.java @@ -2,7 +2,20 @@ package com.gtnewhorizons.angelica.glsm.recording; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; import com.gtnewhorizons.angelica.glsm.DisplayListManager; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.recording.commands.DisplayListCommand; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL15; @@ -57,77 +70,77 @@ public final class CommandBufferExecutor { switch (cmd) { // === Single int commands === case GLCommand.ENABLE -> { - GLStateManager.glEnable(memGetInt(ptr)); + GLSMEnable.glEnable(memGetInt(ptr)); ptr += 4; } case GLCommand.DISABLE -> { - GLStateManager.glDisable(memGetInt(ptr)); + GLSMEnable.glDisable(memGetInt(ptr)); ptr += 4; } case GLCommand.CLEAR -> { - GLStateManager.glClear(memGetInt(ptr)); + GLSMFramebuffer.glClear(memGetInt(ptr)); ptr += 4; } case GLCommand.CLEAR_STENCIL -> { - GLStateManager.glClearStencil(memGetInt(ptr)); + GLSMDepthStencilAlpha.glClearStencil(memGetInt(ptr)); ptr += 4; } case GLCommand.CULL_FACE -> { - GLStateManager.glCullFace(memGetInt(ptr)); + GLSMRasterizer.glCullFace(memGetInt(ptr)); ptr += 4; } case GLCommand.DEPTH_FUNC -> { - GLStateManager.glDepthFunc(memGetInt(ptr)); + GLSMDepthStencilAlpha.glDepthFunc(memGetInt(ptr)); ptr += 4; } case GLCommand.SHADE_MODEL -> { - GLStateManager.glShadeModel(memGetInt(ptr)); + GLSMRasterizer.glShadeModel(memGetInt(ptr)); ptr += 4; } case GLCommand.LOGIC_OP -> { - GLStateManager.glLogicOp(memGetInt(ptr)); + GLSMBlend.glLogicOp(memGetInt(ptr)); ptr += 4; } case GLCommand.MATRIX_MODE -> { - GLStateManager.glMatrixMode(memGetInt(ptr)); + GLSMMatrices.glMatrixMode(memGetInt(ptr)); ptr += 4; } case GLCommand.ACTIVE_TEXTURE -> { - GLStateManager.glActiveTexture(memGetInt(ptr)); + GLSMTextures.glActiveTexture(memGetInt(ptr)); ptr += 4; } case GLCommand.USE_PROGRAM -> { final int recordedProgram = memGetInt(ptr); - GLStateManager.glUseProgram(compiledDisplayList.resolveProgram(recordedProgram)); + GLSMPrograms.glUseProgram(compiledDisplayList.resolveProgram(recordedProgram)); ptr += 4; } case GLCommand.PUSH_ATTRIB -> { - GLStateManager.glPushAttrib(memGetInt(ptr)); + GLSMAttribStack.glPushAttrib(memGetInt(ptr)); ptr += 4; } case GLCommand.POP_ATTRIB -> { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); ptr += 4; // Skip unused padding } case GLCommand.LOAD_IDENTITY -> { - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); } case GLCommand.PUSH_MATRIX -> { - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); } case GLCommand.POP_MATRIX -> { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } case GLCommand.STENCIL_MASK -> { - GLStateManager.glStencilMask(memGetInt(ptr)); + GLSMDepthStencilAlpha.glStencilMask(memGetInt(ptr)); ptr += 4; } case GLCommand.DEPTH_MASK -> { - GLStateManager.glDepthMask(memGetInt(ptr) != 0); + GLSMDepthStencilAlpha.glDepthMask(memGetInt(ptr) != 0); ptr += 4; } case GLCommand.FRONT_FACE -> { - GLStateManager.glFrontFace(memGetInt(ptr)); + GLSMRasterizer.glFrontFace(memGetInt(ptr)); ptr += 4; } @@ -136,43 +149,43 @@ public final class CommandBufferExecutor { final int target = memGetInt(ptr); final int texture = memGetInt(ptr + 4); ptr += 8; - GLStateManager.glBindTexture(target, texture); + GLSMTextures.glBindTexture(target, texture); } case GLCommand.POLYGON_MODE -> { final int face = memGetInt(ptr); final int mode = memGetInt(ptr + 4); ptr += 8; - GLStateManager.glPolygonMode(face, mode); + GLSMRasterizer.glPolygonMode(face, mode); } case GLCommand.COLOR_MATERIAL -> { final int face = memGetInt(ptr); final int mode = memGetInt(ptr + 4); ptr += 8; - GLStateManager.glColorMaterial(face, mode); + GLSMLighting.glColorMaterial(face, mode); } case GLCommand.LINE_STIPPLE -> { final int factor = memGetInt(ptr); final int pattern = memGetInt(ptr + 4); ptr += 8; - GLStateManager.glLineStipple(factor, (short) pattern); + GLSMRasterizer.glLineStipple(factor, (short) pattern); } case GLCommand.STENCIL_MASK_SEPARATE -> { final int face = memGetInt(ptr); final int mask = memGetInt(ptr + 4); ptr += 8; - GLStateManager.glStencilMaskSeparate(face, mask); + GLSMDepthStencilAlpha.glStencilMaskSeparate(face, mask); } case GLCommand.FOGI -> { final int pname = memGetInt(ptr); final int param = memGetInt(ptr + 4); ptr += 8; - GLStateManager.glFogi(pname, param); + GLSMFog.glFogi(pname, param); } case GLCommand.HINT -> { final int target = memGetInt(ptr); final int mode = memGetInt(ptr + 4); ptr += 8; - GLStateManager.glHint(target, mode); + GLSMRasterizer.glHint(target, mode); } // === Three int commands === @@ -181,21 +194,21 @@ public final class CommandBufferExecutor { final int ref = memGetInt(ptr + 4); final int mask = memGetInt(ptr + 8); ptr += 12; - GLStateManager.glStencilFunc(func, ref, mask); + GLSMDepthStencilAlpha.glStencilFunc(func, ref, mask); } case GLCommand.STENCIL_OP -> { final int fail = memGetInt(ptr); final int zfail = memGetInt(ptr + 4); final int zpass = memGetInt(ptr + 8); ptr += 12; - GLStateManager.glStencilOp(fail, zfail, zpass); + GLSMDepthStencilAlpha.glStencilOp(fail, zfail, zpass); } case GLCommand.TEX_PARAMETERI -> { final int target = memGetInt(ptr); final int pname = memGetInt(ptr + 4); final int param = memGetInt(ptr + 8); ptr += 12; - GLStateManager.glTexParameteri(target, pname, param); + GLSMTextures.glTexParameteri(target, pname, param); } // === Four int commands === @@ -205,7 +218,7 @@ public final class CommandBufferExecutor { final int width = memGetInt(ptr + 8); final int height = memGetInt(ptr + 12); ptr += 16; - GLStateManager.glViewport(x, y, width, height); + GLSMRasterizer.glViewport(x, y, width, height); } case GLCommand.SCISSOR -> { final int x = memGetInt(ptr); @@ -213,7 +226,7 @@ public final class CommandBufferExecutor { final int width = memGetInt(ptr + 8); final int height = memGetInt(ptr + 12); ptr += 16; - GLStateManager.glScissor(x, y, width, height); + GLSMRasterizer.glScissor(x, y, width, height); } case GLCommand.BLEND_FUNC -> { final int srcRgb = memGetInt(ptr); @@ -222,9 +235,9 @@ public final class CommandBufferExecutor { final int dstAlpha = memGetInt(ptr + 12); ptr += 16; if (srcRgb == srcAlpha && dstRgb == dstAlpha) { - GLStateManager.glBlendFunc(srcRgb, dstRgb); + GLSMBlend.glBlendFunc(srcRgb, dstRgb); } else { - GLStateManager.tryBlendFuncSeparate(srcRgb, dstRgb, srcAlpha, dstAlpha); + GLSMBlend.tryBlendFuncSeparate(srcRgb, dstRgb, srcAlpha, dstAlpha); } } case GLCommand.COLOR_MASK -> { @@ -233,7 +246,7 @@ public final class CommandBufferExecutor { final boolean b = memGetInt(ptr + 8) != 0; final boolean a = memGetInt(ptr + 12) != 0; ptr += 16; - GLStateManager.glColorMask(r, g, b, a); + GLSMBlend.glColorMask(r, g, b, a); } case GLCommand.STENCIL_FUNC_SEPARATE -> { final int face = memGetInt(ptr); @@ -241,7 +254,7 @@ public final class CommandBufferExecutor { final int ref = memGetInt(ptr + 8); final int mask = memGetInt(ptr + 12); ptr += 16; - GLStateManager.glStencilFuncSeparate(face, func, ref, mask); + GLSMDepthStencilAlpha.glStencilFuncSeparate(face, func, ref, mask); } case GLCommand.STENCIL_OP_SEPARATE -> { final int face = memGetInt(ptr); @@ -249,28 +262,28 @@ public final class CommandBufferExecutor { final int dpfail = memGetInt(ptr + 8); final int dppass = memGetInt(ptr + 12); ptr += 16; - GLStateManager.glStencilOpSeparate(face, sfail, dpfail, dppass); + GLSMDepthStencilAlpha.glStencilOpSeparate(face, sfail, dpfail, dppass); } // === Float commands === case GLCommand.VERTEX_ATTRIB -> { - GLStateManager.glVertexAttrib4f(memGetInt(ptr), memGetFloat(ptr + 4), memGetFloat(ptr + 8), + GLSMCurrentAttribs.glVertexAttrib4f(memGetInt(ptr), memGetFloat(ptr + 4), memGetFloat(ptr + 8), memGetFloat(ptr + 12), memGetFloat(ptr + 16)); ptr += 20; } case GLCommand.POINT_SIZE -> { - GLStateManager.glPointSize(memGetFloat(ptr)); + GLSMRasterizer.glPointSize(memGetFloat(ptr)); ptr += 4; } case GLCommand.LINE_WIDTH -> { - GLStateManager.glLineWidth(memGetFloat(ptr)); + GLSMRasterizer.glLineWidth(memGetFloat(ptr)); ptr += 4; } case GLCommand.POLYGON_OFFSET -> { final float factor = memGetFloat(ptr); final float units = memGetFloat(ptr + 4); ptr += 8; - GLStateManager.glPolygonOffset(factor, units); + GLSMRasterizer.glPolygonOffset(factor, units); } case GLCommand.COLOR -> { final float r = memGetFloat(ptr); @@ -278,14 +291,14 @@ public final class CommandBufferExecutor { final float b = memGetFloat(ptr + 8); final float a = memGetFloat(ptr + 12); ptr += 16; - GLStateManager.glColor4f(r, g, b, a); + GLSMCurrentAttribs.glColor4f(r, g, b, a); } case GLCommand.SECONDARY_COLOR -> { final float r = memGetFloat(ptr); final float g = memGetFloat(ptr + 4); final float b = memGetFloat(ptr + 8); ptr += 12; - GLStateManager.glSecondaryColor3f(r, g, b); + GLSMCurrentAttribs.glSecondaryColor3f(r, g, b); } case GLCommand.CLEAR_COLOR -> { final float r = memGetFloat(ptr); @@ -293,12 +306,12 @@ public final class CommandBufferExecutor { final float b = memGetFloat(ptr + 8); final float a = memGetFloat(ptr + 12); ptr += 16; - GLStateManager.glClearColor(r, g, b, a); + GLSMBlend.glClearColor(r, g, b, a); } case GLCommand.CLEAR_DEPTH -> { final double depth = memGetDouble(ptr); ptr += 8; - GLStateManager.glClearDepth(depth); + GLSMDepthStencilAlpha.glClearDepth(depth); } case GLCommand.BLEND_COLOR -> { final float r = memGetFloat(ptr); @@ -306,7 +319,7 @@ public final class CommandBufferExecutor { final float b = memGetFloat(ptr + 8); final float a = memGetFloat(ptr + 12); ptr += 16; - GLStateManager.glBlendColor(r, g, b, a); + GLSMBlend.glBlendColor(r, g, b, a); } // === Mixed int+float commands === @@ -314,53 +327,53 @@ public final class CommandBufferExecutor { final int func = memGetInt(ptr); final float ref = memGetFloat(ptr + 4); ptr += 8; - GLStateManager.glAlphaFunc(func, ref); + GLSMDepthStencilAlpha.glAlphaFunc(func, ref); } case GLCommand.FOGF -> { final int pname = memGetInt(ptr); final float param = memGetFloat(ptr + 4); ptr += 8; - GLStateManager.glFogf(pname, param); + GLSMFog.glFogf(pname, param); } case GLCommand.LIGHTF -> { final int light = memGetInt(ptr); final int pname = memGetInt(ptr + 4); final float param = memGetFloat(ptr + 8); ptr += 12; - GLStateManager.glLightf(light, pname, param); + GLSMLighting.glLightf(light, pname, param); } case GLCommand.LIGHT_MODELF -> { final int pname = memGetInt(ptr); final float param = memGetFloat(ptr + 4); ptr += 8; - GLStateManager.glLightModelf(pname, param); + GLSMLighting.glLightModelf(pname, param); } case GLCommand.LIGHTI -> { final int light = memGetInt(ptr); final int pname = memGetInt(ptr + 4); final int param = memGetInt(ptr + 8); ptr += 12; - GLStateManager.glLighti(light, pname, param); + GLSMLighting.glLighti(light, pname, param); } case GLCommand.LIGHT_MODELI -> { final int pname = memGetInt(ptr); final int param = memGetInt(ptr + 4); ptr += 8; - GLStateManager.glLightModeli(pname, param); + GLSMLighting.glLightModeli(pname, param); } case GLCommand.MATERIALF -> { final int face = memGetInt(ptr); final int pname = memGetInt(ptr + 4); final float param = memGetFloat(ptr + 8); ptr += 12; - GLStateManager.glMaterialf(face, pname, param); + GLSMLighting.glMaterialf(face, pname, param); } case GLCommand.TEX_PARAMETERF -> { final int target = memGetInt(ptr); final int pname = memGetInt(ptr + 4); final float param = memGetFloat(ptr + 8); ptr += 12; - GLStateManager.glTexParameterf(target, pname, param); + GLSMTextures.glTexParameterf(target, pname, param); } // === Matrix commands === @@ -372,21 +385,21 @@ public final class CommandBufferExecutor { ptr += 4; } MATRIX_BUFFER.flip(); - GLStateManager.glMultMatrix(MATRIX_BUFFER); + GLSMMatrices.glMultMatrix(MATRIX_BUFFER); } case GLCommand.TRANSLATE -> { final float x = memGetFloat(ptr); final float y = memGetFloat(ptr + 4); final float z = memGetFloat(ptr + 8); ptr += 12; - GLStateManager.glTranslatef(x, y, z); + GLSMMatrices.glTranslatef(x, y, z); } case GLCommand.SCALE -> { final float x = memGetFloat(ptr); final float y = memGetFloat(ptr + 4); final float z = memGetFloat(ptr + 8); ptr += 12; - GLStateManager.glScalef(x, y, z); + GLSMMatrices.glScalef(x, y, z); } case GLCommand.LOAD_MATRIX -> { MATRIX_BUFFER.clear(); @@ -395,7 +408,7 @@ public final class CommandBufferExecutor { ptr += 4; } MATRIX_BUFFER.flip(); - GLStateManager.glLoadMatrix(MATRIX_BUFFER); + GLSMMatrices.glLoadMatrix(MATRIX_BUFFER); } // === Buffer commands === @@ -409,7 +422,7 @@ public final class CommandBufferExecutor { ptr += 4; } PARAMS_BUFFER.flip(); - GLStateManager.glFog(pname, PARAMS_BUFFER); + GLSMFog.glFog(pname, PARAMS_BUFFER); } case GLCommand.LIGHT -> { final int light = memGetInt(ptr); @@ -422,7 +435,7 @@ public final class CommandBufferExecutor { ptr += 4; } PARAMS_BUFFER.flip(); - GLStateManager.glLight(light, pname, PARAMS_BUFFER); + GLSMLighting.glLight(light, pname, PARAMS_BUFFER); } case GLCommand.LIGHT_MODEL -> { final int pname = memGetInt(ptr); @@ -434,7 +447,7 @@ public final class CommandBufferExecutor { ptr += 4; } PARAMS_BUFFER.flip(); - GLStateManager.glLightModel(pname, PARAMS_BUFFER); + GLSMLighting.glLightModel(pname, PARAMS_BUFFER); } case GLCommand.MATERIAL -> { final int face = memGetInt(ptr); @@ -447,7 +460,7 @@ public final class CommandBufferExecutor { ptr += 4; } PARAMS_BUFFER.flip(); - GLStateManager.glMaterial(face, pname, PARAMS_BUFFER); + GLSMLighting.glMaterial(face, pname, PARAMS_BUFFER); } case GLCommand.CLIP_PLANE -> { @@ -460,7 +473,7 @@ public final class CommandBufferExecutor { PARAMS_DOUBLE_BUFFER.clear(); PARAMS_DOUBLE_BUFFER.put(a).put(b).put(c).put(d); PARAMS_DOUBLE_BUFFER.flip(); - GLStateManager.glClipPlane(plane, PARAMS_DOUBLE_BUFFER); + GLSMRasterizer.glClipPlane(plane, PARAMS_DOUBLE_BUFFER); } // === Draw commands === @@ -484,19 +497,19 @@ public final class CommandBufferExecutor { final byte b = (byte) ((color >> 16) & 0xFF); final byte g = (byte) ((color >> 8) & 0xFF); final byte r = (byte) ((color & 0xFF)); - GLStateManager.glColor4ub(r, g, b, a); + GLSMCurrentAttribs.glColor4ub(r, g, b, a); } if ((flags & VertexFlags.NORMAL_BIT) != 0) { final int normal = memGetInt(ptr + 12); float nx = (byte)(normal) / 127.0f; float ny = (byte)(normal >> 8) / 127.0f; float nz = (byte)(normal >> 16) / 127.0f; - GLStateManager.glNormal3f(nx, ny, nz); + GLSMCurrentAttribs.glNormal3f(nx, ny, nz); } if ((flags & VertexFlags.TEXTURE_BIT) != 0) { final float s = memGetFloat(ptr + 16); final float t = memGetFloat(ptr + 20); - GLStateManager.glTexCoord2f(s, t); + GLSMCurrentAttribs.glTexCoord2f(s, t); } ptr += 24; // Skip full command size (28 - 4 for cmd already read) } @@ -506,7 +519,7 @@ public final class CommandBufferExecutor { DisplayListManager.glCallList(listId); } case GLCommand.DRAW_BUFFER -> { - GLStateManager.glDrawBuffer(memGetInt(ptr)); + GLSMFramebuffer.glDrawBuffer(memGetInt(ptr)); ptr += 4; } case GLCommand.DRAW_BUFFERS -> { @@ -518,16 +531,16 @@ public final class CommandBufferExecutor { } DRAW_BUFFERS_BUFFER.flip(); ptr += 4 * MAX_DRAW_BUFFERS; - GLStateManager.glDrawBuffers(DRAW_BUFFERS_BUFFER); + GLSMFramebuffer.glDrawBuffers(DRAW_BUFFERS_BUFFER); } case GLCommand.BIND_VBO -> { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, memGetInt(ptr)); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, memGetInt(ptr)); ptr += 4; } case GLCommand.BIND_VAO -> { final int vao = memGetInt(ptr); ptr += 4; - if (compiledDisplayList.replaysVertexArrayBind(vao)) GLStateManager.glBindVertexArray(vao); + if (compiledDisplayList.replaysVertexArrayBind(vao)) GLSMVertexInput.glBindVertexArray(vao); } // === Complex object reference === diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java index a09ec7c3c..fc4f3498a 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/CompiledDisplayList.java @@ -2,6 +2,7 @@ package com.gtnewhorizons.angelica.glsm.recording; import com.gtnewhorizons.angelica.glsm.DisplayListManager; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.recording.commands.DisplayListCommand; import com.gtnewhorizons.angelica.glsm.recording.commands.IndexedDrawBatch; @@ -43,15 +44,15 @@ public final class CompiledDisplayList { int resolveProgram(int program) { if (program == 0) return 0; - final long generation = GLStateManager.getProgramLifetimeGeneration(); + final long generation = GLSMPrograms.getProgramLifetimeGeneration(); if (replayPrograms == null) replayPrograms = new Int2IntOpenHashMap(); if (programLifetimeGeneration != generation) { replayPrograms.clear(); programLifetimeGeneration = generation; } if (replayPrograms.containsKey(program)) return replayPrograms.get(program); - final boolean valid = GLStateManager.glIsProgram(program); - if (!valid || !GLStateManager.isProgramPendingDeletion(program)) { + final boolean valid = GLSMPrograms.glIsProgram(program); + if (!valid || !GLSMPrograms.isProgramPendingDeletion(program)) { replayPrograms.put(program, valid ? program : 0); } return valid ? program : 0; diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java index 177c00cb8..833acf891 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBO.java @@ -1,7 +1,8 @@ package com.gtnewhorizons.angelica.glsm.recording; import com.gtnewhorizon.gtnhlib.client.renderer.vao.IVertexArrayObject; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; import com.gtnewhorizons.angelica.glsm.streaming.LineQuads; import org.lwjgl.opengl.GL11; @@ -32,7 +33,7 @@ public final class DisplayListVBO { } if (extVbos != null) { for (int extVbo : extVbos) { - if (extVbo != 0) GLStateManager.glDeleteBuffers(extVbo); + if (extVbo != 0) GLSMBuffers.glDeleteBuffers(extVbo); } } } @@ -98,15 +99,15 @@ public final class DisplayListVBO { public void render() { if (vao == null) return; - if (lineQuads != null && GLStateManager.ffpWidensLineQuads()) { + if (lineQuads != null && GLSMDraws.ffpWidensLineQuads()) { renderLineQuads(); return; } vao.bind(); if (pendingExtVbo != 0) { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, pendingExtVbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, pendingExtVbo); ImmediateExtendedAttribHandler.setupExtAttribPointers(0L, ImmediateExtendedAttribHandler.EXT_STRIDE); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); pendingExtVbo = 0; } if (count <= 0) { vao.unbind(); return; } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java index e80c6c0e5..b1fbe3cb4 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/DisplayListVBOBuilder.java @@ -9,6 +9,8 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vbo.IVertexBuffer; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; @@ -80,7 +82,7 @@ public final class DisplayListVBOBuilder { final IntArrayList extCounts = wantExt ? new IntArrayList() : null; final IntArrayList extPrims = wantExt ? new IntArrayList() : null; // drawIndex, start, vertexCount, drawMode for each line draw - final IntArrayList lineDraws = GLStateManager.wideLineEmulationEnabled ? new IntArrayList() : null; + final IntArrayList lineDraws = GLSMRasterizer.wideLineEmulationEnabled ? new IntArrayList() : null; for (FormatData data : formatData) { int vertexCount; @@ -212,11 +214,11 @@ public final class DisplayListVBOBuilder { extAddr + (long) rStart * extStride, extStride); } - final int extVbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); + final int extVbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); ext.position(0).limit(extVerts * extStride); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); memFree(ext); return extVbo; } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java index 3d6c36ddf..29db92159 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/ImmediateModeRecorder.java @@ -4,6 +4,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.CallbackTessellator; import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator; import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement.Usage; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.GLTypes; import com.gtnewhorizons.angelica.glsm.QuadConverter; @@ -77,7 +78,7 @@ public final class ImmediateModeRecorder { /** * Set the current lightmap coordinate as packed brightness. - * Called by GLStateManager.glMultiTexCoord2f for unit 1 during recording/drawing. + * Called by GLSMCurrentAttribs.glMultiTexCoord2f for unit 1 during recording/drawing. */ public static void setLightmapCoord(float s, float t) { tessellator().setBrightness(((int) t << 16) | ((int) s & 0xFFFF)); @@ -119,7 +120,7 @@ public final class ImmediateModeRecorder { final DirectTessellator t = tessellator(); t.reset(); t.startDrawing(primitiveType); - final var c = GLStateManager.getColor(); + final var c = GLSMCurrentAttribs.getColor(); t.setColorRGBA((int) (c.getRed() * 255.0f), (int) (c.getGreen() * 255.0f), (int) (c.getBlue() * 255.0f), (int) (c.getAlpha() * 255.0f)); } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/BatchedIndexedDrawCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/BatchedIndexedDrawCmd.java index 8e571492c..0bc998ce3 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/BatchedIndexedDrawCmd.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/BatchedIndexedDrawCmd.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.glsm.recording.commands; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; public final class BatchedIndexedDrawCmd implements DisplayListCommand { private IndexedDrawBatch batch; @@ -26,7 +26,7 @@ public final class BatchedIndexedDrawCmd implements DisplayListCommand { public void execute() { if (batch == null) return; batch.bind(); - GLStateManager.glDrawElements(drawMode, indexCount, indexType, indexByteOffset); + GLSMDraws.glDrawElements(drawMode, indexCount, indexType, indexByteOffset); } @Override diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatch.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatch.java index 76c1ac6fa..440ff3f14 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatch.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatch.java @@ -1,6 +1,8 @@ package com.gtnewhorizons.angelica.glsm.recording.commands; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import org.lwjgl.opengl.GL15; @@ -24,21 +26,21 @@ public final class IndexedDrawBatch { public void bind() { final GLContextState glCtx = GLStateManager.ctx(); if (vaoCtx == glCtx) { - GLStateManager.glBindVertexArray(vao); + GLSMVertexInput.glBindVertexArray(vao); return; } - final int prevVBO = GLStateManager.getBoundVBO(); - final int v = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(v); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, sharedVBO); + final int prevVBO = GLSMBuffers.getBoundVBO(); + final int v = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(v); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, sharedVBO); final int stride = layout.stride(); for (int i = 0; i < layout.locations.length; i++) { final int loc = layout.locations[i]; - GLStateManager.glVertexAttribPointer(loc, layout.sizes[i], layout.types[i], layout.normalized[i], stride, layout.offset(i)); - GLStateManager.glEnableVertexAttribArray(loc); + GLSMVertexInput.glVertexAttribPointer(loc, layout.sizes[i], layout.types[i], layout.normalized[i], stride, layout.offset(i)); + GLSMVertexInput.glEnableVertexAttribArray(loc); } - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEBO); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEBO); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO); vao = v; vaoCtx = glCtx; } @@ -46,9 +48,9 @@ public final class IndexedDrawBatch { public void delete() { if (deleted) return; deleted = true; - if (vaoCtx == GLStateManager.ctx()) GLStateManager.glDeleteVertexArrays(vao); - if (sharedVBO != 0) GLStateManager.glDeleteBuffers(sharedVBO); - if (sharedEBO != 0) GLStateManager.glDeleteBuffers(sharedEBO); + if (vaoCtx == GLStateManager.ctx()) GLSMVertexInput.glDeleteVertexArrays(vao); + if (sharedVBO != 0) GLSMBuffers.glDeleteBuffers(sharedVBO); + if (sharedEBO != 0) GLSMBuffers.glDeleteBuffers(sharedEBO); vao = sharedVBO = sharedEBO = 0; vaoCtx = null; } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatchBuilder.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatchBuilder.java index 48c36273a..4dd561369 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatchBuilder.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawBatchBuilder.java @@ -1,7 +1,8 @@ package com.gtnewhorizons.angelica.glsm.recording.commands; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; @@ -35,8 +36,8 @@ public final class IndexedDrawBatchBuilder { final List out = new ArrayList<>(); if (captures.isEmpty()) return out; - final int prevVBO = GLStateManager.getBoundVBO(); - final int prevEBO = GLStateManager.getBoundEBO(); + final int prevVBO = GLSMBuffers.getBoundVBO(); + final int prevEBO = GLSMVertexInput.getBoundEBO(); final List results = new ArrayList<>(); boolean success = false; @@ -57,8 +58,8 @@ public final class IndexedDrawBatchBuilder { if (!success) { for (GroupResult r : results) r.batch.delete(); } - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEBO); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEBO); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO); } return out; @@ -95,12 +96,12 @@ public final class IndexedDrawBatchBuilder { final long[] indexOffsets = new long[n]; try { - sharedVBO = GLStateManager.glGenBuffers(); - sharedEBO = GLStateManager.glGenBuffers(); + sharedVBO = GLSMBuffers.glGenBuffers(); + sharedEBO = GLSMBuffers.glGenBuffers(); eboData = MemoryUtilities.memAlloc((int) totalIndexBytes); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, sharedVBO); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, totalVertexBytes, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, sharedVBO); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, totalVertexBytes, GL15.GL_STATIC_DRAW); int vboBytePos = 0; int eboBytePos = 0; @@ -110,7 +111,7 @@ public final class IndexedDrawBatchBuilder { for (int g = 0; g < n; g++) { final IndexedDrawCapture c = group.get(g); final int vBytes = c.vertexCount * c.layoutKey.stride(); - GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, vboBytePos, c.vertexData); + GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, vboBytePos, c.vertexData); final long srcIdxAddr = memAddress0(c.indexData); final int idxBytes = c.indexCount * 4; @@ -137,8 +138,8 @@ public final class IndexedDrawBatchBuilder { eboData.position(0).limit((int) totalIndexBytes); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEBO); - GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, eboData, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEBO); + GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, eboData, GL15.GL_STATIC_DRAW); success = true; return new GroupResult(new IndexedDrawBatch(group.get(0).layoutKey, sharedVBO, sharedEBO), @@ -146,8 +147,8 @@ public final class IndexedDrawBatchBuilder { } finally { if (eboData != null) MemoryUtilities.memFree(eboData); if (!success) { - if (sharedVBO != 0) GLStateManager.glDeleteBuffers(sharedVBO); - if (sharedEBO != 0) GLStateManager.glDeleteBuffers(sharedEBO); + if (sharedVBO != 0) GLSMBuffers.glDeleteBuffers(sharedVBO); + if (sharedEBO != 0) GLSMBuffers.glDeleteBuffers(sharedEBO); } } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawCapture.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawCapture.java index ea663c104..7020c1a62 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawCapture.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/IndexedDrawCapture.java @@ -1,6 +1,8 @@ package com.gtnewhorizons.angelica.glsm.recording.commands; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.GLTypes; import com.gtnewhorizons.angelica.glsm.QuadConverter; @@ -64,12 +66,12 @@ public final class IndexedDrawCapture { final int srcIndexSize = GLTypes.sizeBytes(srcIndexType); if (srcIndexSize <= 0) return null; - final int prevEBO = GLStateManager.getBoundEBO(); - final int prevVBO = GLStateManager.getBoundVBO(); + final int prevEBO = GLSMVertexInput.getBoundEBO(); + final int prevVBO = GLSMBuffers.getBoundVBO(); ByteBuffer eboSrc = null; try { - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId); - final int eboBufferSize = GLStateManager.glGetBufferParameteri(GL15.GL_ELEMENT_ARRAY_BUFFER, GL15.GL_BUFFER_SIZE); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId); + final int eboBufferSize = GLSMBuffers.glGetBufferParameteri(GL15.GL_ELEMENT_ARRAY_BUFFER, GL15.GL_BUFFER_SIZE); if (eboBufferSize <= 0) { GLStateManager.warnOnce("ebo-size", "[IndexedDrawCapture] GL_BUFFER_SIZE={} for EBO {}", eboBufferSize, eboId); return null; @@ -80,12 +82,12 @@ public final class IndexedDrawCapture { return null; } eboSrc = MemoryUtilities.memAlloc((int) eboReadSize); - GLStateManager.glGetBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesOffset, eboSrc); + GLSMBuffers.glGetBufferSubData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesOffset, eboSrc); return bake(mode, indicesCount, srcIndexType, MemoryUtilities.memAddress0(eboSrc)); } finally { if (eboSrc != null) MemoryUtilities.memFree(eboSrc); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEBO); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEBO); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, prevVBO); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java index 640207549..a82851418 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/MultMatrixCmd.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.glsm.recording.commands; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import org.jetbrains.annotations.NotNull; import org.joml.Matrix4f; import org.lwjgl.BufferUtils; @@ -26,7 +26,7 @@ public record MultMatrixCmd(Matrix4f matrix, FloatBuffer buffer) implements Disp @Override public void execute() { buffer.rewind(); - GLStateManager.glMultMatrix(buffer); + GLSMMatrices.glMultMatrix(buffer); } @Override diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java index 708da6c9f..e99191711 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexImage2DCmd.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.glsm.recording.commands; import com.gtnewhorizons.angelica.glsm.GLDebug; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLTypes; import com.gtnewhorizons.angelica.glsm.states.PixelStoreState; import org.jetbrains.annotations.NotNull; @@ -56,14 +56,14 @@ public record TexImage2DCmd( @Override public void execute() { if (pixels == null) { - GLStateManager.glTexImage2D(target, level, internalformat, width, height, border, format, type, (ByteBuffer) null); + GLSMTextures.glTexImage2D(target, level, internalformat, width, height, border, format, type, (ByteBuffer) null); return; } - GLStateManager.forcePixelUnpackState(unpack); + GLSMTextures.forcePixelUnpackState(unpack); try { - GLStateManager.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); + GLSMTextures.glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); } finally { - GLStateManager.restorePixelUnpackState(unpack); + GLSMTextures.restorePixelUnpackState(unpack); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java index 3563a1d42..1c3686cd3 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/recording/commands/TexSubImage2DCmd.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.glsm.recording.commands; import com.gtnewhorizons.angelica.glsm.GLDebug; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLTypes; import com.gtnewhorizons.angelica.glsm.states.PixelStoreState; import org.jetbrains.annotations.NotNull; @@ -56,14 +56,14 @@ public record TexSubImage2DCmd( @Override public void execute() { if (pixels == null) { - GLStateManager.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, (ByteBuffer) null); + GLSMTextures.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, (ByteBuffer) null); return; } - GLStateManager.forcePixelUnpackState(unpack); + GLSMTextures.forcePixelUnpackState(unpack); try { - GLStateManager.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + GLSMTextures.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); } finally { - GLStateManager.restorePixelUnpackState(unpack); + GLSMTextures.restorePixelUnpackState(unpack); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMOwners.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMOwners.java new file mode 100644 index 000000000..472b0d1f7 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMOwners.java @@ -0,0 +1,174 @@ +package com.gtnewhorizons.angelica.glsm.redirect; + +final class GLSMOwners { + + static final String[][] METHODS = { + {"com/gtnewhorizons/angelica/glsm/GLSMAttribStack", + "applyRetainedState", "getAttribDepth", "glPopAttrib", "glPopClientAttrib", "glPushAttrib", + "glPushClientAttrib", "isPoppingAttributes", "popState", "popStateTo", "pushState", "registerModifiedState", + "replayStateToBackend", "retainModifiedState"}, + {"com/gtnewhorizons/angelica/glsm/GLSMBlend", + "defaultBlendFunc", "disableBlend", "enableBlend", "getBlendMode", "getBlendState", "getClearColor", + "getColorLogicOpState", "getColorMask", "getEffectiveBlendState", "getEffectiveColorMask", + "getIndexLogicOpState", "getLogicOpMode", "glBlendColor", "glBlendEquation", "glBlendEquationSeparate", + "glBlendFunc", "glBlendFuncSeparate", "glBlendFuncSeparatei", "glClearColor", "glColorMask", "glLogicOp", + "isEffectiveBlendEnabled", "setHudCacheOverride", "tryBlendFuncSeparate"}, + {"com/gtnewhorizons/angelica/glsm/GLSMBuffers", + "getBoundCopyReadBuffer", "getBoundCopyWriteBuffer", "getBoundVBO", "getIndexedBufferBinding", + "glBindBuffer", "glBindBufferBase", "glBindBufferRange", "glBufferData", "glBufferStorage", + "glBufferSubData", "glClearBufferData", "glClearBufferSubData", "glClientWaitSync", "glCopyBufferSubData", + "glCreateBuffers", "glDeleteBuffers", "glDeleteSync", "glFenceSync", "glFlushMappedBufferRange", + "glGenBuffers", "glGetBufferParameter", "glGetBufferParameteri", "glGetBufferParameteriv", + "glGetBufferSubData", "glGetSynci", "glIsBuffer", "glMapBuffer", "glMapBufferRange", + "glMapBufferRangeAddress", "glMemoryBarrier", "glNamedBufferData", "glNamedBufferSubData", "glUnmapBuffer", + "glWaitSync", "nglBufferData", "nglBufferSubData", "nglGetBufferSubData", "nglMapBuffer"}, + {"com/gtnewhorizons/angelica/glsm/GLSMCurrentAttribs", + "consumeUnit23TexCoordSetDuringDraw", "flushDeferredVertexAttribs", "flushEntityIds", + "forceAttribDefaultsDirty", "getColor", "getColorSumState", "getOverlayA", "getOverlayB", "getOverlayG", + "getOverlayR", "getSecondaryColor", "getShaderColorA", "getShaderColorB", "getShaderColorG", + "getShaderColorR", "glColor3b", "glColor3d", "glColor3f", "glColor3ub", "glColor4b", "glColor4d", + "glColor4f", "glColor4ub", "glEdgeFlag", "glMultiTexCoord2d", "glMultiTexCoord2f", "glMultiTexCoord2s", + "glNormal3b", "glNormal3d", "glNormal3f", "glNormal3i", "glSecondaryColor3b", "glSecondaryColor3d", + "glSecondaryColor3f", "glSecondaryColor3ub", "glTexCoord1d", "glTexCoord1f", "glTexCoord2d", "glTexCoord2f", + "glTexCoord3d", "glTexCoord3f", "glTexCoord4d", "glTexCoord4f", "glVertexAttrib2f", "glVertexAttrib2s", + "glVertexAttrib3f", "glVertexAttrib4f", "setEntityIds", "setLightmapTextureCoords", "setOverlayColor", + "setShaderColor"}, + {"com/gtnewhorizons/angelica/glsm/GLSMDepthStencilAlpha", + "disableAlphaTest", "disableDepthTest", "enableAlphaTest", "enableDepthTest", "getAlphaState", + "getAlphaTest", "getDepthState", "getDepthTest", "getEffectiveAlphaState", "getStencilState", + "getStencilTest", "glAlphaFunc", "glClearDepth", "glClearStencil", "glDepthFunc", "glDepthMask", + "glDepthRange", "glStencilFunc", "glStencilFuncSeparate", "glStencilMask", "glStencilMaskSeparate", + "glStencilOp", "glStencilOpSeparate", "isEffectiveAlphaTestEnabled", "isEffectiveDepthMaskEnabled"}, + {"com/gtnewhorizons/angelica/glsm/GLSMDraws", + "displayListExists", "ffpWidensLineQuads", "getDisplayList", "getListMode", "glAccum", "glBegin", + "glCallList", "glCallLists", "glDebugMessageCallback", "glDebugMessageControl", "glDebugMessageInsert", + "glDeleteLists", "glDrawArrays", "glDrawArraysInstanced", "glDrawElements", "glDrawElementsBaseVertex", + "glDrawElementsInstanced", "glDrawRangeElements", "glDrawRangeElementsBaseVertex", "glEnd", "glEndList", + "glFeedbackBuffer", "glFinish", "glFlush", "glGenLists", "glGetDebugMessageLog", "glGetObjectLabel", + "glInitNames", "glIsList", "glListBase", "glLoadName", "glMultiDrawArrays", + "glMultiDrawArraysIndirectCount", "glMultiDrawElementsBaseVertex", "glMultiDrawElementsIndirect", + "glMultiDrawElementsIndirectCount", "glNewList", "glObjectLabel", "glPassThrough", "glPixelTransferf", + "glPixelTransferi", "glPopDebugGroup", "glPopName", "glPrimitiveRestartIndex", "glPushDebugGroup", + "glPushName", "glRasterPos2d", "glRasterPos2f", "glRasterPos2i", "glRasterPos3d", "glRasterPos3f", + "glRasterPos3i", "glRasterPos4d", "glRasterPos4f", "glRasterPos4i", "glRenderMode", "glSelectBuffer", + "glVertex2d", "glVertex2f", "glVertex2i", "glVertex3d", "glVertex3f", "glVertex3i", "isContinuousDraw", + "nglMultiDrawElementsBaseVertex", "preDraw", "registerDebugMessageListener"}, + {"com/gtnewhorizons/angelica/glsm/GLSMEnable", + "glDisable", "glDisablei", "glEnable", "glEnablei", "glIsEnabled"}, + {"com/gtnewhorizons/angelica/glsm/GLSMFog", + "disableFog", "enableFog", "fogColor", "getFogColor", "getFogMode", "getFogState", "glFog", "glFogf", + "glFogi"}, + {"com/gtnewhorizons/angelica/glsm/GLSMFramebuffer", + "attachTextureForReading", "framebufferCompletenessIsMeaningful", "getDrawBuffer", "getDrawFramebuffer", + "getDrawFramebufferGeneration", "getReadFramebuffer", "glBindFramebuffer", "glBindRenderbuffer", + "glBlitFramebuffer", "glCheckFramebufferStatus", "glClear", "glDeleteFramebuffers", "glDeleteRenderbuffers", + "glDrawBuffer", "glDrawBuffers", "glFramebufferRenderbuffer", "glFramebufferTexture", + "glFramebufferTexture1D", "glFramebufferTexture2D", "glFramebufferTexture3D", "glFramebufferTextureFace", + "glFramebufferTextureLayer", "glGenFramebuffers", "glGenRenderbuffers", + "glGetFramebufferAttachmentParameteri", "glIsFramebuffer", "glIsRenderbuffer", + "glNamedFramebufferRenderbuffer", "glNamedFramebufferTexture", "glNamedFramebufferTexture1DEXT", + "glNamedFramebufferTexture2DEXT", "glNamedFramebufferTexture3DEXT", "glNamedFramebufferTextureEXT", + "glNamedFramebufferTextureFaceEXT", "glNamedFramebufferTextureLayer", "glReadBuffer", "glReadPixels", + "glRenderbufferStorage", "glRenderbufferStorageMultisample", "isFramebufferEnabled", + "takeFirstClearBlockNanos"}, + {"com/gtnewhorizons/angelica/glsm/GLSMLighting", + "applyLighting", "captureLighting", "disableColorMaterial", "disableLight", "disableLighting", + "disableRescaleNormal", "enableColorMaterial", "enableLight", "enableLighting", "enableRescaleNormal", + "getBackMaterial", "getColorMaterial", "getColorMaterialFace", "getColorMaterialParameter", + "getFrontMaterial", "getLightDataStates", "getLightModel", "getLightStates", "getLightingGeneration", + "getLightingState", "getNormalizeState", "getRescaleNormalState", "glColorMaterial", "glGetLight", + "glGetMaterial", "glLight", "glLightModel", "glLightModelf", "glLightModeli", "glLightf", "glLighti", + "glMaterial", "glMaterialf", "glMateriali", "i2f"}, + {"com/gtnewhorizons/angelica/glsm/GLSMMatrices", + "applyMultMatrix", "getMatrixMode", "getMatrixStack", "getMatrixStackDepth", "getModelViewMatrix", + "getMvGeneration", "getMvLinearGeneration", "getProjGeneration", "getProjectionMatrix", + "getTexMatrixGeneration", "glFrustum", "glLoadIdentity", "glLoadMatrix", "glMatrixMode", "glMultMatrix", + "glOrtho", "glPopMatrix", "glPushMatrix", "glRotated", "glRotatef", "glScaled", "glScalef", "glTranslated", + "glTranslatef", "gluBuild2DMipmaps", "gluErrorString", "gluLookAt", "gluOrtho2D", "gluPerspective", + "gluPickMatrix", "gluUnProject", "setModelViewMatrix", "setProjectionMatrix", "setTextureMatrix"}, + {"com/gtnewhorizons/angelica/glsm/GLSMPrograms", + "getActiveProgram", "getProgramGeneration", "getProgramLifetimeGeneration", "getProgramStack", + "getVertexProgramTwoSideState", "glAttachShader", "glBindAttribLocation", "glBindFragDataLocation", + "glCompileShader", "glCreateProgram", "glCreateShader", "glDeleteObjectARB", "glDeleteProgram", + "glDeleteShader", "glDetachShader", "glDispatchCompute", "glGetActiveAttrib", "glGetActiveUniform", + "glGetAttachedShaders", "glGetAttribLocation", "glGetHandleARB", "glGetInfoLogARB", + "glGetObjectParameterARB", "glGetObjectParameteriARB", "glGetProgramBinary", "glGetProgramInfoLog", + "glGetProgrami", "glGetShaderInfoLog", "glGetShaderSource", "glGetShaderi", "glGetUniform", + "glGetUniformBlockIndex", "glGetUniformLocation", "glIsProgram", "glIsShader", "glLinkProgram", + "glProgramBinary", "glProgramParameteri", "glShaderSource", "glSpecializeShader", "glUniform1", + "glUniform1f", "glUniform1i", "glUniform2", "glUniform2f", "glUniform2i", "glUniform3", "glUniform3f", + "glUniform3i", "glUniform4", "glUniform4f", "glUniform4i", "glUniformBlockBinding", "glUniformMatrix2", + "glUniformMatrix3", "glUniformMatrix4", "glUseProgram", "glValidateProgram", "isProgramPendingDeletion", + "nglShaderSource", "setFfpInstancing"}, + {"com/gtnewhorizons/angelica/glsm/GLSMQueries", + "checkGLError", "glBeginQuery", "glDeleteQueries", "glEndQuery", "glGenQueries", "glGetBoolean", + "glGetBooleani", "glGetBooleani_v", "glGetDouble", "glGetError", "glGetFloat", "glGetInteger", + "glGetIntegeri", "glGetIntegeri_v", "glGetQueryObjecti", "glGetQueryObjectui", "glGetQueryObjectui64", + "glGetString", "glGetStringi", "glIsQuery", "glQueryCounter"}, + {"com/gtnewhorizons/angelica/glsm/GLSMRasterizer", + "anyClipPlaneEnabled", "disableCull", "disableScissorTest", "enableCull", "enableScissorTest", + "getAutoNormalState", "getClipPlaneState", "getClipPlaneStates", "getCullState", "getDitherState", + "getEdgeFlagState", "getHintState", "getLineSmoothState", "getLineState", "getLineStippleState", + "getMap1Color4State", "getMap1IndexState", "getMap1NormalState", "getMap1TextureCoord1State", + "getMap1TextureCoord2State", "getMap1TextureCoord3State", "getMap1TextureCoord4State", + "getMap1Vertex3State", "getMap1Vertex4State", "getMap2Color4State", "getMap2IndexState", + "getMap2NormalState", "getMap2TextureCoord1State", "getMap2TextureCoord2State", "getMap2TextureCoord3State", + "getMap2TextureCoord4State", "getMap2Vertex3State", "getMap2Vertex4State", "getMultisampleState", + "getPointSmoothState", "getPointSpriteState", "getPointState", "getPolygonOffsetFillState", + "getPolygonOffsetLineState", "getPolygonOffsetPointState", "getPolygonSmoothState", "getPolygonState", + "getPolygonStippleState", "getSampleAlphaToCoverageState", "getSampleAlphaToOneState", + "getSampleCoverageState", "getScissorState", "getScissorTest", "getShadeModelState", "getViewportState", + "glClipPlane", "glCullFace", "glFrontFace", "glGetClipPlane", "glHint", "glLineStipple", "glLineWidth", + "glPointParameter", "glPointParameterf", "glPointParameteri", "glPointSize", "glPolygonMode", + "glPolygonOffset", "glPolygonOffsetClamp", "glPolygonStipple", "glSampleCoverage", "glScissor", + "glShadeModel", "glViewport"}, + {"com/gtnewhorizons/angelica/glsm/GLSMTexEnvGen", + "glGetTexEnv", "glGetTexEnvf", "glGetTexEnvi", "glGetTexGen", "glGetTexGend", "glGetTexGenf", + "glGetTexGeni", "glTexEnv", "glTexEnvf", "glTexEnvi", "glTexGen", "glTexGend", "glTexGenf", "glTexGeni"}, + {"com/gtnewhorizons/angelica/glsm/GLSMTextureLifetime", + "deferredTexturesAwaitingRelease", "onFrameEnd"}, + {"com/gtnewhorizons/angelica/glsm/GLSMTextures", + "abandonTextureStaging", "beginTextureStaging", "commitTextureStaging", "disableTexture", "enableTexture", + "forcePixelUnpackState", "getActiveTextureUnit", "getActiveTextureUnitForServerState", + "getActiveTextureUnitStack", "getBoundTextureForServerState", "getClientActiveTextureUnit", + "getImageUnitBinding", "getMaxBoundTextureUnit", "getSamplerBinding", "getSamplerUnitCount", "getTextures", + "glActiveTexture", "glActiveTextureARB", "glBindImageTexture", "glBindImageTextures", + "glBindMultiTextureEXT", "glBindSampler", "glBindSamplers", "glBindTexture", "glBindTextureUnit", + "glBindTextures", "glClearTexImage", "glClientActiveTexture", "glCopyImageSubData", "glCopyTexImage1D", + "glCopyTexImage2D", "glCopyTexSubImage1D", "glCopyTexSubImage2D", "glCopyTexSubImage3D", "glCreateTextures", + "glDeleteSamplers", "glDeleteTextures", "glGenSamplers", "glGenTextures", "glGenerateMipmap", + "glGetTexImage", "glGetTexLevelParameteri", "glGetTexParameterf", "glGetTexParameteri", "glIsSampler", + "glIsTexture", "glPixelStoref", "glPixelStorei", "glSamplerParameterf", "glSamplerParameteri", + "glTexImage1D", "glTexImage2D", "glTexImage3D", "glTexParameter", "glTexParameterf", "glTexParameteri", + "glTexStorage2D", "glTexSubImage1D", "glTexSubImage2D", "glTexSubImage3D", "lookupTexParameteri", + "markTextureAsAtlas", "remapTexClamp", "remapTexClampBuffer", "remapTexImageForGLES", + "restorePixelUnpackState", "setActiveTexture", "setFilter", "setTextureSupersamplingSamples", + "trackMaxBoundTextureUnit", "trimTextureStaging", "unbindAllSamplers", "updateTexParameterfCache", + "updateTexParameteriCache"}, + {"com/gtnewhorizons/angelica/glsm/GLSMVertexInput", + "getBoundEBO", "getBoundVAO", "glBindVertexArray", "glBindVertexArrayAPPLE", "glBindVertexBuffer", + "glColorPointer", "glDeleteVertexArrays", "glDisableClientState", "glDisableVertexAttribArray", + "glEdgeFlagPointer", "glEnableClientState", "glEnableVertexAttribArray", "glFogCoordPointer", + "glGenVertexArrays", "glGetPointer", "glInterleavedArrays", "glIsVertexArray", "glNormalPointer", + "glSecondaryColorPointer", "glTexCoordPointer", "glVertexAttribBinding", "glVertexAttribDivisor", + "glVertexAttribDivisorARB", "glVertexAttribFormat", "glVertexAttribIFormat", "glVertexAttribIPointer", + "glVertexAttribPointer", "glVertexPointer"}, + }; + + static final String[][] FIELDS = { + {"com/gtnewhorizons/angelica/glsm/GLSMAttribStack", + "attribBackendCalls", "attribDiscards", "attribPushes", "attribSlotsSaved", "attribValueRestores"}, + {"com/gtnewhorizons/angelica/glsm/GLSMDraws", + "drawCalls"}, + {"com/gtnewhorizons/angelica/glsm/GLSMFramebuffer", + "DEFAULT_DRAW_BUFFER"}, + {"com/gtnewhorizons/angelica/glsm/GLSMPrograms", + "programSwitches"}, + {"com/gtnewhorizons/angelica/glsm/GLSMRasterizer", + "wideLineEmulationEnabled"}, + {"com/gtnewhorizons/angelica/glsm/GLSMTextures", + "TEX_PARAM_MISS", "texBindMisses"}, + }; + + private GLSMOwners() {} +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirector.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirector.java index a1db2a37e..c0691bac2 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirector.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirector.java @@ -11,6 +11,8 @@ import org.objectweb.asm.Handle; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.IntInsnNode; import org.objectweb.asm.tree.InvokeDynamicInsnNode; import org.objectweb.asm.tree.LdcInsnNode; @@ -21,13 +23,15 @@ import org.objectweb.asm.tree.TypeInsnNode; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; /** - * Core GL call redirector for GLSM. Rewrites bytecode so that GL calls go through {@code GLStateManager} for state tracking and backend abstraction. + * Core GL call redirector for GLSM. Rewrites bytecode so GL calls go through the GLSM classes for state tracking and backend abstraction. *

* THIS CLASS MIGHT BE LOADED ON A DIFFERENT CLASS LOADER. * IT SHOULD NOT CALL ANY CODE FROM THE MAIN MOD. @@ -186,6 +190,12 @@ public class GLSMRedirector { private static final Map typeRedirects = new HashMap<>(); private static final ClassConstantPoolParser cstPoolParser; private static final String[] CONSTANT_POOL_SEARCH_STRINGS; + private static final Map methodOwner = new HashMap<>(512); + private static final Map fieldOwner = new HashMap<>(64); + static final String[] CORE_REWRITE_TARGETS = {"makeCurrent", "releaseContext", "swapBuffers", "updateDisplay", "isCurrent"}; + private static final Set LEGACY_WARNED = ConcurrentHashMap.newKeySet(); + private String legacyHint = ""; + private LegacyRewriter legacyRewriter; private static final String[] CORE_EXCLUSIONS = { "org.lwjgl", @@ -540,7 +550,9 @@ public class GLSMRedirector { .add("glIsFramebuffer") .add("glIsRenderbuffer") .add("glBindBufferBase") - .add("glBindBufferRange"); + .add("glBindBufferRange") + .add("glEnablei") + .add("glDisablei"); final var gl31 = RedirectMap.newMap() .add("glDrawElementsInstanced") .add("glDrawArraysInstanced") @@ -574,7 +586,8 @@ public class GLSMRedirector { .add("glVertexAttribFormat") .add("glVertexAttribIFormat") .add("glVertexAttribBinding") - .add("glMultiDrawElementsIndirect"); + .add("glMultiDrawElementsIndirect") + .add("glCopyImageSubData"); final var gl44 = RedirectMap.newMap() .add("glBufferStorage") .add("glBindSamplers") @@ -899,10 +912,34 @@ public class GLSMRedirector { stringsToSearch.add(Drawable); stringsToSearch.add(SharedDrawable); stringsToSearch.add(Display); + stringsToSearch.add(GLStateManager); stringsToSearch.addAll(typeRedirects.keySet()); stringsToSearch.addAll(methodRedirects.keySet()); CONSTANT_POOL_SEARCH_STRINGS = stringsToSearch.toArray(new String[0]); cstPoolParser = new ClassConstantPoolParser(CONSTANT_POOL_SEARCH_STRINGS); + + fillOwners(methodOwner, GLSMOwners.METHODS); + fillOwners(fieldOwner, GLSMOwners.FIELDS); + } + + private static void fillOwners(Map owners, String[][] table) { + for (String[] row : table) { + for (int i = 1; i < row.length; i++) owners.put(row[i], row[0]); + } + } + + static Set redirectTargets() { + final Set targets = new TreeSet<>(glMethodRedirects.values()); + targets.addAll(glDescRedirects.values()); + for (Map inner : methodRedirects.values()) targets.addAll(inner.values()); + for (String cap : glCapRedirects.values()) { + targets.add("enable" + cap); + targets.add("disable" + cap); + } + targets.add("glEnable"); + targets.add("glDisable"); + Collections.addAll(targets, CORE_REWRITE_TARGETS); + return targets; } public String[] getCoreExclusions() { @@ -915,9 +952,46 @@ public class GLSMRedirector { public static String getGLPrefix() { return GL_PREFIX; } - public static String getTargetClassName() { return GLStateManager; } + public static String getTargetOwner(String glsmName) { return methodOwner.getOrDefault(glsmName, GLStateManager); } - /** Key: original method name, value: GLStateManager method name. */ + public static List glsmClasses() { + final Set classes = new LinkedHashSet<>(); + classes.add(GLStateManager); + for (String[] row : GLSMOwners.METHODS) classes.add(row[0]); + for (String[] row : GLSMOwners.FIELDS) classes.add(row[0]); + return List.copyOf(classes); + } + + public void setLegacyHint(String hint) { this.legacyHint = hint; } + + public void setLegacyRewriter(LegacyRewriter rewriter) { this.legacyRewriter = rewriter; } + + private static String simpleName(String internalName) { + return internalName.substring(internalName.lastIndexOf('/') + 1); + } + + private void warnLegacy(String transformedName, String name, String newOwner) { + warnLegacyUse(transformedName, name, "moved to " + simpleName(newOwner) + "." + name); + } + + private void warnLegacyUse(String transformedName, String name, String outcome) { + final int dot = transformedName.lastIndexOf('.'); + final String key = dot < 0 ? transformedName : transformedName.substring(0, dot); + if (LEGACY_WARNED.add(key)) { + LOGGER.warn("{} uses GLStateManager.{}, {}; rewritten at load.{}", transformedName, name, outcome, legacyHint.isEmpty() ? "" : " " + legacyHint); + } + } + + private boolean tryLegacyRewrite(String transformedName, InsnList instructions, MethodInsnNode call) { + if (legacyRewriter == null) return false; + final String name = call.name; + final String replacement = legacyRewriter.rewrite(instructions, call); + if (replacement == null) return false; + warnLegacyUse(transformedName, name, "redirected to " + replacement); + return true; + } + + /** @return Map from GL method name to GLSM method name. {@link #getTargetOwner} gives its class. */ public static Map getGLPrefixMethodRedirects() { return Collections.unmodifiableMap(glMethodRedirects); } @@ -943,7 +1017,9 @@ public class GLSMRedirector { if (isOpenGlHelper && (mn.name.equals("glBlendFunc") || mn.name.equals("func_148821_a"))) { continue; } + boolean rewroteLegacy = false; for (AbstractInsnNode node : mn.instructions.toArray()) { + if (rewroteLegacy && !mn.instructions.contains(node)) continue; if (node instanceof TypeInsnNode tNode) { if (tNode.getOpcode() == Opcodes.NEW || tNode.getOpcode() == Opcodes.CHECKCAST) { final String redirect = typeRedirects.get(tNode.desc); @@ -955,7 +1031,29 @@ public class GLSMRedirector { changed = true; } } + } else if (node instanceof FieldInsnNode fNode) { + if (fNode.owner.equals(GLStateManager) && (fNode.getOpcode() == Opcodes.GETSTATIC || fNode.getOpcode() == Opcodes.PUTSTATIC)) { + final String newOwner = fieldOwner.get(fNode.name); + if (newOwner != null) { + warnLegacy(transformedName, fNode.name, newOwner); + fNode.owner = newOwner; + changed = true; + } + } } else if (node instanceof MethodInsnNode mNode) { + if (mNode.owner.equals(GLStateManager)) { + if (tryLegacyRewrite(transformedName, mn.instructions, mNode)) { + rewroteLegacy = true; + changed = true; + continue; + } + final String newOwner = methodOwner.get(mNode.name); + if (newOwner != null) { + warnLegacy(transformedName, mNode.name, newOwner); + mNode.owner = newOwner; + changed = true; + } + } if (mNode.desc.equals("(I)V") && mNode.owner.startsWith(GL_PREFIX) && (mNode.name.equals("glEnable") || mNode.name.equals("glDisable"))) { final AbstractInsnNode prevNode = node.getPrevious(); String name = null; @@ -974,12 +1072,12 @@ public class GLSMRedirector { if (LOG_SPAM) { final String shortOwner = mNode.owner.substring(mNode.owner.lastIndexOf("/") + 1); if (name == null) { - LOGGER.info("Redirecting call in {} from {}.{}(I)V to GLStateManager.{}(I)V", transformedName, shortOwner, mNode.name, mNode.name); + LOGGER.info("Redirecting call in {} from {}.{}(I)V to {}.{}(I)V", transformedName, shortOwner, mNode.name, simpleName(getTargetOwner(mNode.name)), mNode.name); } else { - LOGGER.info("Redirecting call in {} from {}.{}(I)V to GLStateManager.{}()V", transformedName, shortOwner, mNode.name, name); + LOGGER.info("Redirecting call in {} from {}.{}(I)V to {}.{}()V", transformedName, shortOwner, mNode.name, simpleName(getTargetOwner(name)), name); } } - mNode.owner = GLStateManager; + mNode.owner = getTargetOwner(name != null ? name : mNode.name); if (name != null) { mNode.name = name; mNode.desc = "()V"; @@ -1039,9 +1137,9 @@ public class GLSMRedirector { } else if (glsmName != null) { if (LOG_SPAM) { final String shortOwner = mNode.owner.substring(mNode.owner.lastIndexOf("/") + 1); - LOGGER.info("Redirecting call in {} from {}.{}{} to GLStateManager.{}{}", transformedName, shortOwner, mNode.name, mNode.desc, glsmName, mNode.desc); + LOGGER.info("Redirecting call in {} from {}.{}{} to {}.{}{}", transformedName, shortOwner, mNode.name, mNode.desc, simpleName(getTargetOwner(glsmName)), glsmName, mNode.desc); } - mNode.owner = GLStateManager; + mNode.owner = getTargetOwner(glsmName); mNode.name = glsmName; changed = true; } else if (lwjgl3Aware && mNode.owner.startsWith(LWJGL_GL_PACKAGE) && hasLwjglTypedDescriptor(mNode.desc) && !isAwareNonDispatching(mNode.owner, mNode.name)) { @@ -1066,6 +1164,17 @@ public class GLSMRedirector { // Redirect method handles in invokedynamic bootstrap arguments for (int i = 0; i < dynNode.bsmArgs.length; i++) { if (!(dynNode.bsmArgs[i] instanceof Handle handle)) continue; + if (handle.getOwner().equals(GLStateManager)) { + final int tag = handle.getTag(); + final String newOwner = tag == Opcodes.H_INVOKESTATIC ? methodOwner.get(handle.getName()) + : tag == Opcodes.H_GETSTATIC || tag == Opcodes.H_PUTSTATIC ? fieldOwner.get(handle.getName()) : null; + if (newOwner != null) { + warnLegacy(transformedName, handle.getName(), newOwner); + dynNode.bsmArgs[i] = new Handle(tag, newOwner, handle.getName(), handle.getDesc()); + changed = true; + continue; + } + } String glsmName = glDescRedirects.get(handle.getOwner() + " " + handle.getName() + handle.getDesc()); if (glsmName == null) { final Map redirects = handle.getOwner().startsWith(GL_PREFIX) ? glMethodRedirects : methodRedirects.get(handle.getOwner()); @@ -1081,9 +1190,9 @@ public class GLSMRedirector { } if (LOG_SPAM) { final String shortOwner = handle.getOwner().substring(handle.getOwner().lastIndexOf("/") + 1); - LOGGER.info("Redirecting invokedynamic handle in {} from {}.{}{} to GLStateManager.{}{}", transformedName, shortOwner, handle.getName(), handle.getDesc(), glsmName, handle.getDesc()); + LOGGER.info("Redirecting invokedynamic handle in {} from {}.{}{} to {}.{}{}", transformedName, shortOwner, handle.getName(), handle.getDesc(), simpleName(getTargetOwner(glsmName)), glsmName, handle.getDesc()); } - dynNode.bsmArgs[i] = new Handle(handle.getTag(), GLStateManager, glsmName, handle.getDesc()); + dynNode.bsmArgs[i] = new Handle(handle.getTag(), getTargetOwner(glsmName), glsmName, handle.getDesc()); changed = true; } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/LegacyRewriter.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/LegacyRewriter.java new file mode 100644 index 000000000..1880d29e9 --- /dev/null +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/redirect/LegacyRewriter.java @@ -0,0 +1,10 @@ +package com.gtnewhorizons.angelica.glsm.redirect; + +import org.objectweb.asm.tree.InsnList; +import org.objectweb.asm.tree.MethodInsnNode; + +public interface LegacyRewriter { + + /** Replaces {@code call} in place and returns the replacement's name for the legacy warning, or null to leave it alone. */ + String rewrite(InsnList instructions, MethodInsnNode call); +} diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/shader/ProgramBinaryCache.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/shader/ProgramBinaryCache.java index cfdc8a0c4..fe0de5c71 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/shader/ProgramBinaryCache.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/shader/ProgramBinaryCache.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.glsm.shader; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; import com.gtnewhorizons.angelica.glsm.threading.AngelicaWorkers; @@ -73,7 +73,7 @@ public final class ProgramBinaryCache { } public static void markRetrievable(int program) { - GLStateManager.glProgramParameteri(program, GL41.GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL11.GL_TRUE); + GLSMPrograms.glProgramParameteri(program, GL41.GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL11.GL_TRUE); } public static int load(Key key) { @@ -87,16 +87,16 @@ public final class ProgramBinaryCache { ShaderDiskCache.remove(diskKey); return 0; } - final int program = GLStateManager.glCreateProgram(); + final int program = GLSMPrograms.glCreateProgram(); final ByteBuffer data = MemoryUtilities.memAlloc(blob.data().length); try { data.put(blob.data()).flip(); - GLStateManager.glProgramBinary(program, format, data); + GLSMPrograms.glProgramBinary(program, format, data); } finally { MemoryUtilities.memFree(data); } - if (GLStateManager.glGetProgrami(program, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) { - GLStateManager.glDeleteProgram(program); + if (GLSMPrograms.glGetProgrami(program, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) { + GLSMPrograms.glDeleteProgram(program); ShaderDiskCache.remove(diskKey); if (rejectWarned.compareAndSet(false, true)) LOGGER.error("Driver rejected a saved shader program!! Recompiling rejected programs from source"); return 0; @@ -112,13 +112,13 @@ public final class ProgramBinaryCache { } private static boolean saveBinary(Key key, int program) { - final int length = GLStateManager.glGetProgrami(program, GL41.GL_PROGRAM_BINARY_LENGTH); + final int length = GLSMPrograms.glGetProgrami(program, GL41.GL_PROGRAM_BINARY_LENGTH); if (length <= 0) return false; final ByteBuffer data = MemoryUtilities.memAlloc(length); final IntBuffer written = MemoryUtilities.memAllocInt(1); final IntBuffer format = MemoryUtilities.memAllocInt(1); try { - GLStateManager.glGetProgramBinary(program, written, format, data); + GLSMPrograms.glGetProgramBinary(program, written, format, data); if (written.get(0) <= 0) return false; data.limit(written.get(0)); final byte[] binary = ShaderCacheIO.toHeap(data); diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java index 08077daf4..137fdf8ff 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/BooleanStateStack.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.stacks; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.hooks.VanillaBooleanLayer; import com.gtnewhorizons.angelica.glsm.states.BooleanState; @@ -90,7 +91,7 @@ public class BooleanStateStack extends BooleanState implements CowStateStack extends IStateStack { final int depth = o.attribDepth; if (depth == 0 || d.claimedAt(depth) || !o.savesState(d.id)) return; captureSlot(d.claim(depth)); - GLStateManager.registerModifiedState(o, d.id); + GLSMAttribStack.registerModifiedState(o, d.id); } @Override diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java index 1fe1912b2..6ce73d29c 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/stacks/TextureUnitBooleanStateStack.java @@ -1,5 +1,6 @@ package com.gtnewhorizons.angelica.glsm.stacks; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; @@ -50,7 +51,7 @@ public final class TextureUnitBooleanStateStack extends BooleanStateStack { } if (!ffpStateOnly) { - final int currentUnit = GLStateManager.getActiveTextureUnit(); + final int currentUnit = GLSMTextures.getActiveTextureUnit(); final boolean needsSwitch = currentUnit != unitIndex; if (needsSwitch) BackendManager.RENDER_BACKEND.activeTexture(GL13.GL_TEXTURE0 + unitIndex); diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java index f3e8ce45f..669488c99 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/BooleanState.java @@ -1,5 +1,6 @@ package com.gtnewhorizons.angelica.glsm.states; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; import com.gtnewhorizons.angelica.glsm.GLStateManager; import lombok.Getter; import org.lwjgl.opengl.GL11; @@ -45,7 +46,7 @@ public class BooleanState implements ISettableState { public void setEnabled(boolean enabled) { final boolean bypass = !GLStateManager.isCachingEnabled(); - if (stateUnknown || bypass || enabled != this.enabled || (this.glCap == GL11.GL_BLEND && GLStateManager.vendorIsAMD() && GLStateManager.isPoppingAttributes())) { + if (stateUnknown || bypass || enabled != this.enabled || (this.glCap == GL11.GL_BLEND && GLStateManager.vendorIsAMD() && GLSMAttribStack.isPoppingAttributes())) { GLStateManager.beforeUncapturedCapabilityChange(glCap); stateUnknown = false; this.enabled = enabled; diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java index 7c5e6d739..754b9159f 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightModelState.java @@ -8,7 +8,7 @@ import org.lwjgl.opengl.GL12; import java.nio.FloatBuffer; import java.nio.IntBuffer; -import static com.gtnewhorizons.angelica.glsm.GLStateManager.i2f; +import static com.gtnewhorizons.angelica.glsm.GLSMLighting.i2f; public class LightModelState implements ISettableState { diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java index 191aa380e..a78d4ba80 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/LightState.java @@ -1,5 +1,6 @@ package com.gtnewhorizons.angelica.glsm.states; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.GLStateManager; import org.joml.Matrix3f; import org.joml.Vector3f; @@ -11,7 +12,7 @@ import org.lwjgl.opengl.GL11; import java.nio.FloatBuffer; import java.nio.IntBuffer; -import static com.gtnewhorizons.angelica.glsm.GLStateManager.i2f; +import static com.gtnewhorizons.angelica.glsm.GLSMLighting.i2f; public class LightState implements ISettableState { @@ -73,14 +74,14 @@ public class LightState implements ISettableState { this.rawPosition = new Vector4f(position); this.position = position; - this.position.mul(GLStateManager.getModelViewMatrix()); - this.posMvGeneration = GLStateManager.getMvGeneration(); + this.position.mul(GLSMMatrices.getModelViewMatrix()); + this.posMvGeneration = GLSMMatrices.getMvGeneration(); this.rawSpotDirection = new Vector3f(spotDirection); this.spotDirection = spotDirection; - GLStateManager.getModelViewMatrix().get3x3(matrix3f); + GLSMMatrices.getModelViewMatrix().get3x3(matrix3f); this.spotDirection.mul(matrix3f); - this.spotDirLinearGeneration = GLStateManager.getMvLinearGeneration(); + this.spotDirLinearGeneration = GLSMMatrices.getMvLinearGeneration(); } public boolean setAmbient(FloatBuffer newBuffer) { @@ -152,12 +153,12 @@ public class LightState implements ISettableState { } private boolean applyPosition(Vector4f raw) { - final int mvGen = GLStateManager.getMvGeneration(); + final int mvGen = GLSMMatrices.getMvGeneration(); if (!GLStateManager.isCachingEnabled() || this.posMvGeneration != mvGen || !this.rawPosition.equals(raw)) { this.rawPosition.set(raw); this.posMvGeneration = mvGen; this.position.set(raw); - this.position.mul(GLStateManager.getModelViewMatrix()); + this.position.mul(GLSMMatrices.getModelViewMatrix()); return true; } return false; @@ -175,11 +176,11 @@ public class LightState implements ISettableState { } private boolean applySpotDirection(Vector3f raw) { - final int mvLinearGen = GLStateManager.getMvLinearGeneration(); + final int mvLinearGen = GLSMMatrices.getMvLinearGeneration(); if (!GLStateManager.isCachingEnabled() || this.spotDirLinearGeneration != mvLinearGen || !this.rawSpotDirection.equals(raw)) { this.rawSpotDirection.set(raw); this.spotDirLinearGeneration = mvLinearGen; - GLStateManager.getModelViewMatrix().get3x3(matrix3f); + GLSMMatrices.getModelViewMatrix().get3x3(matrix3f); this.spotDirection.set(raw); this.spotDirection.mul(matrix3f); return true; diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java index c031354bc..ab98c1af9 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/states/MaterialState.java @@ -9,7 +9,7 @@ import org.joml.Vector4i; import java.nio.FloatBuffer; import java.nio.IntBuffer; -import static com.gtnewhorizons.angelica.glsm.GLStateManager.i2f; +import static com.gtnewhorizons.angelica.glsm.GLSMLighting.i2f; public class MaterialState implements ISettableState { diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/GlStreamingRing.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/GlStreamingRing.java index d2dd77ea3..420e3593d 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/GlStreamingRing.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/GlStreamingRing.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.streaming; import com.gtnewhorizons.angelica.config.SystemProperties; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import org.lwjgl.opengl.GL30; @@ -50,15 +51,15 @@ final class GlStreamingRing { static GlStreamingRing create(int target, int capacity, boolean forceOrphan) { if (forceOrphan || !RenderSystem.supportsBufferStorage()) return null; - final int id = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(target, id); + final int id = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(target, id); final int storageFlags = GL44.GL_MAP_PERSISTENT_BIT | GL30.GL_MAP_WRITE_BIT | GL44.GL_MAP_COHERENT_BIT | GL44.GL_CLIENT_STORAGE_BIT; RenderSystem.bufferStorage(target, capacity, storageFlags); final int mapFlags = GL44.GL_MAP_PERSISTENT_BIT | GL30.GL_MAP_WRITE_BIT | GL44.GL_MAP_COHERENT_BIT; - final ByteBuffer mapped = GLStateManager.glMapBufferRange(target, 0, capacity, mapFlags); - GLStateManager.glBindBuffer(target, 0); + final ByteBuffer mapped = GLSMBuffers.glMapBufferRange(target, 0, capacity, mapFlags); + GLSMBuffers.glBindBuffer(target, 0); if (mapped == null) { - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); GLStateManager.LOGGER.warn("Persistent map failed for streaming ring (target=0x{}, {} bytes)", Integer.toHexString(target), capacity); return null; } @@ -102,7 +103,7 @@ final class GlStreamingRing { private void fence() { if (pendingBytes > 0) { - fences.enqueue(GLStateManager.glFenceSync(GL32.GL_SYNC_GPU_COMMANDS_COMPLETE, 0), pendingBytes); + fences.enqueue(GLSMBuffers.glFenceSync(GL32.GL_SYNC_GPU_COMMANDS_COMPLETE, 0), pendingBytes); pendingBytes = 0; fencesIssued++; totalFencesIssued++; @@ -116,8 +117,8 @@ final class GlStreamingRing { private void reclaim() { while (!fences.isEmpty()) { final long fenceId = fences.firstId(); - if (!signaled(GLStateManager.glClientWaitSync(fenceId, 0, 0L))) break; - GLStateManager.glDeleteSync(fenceId); + if (!signaled(GLSMBuffers.glClientWaitSync(fenceId, 0, 0L))) break; + GLSMBuffers.glDeleteSync(fenceId); remaining += fences.firstBytes(); fences.dequeue(); } @@ -132,14 +133,14 @@ final class GlStreamingRing { long remainingNanos = SYNC_WAIT_TOTAL_NANOS; int status; do { - status = GLStateManager.glClientWaitSync(fenceId, GL32.GL_SYNC_FLUSH_COMMANDS_BIT, + status = GLSMBuffers.glClientWaitSync(fenceId, GL32.GL_SYNC_FLUSH_COMMANDS_BIT, Math.min(SYNC_WAIT_SLICE_NANOS, remainingNanos)); remainingNanos = deadline - System.nanoTime(); } while (status == GL32.GL_TIMEOUT_EXPIRED && remainingNanos > 0); if (!signaled(status)) { GLStateManager.LOGGER.warn("Streaming ring fence wait did not signal (status=0x{}); reclaiming anyway", Integer.toHexString(status)); } - GLStateManager.glDeleteSync(fenceId); + GLSMBuffers.glDeleteSync(fenceId); remaining += bytes; reclaim(); } @@ -161,14 +162,14 @@ final class GlStreamingRing { void destroy() { while (!fences.isEmpty()) { - GLStateManager.glDeleteSync(fences.firstId()); + GLSMBuffers.glDeleteSync(fences.firstId()); fences.dequeue(); } if (bufferId != 0) { - GLStateManager.glBindBuffer(target, bufferId); - GLStateManager.glUnmapBuffer(target); - GLStateManager.glBindBuffer(target, 0); - GLStateManager.glDeleteBuffers(bufferId); + GLSMBuffers.glBindBuffer(target, bufferId); + GLSMBuffers.glUnmapBuffer(target); + GLSMBuffers.glBindBuffer(target, 0); + GLSMBuffers.glDeleteBuffers(bufferId); bufferId = 0; } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/LineQuads.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/LineQuads.java index 1b30770c7..fe00582ec 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/LineQuads.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/LineQuads.java @@ -4,6 +4,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.ffp.VAOManager; import org.lwjgl.opengl.GL11; @@ -60,16 +61,16 @@ public final class LineQuads { } public static boolean disableCulling() { - final boolean wasEnabled = GLStateManager.getCullState().isEnabled(); + final boolean wasEnabled = GLSMRasterizer.getCullState().isEnabled(); if (wasEnabled) { - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); } return wasEnabled; } public static void restoreCulling(boolean wasEnabled) { if (wasEnabled) { - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java index 1def3853a..203e3893a 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/OrphanStreamingBuffer.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.glsm.streaming; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import org.lwjgl.opengl.GL15; import java.nio.ByteBuffer; @@ -14,19 +14,19 @@ public final class OrphanStreamingBuffer { private int capacity; public OrphanStreamingBuffer() { - this.bufferId = GLStateManager.glGenBuffers(); + this.bufferId = GLSMBuffers.glGenBuffers(); } public void upload(ByteBuffer data) { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId); capacity = StreamingUploader.upload(data, capacity); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } void upload(StreamingUploader.UploadStrategy strategy, ByteBuffer data) { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferId); capacity = StreamingUploader.upload(strategy, data, capacity); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } public int getCapacity() { @@ -39,7 +39,7 @@ public final class OrphanStreamingBuffer { public void destroy() { if (bufferId != 0) { - GLStateManager.glDeleteBuffers(bufferId); + GLSMBuffers.glDeleteBuffers(bufferId); bufferId = 0; } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java index cd6baf990..6303719f0 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingUploader.java @@ -1,5 +1,6 @@ package com.gtnewhorizons.angelica.glsm.streaming; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.GLStateManager; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL30; @@ -27,30 +28,30 @@ public final class StreamingUploader { public static int upload(UploadStrategy strategy, ByteBuffer data, int capacity) { switch (strategy) { case BUFFER_DATA -> { - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); return data.remaining(); } case BUFFER_SUB_DATA -> { if (data.remaining() > capacity) { - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); return data.remaining(); } - GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, data); + GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, data); return capacity; } case MAP_BUFFER_RANGE -> { if (data.remaining() > capacity) { - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); return data.remaining(); } final int dataSize = data.remaining(); - final long dst = GLStateManager.glMapBufferRangeAddress(GL15.GL_ARRAY_BUFFER, 0, dataSize, MAP_WRITE_INVALIDATE_BUFFER); + final long dst = GLSMBuffers.glMapBufferRangeAddress(GL15.GL_ARRAY_BUFFER, 0, dataSize, MAP_WRITE_INVALIDATE_BUFFER); if (dst == 0L) { - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); return data.remaining(); } memCopy(memAddress0(data), dst, dataSize); - GLStateManager.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); + GLSMBuffers.glUnmapBuffer(GL15.GL_ARRAY_BUFFER); return capacity; } default -> throw new UnsupportedOperationException(); diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorStreamingDrawer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorStreamingDrawer.java index f5ae36377..e27a7a01d 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorStreamingDrawer.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorStreamingDrawer.java @@ -7,6 +7,10 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement; import com.gtnewhorizons.angelica.config.SystemProperties; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.QuadConverter; import com.gtnewhorizons.angelica.glsm.RenderSystem; @@ -179,7 +183,7 @@ public class TessellatorStreamingDrawer { final int[] rawBuffer = tess.rawBuffer; final int defaultColor; if (!tess.hasColor) { - final var c = GLStateManager.getColor(); + final var c = GLSMCurrentAttribs.getColor(); defaultColor = ((int)(clamp(0f, 1f, c.getAlpha()) * 255) << 24) | ((int)(clamp(0f, 1f, c.getBlue()) * 255) << 16) | ((int)(clamp(0f, 1f, c.getGreen()) * 255) << 8) | (int)(clamp(0f, 1f, c.getRed()) * 255); } else { @@ -367,10 +371,10 @@ public class TessellatorStreamingDrawer { final boolean fromRing = firstVertex >= 0; if (fromRing) { - GLStateManager.glBindVertexArray(persistentVAOs[flags]); + GLSMVertexInput.glBindVertexArray(persistentVAOs[flags]); } else { if (Tracy.ENABLED && persistentBuffer != null) orphanFallbacks++; - GLStateManager.glBindVertexArray(orphanVAOs[flags]); + GLSMVertexInput.glBindVertexArray(orphanVAOs[flags]); orphanBuffers[flags].upload(packed); firstVertex = 0; } @@ -382,7 +386,7 @@ public class TessellatorStreamingDrawer { } drawWithQuadConversion(glCtx, drawMode, firstVertex, vertexCount); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } finally { if (locked) GLStateManager.releaseDrawLock(); Tracy.endZone(); @@ -403,7 +407,7 @@ public class TessellatorStreamingDrawer { } return true; } - if (GLStateManager.ffpWidensLineQuads()) { + if (GLSMDraws.ffpWidensLineQuads()) { final GLContextState glCtx = GLStateManager.ctx(); glCtx.lineQuadsActive = true; try { @@ -463,10 +467,10 @@ public class TessellatorStreamingDrawer { FfpExtendedAttribs.beginInternalDraw(); try { if (drawMode == GL11.GL_QUADS) { - GLStateManager.drawCalls++; + GLSMDraws.drawCalls++; QuadConverter.drawQuadsAsTriangles(glCtx, firstVertex, vertexCount); } else { - GLStateManager.glDrawArrays(drawMode, firstVertex, vertexCount); + GLSMDraws.glDrawArrays(drawMode, firstVertex, vertexCount); } } finally { FfpExtendedAttribs.endInternalDraw(); @@ -486,36 +490,36 @@ public class TessellatorStreamingDrawer { } if (firstVertex >= 0) { - GLStateManager.glBindVertexArray(vaos.extendedPersistent(layout)[flags]); + GLSMVertexInput.glBindVertexArray(vaos.extendedPersistent(layout)[flags]); } else { - GLStateManager.glBindVertexArray(vaos.extendedOrphan(layout)[flags]); + GLSMVertexInput.glBindVertexArray(vaos.extendedOrphan(layout)[flags]); orphanBuffers[flags].upload(combined); firstVertex = 0; } drawWithQuadConversion(glCtx, drawMode, firstVertex, vertexCount); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } private static void ensureExtendedVAOs(StreamingVaos vaos, int flags, VertexFormat format, int layout) { final int[] extendedOrphanVAOs = vaos.extendedOrphan(layout); final int[] extendedPersistentVAOs = vaos.extendedPersistent(layout); if (extendedOrphanVAOs[flags] == 0) { - extendedOrphanVAOs[flags] = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(extendedOrphanVAOs[flags]); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, orphanBuffers[flags].getBufferId()); + extendedOrphanVAOs[flags] = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(extendedOrphanVAOs[flags]); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, orphanBuffers[flags].getBufferId()); setupExtendedBufferState(format, layout); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); } if (persistentBuffer != null && extendedPersistentVAOs[flags] == 0) { - extendedPersistentVAOs[flags] = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(extendedPersistentVAOs[flags]); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, persistentBuffer.getBufferId()); + extendedPersistentVAOs[flags] = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(extendedPersistentVAOs[flags]); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, persistentBuffer.getBufferId()); setupExtendedBufferState(format, layout); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); } } @@ -606,19 +610,19 @@ public class TessellatorStreamingDrawer { if (orphanBuffers[flags] == null) orphanBuffers[flags] = new OrphanStreamingBuffer(); if (orphanVAOs[flags] == 0) { - orphanVAOs[flags] = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(orphanVAOs[flags]); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, orphanBuffers[flags].getBufferId()); + orphanVAOs[flags] = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(orphanVAOs[flags]); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, orphanBuffers[flags].getBufferId()); format.setupBufferState(0L); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } if (persistentBuffer != null && persistentVAOs[flags] == 0) { - persistentVAOs[flags] = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(persistentVAOs[flags]); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, persistentBuffer.getBufferId()); + persistentVAOs[flags] = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(persistentVAOs[flags]); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, persistentBuffer.getBufferId()); format.setupBufferState(0L); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/UniformRingBuffer.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/UniformRingBuffer.java index 43aeb0c24..c8de05b65 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/UniformRingBuffer.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/streaming/UniformRingBuffer.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.glsm.streaming; import com.gtnewhorizons.angelica.config.SystemProperties; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL31; @@ -34,10 +34,10 @@ public final class UniformRingBuffer { this.stride = (blockSize + OFFSET_ALIGNMENT - 1) & -OFFSET_ALIGNMENT; this.ring = GlStreamingRing.create(GL31.GL_UNIFORM_BUFFER, capacity, forceOrphan); if (ring == null) { - orphanBufferId = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, orphanBufferId); - GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, capacity, GL15.GL_STREAM_DRAW); - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, 0); + orphanBufferId = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, orphanBufferId); + GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, capacity, GL15.GL_STREAM_DRAW); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, 0); } } @@ -55,20 +55,20 @@ public final class UniformRingBuffer { } private int writeOrphan(long srcAddress) { - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, orphanBufferId); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, orphanBufferId); int offset = writePos; if (offset + stride > capacity) { - GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, capacity, GL15.GL_STREAM_DRAW); + GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, capacity, GL15.GL_STREAM_DRAW); offset = 0; orphanWraps++; } - final long dst = GLStateManager.glMapBufferRangeAddress(GL31.GL_UNIFORM_BUFFER, offset, blockSize, GL30.GL_MAP_WRITE_BIT | GL30.GL_MAP_INVALIDATE_RANGE_BIT | GL30.GL_MAP_UNSYNCHRONIZED_BIT); + final long dst = GLSMBuffers.glMapBufferRangeAddress(GL31.GL_UNIFORM_BUFFER, offset, blockSize, GL30.GL_MAP_WRITE_BIT | GL30.GL_MAP_INVALIDATE_RANGE_BIT | GL30.GL_MAP_UNSYNCHRONIZED_BIT); if (dst == 0L) { throw new IllegalStateException("mapBufferRange failed on uniform ring (offset=" + offset + ")"); } memCopy(srcAddress, dst, blockSize); - GLStateManager.glUnmapBuffer(GL31.GL_UNIFORM_BUFFER); - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, 0); + GLSMBuffers.glUnmapBuffer(GL31.GL_UNIFORM_BUFFER); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, 0); writePos = offset + stride; return offset; } @@ -91,7 +91,7 @@ public final class UniformRingBuffer { if (ring != null) { ring.destroy(); } else if (orphanBufferId != 0) { - GLStateManager.glDeleteBuffers(orphanBufferId); + GLSMBuffers.glDeleteBuffers(orphanBufferId); orphanBufferId = 0; } } diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java index 05cb16954..ea5e3e359 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfo.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.glsm.texture; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import lombok.Getter; import lombok.Setter; @@ -126,14 +126,14 @@ public class TextureInfo { } private int queryParameteri(int pname) { - if (GLStateManager.getBoundTextureForServerState() == id) { + if (GLSMTextures.getBoundTextureForServerState() == id) { return RENDER_BACKEND.getTexParameteri(target, pname); } return RENDER_BACKEND.getTextureParameteri(id, target, pname); } private float queryParameterf(int pname) { - if (GLStateManager.getBoundTextureForServerState() == id) { + if (GLSMTextures.getBoundTextureForServerState() == id) { return RENDER_BACKEND.getTexParameterf(target, pname); } return RENDER_BACKEND.getTextureParameterf(id, target, pname); diff --git a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java index 6cf835311..5ce59d198 100644 --- a/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java +++ b/glsm/src/main/java/com/gtnewhorizons/angelica/glsm/texture/TextureInfoCache.java @@ -1,5 +1,6 @@ package com.gtnewhorizons.angelica.glsm.texture; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -86,15 +87,15 @@ public class TextureInfoCache { } public void onTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, @Nullable Buffer pixels) { - if (isTrackedTarget(target) && level == 0) defineLevelZero(GLStateManager.getBoundTextureForServerState(), target, internalformat, width, height); + if (isTrackedTarget(target) && level == 0) defineLevelZero(GLSMTextures.getBoundTextureForServerState(), target, internalformat, width, height); } public void onTexImage2D(int target, int level, int internalformat, int width, int height, int border, int format, int type, long pixels_buffer_offset) { - if (isTrackedTarget(target) && level == 0) defineLevelZero(GLStateManager.getBoundTextureForServerState(), target, internalformat, width, height); + if (isTrackedTarget(target) && level == 0) defineLevelZero(GLSMTextures.getBoundTextureForServerState(), target, internalformat, width, height); } public void onCopyTexImage2D(int target, int level, int internalformat, int width, int height) { - if (isTrackedTarget(target) && level == 0) defineLevelZero(GLStateManager.getBoundTextureForServerState(), target, internalformat, width, height); + if (isTrackedTarget(target) && level == 0) defineLevelZero(GLSMTextures.getBoundTextureForServerState(), target, internalformat, width, height); } public void onTextureImage2D(int texture, int target, int level, int internalformat, int width, int height) { @@ -102,11 +103,11 @@ public class TextureInfoCache { } public void onTexStorage2D(int target, int internalformat, int width, int height) { - if (isTrackedTarget(target)) defineLevelZero(GLStateManager.getBoundTextureForServerState(), target, internalformat, width, height); + if (isTrackedTarget(target)) defineLevelZero(GLSMTextures.getBoundTextureForServerState(), target, internalformat, width, height); } public void onTexSubImage2D(int target, int level) { - if (isTrackedTarget(target) && level == 0) onContentsChanged(GLStateManager.getBoundTextureForServerState()); + if (isTrackedTarget(target) && level == 0) onContentsChanged(GLSMTextures.getBoundTextureForServerState()); } public static boolean isGenericCompressedInternalFormat(int internalFormat) { diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ArrayUniformUploadGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ArrayUniformUploadGLTest.java index f6130ee01..e1f9712b1 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ArrayUniformUploadGLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ArrayUniformUploadGLTest.java @@ -29,7 +29,7 @@ class ArrayUniformUploadGLTest { for (int i = 0; i < 20; i++) buf.put(i + 1.0f); // 1..20, all distinct, all non-zero buf.flip(); - GLStateManager.glUniform2(GL20.glGetUniformLocation(p, "cosmicuvs"), buf); + GLSMPrograms.glUniform2(GL20.glGetUniformLocation(p, "cosmicuvs"), buf); final FloatBuffer read = BufferUtils.createFloatBuffer(2); for (int i = 0; i < 10; i++) { @@ -42,7 +42,7 @@ class ArrayUniformUploadGLTest { } } finally { GL20.glUseProgram(0); - GLStateManager.glDeleteProgram(p); + GLSMPrograms.glDeleteProgram(p); } } @@ -59,7 +59,7 @@ class ArrayUniformUploadGLTest { final IntBuffer buf = BufferUtils.createIntBuffer(4); buf.put(11).put(22).put(33).put(44).flip(); - GLStateManager.glUniform1(GL20.glGetUniformLocation(p, "vals"), buf); + GLSMPrograms.glUniform1(GL20.glGetUniformLocation(p, "vals"), buf); final IntBuffer read = BufferUtils.createIntBuffer(1); final int[] expect = {11, 22, 33, 44}; @@ -72,7 +72,7 @@ class ArrayUniformUploadGLTest { } } finally { GL20.glUseProgram(0); - GLStateManager.glDeleteProgram(p); + GLSMPrograms.glDeleteProgram(p); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java index f328cd9ad..fb4031d7c 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/CompatUniformManagerTest.java @@ -21,7 +21,7 @@ class CompatUniformManagerTest { void cleanup() { if (program != 0) { GL20.glUseProgram(0); - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glDeleteProgram(program); program = 0; } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationParityTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationParityTest.java index 73e2ad043..100cd380a 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationParityTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationParityTest.java @@ -19,15 +19,15 @@ class DisplayListCompilationParityTest { enum Caller { GLSM { - void newList(int list, int mode) { GLStateManager.glNewList(list, mode); } - void endList() { GLStateManager.glEndList(); } - void callList(int list) { GLStateManager.glCallList(list); } - void enable(int cap) { GLStateManager.glEnable(cap); } - void translate(float x, float y, float z) { GLStateManager.glTranslatef(x, y, z); } - void pushMatrix() { GLStateManager.glPushMatrix(); } - void popMatrix() { GLStateManager.glPopMatrix(); } - void matrixMode(int mode) { GLStateManager.glMatrixMode(mode); } - void getFloat(int pname, FloatBuffer dst) { GLStateManager.glGetFloat(pname, dst); } + void newList(int list, int mode) { GLSMDraws.glNewList(list, mode); } + void endList() { GLSMDraws.glEndList(); } + void callList(int list) { GLSMDraws.glCallList(list); } + void enable(int cap) { GLSMEnable.glEnable(cap); } + void translate(float x, float y, float z) { GLSMMatrices.glTranslatef(x, y, z); } + void pushMatrix() { GLSMMatrices.glPushMatrix(); } + void popMatrix() { GLSMMatrices.glPopMatrix(); } + void matrixMode(int mode) { GLSMMatrices.glMatrixMode(mode); } + void getFloat(int pname, FloatBuffer dst) { GLSMQueries.glGetFloat(pname, dst); } void flushMatrix() { DisplayListManager.flushMatrix(); } }, RAW { @@ -68,35 +68,35 @@ class DisplayListCompilationParityTest { @BeforeEach void setup() { if (DisplayListManager.isRecording()) { - try { GLStateManager.glEndList(); } catch (Exception ignored) {} + try { GLSMDraws.glEndList(); } catch (Exception ignored) {} } - GLStateManager.disableBlend(); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); GL11.glDisable(GL11.GL_BLEND); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDisable(GL11.GL_CULL_FACE); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); } @AfterEach void cleanup() { if (DisplayListManager.isRecording()) { - try { GLStateManager.glEndList(); } catch (Exception ignored) {} + try { GLSMDraws.glEndList(); } catch (Exception ignored) {} } if (testList > 0) { - GLStateManager.glDeleteLists(testList, 1); + GLSMDraws.glDeleteLists(testList, 1); testList = -1; } - GLStateManager.disableBlend(); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); GL11.glDisable(GL11.GL_BLEND); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDisable(GL11.GL_CULL_FACE); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); } @ParameterizedTest diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationTest.java index ebdd08eab..e4c73acfe 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListCompilationTest.java @@ -21,73 +21,73 @@ class DisplayListCompilationTest { @BeforeEach void setup() { if (DisplayListManager.isRecording()) { - try { GLStateManager.glEndList(); } catch (Exception ignored) {} + try { GLSMDraws.glEndList(); } catch (Exception ignored) {} } - GLStateManager.disableBlend(); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); } @AfterEach void cleanup() { if (DisplayListManager.isRecording()) { - try { GLStateManager.glEndList(); } catch (Exception ignored) {} + try { GLSMDraws.glEndList(); } catch (Exception ignored) {} } if (testList > 0) { - GLStateManager.glDeleteLists(testList, 1); + GLSMDraws.glDeleteLists(testList, 1); testList = -1; } - GLStateManager.disableBlend(); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); } @Test void glsm_compileAndExecute_matrixModeWithTransforms() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE_AND_EXECUTE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE_AND_EXECUTE); - GLStateManager.glTranslatef(10, 0, 0); - GLStateManager.glRotatef(45, 0, 1, 0); + GLSMMatrices.glTranslatef(10, 0, 0); + GLSMMatrices.glRotatef(45, 0, 1, 0); DisplayListManager.flushMatrix(); assertNotEquals(0.0f, matrix(GL11.GL_MODELVIEW_MATRIX).get(12), "After transforms: applied immediately"); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); assertEquals(0.0f, matrix(GL11.GL_PROJECTION_MATRIX).get(12), 0.001f, "PROJECTION still identity"); - GLStateManager.glEndList(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMDraws.glEndList(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } @Test void glsm_unsupportedOpInList_abortsCleanly() { testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); assertTrue(DisplayListManager.isRecording(), "recording after glNewList"); - assertThrows(UnsupportedOperationException.class, () -> GLStateManager.glReadBuffer(GL11.GL_FRONT)); + assertThrows(UnsupportedOperationException.class, () -> GLSMFramebuffer.glReadBuffer(GL11.GL_FRONT)); assertFalse(DisplayListManager.isRecording(), "recording state must be reset after an in-list throw"); assertEquals(DisplayListManager.RecordMode.NONE, DisplayListManager.getRecordMode()); - assertDoesNotThrow(() -> GLStateManager.glReadBuffer(GL11.GL_FRONT)); - assertDoesNotThrow(GLStateManager::glEndList); - GLStateManager.glReadBuffer(GL11.GL_BACK); + assertDoesNotThrow(() -> GLSMFramebuffer.glReadBuffer(GL11.GL_FRONT)); + assertDoesNotThrow(GLSMDraws::glEndList); + GLSMFramebuffer.glReadBuffer(GL11.GL_BACK); } @Test void glsm_abortIfLeaked_recoversOpenList() { testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); assertTrue(DisplayListManager.isRecording()); DisplayListManager.abortIfLeaked(); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListMatrixRestorationTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListMatrixRestorationTest.java index 5d5219529..81bb4c774 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListMatrixRestorationTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListMatrixRestorationTest.java @@ -19,14 +19,14 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture { for (int target : new int[] { GL11.GL_MODELVIEW, GL11.GL_PROJECTION, GL11.GL_TEXTURE }) { resetMatrices(); int list = newList(); - GLStateManager.glNewList(list, compileMode); - GLStateManager.glMatrixMode(target); - GLStateManager.glScalef(-2, 3, -4); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, compileMode); + GLSMMatrices.glMatrixMode(target); + GLSMMatrices.glScalef(-2, 3, -4); + GLSMDraws.glEndList(); resetMatrices(); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); FloatBuffer matrix = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(switch (target) { + GLSMQueries.glGetFloat(switch (target) { case GL11.GL_PROJECTION -> GL11.GL_PROJECTION_MATRIX; case GL11.GL_TEXTURE -> GL11.GL_TEXTURE_MATRIX; default -> GL11.GL_MODELVIEW_MATRIX; @@ -42,15 +42,15 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture { @AfterEach void resetMatrices() { for (int unit = 0; unit < 2; unit++) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); } private static float translation(int target) { @@ -62,23 +62,23 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture { for (int mask : new int[] { GL11.GL_TRANSFORM_BIT, GL11.GL_ALL_ATTRIB_BITS }) { for (int compileMode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) { int list = newList(); - GLStateManager.glNewList(list, compileMode); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glPushAttrib(mask); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(3, 0, 0); - GLStateManager.glPopAttrib(); - GLStateManager.glLoadIdentity(); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, compileMode); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMAttribStack.glPushAttrib(mask); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(3, 0, 0); + GLSMAttribStack.glPopAttrib(); + GLSMMatrices.glLoadIdentity(); + GLSMDraws.glEndList(); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(9, 0, 0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(5, 0, 0); - GLStateManager.glCallList(list); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(9, 0, 0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(5, 0, 0); + GLSMDraws.glCallList(list); assertEquals(3f, translation(GL11.GL_MODELVIEW_MATRIX)); assertEquals(0f, translation(GL11.GL_TEXTURE_MATRIX)); } @@ -88,46 +88,46 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture { @Test void nestedAttributesRestoreInheritedCallerMode() { int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glPushAttrib(GL11.GL_TRANSFORM_BIT); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPopAttrib(); - GLStateManager.glLoadIdentity(); - GLStateManager.glPopAttrib(); - GLStateManager.glLoadIdentity(); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMAttribStack.glPushAttrib(GL11.GL_TRANSFORM_BIT); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMAttribStack.glPopAttrib(); + GLSMMatrices.glLoadIdentity(); + GLSMAttribStack.glPopAttrib(); + GLSMMatrices.glLoadIdentity(); + GLSMDraws.glEndList(); - GLStateManager.glTranslatef(5, 0, 0); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glTranslatef(7, 0, 0); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glTranslatef(9, 0, 0); - GLStateManager.glCallList(list); + GLSMMatrices.glTranslatef(5, 0, 0); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glTranslatef(7, 0, 0); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glTranslatef(9, 0, 0); + GLSMDraws.glCallList(list); assertEquals(5f, translation(GL11.GL_MODELVIEW_MATRIX)); assertEquals(0f, translation(GL11.GL_PROJECTION_MATRIX)); assertEquals(0f, translation(GL11.GL_TEXTURE_MATRIX)); - assertEquals(GL11.GL_TEXTURE, GLStateManager.glGetInteger(GL11.GL_MATRIX_MODE)); + assertEquals(GL11.GL_TEXTURE, GLSMQueries.glGetInteger(GL11.GL_MATRIX_MODE)); } @Test void implicitMatrixCommandsAndEmptyListsInheritCallerTarget() { int empty = newList(); - GLStateManager.glNewList(empty, GL11.GL_COMPILE); - GLStateManager.glEndList(); + GLSMDraws.glNewList(empty, GL11.GL_COMPILE); + GLSMDraws.glEndList(); int load = newList(); - GLStateManager.glNewList(load, GL11.GL_COMPILE); - GLStateManager.glLoadIdentity(); - GLStateManager.glEndList(); - GLStateManager.glTranslatef(5, 0, 0); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glTranslatef(9, 0, 0); - GLStateManager.glCallList(empty); - assertEquals(GL11.GL_TEXTURE, GLStateManager.glGetInteger(GL11.GL_MATRIX_MODE)); + GLSMDraws.glNewList(load, GL11.GL_COMPILE); + GLSMMatrices.glLoadIdentity(); + GLSMDraws.glEndList(); + GLSMMatrices.glTranslatef(5, 0, 0); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glTranslatef(9, 0, 0); + GLSMDraws.glCallList(empty); + assertEquals(GL11.GL_TEXTURE, GLSMQueries.glGetInteger(GL11.GL_MATRIX_MODE)); assertEquals(9f, translation(GL11.GL_TEXTURE_MATRIX)); - GLStateManager.glCallList(load); - assertEquals(GL11.GL_TEXTURE, GLStateManager.glGetInteger(GL11.GL_MATRIX_MODE)); + GLSMDraws.glCallList(load); + assertEquals(GL11.GL_TEXTURE, GLSMQueries.glGetInteger(GL11.GL_MATRIX_MODE)); assertEquals(0f, translation(GL11.GL_TEXTURE_MATRIX)); assertEquals(5f, translation(GL11.GL_MODELVIEW_MATRIX)); } @@ -135,14 +135,14 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture { @Test void explicitInitialModelviewSurvivesReplayFromTexture() { int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glEndList(); - GLStateManager.glTranslatef(5, 0, 0); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glTranslatef(9, 0, 0); - GLStateManager.glCallList(list); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMDraws.glEndList(); + GLSMMatrices.glTranslatef(5, 0, 0); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glTranslatef(9, 0, 0); + GLSMDraws.glCallList(list); assertEquals(0f, translation(GL11.GL_MODELVIEW_MATRIX)); assertEquals(9f, translation(GL11.GL_TEXTURE_MATRIX)); } @@ -153,16 +153,16 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture { for (int compileMode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) { resetMatrices(); int list = newList(); - GLStateManager.glNewList(list, compileMode); - GLStateManager.glTranslatef(5, 0, 0); - GLStateManager.glMatrixMode(explicitTarget); - GLStateManager.glTranslatef(7, 0, 0); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, compileMode); + GLSMMatrices.glTranslatef(5, 0, 0); + GLSMMatrices.glMatrixMode(explicitTarget); + GLSMMatrices.glTranslatef(7, 0, 0); + GLSMDraws.glEndList(); for (int callerTarget : new int[] { GL11.GL_MODELVIEW, GL11.GL_PROJECTION, GL11.GL_TEXTURE }) { resetMatrices(); - GLStateManager.glMatrixMode(callerTarget); - GLStateManager.glCallList(list); + GLSMMatrices.glMatrixMode(callerTarget); + GLSMDraws.glCallList(list); String context = "compileMode=" + compileMode + ", callerTarget=" + callerTarget; assertEquals((callerTarget == GL11.GL_MODELVIEW ? 5f : 0f) + (explicitTarget == GL11.GL_MODELVIEW ? 7f : 0f), translation(GL11.GL_MODELVIEW_MATRIX), context); @@ -180,27 +180,27 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture { for (int compileMode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) { resetMatrices(); int list = newList(); - GLStateManager.glNewList(list, compileMode); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glPushAttrib(mask); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glTranslatef(7, 0, 0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glTranslatef(3, 0, 0); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.glPopAttrib(); - GLStateManager.glPopAttrib(); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, compileMode); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMAttribStack.glPushAttrib(mask); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glTranslatef(7, 0, 0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glTranslatef(3, 0, 0); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMAttribStack.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); + GLSMDraws.glEndList(); resetMatrices(); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); String context = "compileMode=" + compileMode; - assertEquals(GL13.GL_TEXTURE0, GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE), context); + assertEquals(GL13.GL_TEXTURE0, GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE), context); assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), context); assertEquals(3f, translation(GL11.GL_MODELVIEW_MATRIX), context); assertEquals(0f, translation(GL11.GL_TEXTURE_MATRIX), context); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); assertEquals(7f, translation(GL11.GL_TEXTURE_MATRIX), context); } } @@ -208,38 +208,38 @@ class DisplayListMatrixRestorationTest extends DisplayListTestFixture { @Test void pendingTextureTransformStaysOnOriginalUnit() { int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glTranslatef(7, 0, 0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glEndList(); - GLStateManager.glCallList(list); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glTranslatef(7, 0, 0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMDraws.glEndList(); + GLSMDraws.glCallList(list); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); assertEquals(7f, translation(GL11.GL_TEXTURE_MATRIX)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); assertEquals(0f, translation(GL11.GL_TEXTURE_MATRIX)); } @Test void explicitModeAfterNestedListIsNotDeduplicated() { int child = newList(); - GLStateManager.glNewList(child, GL11.GL_COMPILE); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glTranslatef(5, 0, 0); - GLStateManager.glEndList(); + GLSMDraws.glNewList(child, GL11.GL_COMPILE); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glTranslatef(5, 0, 0); + GLSMDraws.glEndList(); int parent = newList(); - GLStateManager.glNewList(parent, GL11.GL_COMPILE); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glCallList(child); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glEndList(); - GLStateManager.glCallList(parent); + GLSMDraws.glNewList(parent, GL11.GL_COMPILE); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMDraws.glCallList(child); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMDraws.glEndList(); + GLSMDraws.glCallList(parent); assertEquals(5f, translation(GL11.GL_MODELVIEW_MATRIX)); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java index f1f5d7a92..bedbb2555 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/DisplayListTestHelper.java @@ -62,9 +62,9 @@ public final class DisplayListTestHelper { public static CompiledDisplayList createDisplayList(Runnable runnable) { int list = GL11.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); runnable.run(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); CompiledDisplayList compiled = DisplayListManager.getDisplayList(list); assertNotNull(compiled, "Display list should be compiled"); return compiled; @@ -72,13 +72,13 @@ public final class DisplayListTestHelper { /** Calls {@code list} on an identity modelview and returns the resulting matrix. The caller's matrix is restored. */ public static FloatBuffer modelviewAfterCall(int list) { - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); try { - GLStateManager.glLoadIdentity(); - GLStateManager.glCallList(list); + GLSMMatrices.glLoadIdentity(); + GLSMDraws.glCallList(list); return GlTestSupport.modelview(); } finally { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } } @@ -96,12 +96,12 @@ public final class DisplayListTestHelper { /** Immediate-mode quad from the origin to (size, size) at z = 0. */ public static void immediateQuad(float size) { - GLStateManager.glBegin(GL11.GL_QUADS); - GLStateManager.glVertex3f(0.0f, 0.0f, 0.0f); - GLStateManager.glVertex3f(size, 0.0f, 0.0f); - GLStateManager.glVertex3f(size, size, 0.0f); - GLStateManager.glVertex3f(0.0f, size, 0.0f); - GLStateManager.glEnd(); + GLSMDraws.glBegin(GL11.GL_QUADS); + GLSMDraws.glVertex3f(0.0f, 0.0f, 0.0f); + GLSMDraws.glVertex3f(size, 0.0f, 0.0f); + GLSMDraws.glVertex3f(size, size, 0.0f); + GLSMDraws.glVertex3f(0.0f, size, 0.0f); + GLSMDraws.glEnd(); } /** Textured quad written straight into the vanilla Tessellator's raw buffer and handed to the draw interceptor. */ diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java index fb2956ab0..5ebc5630f 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/FeedbackManagerTest.java @@ -120,28 +120,28 @@ class FeedbackManagerTest { } private static int feedbackDraw(int mode, float... verts) { - GLStateManager.getModelViewMatrix().identity(); - GLStateManager.getProjectionMatrix().identity(); - GLStateManager.getViewportState().setViewPort(0, 0, 800, 600); - GLStateManager.getViewportState().setDepthRange(0.0, 1.0); + GLSMMatrices.getModelViewMatrix().identity(); + GLSMMatrices.getProjectionMatrix().identity(); + GLSMRasterizer.getViewportState().setViewPort(0, 0, 800, 600); + GLSMRasterizer.getViewportState().setDepthRange(0.0, 1.0); final int vao = GL30.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); + GLSMVertexInput.glBindVertexArray(vao); final FloatBuffer vertBuf = BufferUtils.createFloatBuffer(verts.length); vertBuf.put(verts).flip(); final int vbo = GL15.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertBuf, GL15.GL_STATIC_DRAW); - GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0); - GLStateManager.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0); + GLSMVertexInput.glEnableVertexAttribArray(0); try { FeedbackManager.processDrawArrays(mode, 0, verts.length / 3); return FeedbackManager.glRenderMode(GL11.GL_RENDER); } finally { - GLStateManager.glDisableVertexAttribArray(0); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glDisableVertexAttribArray(0); + GLSMVertexInput.glBindVertexArray(0); GL15.glDeleteBuffers(vbo); - GLStateManager.glDeleteVertexArrays(vao); + GLSMVertexInput.glDeleteVertexArrays(vao); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendFuncUnknownState_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendFuncUnknownState_GLTest.java index 40b41a1c3..902b0ce1d 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendFuncUnknownState_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendFuncUnknownState_GLTest.java @@ -27,13 +27,13 @@ class GLSM_BlendFuncUnknownState_GLTest { @AfterEach void restoreDefaultBlendFunc() { if (!RenderSystem.supportsBufferBlending()) return; - GLStateManager.tryBlendFuncSeparate(GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ZERO); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ZERO); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); } private static void seedVanillaSeparate() { - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE); - GLStateManager.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE); + GLSMBlend.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA); } private static void overrideBufferZero() { @@ -52,7 +52,7 @@ class GLSM_BlendFuncUnknownState_GLTest { for (int buffer = 0; buffer < 2; buffer++) { assertBufferBlend(buffer, VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA); } - assertFalse(GLStateManager.getBlendState().isFuncUnknown(), "forward must clear the unknown flag"); + assertFalse(GLSMBlend.getBlendState().isFuncUnknown(), "forward must clear the unknown flag"); } @Test @@ -60,34 +60,34 @@ class GLSM_BlendFuncUnknownState_GLTest { seedVanillaSeparate(); overrideBufferZero(); - GLStateManager.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA); + GLSMBlend.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA); assertVanillaOnBothBuffers(); } @Test void glBlendFuncForwardsAfterIndexedOverride() { - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); overrideBufferZero(); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); for (int buffer = 0; buffer < 2; buffer++) { assertBufferBlend(buffer, GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); } - assertFalse(GLStateManager.getBlendState().isFuncUnknown(), "forward must clear the unknown flag"); + assertFalse(GLSMBlend.getBlendState().isFuncUnknown(), "forward must clear the unknown flag"); } @Test void popAttribForwardsAfterIndexedOverride() { seedVanillaSeparate(); - GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); try { overrideBufferZero(); } finally { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } assertVanillaOnBothBuffers(); @@ -95,20 +95,20 @@ class GLSM_BlendFuncUnknownState_GLTest { @Test void displayListReplayForwardsAfterIndexedOverride() { - final int list = GLStateManager.glGenLists(1); + final int list = GLSMDraws.glGenLists(1); try { - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMBlend.tryBlendFuncSeparate(VANILLA_SRC_RGB, VANILLA_DST_RGB, VANILLA_SRC_ALPHA, VANILLA_DST_ALPHA); + GLSMDraws.glEndList(); seedVanillaSeparate(); overrideBufferZero(); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertVanillaOnBothBuffers(); } finally { - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java index f9ba711cc..ad0f56e8b 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_BlendUnknownState_UnitTest.java @@ -33,20 +33,20 @@ class GLSM_BlendUnknownState_UnitTest { @Test void testSetUnknownStateForcesCacheBypass() { // Enable blend via GLSM — both cache and GL should agree - GLStateManager.enableBlend(); + GLSMBlend.enableBlend(); assertTrue(GL11.glIsEnabled(GL11.GL_BLEND), "GL blend should be enabled"); - assertTrue(GLStateManager.getBlendMode().isEnabled(), "GLSM blend cache should be enabled"); + assertTrue(GLSMBlend.getBlendMode().isEnabled(), "GLSM blend cache should be enabled"); // Simulate a per-buffer disable that bypasses the cache (as glDisablei does) GL30.glDisablei(GL11.GL_BLEND, 0); - GLStateManager.getBlendMode().setUnknownState(); + GLSMBlend.getBlendMode().setUnknownState(); // Cache still says enabled, but GL state for buffer 0 is now disabled - assertTrue(GLStateManager.getBlendMode().isEnabled(), "GLSM cache should still say enabled"); + assertTrue(GLSMBlend.getBlendMode().isEnabled(), "GLSM cache should still say enabled"); // Re-enable blend via GLSM — without setUnknownState, this would be a no-op // because the cache thinks blend is already enabled - GLStateManager.enableBlend(); + GLSMBlend.enableBlend(); // Per GL spec, glEnable(GL_BLEND) enables blend for ALL draw buffers, // overriding any per-buffer disables @@ -72,9 +72,9 @@ class GLSM_BlendUnknownState_UnitTest { private static void setBlend(boolean enabled) { if (enabled) { - GLStateManager.enableBlend(); + GLSMBlend.enableBlend(); } else { - GLStateManager.disableBlend(); + GLSMBlend.disableBlend(); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ClientArrays_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ClientArrays_GLTest.java index 0e5e2d40b..d1c258ce6 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ClientArrays_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ClientArrays_GLTest.java @@ -42,17 +42,17 @@ public class GLSM_ClientArrays_GLTest { @BeforeEach void bindFreshVertexArray() { - savedVao = GLStateManager.getBoundVAO(); - vao = GLStateManager.glGenVertexArrays(); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindVertexArray(vao); + savedVao = GLSMVertexInput.getBoundVAO(); + vao = GLSMVertexInput.glGenVertexArrays(); + vbo = GLSMBuffers.glGenBuffers(); + GLSMVertexInput.glBindVertexArray(vao); } @AfterEach void deleteVertexArray() { - GLStateManager.glBindVertexArray(savedVao); - GLStateManager.glDeleteVertexArrays(vao); - GLStateManager.glDeleteBuffers(vbo); + GLSMVertexInput.glBindVertexArray(savedVao); + GLSMVertexInput.glDeleteVertexArrays(vao); + GLSMBuffers.glDeleteBuffers(vbo); } private static boolean attribHasSize3(Usage usage) { @@ -76,10 +76,10 @@ public class GLSM_ClientArrays_GLTest { } private static void assertClientArray(String name, int sizePname, int size, int typePname, int type, int stridePname, int stride, int bindingPname, int binding) { - if (sizePname != 0) assertEquals(size, GLStateManager.glGetInteger(sizePname), name + " size"); - if (typePname != 0) assertEquals(type, GLStateManager.glGetInteger(typePname), name + " type"); - assertEquals(stride, GLStateManager.glGetInteger(stridePname), name + " stride"); - assertEquals(binding, GLStateManager.glGetInteger(bindingPname), name + " buffer binding"); + if (sizePname != 0) assertEquals(size, GLSMQueries.glGetInteger(sizePname), name + " size"); + if (typePname != 0) assertEquals(type, GLSMQueries.glGetInteger(typePname), name + " type"); + assertEquals(stride, GLSMQueries.glGetInteger(stridePname), name + " stride"); + assertEquals(binding, GLSMQueries.glGetInteger(bindingPname), name + " buffer binding"); } private static void assertVertexArray(String name, int size, int type, int stride, int binding) { @@ -95,79 +95,79 @@ public class GLSM_ClientArrays_GLTest { void vertexArrayStateRestoredOnlyWithVertexArrayBit() { final int position = Usage.POSITION.getAttributeLocation(); try { - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); final int flagsBefore = GLStateManager.ctx().vaos.getVertexFlags(); assertFalse(positionArrayEnabled()); assertFalse(colorArrayEnabled()); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glEnableClientState(GL11.GL_COLOR_ARRAY); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glEnableClientState(GL11.GL_COLOR_ARRAY); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); assertTrue(positionArrayEnabled()); assertTrue(colorArrayEnabled()); - GLStateManager.glPopClientAttrib(); + GLSMAttribStack.glPopClientAttrib(); assertFalse(positionArrayEnabled(), "pop disables an array enabled inside the push"); assertEquals(GL11.GL_FALSE, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED)); assertFalse(colorArrayEnabled()); assertEquals(flagsBefore, GLStateManager.ctx().vaos.getVertexFlags()); - assertEquals(0, GLStateManager.getClientActiveTextureUnit()); + assertEquals(0, GLSMTextures.getClientActiveTextureUnit()); - GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glPopClientAttrib(); + GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY); + GLSMAttribStack.glPopClientAttrib(); assertTrue(positionArrayEnabled(), "pop re-enables an array disabled inside the push"); assertEquals(GL11.GL_TRUE, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED)); - GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT); - GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glEnableClientState(GL11.GL_COLOR_ARRAY); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glPopClientAttrib(); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT); + GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glEnableClientState(GL11.GL_COLOR_ARRAY); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); + GLSMAttribStack.glPopClientAttrib(); assertTrue(positionArrayEnabled(), "a pixel-store push must not restore array enables"); assertTrue(colorArrayEnabled()); - assertEquals(1, GLStateManager.getClientActiveTextureUnit()); + assertEquals(1, GLSMTextures.getClientActiveTextureUnit()); } finally { drainClientAttribStack(); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glDisableClientState(GL11.GL_COLOR_ARRAY); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glDisableClientState(GL11.GL_COLOR_ARRAY); } } @Test void clientActiveTextureRoundTrips() { try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - assertEquals(GLStateManager.MAX_TEXTURE_COORDS, GLStateManager.glGetInteger(GL20.GL_MAX_TEXTURE_COORDS)); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + assertEquals(GLStateManager.MAX_TEXTURE_COORDS, GLSMQueries.glGetInteger(GL20.GL_MAX_TEXTURE_COORDS)); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); - assertEquals(GL13.GL_TEXTURE1, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); - GLStateManager.glClientActiveTexture(0); - assertEquals(GL13.GL_TEXTURE1, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_UNITS); - assertEquals(GL13.GL_TEXTURE1, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_COORDS); - assertEquals(GL13.GL_TEXTURE1, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE), "units past GL_MAX_TEXTURE_COORDS are rejected"); - assertEquals(1, GLStateManager.getClientActiveTextureUnit()); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); + assertEquals(GL13.GL_TEXTURE1, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); + GLSMTextures.glClientActiveTexture(0); + assertEquals(GL13.GL_TEXTURE1, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_UNITS); + assertEquals(GL13.GL_TEXTURE1, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_COORDS); + assertEquals(GL13.GL_TEXTURE1, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE), "units past GL_MAX_TEXTURE_COORDS are rejected"); + assertEquals(1, GLSMTextures.getClientActiveTextureUnit()); - GLStateManager.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 0L); + GLSMVertexInput.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 0L); final VAOManager.Attrib attrib = GLStateManager.ctx().vaos.attrib(Usage.SECONDARY_UV.getAttributeLocation()); assertNotNull(attrib); assertEquals(2, attrib.size); assumeTrue(GLStateManager.MAX_TEXTURE_COORDS > 5); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE5); - assertEquals(GL13.GL_TEXTURE5, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); - GLStateManager.glTexCoordPointer(3, GL11.GL_FLOAT, 0, 0L); - assertEquals(3, GLStateManager.glGetInteger(GL11.GL_TEXTURE_COORD_ARRAY_SIZE)); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE5); + assertEquals(GL13.GL_TEXTURE5, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); + GLSMVertexInput.glTexCoordPointer(3, GL11.GL_FLOAT, 0, 0L); + assertEquals(3, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_COORD_ARRAY_SIZE)); assertFalse(attribHasSize3(Usage.PRIMARY_UV)); assertFalse(attribHasSize3(Usage.SECONDARY_UV)); } finally { - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } } @@ -175,22 +175,22 @@ public class GLSM_ClientArrays_GLTest { void conventionalPointerSurvivesGenericOverride() { final int position = Usage.POSITION.getAttributeLocation(); try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); - GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 4L); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); + GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 4L); assertEquals(3, VAOManager.get(position).size, "disabled generic pointer must not displace an enabled conventional array"); assertEquals(3, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_SIZE)); - GLStateManager.glEnableVertexAttribArray(position); + GLSMVertexInput.glEnableVertexAttribArray(position); assertEquals(2, VAOManager.get(position).size, "enabled generic attribute wins"); assertTrue(VAOManager.get(position).genericPointer); assertEquals(2, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_SIZE)); assertEquals(8, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_STRIDE)); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDisableVertexAttribArray(position); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glDisableVertexAttribArray(position); assertEquals(3, VAOManager.get(position).size, "conventional pointer must come back when the generic attribute is disabled"); assertEquals(12, VAOManager.get(position).stride); assertFalse(VAOManager.get(position).genericPointer); @@ -198,12 +198,12 @@ public class GLSM_ClientArrays_GLTest { assertEquals(12, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_STRIDE)); assertEquals(vbo, driverAttrib(position, GL15.GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)); assertEquals(GL11.GL_TRUE, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED), "conventional array stays enabled at draw level"); - assertTrue(GLStateManager.glIsEnabled(GL11.GL_VERTEX_ARRAY)); - assertEquals(0, GLStateManager.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), "repoint must restore the array buffer binding"); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_VERTEX_ARRAY)); + assertEquals(0, GLSMQueries.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), "repoint must restore the array buffer binding"); } finally { - GLStateManager.glDisableVertexAttribArray(position); - GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glDisableVertexAttribArray(position); + GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } } @@ -211,55 +211,55 @@ public class GLSM_ClientArrays_GLTest { void conventionalPointerSetUnderEnabledGenericAppliesOnceGenericIsDisabled() { final int position = Usage.POSITION.getAttributeLocation(); try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 0L); - GLStateManager.glEnableVertexAttribArray(position); - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); - GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 0L); + GLSMVertexInput.glEnableVertexAttribArray(position); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); + GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY); assertEquals(2, VAOManager.get(position).size); assertEquals(2, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_SIZE)); - GLStateManager.glDisableVertexAttribArray(position); + GLSMVertexInput.glDisableVertexAttribArray(position); assertEquals(3, VAOManager.get(position).size); assertEquals(3, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_SIZE)); assertEquals(GL11.GL_TRUE, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED)); - GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY); assertEquals(GL11.GL_FALSE, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED)); assertFalse(positionArrayEnabled()); } finally { - GLStateManager.glDisableVertexAttribArray(position); - GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glDisableVertexAttribArray(position); + GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } } @Test void drawVertexFlagsDoNotAnswerClientArrayEnables() { try { - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); VAOManager.setCurrentVertexFlags(VertexFlags.COLOR_BIT | VertexFlags.NORMAL_BIT | VertexFlags.TEXTURE_BIT); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_COLOR_ARRAY)); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_NORMAL_ARRAY)); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY)); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_COLOR_ARRAY)); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_NORMAL_ARRAY)); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY)); - GLStateManager.glEnableClientState(GL11.GL_COLOR_ARRAY); + GLSMVertexInput.glEnableClientState(GL11.GL_COLOR_ARRAY); VAOManager.setCurrentVertexFlags(0); - assertTrue(GLStateManager.glIsEnabled(GL11.GL_COLOR_ARRAY)); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_COLOR_ARRAY)); } finally { - GLStateManager.glDisableClientState(GL11.GL_COLOR_ARRAY); + GLSMVertexInput.glDisableClientState(GL11.GL_COLOR_ARRAY); VAOManager.setCurrentVertexFlags(0); } } @Test void clientArrayPointerQueriesAreAnsweredFromCache() { - final int vaoB = GLStateManager.glGenVertexArrays(); + final int vaoB = GLSMVertexInput.glGenVertexArrays(); final IntBuffer ints = BufferUtils.createIntBuffer(16); try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); assertVertexArray("default vertex", 4, GL11.GL_FLOAT, 0, 0); assertClientArray("default normal", 0, 0, GL11.GL_NORMAL_ARRAY_TYPE, GL11.GL_FLOAT, GL11.GL_NORMAL_ARRAY_STRIDE, 0, GL15.GL_NORMAL_ARRAY_BUFFER_BINDING, 0); @@ -271,15 +271,15 @@ public class GLSM_ClientArrays_GLTest { assertClientArray("default index", 0, 0, GL11.GL_INDEX_ARRAY_TYPE, GL11.GL_FLOAT, GL11.GL_INDEX_ARRAY_STRIDE, 0, GL15.GL_INDEX_ARRAY_BUFFER_BINDING, 0); assertClientArray("default edge flag", 0, 0, 0, 0, GL11.GL_EDGE_FLAG_ARRAY_STRIDE, 0, GL15.GL_EDGE_FLAG_ARRAY_BUFFER_BINDING, 0); assertTexCoordArray("default texcoord", 4, GL11.GL_FLOAT, 0, 0); - assertNull(GLStateManager.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4)); + assertNull(GLSMVertexInput.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4)); - GLStateManager.glVertexPointer(3, GL11.GL_SHORT, 20, 8L); - GLStateManager.glNormalPointer(GL11.GL_BYTE, 16, 4L); - GLStateManager.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 16, 12L); - GLStateManager.glSecondaryColorPointer(3, GL11.GL_FLOAT, 12, 0L); - GLStateManager.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L); - GLStateManager.glEdgeFlagPointer(7, 0L); - GLStateManager.glTexCoordPointer(2, GL11.GL_FLOAT, 8, 0L); + GLSMVertexInput.glVertexPointer(3, GL11.GL_SHORT, 20, 8L); + GLSMVertexInput.glNormalPointer(GL11.GL_BYTE, 16, 4L); + GLSMVertexInput.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 16, 12L); + GLSMVertexInput.glSecondaryColorPointer(3, GL11.GL_FLOAT, 12, 0L); + GLSMVertexInput.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L); + GLSMVertexInput.glEdgeFlagPointer(7, 0L); + GLSMVertexInput.glTexCoordPointer(2, GL11.GL_FLOAT, 8, 0L); assertVertexArray("vertex", 3, GL11.GL_SHORT, 20, vbo); assertClientArray("normal", 0, 0, GL11.GL_NORMAL_ARRAY_TYPE, GL11.GL_BYTE, GL11.GL_NORMAL_ARRAY_STRIDE, 16, GL15.GL_NORMAL_ARRAY_BUFFER_BINDING, vbo); @@ -292,98 +292,98 @@ public class GLSM_ClientArrays_GLTest { assertClientArray("edge flag", 0, 0, 0, 0, GL11.GL_EDGE_FLAG_ARRAY_STRIDE, 7, GL15.GL_EDGE_FLAG_ARRAY_BUFFER_BINDING, vbo); assertTexCoordArray("texcoord unit 0", 2, GL11.GL_FLOAT, 8, vbo); - assertEquals(3.0f, GLStateManager.glGetFloat(GL11.GL_VERTEX_ARRAY_SIZE)); - GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE, ints); + assertEquals(3.0f, GLSMQueries.glGetFloat(GL11.GL_VERTEX_ARRAY_SIZE)); + GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE, ints); assertEquals(20, ints.get(0)); - assertEquals(8L, MemoryUtilities.memAddress(GLStateManager.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4))); - assertEquals(12L, MemoryUtilities.memAddress(GLStateManager.glGetPointer(GL11.GL_COLOR_ARRAY_POINTER, 4))); + assertEquals(8L, MemoryUtilities.memAddress(GLSMVertexInput.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4))); + assertEquals(12L, MemoryUtilities.memAddress(GLSMVertexInput.glGetPointer(GL11.GL_COLOR_ARRAY_POINTER, 4))); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_COORDS - 1); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_COORDS - 1); assertTexCoordArray("unset texcoord unit", 4, GL11.GL_FLOAT, 0, 0); - GLStateManager.glTexCoordPointer(3, GL11.GL_SHORT, 6, 0L); + GLSMVertexInput.glTexCoordPointer(3, GL11.GL_SHORT, 6, 0L); assertTexCoordArray("last texcoord unit", 3, GL11.GL_SHORT, 6, vbo); assertFalse(attribHasSize3(Usage.PRIMARY_UV)); assertFalse(attribHasSize3(Usage.SECONDARY_UV)); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); assertTexCoordArray("texcoord unit 0 again", 2, GL11.GL_FLOAT, 8, vbo); - GLStateManager.glBindVertexArray(vaoB); + GLSMVertexInput.glBindVertexArray(vaoB); assertVertexArray("other vao", 4, GL11.GL_FLOAT, 0, 0); final FloatBuffer client = BufferUtils.createFloatBuffer(12); - GLStateManager.glVertexPointer(2, 0, client); + GLSMVertexInput.glVertexPointer(2, 0, client); assertVertexArray("client pointer", 2, GL11.GL_FLOAT, 0, 0); - assertEquals(MemoryUtilities.memAddress(client), MemoryUtilities.memAddress(GLStateManager.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4))); - GLStateManager.glBindVertexArray(vao); + assertEquals(MemoryUtilities.memAddress(client), MemoryUtilities.memAddress(GLSMVertexInput.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4))); + GLSMVertexInput.glBindVertexArray(vao); assertVertexArray("first vao again", 3, GL11.GL_SHORT, 20, vbo); } finally { - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDeleteVertexArrays(vaoB); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glDeleteVertexArrays(vaoB); } } @Test void interleavedArraysSetClientStateWithoutAnActiveFfpProgram() { try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); assumeFalse(GLStateManager.ctx().ffp.isActive()); - GLStateManager.glInterleavedArrays(GL11.GL_C4UB_V3F, 0, 0L); - assertTrue(GLStateManager.glIsEnabled(GL11.GL_VERTEX_ARRAY)); - assertTrue(GLStateManager.glIsEnabled(GL11.GL_COLOR_ARRAY)); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_NORMAL_ARRAY)); + GLSMVertexInput.glInterleavedArrays(GL11.GL_C4UB_V3F, 0, 0L); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_VERTEX_ARRAY)); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_COLOR_ARRAY)); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_NORMAL_ARRAY)); assertVertexArray("interleaved vertex", 3, GL11.GL_FLOAT, 16, vbo); - assertEquals(GL11.GL_UNSIGNED_BYTE, GLStateManager.glGetInteger(GL11.GL_COLOR_ARRAY_TYPE)); + assertEquals(GL11.GL_UNSIGNED_BYTE, GLSMQueries.glGetInteger(GL11.GL_COLOR_ARRAY_TYPE)); } finally { for (final int cap : CLIENT_ARRAY_CAPS) { - GLStateManager.glDisableClientState(cap); + GLSMVertexInput.glDisableClientState(cap); } - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } } @Test void clientVertexArrayBitRestoresPointersEnablesAndBindings() { - final int vaoB = GLStateManager.glGenVertexArrays(); - final int vbo2 = GLStateManager.glGenBuffers(); - final int ebo = GLStateManager.glGenBuffers(); + final int vaoB = GLSMVertexInput.glGenVertexArrays(); + final int vbo2 = GLSMBuffers.glGenBuffers(); + final int ebo = GLSMBuffers.glGenBuffers(); final int position = Usage.POSITION.getAttributeLocation(); final int color = Usage.COLOR.getAttributeLocation(); final int normal = Usage.NORMAL.getAttributeLocation(); try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); - GLStateManager.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 16, 12L); - GLStateManager.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L); - GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glEnableClientState(GL11.GL_COLOR_ARRAY); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); + GLSMVertexInput.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 16, 12L); + GLSMVertexInput.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L); + GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glEnableClientState(GL11.GL_COLOR_ARRAY); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo2); - GLStateManager.glVertexPointer(2, GL11.GL_SHORT, 4, 4L); - GLStateManager.glFogCoordPointer(GL11.GL_FLOAT, 8, 0L); - GLStateManager.glDisableClientState(GL11.GL_COLOR_ARRAY); - GLStateManager.glEnableClientState(GL11.GL_NORMAL_ARRAY); - GLStateManager.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, 4, 0L); - GLStateManager.glEnableVertexAttribArray(5); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindVertexArray(vaoB); - GLStateManager.glPopClientAttrib(); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo2); + GLSMVertexInput.glVertexPointer(2, GL11.GL_SHORT, 4, 4L); + GLSMVertexInput.glFogCoordPointer(GL11.GL_FLOAT, 8, 0L); + GLSMVertexInput.glDisableClientState(GL11.GL_COLOR_ARRAY); + GLSMVertexInput.glEnableClientState(GL11.GL_NORMAL_ARRAY); + GLSMVertexInput.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, 4, 0L); + GLSMVertexInput.glEnableVertexAttribArray(5); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); + GLSMVertexInput.glBindVertexArray(vaoB); + GLSMAttribStack.glPopClientAttrib(); - assertEquals(vao, GLStateManager.getBoundVAO()); - assertEquals(vbo, GLStateManager.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING)); - assertEquals(ebo, GLStateManager.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING)); + assertEquals(vao, GLSMVertexInput.getBoundVAO()); + assertEquals(vbo, GLSMQueries.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING)); + assertEquals(ebo, GLSMQueries.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING)); assertEquals(ebo, GL11.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING)); - assertEquals(GL13.GL_TEXTURE0, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); + assertEquals(GL13.GL_TEXTURE0, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); assertVertexArray("restored vertex", 3, GL11.GL_FLOAT, 12, vbo); - assertEquals(4, GLStateManager.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE)); - assertEquals(vbo, GLStateManager.glGetInteger(GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING)); - assertTrue(GLStateManager.glIsEnabled(GL11.GL_COLOR_ARRAY)); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_NORMAL_ARRAY)); + assertEquals(4, GLSMQueries.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE)); + assertEquals(vbo, GLSMQueries.glGetInteger(GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING)); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_COLOR_ARRAY)); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_NORMAL_ARRAY)); assertTrue(colorArrayEnabled()); assertEquals(3, driverAttrib(position, GL20.GL_VERTEX_ATTRIB_ARRAY_SIZE)); @@ -395,24 +395,24 @@ public class GLSM_ClientArrays_GLTest { assertEquals(GL11.GL_FALSE, driverAttrib(normal, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED)); assertEquals(GL11.GL_FALSE, driverAttrib(5, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED)); - GLStateManager.glBindVertexArray(vaoB); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glDeleteVertexArrays(vaoB); - GLStateManager.glPopClientAttrib(); - assertEquals(vao, GLStateManager.getBoundVAO(), "a deleted VAO must not be restored"); + GLSMVertexInput.glBindVertexArray(vaoB); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMVertexInput.glBindVertexArray(vao); + GLSMVertexInput.glDeleteVertexArrays(vaoB); + GLSMAttribStack.glPopClientAttrib(); + assertEquals(vao, GLSMVertexInput.getBoundVAO(), "a deleted VAO must not be restored"); assertVertexArray("after dead-vao pop", 3, GL11.GL_FLOAT, 12, vbo); } finally { drainClientAttribStack(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glBindVertexArray(vao); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); for (final int cap : CLIENT_ARRAY_CAPS) { - GLStateManager.glDisableClientState(cap); + GLSMVertexInput.glDisableClientState(cap); } - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDeleteVertexArrays(vaoB); - GLStateManager.glDeleteBuffers(vbo2); - GLStateManager.glDeleteBuffers(ebo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glDeleteVertexArrays(vaoB); + GLSMBuffers.glDeleteBuffers(vbo2); + GLSMBuffers.glDeleteBuffers(ebo); } } @@ -420,150 +420,150 @@ public class GLSM_ClientArrays_GLTest { void enabledGenericAttributeWinsWithoutAPointer() { final int position = Usage.POSITION.getAttributeLocation(); try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); - GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); + GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY); assertFalse(VAOManager.get(position).genericPointer); - GLStateManager.glEnableVertexAttribArray(position); + GLSMVertexInput.glEnableVertexAttribArray(position); assertTrue(VAOManager.get(position).genericPointer, "generic 0 supersedes position on its enable bit alone"); - GLStateManager.glDisableVertexAttribArray(position); + GLSMVertexInput.glDisableVertexAttribArray(position); assertFalse(VAOManager.get(position).genericPointer); assertEquals(3, VAOManager.get(position).size); } finally { - GLStateManager.glDisableVertexAttribArray(position); - GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glDisableVertexAttribArray(position); + GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } } @Test void deletedBufferIsDetachedFromTheBoundVertexArray() { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 4L); - GLStateManager.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L); - assertEquals(vbo, GLStateManager.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING)); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 4L); + GLSMVertexInput.glFogCoordPointer(GL11.GL_FLOAT, 4, 0L); + assertEquals(vbo, GLSMQueries.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING)); - GLStateManager.glDeleteBuffers(vbo); - assertEquals(0, GLStateManager.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING)); - assertEquals(0, GLStateManager.glGetInteger(GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING)); - assertEquals(12, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE), "offset and stride survive the detach"); - assertEquals(3, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE)); + GLSMBuffers.glDeleteBuffers(vbo); + assertEquals(0, GLSMQueries.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING)); + assertEquals(0, GLSMQueries.glGetInteger(GL15.GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING)); + assertEquals(12, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE), "offset and stride survive the detach"); + assertEquals(3, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE)); } @Test void shadowedPointerIsNotRepointedAtAReusedBufferName() { - final int other = GLStateManager.glGenVertexArrays(); - final int conventional = GLStateManager.glGenBuffers(); - final int generic = GLStateManager.glGenBuffers(); + final int other = GLSMVertexInput.glGenVertexArrays(); + final int conventional = GLSMBuffers.glGenBuffers(); + final int generic = GLSMBuffers.glGenBuffers(); final int position = Usage.POSITION.getAttributeLocation(); int reused = 0; try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, conventional); - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); - GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, generic); - GLStateManager.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 0L); - GLStateManager.glEnableVertexAttribArray(position); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, conventional); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); + GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, generic); + GLSMVertexInput.glVertexAttribPointer(position, 2, GL11.GL_FLOAT, false, 8, 0L); + GLSMVertexInput.glEnableVertexAttribArray(position); - GLStateManager.glBindVertexArray(other); - GLStateManager.glDeleteBuffers(conventional); - reused = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, reused); + GLSMVertexInput.glBindVertexArray(other); + GLSMBuffers.glDeleteBuffers(conventional); + reused = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, reused); assumeTrue(reused == conventional, "driver did not reuse the buffer name"); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glDisableVertexAttribArray(position); + GLSMVertexInput.glBindVertexArray(vao); + GLSMVertexInput.glDisableVertexAttribArray(position); assertEquals(generic, driverAttrib(position, GL15.GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING), "a pointer set before the delete must not attach to the new buffer"); } finally { - GLStateManager.glBindVertexArray(vao); - GLStateManager.glDisableVertexAttribArray(position); - GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDeleteVertexArrays(other); - GLStateManager.glDeleteBuffers(generic); - if (reused != 0) GLStateManager.glDeleteBuffers(reused); + GLSMVertexInput.glBindVertexArray(vao); + GLSMVertexInput.glDisableVertexAttribArray(position); + GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glDeleteVertexArrays(other); + GLSMBuffers.glDeleteBuffers(generic); + if (reused != 0) GLSMBuffers.glDeleteBuffers(reused); } } @Test void popKeepsCurrentArraysWhenTheSavedArrayBufferWasDeleted() { - final int vbo2 = GLStateManager.glGenBuffers(); + final int vbo2 = GLSMBuffers.glGenBuffers(); try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo2); - GLStateManager.glVertexPointer(2, GL11.GL_SHORT, 4, 0L); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glDeleteBuffers(vbo); - GLStateManager.glPopClientAttrib(); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo2); + GLSMVertexInput.glVertexPointer(2, GL11.GL_SHORT, 4, 0L); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); + GLSMBuffers.glDeleteBuffers(vbo); + GLSMAttribStack.glPopClientAttrib(); - assertEquals(2, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE), "array state is not restored once its array buffer is gone"); - assertEquals(vbo2, GLStateManager.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING)); + assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE), "array state is not restored once its array buffer is gone"); + assertEquals(vbo2, GLSMQueries.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING)); assertEquals(vbo2, GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING)); - assertEquals(GL13.GL_TEXTURE0, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); + assertEquals(GL13.GL_TEXTURE0, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); } finally { drainClientAttribStack(); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDeleteBuffers(vbo2); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glDeleteBuffers(vbo2); } } @Test void clientAttribStackIsNotCompiledIntoDisplayLists() { - final int other = GLStateManager.glGenVertexArrays(); - final int list = GLStateManager.glGenLists(1); + final int other = GLSMVertexInput.glGenVertexArrays(); + final int list = GLSMDraws.glGenLists(1); try { - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glPopClientAttrib(); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMAttribStack.glPopClientAttrib(); + GLSMDraws.glEndList(); - GLStateManager.glBindVertexArray(other); - GLStateManager.glCallList(list); - assertEquals(other, GLStateManager.getBoundVAO(), "replaying the list must not rebind the vertex array that was bound while compiling"); + GLSMVertexInput.glBindVertexArray(other); + GLSMDraws.glCallList(list); + assertEquals(other, GLSMVertexInput.getBoundVAO(), "replaying the list must not rebind the vertex array that was bound while compiling"); assertEquals(other, GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING), "driver vertex array unchanged by replay"); } finally { drainClientAttribStack(); - GLStateManager.glDeleteLists(list, 1); - GLStateManager.glDeleteVertexArrays(other); + GLSMDraws.glDeleteLists(list, 1); + GLSMVertexInput.glDeleteVertexArrays(other); } } @Test void popRestoresDivisorAndStateWithoutAnAttributeLocation() { try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, 4, 0L); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMVertexInput.glVertexAttribPointer(5, 1, GL11.GL_FLOAT, false, 4, 0L); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glPopClientAttrib(); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMAttribStack.glPopClientAttrib(); assertEquals(0, driverAttrib(5, GL33.GL_VERTEX_ATTRIB_ARRAY_DIVISOR)); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glVertexAttribDivisor(5, 3); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMVertexInput.glVertexAttribDivisor(5, 3); assertEquals(3, driverAttrib(5, GL33.GL_VERTEX_ATTRIB_ARRAY_DIVISOR)); - GLStateManager.glPopClientAttrib(); + GLSMAttribStack.glPopClientAttrib(); assertEquals(0, driverAttrib(5, GL33.GL_VERTEX_ATTRIB_ARRAY_DIVISOR)); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glEnableClientState(GL14.GL_FOG_COORDINATE_ARRAY); - GLStateManager.glPopClientAttrib(); - assertFalse(GLStateManager.glIsEnabled(GL14.GL_FOG_COORDINATE_ARRAY)); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMVertexInput.glEnableClientState(GL14.GL_FOG_COORDINATE_ARRAY); + GLSMAttribStack.glPopClientAttrib(); + assertFalse(GLSMEnable.glIsEnabled(GL14.GL_FOG_COORDINATE_ARRAY)); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glEnableVertexAttribArray(5); - GLStateManager.glPopClientAttrib(); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMVertexInput.glEnableVertexAttribArray(5); + GLSMAttribStack.glPopClientAttrib(); assertEquals(GL11.GL_FALSE, driverAttrib(5, GL20.GL_VERTEX_ATTRIB_ARRAY_ENABLED)); } finally { drainClientAttribStack(); - GLStateManager.glDisableVertexAttribArray(5); - GLStateManager.glDisableClientState(GL14.GL_FOG_COORDINATE_ARRAY); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glDisableVertexAttribArray(5); + GLSMVertexInput.glDisableClientState(GL14.GL_FOG_COORDINATE_ARRAY); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } } @@ -572,21 +572,21 @@ public class GLSM_ClientArrays_GLTest { final FloatBuffer data = BufferUtils.createFloatBuffer(64); final int position = Usage.POSITION.getAttributeLocation(); try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); data.position(2); - GLStateManager.glInterleavedArrays(GL11.GL_C4UB_V3F, 0, data); + GLSMVertexInput.glInterleavedArrays(GL11.GL_C4UB_V3F, 0, data); final long base = MemoryUtilities.memAddress(data); assertNotNull(VAOManager.get(position).clientPointer); assertEquals(base + 4, MemoryUtilities.memAddress(VAOManager.get(position).clientPointer)); - assertEquals(base + 4, MemoryUtilities.memAddress(GLStateManager.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4))); - assertEquals(base, MemoryUtilities.memAddress(GLStateManager.glGetPointer(GL11.GL_COLOR_ARRAY_POINTER, 4))); - assertEquals(0, GLStateManager.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING)); - assertEquals(16, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE)); + assertEquals(base + 4, MemoryUtilities.memAddress(GLSMVertexInput.glGetPointer(GL11.GL_VERTEX_ARRAY_POINTER, 4))); + assertEquals(base, MemoryUtilities.memAddress(GLSMVertexInput.glGetPointer(GL11.GL_COLOR_ARRAY_POINTER, 4))); + assertEquals(0, GLSMQueries.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING)); + assertEquals(16, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE)); assertTrue(GLStateManager.ctx().vaos.hasAnyClientSideEnabledAttrib()); } finally { for (final int cap : CLIENT_ARRAY_CAPS) { - GLStateManager.glDisableClientState(cap); + GLSMVertexInput.glDisableClientState(cap); } } } @@ -594,82 +594,82 @@ public class GLSM_ClientArrays_GLTest { @Test void enableAndDisableRouteClientArrayCapsToClientState() { for (final int cap : CLIENT_ARRAY_CAPS) { - GLStateManager.glEnable(cap); - assertTrue(GLStateManager.glIsEnabled(cap), hex(cap)); - GLStateManager.glDisable(cap); - assertFalse(GLStateManager.glIsEnabled(cap), hex(cap)); + GLSMEnable.glEnable(cap); + assertTrue(GLSMEnable.glIsEnabled(cap), hex(cap)); + GLSMEnable.glDisable(cap); + assertFalse(GLSMEnable.glIsEnabled(cap), hex(cap)); } - GLStateManager.glEnable(GL11.GL_VERTEX_ARRAY); + GLSMEnable.glEnable(GL11.GL_VERTEX_ARRAY); assertTrue(positionArrayEnabled()); - GLStateManager.glDisable(GL11.GL_VERTEX_ARRAY); + GLSMEnable.glDisable(GL11.GL_VERTEX_ARRAY); } @Test void illegalPointerArgumentsAreIgnored() { try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); - GLStateManager.glNormalPointer(GL11.GL_FLOAT, 12, 0L); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 12, 0L); + GLSMVertexInput.glNormalPointer(GL11.GL_FLOAT, 12, 0L); - GLStateManager.glVertexPointer(1, GL11.GL_FLOAT, 4, 0L); - GLStateManager.glVertexPointer(3, GL11.GL_UNSIGNED_BYTE, 3, 0L); - GLStateManager.glNormalPointer(GL11.GL_UNSIGNED_BYTE, 3, 0L); + GLSMVertexInput.glVertexPointer(1, GL11.GL_FLOAT, 4, 0L); + GLSMVertexInput.glVertexPointer(3, GL11.GL_UNSIGNED_BYTE, 3, 0L); + GLSMVertexInput.glNormalPointer(GL11.GL_UNSIGNED_BYTE, 3, 0L); assertVertexArray("vertex after illegal calls", 3, GL11.GL_FLOAT, 12, vbo); - assertEquals(GL11.GL_FLOAT, GLStateManager.glGetInteger(GL11.GL_NORMAL_ARRAY_TYPE)); + assertEquals(GL11.GL_FLOAT, GLSMQueries.glGetInteger(GL11.GL_NORMAL_ARRAY_TYPE)); - GLStateManager.glColorPointer(GL12.GL_BGRA, GL11.GL_UNSIGNED_BYTE, 4, 0L); - assertEquals(GL12.GL_BGRA, GLStateManager.glGetInteger(GL11.GL_COLOR_ARRAY_SIZE)); - GLStateManager.glColorPointer(GL12.GL_BGRA, GL11.GL_FLOAT, 16, 0L); - assertEquals(GL11.GL_UNSIGNED_BYTE, GLStateManager.glGetInteger(GL11.GL_COLOR_ARRAY_TYPE)); + GLSMVertexInput.glColorPointer(GL12.GL_BGRA, GL11.GL_UNSIGNED_BYTE, 4, 0L); + assertEquals(GL12.GL_BGRA, GLSMQueries.glGetInteger(GL11.GL_COLOR_ARRAY_SIZE)); + GLSMVertexInput.glColorPointer(GL12.GL_BGRA, GL11.GL_FLOAT, 16, 0L); + assertEquals(GL11.GL_UNSIGNED_BYTE, GLSMQueries.glGetInteger(GL11.GL_COLOR_ARRAY_TYPE)); - GLStateManager.glVertexAttribPointer(VAOManager.MAX_ATTRIBS, 3, GL11.GL_FLOAT, false, 0, 0L); - GLStateManager.glEnableVertexAttribArray(VAOManager.MAX_ATTRIBS); - GLStateManager.glDisableVertexAttribArray(VAOManager.MAX_ATTRIBS); - GLStateManager.glVertexAttribPointer(5, 5, GL11.GL_FLOAT, false, 0, 0L); + GLSMVertexInput.glVertexAttribPointer(VAOManager.MAX_ATTRIBS, 3, GL11.GL_FLOAT, false, 0, 0L); + GLSMVertexInput.glEnableVertexAttribArray(VAOManager.MAX_ATTRIBS); + GLSMVertexInput.glDisableVertexAttribArray(VAOManager.MAX_ATTRIBS); + GLSMVertexInput.glVertexAttribPointer(5, 5, GL11.GL_FLOAT, false, 0, 0L); assertNull(VAOManager.get(5)); } finally { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } } @Test void clientArrayEnablesAreAnsweredFromCache() { - final int vaoB = GLStateManager.glGenVertexArrays(); + final int vaoB = GLSMVertexInput.glGenVertexArrays(); try { - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); for (final int cap : CLIENT_ARRAY_CAPS) { - assertFalse(GLStateManager.glIsEnabled(cap), "default isEnabled " + hex(cap)); + assertFalse(GLSMEnable.glIsEnabled(cap), "default isEnabled " + hex(cap)); assertEnableRoundTrip(cap, true); } - GLStateManager.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY), "texcoord array enable is per client texture unit"); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - assertTrue(GLStateManager.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY)); - GLStateManager.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); + GLSMVertexInput.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY), "texcoord array enable is per client texture unit"); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_COORD_ARRAY)); + GLSMVertexInput.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); - GLStateManager.glEnableClientState(GL11.GL_INDEX_ARRAY); - GLStateManager.glBindVertexArray(vaoB); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_INDEX_ARRAY), "array enables are per vertex array object"); - GLStateManager.glBindVertexArray(vao); - assertTrue(GLStateManager.glIsEnabled(GL11.GL_INDEX_ARRAY)); - GLStateManager.glDisableClientState(GL11.GL_INDEX_ARRAY); + GLSMVertexInput.glEnableClientState(GL11.GL_INDEX_ARRAY); + GLSMVertexInput.glBindVertexArray(vaoB); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_INDEX_ARRAY), "array enables are per vertex array object"); + GLSMVertexInput.glBindVertexArray(vao); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_INDEX_ARRAY)); + GLSMVertexInput.glDisableClientState(GL11.GL_INDEX_ARRAY); - GLStateManager.glBindVertexArray(vaoB); - GLStateManager.glEnableVertexAttribArray(0); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_VERTEX_ARRAY), "an enabled generic attribute 0 is not GL_VERTEX_ARRAY"); - GLStateManager.glDisableVertexAttribArray(0); - GLStateManager.glBindVertexArray(vao); + GLSMVertexInput.glBindVertexArray(vaoB); + GLSMVertexInput.glEnableVertexAttribArray(0); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_VERTEX_ARRAY), "an enabled generic attribute 0 is not GL_VERTEX_ARRAY"); + GLSMVertexInput.glDisableVertexAttribArray(0); + GLSMVertexInput.glBindVertexArray(vao); } finally { - GLStateManager.glBindVertexArray(vaoB); - GLStateManager.glDisableVertexAttribArray(0); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glBindVertexArray(vaoB); + GLSMVertexInput.glDisableVertexAttribArray(0); + GLSMVertexInput.glBindVertexArray(vao); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); for (final int cap : CLIENT_ARRAY_CAPS) { - GLStateManager.glDisableClientState(cap); + GLSMVertexInput.glDisableClientState(cap); } - GLStateManager.glDeleteVertexArrays(vaoB); + GLSMVertexInput.glDeleteVertexArrays(vaoB); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_CoreRemovedCaps_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_CoreRemovedCaps_GLTest.java index 28fb18981..18cada7d9 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_CoreRemovedCaps_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_CoreRemovedCaps_GLTest.java @@ -52,7 +52,7 @@ public class GLSM_CoreRemovedCaps_GLTest { private static void assertSecondaryColor(float red, float green, float blue) { final FloatBuffer params = BufferUtils.createFloatBuffer(4); - GLStateManager.glGetFloat(GL14.GL_CURRENT_SECONDARY_COLOR, params); + GLSMQueries.glGetFloat(GL14.GL_CURRENT_SECONDARY_COLOR, params); assertEquals(red, params.get(0), "red must round-trip through the cache"); assertEquals(green, params.get(1), "green must round-trip through the cache"); assertEquals(blue, params.get(2), "blue must round-trip through the cache"); @@ -67,15 +67,15 @@ public class GLSM_CoreRemovedCaps_GLTest { @MethodSource("removedCaps") void enableDisableIsCacheOnly(String name, int cap) { try { - GLStateManager.glEnable(cap); + GLSMEnable.glEnable(cap); assertNoGlError("glEnable(" + name + ")"); - assertTrue(GLStateManager.glIsEnabled(cap), name + " must still round-trip through the cache"); + assertTrue(GLSMEnable.glIsEnabled(cap), name + " must still round-trip through the cache"); - GLStateManager.glDisable(cap); + GLSMEnable.glDisable(cap); assertNoGlError("glDisable(" + name + ")"); - assertFalse(GLStateManager.glIsEnabled(cap)); + assertFalse(GLSMEnable.glIsEnabled(cap)); } finally { - GLStateManager.glDisable(cap); + GLSMEnable.glDisable(cap); } } @@ -83,80 +83,80 @@ public class GLSM_CoreRemovedCaps_GLTest { @MethodSource("removedCaps") void pushPopAttribIsCacheOnly(String name, int cap) { try { - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.glEnable(cap); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMEnable.glEnable(cap); + GLSMAttribStack.glPopAttrib(); assertNoGlError("glPushAttrib/glEnable(" + name + ")/glPopAttrib"); - assertFalse(GLStateManager.glIsEnabled(cap)); + assertFalse(GLSMEnable.glIsEnabled(cap)); } finally { - GLStateManager.glDisable(cap); + GLSMEnable.glDisable(cap); } } @Test void secondaryColorIsRestoredByPopAttrib() { try { - GLStateManager.glSecondaryColor3f(0.125F, 0.25F, 0.375F); - GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT); - GLStateManager.glSecondaryColor3f(1.0F, 1.0F, 1.0F); - GLStateManager.glPopAttrib(); + GLSMCurrentAttribs.glSecondaryColor3f(0.125F, 0.25F, 0.375F); + GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT); + GLSMCurrentAttribs.glSecondaryColor3f(1.0F, 1.0F, 1.0F); + GLSMAttribStack.glPopAttrib(); assertNoGlError("glPushAttrib/glSecondaryColor3f/glPopAttrib"); assertSecondaryColor(0.125F, 0.25F, 0.375F); } finally { - GLStateManager.glSecondaryColor3f(0.0F, 0.0F, 0.0F); + GLSMCurrentAttribs.glSecondaryColor3f(0.0F, 0.0F, 0.0F); } } @Test void colorSumIsRestoredByFogBitPopAttrib() { try { - GLStateManager.glPushAttrib(GL11.GL_FOG_BIT); - GLStateManager.glEnable(GL14.GL_COLOR_SUM); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_FOG_BIT); + GLSMEnable.glEnable(GL14.GL_COLOR_SUM); + GLSMAttribStack.glPopAttrib(); assertNoGlError("glPushAttrib(GL_FOG_BIT)/glEnable(GL_COLOR_SUM)/glPopAttrib"); - assertFalse(GLStateManager.glIsEnabled(GL14.GL_COLOR_SUM)); + assertFalse(GLSMEnable.glIsEnabled(GL14.GL_COLOR_SUM)); } finally { - GLStateManager.glDisable(GL14.GL_COLOR_SUM); + GLSMEnable.glDisable(GL14.GL_COLOR_SUM); } } @Test void secondaryColorReplaysFromDisplayList() { - final int list = GLStateManager.glGenLists(1); + final int list = GLSMDraws.glGenLists(1); try { - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glSecondaryColor3f(0.5F, 0.625F, 0.75F); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMCurrentAttribs.glSecondaryColor3f(0.5F, 0.625F, 0.75F); + GLSMDraws.glEndList(); assertNoGlError("glSecondaryColor3f display list compile"); - GLStateManager.glSecondaryColor3f(0.0F, 0.0F, 0.0F); - GLStateManager.glCallList(list); + GLSMCurrentAttribs.glSecondaryColor3f(0.0F, 0.0F, 0.0F); + GLSMDraws.glCallList(list); assertNoGlError("glSecondaryColor3f display list replay"); assertSecondaryColor(0.5F, 0.625F, 0.75F); } finally { - GLStateManager.glDeleteLists(list, 1); - GLStateManager.glSecondaryColor3f(0.0F, 0.0F, 0.0F); + GLSMDraws.glDeleteLists(list, 1); + GLSMCurrentAttribs.glSecondaryColor3f(0.0F, 0.0F, 0.0F); } } @Test void displayListReplayIsCacheOnly() { - final int list = GLStateManager.glGenLists(1); + final int list = GLSMDraws.glGenLists(1); try { - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glEnable(GL11.GL_LINE_STIPPLE); - GLStateManager.glLineStipple(2, (short) 0xF0F0); - GLStateManager.glDisable(GL11.GL_LINE_STIPPLE); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMEnable.glEnable(GL11.GL_LINE_STIPPLE); + GLSMRasterizer.glLineStipple(2, (short) 0xF0F0); + GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE); + GLSMDraws.glEndList(); assertNoGlError("display list compile"); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertNoGlError("display list replay"); } finally { - GLStateManager.glDeleteLists(list, 1); - GLStateManager.glDisable(GL11.GL_LINE_STIPPLE); + GLSMDraws.glDeleteLists(list, 1); + GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeferredTextureDelete_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeferredTextureDelete_GLTest.java index 7f1d06003..c4d09f1d3 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeferredTextureDelete_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeferredTextureDelete_GLTest.java @@ -22,26 +22,26 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; @GLCoreTest public class GLSM_DeferredTextureDelete_GLTest { - private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLStateManager.class, "RELEASE_DELAY_FRAMES"); + private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLSMTextureLifetime.class, "RELEASE_DELAY_FRAMES"); private static final int SIZE = 4; private static final int LEVELS = 3; private static int immutableTexture() { assumeTrue(GLStateManager.capabilities.OpenGL42, "no glTexStorage2D on this context"); - final int tex = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexStorage2D(GL11.GL_TEXTURE_2D, 1, GL30.GL_R8, 4, 4); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + final int tex = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexStorage2D(GL11.GL_TEXTURE_2D, 1, GL30.GL_R8, 4, 4); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); return tex; } private static int mipmappedTexture() { - final int tex = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); + final int tex = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); for (int level = 0; level < LEVELS; level++) { - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, SIZE >> level, SIZE >> level, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, SIZE >> level, SIZE >> level, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); } - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); return tex; } @@ -54,11 +54,11 @@ public class GLSM_DeferredTextureDelete_GLTest { } private static int cachedBinding(int unit) { - return GLStateManager.getTextures().getTextureUnitBindings(unit).getBinding(); + return GLSMTextures.getTextures().getTextureUnitBindings(unit).getBinding(); } private static void framesPass(int frames) { - for (int i = 0; i < frames; i++) GLStateManager.onFrameEnd(); + for (int i = 0; i < frames; i++) GLSMTextureLifetime.onFrameEnd(); } enum Attachment { @@ -67,17 +67,17 @@ public class GLSM_DeferredTextureDelete_GLTest { }, FRAMEBUFFER { @Override int attach(int tex) { - final int fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); return fbo; } }, NAMED_EXT { @Override int attach(int tex) { - final int fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glNamedFramebufferTexture2DEXT(fbo, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glNamedFramebufferTexture2DEXT(fbo, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); assertEquals(0, GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING), "named attach must restore the draw binding"); return fbo; } @@ -90,30 +90,30 @@ public class GLSM_DeferredTextureDelete_GLTest { @EnumSource(Attachment.class) void storageIsReleasedOnlyAfterTheDelayFramesUnattached(Attachment attachment) { framesPass(RELEASE_DELAY_FRAMES); - final int before = GLStateManager.deferredTexturesAwaitingRelease(); + final int before = GLSMTextureLifetime.deferredTexturesAwaitingRelease(); final int tex = mipmappedTexture(); final int fbo = attachment.attach(tex); - GLStateManager.glDeleteTextures(tex); - assertEquals(before + 1, GLStateManager.deferredTexturesAwaitingRelease()); + GLSMTextures.glDeleteTextures(tex); + assertEquals(before + 1, GLSMTextureLifetime.deferredTexturesAwaitingRelease()); framesPass(RELEASE_DELAY_FRAMES - 1); assertEquals(SIZE, levelWidth(tex, 0), "storage must outlive the delete by the delay frames"); if (fbo != 0) { framesPass(RELEASE_DELAY_FRAMES); assertEquals(SIZE, levelWidth(tex, 0), "an attached texture keeps its storage"); - assertEquals(before + 1, GLStateManager.deferredTexturesAwaitingRelease()); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glDeleteTextures(GLStateManager.glGenTextures()); + assertEquals(before + 1, GLSMTextureLifetime.deferredTexturesAwaitingRelease()); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMTextures.glDeleteTextures(GLSMTextures.glGenTextures()); assertEquals(tex, GL30.glGetFramebufferAttachmentParameteri(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME), "a flush must not delete an attached texture"); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(BufferUtils.createIntBuffer(1).put(fbo).flip()); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(BufferUtils.createIntBuffer(1).put(fbo).flip()); framesPass(RELEASE_DELAY_FRAMES - 1); assertEquals(SIZE, levelWidth(tex, 0), "storage must outlive the detach by the delay frames"); } framesPass(1); for (int level = 0; level < LEVELS; level++) assertEquals(0, levelWidth(tex, level), "level " + level); - assertEquals(before, GLStateManager.deferredTexturesAwaitingRelease(), "released storage leaves nothing awaiting release"); + assertEquals(before, GLSMTextureLifetime.deferredTexturesAwaitingRelease(), "released storage leaves nothing awaiting release"); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } @@ -124,66 +124,66 @@ public class GLSM_DeferredTextureDelete_GLTest { void deletedNamesAreRejected(Rejection rejection) { final int tex = mipmappedTexture(); final int other = mipmappedTexture(); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); try { switch (rejection) { case ATTACH -> { - final int fbo = GLStateManager.glGenFramebuffers(); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); try { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); assertEquals(GL11.GL_NONE, GL30.glGetFramebufferAttachmentParameteri(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)); } finally { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(fbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(fbo); } } case BIND_TEXTURE_UNIT -> { - GLStateManager.glBindTextureUnit(2, other); - GLStateManager.glBindTextureUnit(2, tex); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTextures.glBindTextureUnit(2, other); + GLSMTextures.glBindTextureUnit(2, tex); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); assertEquals(other, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "driver binding"); - assertEquals(other, GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "cached binding"); + assertEquals(other, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "cached binding"); } } assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTextureUnit(2, 0); - GLStateManager.glDeleteTextures(other); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTextureUnit(2, 0); + GLSMTextures.glDeleteTextures(other); } } @Test void bindTexturesBindsEachTextureToItsTarget() { final int t2d = mipmappedTexture(); - final int t3d = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0); + final int t3d = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0); try { - GLStateManager.glBindTextures(1, new int[] {t2d, t3d}); + GLSMTextures.glBindTextures(1, new int[] {t2d, t3d}); assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "active unit unchanged"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); assertEquals(t2d, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "unit 1 driver binding"); - assertEquals(t2d, GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "unit 1 cached binding"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); + assertEquals(t2d, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "unit 1 cached binding"); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); assertEquals(t3d, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D), "unit 2 driver binding"); assertEquals(t3d, cachedBinding(2), "unit 2 cached binding"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); final int unit0 = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - GLStateManager.glBindTextures(GLStateManager.MAX_TEXTURE_UNITS - 1, new int[] {t3d, t2d}); + GLSMTextures.glBindTextures(GLStateManager.MAX_TEXTURE_UNITS - 1, new int[] {t3d, t2d}); assertEquals(unit0, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "an out-of-range multi-bind must not land on the active unit"); - GLStateManager.glDeleteTextures(t2d); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glDeleteTextures(t2d); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); assertEquals(0, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "delete unbinds a multi-bound texture"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTextures(1, new int[] {0, 0}); - GLStateManager.glDeleteTextures(t3d); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTextures(1, new int[] {0, 0}); + GLSMTextures.glDeleteTextures(t3d); } assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } @@ -191,22 +191,22 @@ public class GLSM_DeferredTextureDelete_GLTest { @Test void dsaCreated3DTextureIsBoundAs3D() { final int tex = RenderSystem.createTexture(GL12.GL_TEXTURE_3D); - final int other = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, other); + final int other = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, other); RenderSystem.texImage3D(tex, GL12.GL_TEXTURE_3D, 0, GL11.GL_RGBA8, SIZE, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); assertEquals(tex, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D), "texImage3D binds the texture as 3D"); assertEquals(tex, cachedBinding(0), "cached 3D binding"); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0); - GLStateManager.glDeleteTextures(tex); - GLStateManager.glDeleteTextures(other); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0); + GLSMTextures.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(other); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } @Test void createdNon2DTextureIsNotReleasedAs2D() { assumeTrue(GLStateManager.capabilities.OpenGL45, "no glCreateTextures on this context"); - final int tex = GLStateManager.glCreateTextures(GL12.GL_TEXTURE_3D); - GLStateManager.glDeleteTextures(tex); + final int tex = GLSMTextures.glCreateTextures(GL12.GL_TEXTURE_3D); + GLSMTextures.glDeleteTextures(tex); framesPass(RELEASE_DELAY_FRAMES); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } @@ -217,17 +217,17 @@ public class GLSM_DeferredTextureDelete_GLTest { final int unbound = Attachment.FRAMEBUFFER.attach(tex); final int bound = Attachment.FRAMEBUFFER.attach(tex); try { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, bound); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, bound); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); assertEquals(GL11.GL_NONE, GL30.glGetFramebufferAttachmentParameteri(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, unbound); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, unbound); assertEquals(tex, GL30.glGetFramebufferAttachmentParameteri(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)); } finally { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(bound); - GLStateManager.glDeleteFramebuffers(unbound); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(bound); + GLSMFramebuffer.glDeleteFramebuffers(unbound); } } @@ -237,21 +237,21 @@ public class GLSM_DeferredTextureDelete_GLTest { @EnumSource(Rescue.class) void rescuedTextureIsEmptyWithDefaultParameters(Rescue rescue) { final int tex = mipmappedTexture(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_BASE_LEVEL, 1); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL33.GL_TEXTURE_SWIZZLE_R, GL11.GL_GREEN); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 1.5f); - GLStateManager.glTexParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_BORDER_COLOR, (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] {1, 1, 1, 1}).flip()); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_BASE_LEVEL, 1); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL33.GL_TEXTURE_SWIZZLE_R, GL11.GL_GREEN); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 1.5f); + GLSMTextures.glTexParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_BORDER_COLOR, (FloatBuffer) BufferUtils.createFloatBuffer(4).put(new float[] {1, 1, 1, 1}).flip()); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); final int fbo = rescue == Rescue.ATTACHED ? Attachment.FRAMEBUFFER.attach(tex) : 0; - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); if (rescue != Rescue.PENDING) framesPass(RELEASE_DELAY_FRAMES); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); try { assertEquals(rescue == Rescue.ATTACHED ? SIZE : 0, levelWidth(tex, 0), "only an attached texture keeps its storage"); final int[][] defaults = { @@ -264,7 +264,7 @@ public class GLSM_DeferredTextureDelete_GLTest { }; for (int[] pair : defaults) { assertEquals(pair[1], GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, pair[0]), "driver pname 0x" + Integer.toHexString(pair[0])); - assertEquals(pair[1], GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, pair[0]), "cached pname 0x" + Integer.toHexString(pair[0])); + assertEquals(pair[1], GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, pair[0]), "cached pname 0x" + Integer.toHexString(pair[0])); } assertEquals(0.0f, GL11.glGetTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS)); final FloatBuffer border = BufferUtils.createFloatBuffer(16); @@ -272,22 +272,22 @@ public class GLSM_DeferredTextureDelete_GLTest { assertEquals(0.0f, border.get(0) + border.get(1) + border.get(2) + border.get(3), "border color"); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(tex); - if (fbo != 0) GLStateManager.glDeleteFramebuffers(fbo); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(tex); + if (fbo != 0) GLSMFramebuffer.glDeleteFramebuffers(fbo); } } @Test void rescuingWithADifferentTargetLeavesTheBoundTextureAlone() { - final int t3d = GLStateManager.glGenTextures(); + final int t3d = GLSMTextures.glGenTextures(); final int tex = mipmappedTexture(); try { - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d); - GLStateManager.glTexParameteri(GL12.GL_TEXTURE_3D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d); + GLSMTextures.glTexParameteri(GL12.GL_TEXTURE_3D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glDeleteTextures(tex); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, tex); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, tex); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "GLSM drops the bind"); assertEquals(t3d, cachedBinding(0), "cached 3D binding"); @@ -296,28 +296,28 @@ public class GLSM_DeferredTextureDelete_GLTest { assertEquals(t3d, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D), "the release must not unbind the 3D texture"); assertEquals(0, levelWidth(tex, 0), "the mismatched bind must leave the texture deferred"); } finally { - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0); - GLStateManager.glDeleteTextures(t3d); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0); + GLSMTextures.glDeleteTextures(t3d); } } @Test void deletingAStaleNameKeepsTheBoundTexture() { final int live = mipmappedTexture(); - final int stale = GLStateManager.glGenTextures(); + final int stale = GLSMTextures.glGenTextures(); try { - GLStateManager.glDeleteTextures(stale); - GLStateManager.glDeleteTextures(GLStateManager.glGenTextures()); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, live); + GLSMTextures.glDeleteTextures(stale); + GLSMTextures.glDeleteTextures(GLSMTextures.glGenTextures()); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, live); - GLStateManager.glDeleteTextures(stale); + GLSMTextures.glDeleteTextures(stale); framesPass(RELEASE_DELAY_FRAMES); assertEquals(SIZE, levelWidth(live, 0), "a stale delete must not empty the bound texture"); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(live); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(live); } } @@ -325,7 +325,7 @@ public class GLSM_DeferredTextureDelete_GLTest { void deletingAnImmutableTextureRaisesNoError() { final int tex = immutableTexture(); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } @@ -333,14 +333,14 @@ public class GLSM_DeferredTextureDelete_GLTest { @Test void rescuedImmutableTextureResetsParametersAndDeletesAgain() { final int tex = immutableTexture(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(tex); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(tex); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); assertEquals(GL11.GL_NEAREST_MIPMAP_LINEAR, GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER)); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } @@ -348,23 +348,23 @@ public class GLSM_DeferredTextureDelete_GLTest { @ParameterizedTest @ValueSource(booleans = {true, false}) void deletingA2DTextureWhileA3DTextureIsBound(boolean deletedIsHidden2D) { - final int t2d = GLStateManager.glGenTextures(); - final int t3d = GLStateManager.glGenTextures(); - final int other = GLStateManager.glGenTextures(); + final int t2d = GLSMTextures.glGenTextures(); + final int t3d = GLSMTextures.glGenTextures(); + final int other = GLSMTextures.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t2d); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t2d); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d); - GLStateManager.glDeleteTextures(deletedIsHidden2D ? t2d : other); + GLSMTextures.glDeleteTextures(deletedIsHidden2D ? t2d : other); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); assertEquals(deletedIsHidden2D ? 0 : t2d, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "only the deleted texture leaves the hidden 2D binding"); assertEquals(t3d, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D)); } finally { - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(t3d); - GLStateManager.glDeleteTextures(deletedIsHidden2D ? other : t2d); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(t3d); + GLSMTextures.glDeleteTextures(deletedIsHidden2D ? other : t2d); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeletedBufferBinding_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeletedBufferBinding_GLTest.java index 1eb527ed1..ecaa42f5b 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeletedBufferBinding_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DeletedBufferBinding_GLTest.java @@ -15,14 +15,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class GLSM_DeletedBufferBinding_GLTest { private static int makeBoundBuffer(int target) { - final int buffer = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(target, buffer); - GLStateManager.glBufferData(target, 64L, GL15.GL_STREAM_DRAW); + final int buffer = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(target, buffer); + GLSMBuffers.glBufferData(target, 64L, GL15.GL_STREAM_DRAW); return buffer; } private static void assertUnboundAfterDelete(int target, int binding, int buffer) { - GLStateManager.glDeleteBuffers(buffer); + GLSMBuffers.glDeleteBuffers(buffer); assertEquals(0, GL11.glGetInteger(binding), "GL unbinds a deleted buffer; the cache must not be the only place that knows"); } @@ -31,12 +31,12 @@ public class GLSM_DeletedBufferBinding_GLTest { final int pbo = makeBoundBuffer(GL21.GL_PIXEL_UNPACK_BUFFER); assertUnboundAfterDelete(GL21.GL_PIXEL_UNPACK_BUFFER, GL21.GL_PIXEL_UNPACK_BUFFER_BINDING, pbo); - final int tex = GLStateManager.glGenTextures(); + final int tex = GLSMTextures.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 1, 1, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(4)); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 1, 1, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(4)); } finally { - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); } } @@ -66,12 +66,12 @@ public class GLSM_DeletedBufferBinding_GLTest { void deletedIndexedUniformBufferIsNotRestoredFromCache() { final int index = 3; final int ubo = makeBoundBuffer(GL31.GL_UNIFORM_BUFFER); - GLStateManager.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, index, ubo); - assertEquals(ubo, GLStateManager.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index)); + GLSMBuffers.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, index, ubo); + assertEquals(ubo, GLSMBuffers.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index)); - GLStateManager.glDeleteBuffers(ubo); + GLSMBuffers.glDeleteBuffers(ubo); assertEquals(0, GL30.glGetInteger(GL31.GL_UNIFORM_BUFFER_BINDING, index)); - assertEquals(0, GLStateManager.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index)); + assertEquals(0, GLSMBuffers.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, index)); } @Test diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DirtyTracking_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DirtyTracking_UnitTest.java index dd6363156..f11bc60bf 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DirtyTracking_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DirtyTracking_UnitTest.java @@ -14,127 +14,127 @@ public class GLSM_DirtyTracking_UnitTest { @BeforeEach void pushTrackedState() { - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT | GL11.GL_FOG_BIT | GL11.GL_CURRENT_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT | GL11.GL_FOG_BIT | GL11.GL_CURRENT_BIT); } @AfterEach void popTrackedState() { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } @Test void materialBumpsOnlyOnChange() { - GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.1F, 0.2F, 0.3F, 0.4F)); - final int gen = GLStateManager.getLightingGeneration(); + GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.1F, 0.2F, 0.3F, 0.4F)); + final int gen = GLSMLighting.getLightingGeneration(); - GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.1F, 0.2F, 0.3F, 0.4F)); - assertEquals(gen, GLStateManager.getLightingGeneration(), "identical material must not bump lightingGeneration"); + GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.1F, 0.2F, 0.3F, 0.4F)); + assertEquals(gen, GLSMLighting.getLightingGeneration(), "identical material must not bump lightingGeneration"); - GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.9F, 0.2F, 0.3F, 0.4F)); - assertEquals(gen + 1, GLStateManager.getLightingGeneration(), "changed material must bump lightingGeneration once"); + GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.9F, 0.2F, 0.3F, 0.4F)); + assertEquals(gen + 1, GLSMLighting.getLightingGeneration(), "changed material must bump lightingGeneration once"); } @Test void lightModelBumpsOnlyOnChange() { - GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.5F, 0.5F, 0.5F, 1.0F)); - final int gen = GLStateManager.getLightingGeneration(); + GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.5F, 0.5F, 0.5F, 1.0F)); + final int gen = GLSMLighting.getLightingGeneration(); - GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.5F, 0.5F, 0.5F, 1.0F)); - assertEquals(gen, GLStateManager.getLightingGeneration(), "identical light model ambient must not bump"); + GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.5F, 0.5F, 0.5F, 1.0F)); + assertEquals(gen, GLSMLighting.getLightingGeneration(), "identical light model ambient must not bump"); } @Test void lightColorBumpsOnlyOnChange() { - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.75F, 1.0F)); - final int gen = GLStateManager.getLightingGeneration(); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.75F, 1.0F)); + final int gen = GLSMLighting.getLightingGeneration(); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.75F, 1.0F)); - assertEquals(gen, GLStateManager.getLightingGeneration(), "identical light diffuse must not bump"); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.75F, 1.0F)); + assertEquals(gen, GLSMLighting.getLightingGeneration(), "identical light diffuse must not bump"); } @Test void lightPositionDirtySkipsUnderSameModelview() { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(1.0F, 2.0F, 3.0F); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(1.0F, 2.0F, 3.0F); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F)); - final int gen = GLStateManager.getLightingGeneration(); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F)); + final int gen = GLSMLighting.getLightingGeneration(); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F)); - assertEquals(gen, GLStateManager.getLightingGeneration(), "same position under same modelview must not bump"); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F)); + assertEquals(gen, GLSMLighting.getLightingGeneration(), "same position under same modelview must not bump"); - GLStateManager.glTranslatef(5.0F, 0.0F, 0.0F); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F)); - assertEquals(gen + 1, GLStateManager.getLightingGeneration(), "same raw position under changed modelview must bump"); + GLSMMatrices.glTranslatef(5.0F, 0.0F, 0.0F); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.1F, 0.2F, 0.3F, 1.0F)); + assertEquals(gen + 1, GLSMLighting.getLightingGeneration(), "same raw position under changed modelview must bump"); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } @Test void translationDoesNotBumpLinearGeneration() { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); - final int mv = GLStateManager.getMvGeneration(); - final int lin = GLStateManager.getMvLinearGeneration(); + final int mv = GLSMMatrices.getMvGeneration(); + final int lin = GLSMMatrices.getMvLinearGeneration(); - GLStateManager.glTranslatef(1.0F, 2.0F, 3.0F); - assertEquals(mv + 1, GLStateManager.getMvGeneration(), "translate must bump mvGeneration"); - assertEquals(lin, GLStateManager.getMvLinearGeneration(), "translate must NOT bump mvLinearGeneration"); + GLSMMatrices.glTranslatef(1.0F, 2.0F, 3.0F); + assertEquals(mv + 1, GLSMMatrices.getMvGeneration(), "translate must bump mvGeneration"); + assertEquals(lin, GLSMMatrices.getMvLinearGeneration(), "translate must NOT bump mvLinearGeneration"); - GLStateManager.glRotatef(30.0F, 0.0F, 1.0F, 0.0F); - assertEquals(mv + 2, GLStateManager.getMvGeneration(), "rotate must bump mvGeneration"); - assertEquals(lin + 1, GLStateManager.getMvLinearGeneration(), "rotate must bump mvLinearGeneration"); + GLSMMatrices.glRotatef(30.0F, 0.0F, 1.0F, 0.0F); + assertEquals(mv + 2, GLSMMatrices.getMvGeneration(), "rotate must bump mvGeneration"); + assertEquals(lin + 1, GLSMMatrices.getMvLinearGeneration(), "rotate must bump mvLinearGeneration"); - GLStateManager.glScalef(2.0F, 2.0F, 2.0F); - assertEquals(lin + 2, GLStateManager.getMvLinearGeneration(), "scale must bump mvLinearGeneration"); + GLSMMatrices.glScalef(2.0F, 2.0F, 2.0F); + assertEquals(lin + 2, GLSMMatrices.getMvLinearGeneration(), "scale must bump mvLinearGeneration"); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } @Test void fogBumpsOnlyOnChange() { - GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.5F); + GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.5F); final int gen = GLStateManager.getFragmentGeneration(); - GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.5F); + GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.5F); assertEquals(gen, GLStateManager.getFragmentGeneration(), "identical fog density must not bump fragmentGeneration"); - GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.7F); + GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.7F); assertEquals(gen + 1, GLStateManager.getFragmentGeneration(), "changed fog density must bump fragmentGeneration"); } @Test void spotDirectionDirtySkipsUnderTranslationOnly() { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F)); - final int gen = GLStateManager.getLightingGeneration(); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F)); + final int gen = GLSMLighting.getLightingGeneration(); - GLStateManager.glTranslatef(5.0F, 0.0F, 0.0F); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F)); - assertEquals(gen, GLStateManager.getLightingGeneration(), "spot direction under translation-only must not bump"); + GLSMMatrices.glTranslatef(5.0F, 0.0F, 0.0F); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F)); + assertEquals(gen, GLSMLighting.getLightingGeneration(), "spot direction under translation-only must not bump"); - GLStateManager.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F)); - assertEquals(gen + 1, GLStateManager.getLightingGeneration(), "same raw spot direction under changed 3x3 must bump"); + GLSMMatrices.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.0F, 0.0F, -1.0F)); + assertEquals(gen + 1, GLSMLighting.getLightingGeneration(), "same raw spot direction under changed 3x3 must bump"); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } @Test void colorMaterialFreezesLastColorOnDisable() { - GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); - GLStateManager.glColor4f(1.0F, 0.0F, 0.0F, 1.0F); // enable-time color - GLStateManager.enableColorMaterial(); - GLStateManager.glColor4f(0.0F, 0.0F, 1.0F, 1.0F); // last color while enabled - GLStateManager.disableColorMaterial(); + GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); + GLSMCurrentAttribs.glColor4f(1.0F, 0.0F, 0.0F, 1.0F); // enable-time color + GLSMLighting.enableColorMaterial(); + GLSMCurrentAttribs.glColor4f(0.0F, 0.0F, 1.0F, 1.0F); // last color while enabled + GLSMLighting.disableColorMaterial(); - final Vector4f diffuse = GLStateManager.getFrontMaterial().diffuse; + final Vector4f diffuse = GLSMLighting.getFrontMaterial().diffuse; assertEquals(0.0F, diffuse.x, "diffuse must freeze at last color (blue), not enable-time red"); assertEquals(0.0F, diffuse.y, "green channel must be 0"); assertEquals(1.0F, diffuse.z, "blue channel must be 1"); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java index 4bbefb56f..5186e9210 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Batching_Test.java @@ -78,9 +78,9 @@ class GLSM_DisplayList_Batching_Test { void testDifferentTransformsSameFormatShareVBO() { CompiledDisplayList compiled = createDisplayList(() -> { createSimpleDraw(); - GLStateManager.glTranslatef(1, 0, 0); + GLSMMatrices.glTranslatef(1, 0, 0); createSimpleDraw(); - GLStateManager.glTranslatef(2, 0, 0); + GLSMMatrices.glTranslatef(2, 0, 0); createSimpleDraw(); }); @@ -107,9 +107,9 @@ class GLSM_DisplayList_Batching_Test { // has a different transform, so they can't all be merged. CompiledDisplayList compiled = createDisplayList(() -> { createSimpleDraw(); - GLStateManager.glTranslatef(0.5f, 0, 0); + GLSMMatrices.glTranslatef(0.5f, 0, 0); createSimpleDraw(); - GLStateManager.glTranslatef(-0.5f, 0, 0); + GLSMMatrices.glTranslatef(-0.5f, 0, 0); createSimpleDraw(); }); @@ -125,8 +125,8 @@ class GLSM_DisplayList_Batching_Test { @Test void testDrawsWithSameTransformProduceSingleDrawRangeCmd() { CompiledDisplayList compiled = createDisplayList(() -> { - GLStateManager.glTranslatef(1.0f, 2.0f, 3.0f); - GLStateManager.glScalef(2, 1, 3); + GLSMMatrices.glTranslatef(1.0f, 2.0f, 3.0f); + GLSMMatrices.glScalef(2, 1, 3); createSimpleDraw(); createSimpleDraw(); createSimpleDraw(); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_CompileAndExecuteArrays_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_CompileAndExecuteArrays_GLTest.java index 2fda795c1..3e2be1058 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_CompileAndExecuteArrays_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_CompileAndExecuteArrays_GLTest.java @@ -29,61 +29,61 @@ public class GLSM_DisplayList_CompileAndExecuteArrays_GLTest { @BeforeEach void setUp() { - final ViewportState vp = GLStateManager.getViewportState(); + final ViewportState vp = GLSMRasterizer.getViewportState(); savedX = vp.x; savedY = vp.y; savedW = vp.width; savedH = vp.height; - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); final ByteBuffer verts = ByteBuffer.allocateDirect(3 * 12).order(ByteOrder.nativeOrder()); verts.putFloat(0f).putFloat(0.5f).putFloat(0f).putFloat(W).putFloat(0.5f).putFloat(0f).flip(); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW); - GLStateManager.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, 12, 0L); - GLStateManager.glEnableVertexAttribArray(POSITION_LOC); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW); + GLSMVertexInput.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, 12, 0L); + GLSMVertexInput.glEnableVertexAttribArray(POSITION_LOC); - GLStateManager.glViewport(0, 0, W, 1); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glOrtho(0, W, 0, 1, -1, 1); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glColor4f(1f, 1f, 1f, 1f); + GLSMRasterizer.glViewport(0, 0, W, 1); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glOrtho(0, W, 0, 1, -1, 1); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMCurrentAttribs.glColor4f(1f, 1f, 1f, 1f); } @AfterEach void tearDown() { - if (list > 0) GLStateManager.glDeleteLists(list, 1); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPopMatrix(); - GLStateManager.glViewport(savedX, savedY, savedW, savedH); - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - if (vbo != 0) GLStateManager.glDeleteBuffers(vbo); - if (vao != 0) GLStateManager.glDeleteVertexArrays(vao); + if (list > 0) GLSMDraws.glDeleteLists(list, 1); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); + GLSMRasterizer.glViewport(savedX, savedY, savedW, savedH); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo); + if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao); while (GL11.glGetError() != GL11.GL_NO_ERROR) {} } private void clear() { - GLStateManager.glClearColor(0f, 0f, 0f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0f, 0f, 0f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); } private boolean[] readCoverage() { pixels.clear(); - GLStateManager.glReadPixels(0, 0, W, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + GLSMFramebuffer.glReadPixels(0, 0, W, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "GL error during readback"); final boolean[] covered = new boolean[W]; @@ -101,13 +101,13 @@ public class GLSM_DisplayList_CompileAndExecuteArrays_GLTest { /** The scale is issued inside the list, after the push that flushed everything before it - AE2 monitor's shape. */ private void compileScaledDraw(int mode) { - list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, mode); - GLStateManager.glPushMatrix(); - GLStateManager.glScalef(0.5f, 1f, 1f); - GLStateManager.glDrawArrays(GL11.GL_LINES, 0, 2); - GLStateManager.glPopMatrix(); - GLStateManager.glEndList(); + list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, mode); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glScalef(0.5f, 1f, 1f); + GLSMDraws.glDrawArrays(GL11.GL_LINES, 0, 2); + GLSMMatrices.glPopMatrix(); + GLSMDraws.glEndList(); } // Replay is not asserted here: a compiled list plays back through FFP client arrays, which this core context lacks, diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java index 594df85a9..4bcc36402 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_FormatOptimization_Test.java @@ -21,13 +21,13 @@ class GLSM_DisplayList_FormatOptimization_Test { @AfterEach void cleanup() { if (displayList > 0) { - GLStateManager.glDeleteLists(displayList, 1); + GLSMDraws.glDeleteLists(displayList, 1); displayList = -1; } // Reset GL state to avoid test pollution - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glTexCoord2f(0.0f, 0.0f); - GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glTexCoord2f(0.0f, 0.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f); } private static final float[][] CORNERS = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; @@ -37,20 +37,20 @@ class GLSM_DisplayList_FormatOptimization_Test { @ValueSource(booleans = {false, true}) void colorTextureFormatLeavesLastColorCurrent(boolean normals) { displayList = GL11.glGenLists(1); - GLStateManager.glNewList(displayList, GL11.GL_COMPILE); + GLSMDraws.glNewList(displayList, GL11.GL_COMPILE); - GLStateManager.glBegin(GL11.GL_QUADS); + GLSMDraws.glBegin(GL11.GL_QUADS); for (int i = 0; i < 4; i++) { - if (normals) GLStateManager.glNormal3f(0, 0, 1); - GLStateManager.glColor4f(COLORS[i][0], COLORS[i][1], COLORS[i][2], COLORS[i][3]); - GLStateManager.glTexCoord2f(CORNERS[i][0], CORNERS[i][1]); - GLStateManager.glVertex3f(CORNERS[i][0], CORNERS[i][1], 0); + if (normals) GLSMCurrentAttribs.glNormal3f(0, 0, 1); + GLSMCurrentAttribs.glColor4f(COLORS[i][0], COLORS[i][1], COLORS[i][2], COLORS[i][3]); + GLSMCurrentAttribs.glTexCoord2f(CORNERS[i][0], CORNERS[i][1]); + GLSMDraws.glVertex3f(CORNERS[i][0], CORNERS[i][1], 0); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); - GLStateManager.glCallList(displayList); + GLSMDraws.glCallList(displayList); verifyState(GL11.GL_CURRENT_COLOR, new float[]{0f, 0f, 1f, 1f}, "After playback, color should be blue (last color in immediate mode block)"); } @@ -59,40 +59,40 @@ class GLSM_DisplayList_FormatOptimization_Test { void testMultipleDrawsInDisplayList() { // Test a display list with multiple draws with different formats displayList = GL11.glGenLists(1); - GLStateManager.glNewList(displayList, GL11.GL_COMPILE); + GLSMDraws.glNewList(displayList, GL11.GL_COMPILE); // First draw: position only DisplayListTestHelper.immediateQuad(1.0f); // Second draw: position + color - GLStateManager.glBegin(GL11.GL_QUADS); - GLStateManager.glColor4f(1, 0, 0, 1); - GLStateManager.glVertex3f(2, 0, 0); - GLStateManager.glColor4f(0, 1, 0, 1); - GLStateManager.glVertex3f(3, 0, 0); - GLStateManager.glColor4f(0, 0, 1, 1); - GLStateManager.glVertex3f(3, 1, 0); - GLStateManager.glColor4f(1, 1, 0, 1); - GLStateManager.glVertex3f(2, 1, 0); - GLStateManager.glEnd(); + GLSMDraws.glBegin(GL11.GL_QUADS); + GLSMCurrentAttribs.glColor4f(1, 0, 0, 1); + GLSMDraws.glVertex3f(2, 0, 0); + GLSMCurrentAttribs.glColor4f(0, 1, 0, 1); + GLSMDraws.glVertex3f(3, 0, 0); + GLSMCurrentAttribs.glColor4f(0, 0, 1, 1); + GLSMDraws.glVertex3f(3, 1, 0); + GLSMCurrentAttribs.glColor4f(1, 1, 0, 1); + GLSMDraws.glVertex3f(2, 1, 0); + GLSMDraws.glEnd(); // Third draw: position + texture - GLStateManager.glBegin(GL11.GL_QUADS); - GLStateManager.glTexCoord2f(0, 0); - GLStateManager.glVertex3f(4, 0, 0); - GLStateManager.glTexCoord2f(1, 0); - GLStateManager.glVertex3f(5, 0, 0); - GLStateManager.glTexCoord2f(1, 1); - GLStateManager.glVertex3f(5, 1, 0); - GLStateManager.glTexCoord2f(0, 1); - GLStateManager.glVertex3f(4, 1, 0); - GLStateManager.glEnd(); + GLSMDraws.glBegin(GL11.GL_QUADS); + GLSMCurrentAttribs.glTexCoord2f(0, 0); + GLSMDraws.glVertex3f(4, 0, 0); + GLSMCurrentAttribs.glTexCoord2f(1, 0); + GLSMDraws.glVertex3f(5, 0, 0); + GLSMCurrentAttribs.glTexCoord2f(1, 1); + GLSMDraws.glVertex3f(5, 1, 0); + GLSMCurrentAttribs.glTexCoord2f(0, 1); + GLSMDraws.glVertex3f(4, 1, 0); + GLSMDraws.glEnd(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Call the list and verify color is restored to last value from second draw (yellow) // Third draw has no color, so doesn't affect GL_CURRENT_COLOR - GLStateManager.glCallList(displayList); + GLSMDraws.glCallList(displayList); verifyState(GL11.GL_CURRENT_COLOR, new float[]{1f, 1f, 0f, 1f}, "After playback, color should be yellow (last color from second draw)"); } @@ -104,26 +104,26 @@ class GLSM_DisplayList_FormatOptimization_Test { @Test void testColorRestoredAfterImmediateModeVBOPlayback() { // Set initial color to white - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); verifyState(GL11.GL_CURRENT_COLOR, new float[]{1f, 1f, 1f, 1f}, "Initial color should be white"); // Create display list with immediate mode that sets color to BLUE (0, 0, 1, 1) displayList = GL11.glGenLists(1); - GLStateManager.glNewList(displayList, GL11.GL_COMPILE); + GLSMDraws.glNewList(displayList, GL11.GL_COMPILE); - GLStateManager.glBegin(GL11.GL_QUADS); - GLStateManager.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); // Blue - GLStateManager.glVertex3f(0, 0, 0); - GLStateManager.glVertex3f(1, 0, 0); - GLStateManager.glVertex3f(1, 1, 0); - GLStateManager.glVertex3f(0, 1, 0); - GLStateManager.glEnd(); + GLSMDraws.glBegin(GL11.GL_QUADS); + GLSMCurrentAttribs.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); // Blue + GLSMDraws.glVertex3f(0, 0, 0); + GLSMDraws.glVertex3f(1, 0, 0); + GLSMDraws.glVertex3f(1, 1, 0); + GLSMDraws.glVertex3f(0, 1, 0); + GLSMDraws.glEnd(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Call the display list - GLStateManager.glCallList(displayList); + GLSMDraws.glCallList(displayList); // After playback, GL_CURRENT_COLOR should be blue (the last color in the display list) // AND the GLSM cache should also be blue (synced with GL) @@ -131,7 +131,7 @@ class GLSM_DisplayList_FormatOptimization_Test { "After display list playback, color should be blue (last color in the list)"); // Now set color to red - this should ACTUALLY change the color - GLStateManager.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); verifyState(GL11.GL_CURRENT_COLOR, new float[]{1f, 0f, 0f, 1f}, "After setting color to red, color should be red"); } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java index dc918c36e..61857968c 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Nesting_Test.java @@ -25,37 +25,37 @@ class GLSM_DisplayList_Nesting_Test { @AfterEach void cleanup() { if (parentList > 0) { - GLStateManager.glDeleteLists(parentList, 1); + GLSMDraws.glDeleteLists(parentList, 1); parentList = -1; } if (childList > 0) { - GLStateManager.glDeleteLists(childList, 1); + GLSMDraws.glDeleteLists(childList, 1); childList = -1; } // Reset GL state - GLStateManager.glLoadIdentity(); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMMatrices.glLoadIdentity(); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } @Test void testNestedDisplayListWithParentTransform() { // Create child list: just a simple quad at origin childList = GL11.glGenLists(1); - GLStateManager.glNewList(childList, GL11.GL_COMPILE); + GLSMDraws.glNewList(childList, GL11.GL_COMPILE); GL11.glBegin(GL11.GL_QUADS); GL11.glVertex3f(0, 0, 0); GL11.glVertex3f(1, 0, 0); GL11.glVertex3f(1, 1, 0); GL11.glVertex3f(0, 1, 0); GL11.glEnd(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Create parent list: translate then call child parentList = GL11.glGenLists(1); - GLStateManager.glNewList(parentList, GL11.GL_COMPILE); - GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); // Parent transform - GLStateManager.glCallList(childList); // Should render child at (10,0,0) - GLStateManager.glEndList(); + GLSMDraws.glNewList(parentList, GL11.GL_COMPILE); + GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); // Parent transform + GLSMDraws.glCallList(childList); // Should render child at (10,0,0) + GLSMDraws.glEndList(); DisplayListTestHelper.assertModelviewAfterCall(parentList, new Matrix4f().translate(10.0f, 0.0f, 0.0f), "parent transform applies to the child"); } @@ -73,8 +73,8 @@ class GLSM_DisplayList_Nesting_Test { try { for (int depth = chain.length - 1; depth >= 0; depth--) { lists[depth] = GL11.glGenLists(1); - GLStateManager.glNewList(lists[depth], GL11.GL_COMPILE); - GLStateManager.glTranslatef(chain[depth], 0.0f, 0.0f); + GLSMDraws.glNewList(lists[depth], GL11.GL_COMPILE); + GLSMMatrices.glTranslatef(chain[depth], 0.0f, 0.0f); if (depth == chain.length - 1) { GL11.glBegin(GL11.GL_QUADS); GL11.glVertex3f(0, 0, 0); @@ -83,14 +83,14 @@ class GLSM_DisplayList_Nesting_Test { GL11.glVertex3f(0, 1, 0); GL11.glEnd(); } else { - GLStateManager.glCallList(lists[depth + 1]); + GLSMDraws.glCallList(lists[depth + 1]); } - GLStateManager.glEndList(); + GLSMDraws.glEndList(); } DisplayListTestHelper.assertModelviewAfterCall(lists[0], new Matrix4f().translate(expectedX, 0.0f, 0.0f), "nested translations"); } finally { for (int list : lists) { - if (list > 0) GLStateManager.glDeleteLists(list, 1); + if (list > 0) GLSMDraws.glDeleteLists(list, 1); } } } @@ -99,24 +99,24 @@ class GLSM_DisplayList_Nesting_Test { void testNestedDisplayListWithPushPop() { // Create child list with push/pop (shouldn't affect parent's matrix) childList = GL11.glGenLists(1); - GLStateManager.glNewList(childList, GL11.GL_COMPILE); - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); // Child transform + GLSMDraws.glNewList(childList, GL11.GL_COMPILE); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); // Child transform GL11.glBegin(GL11.GL_QUADS); GL11.glVertex3f(0, 0, 0); GL11.glVertex3f(1, 0, 0); GL11.glVertex3f(1, 1, 0); GL11.glVertex3f(0, 1, 0); GL11.glEnd(); - GLStateManager.glPopMatrix(); // Restore matrix to parent's state - GLStateManager.glEndList(); + GLSMMatrices.glPopMatrix(); // Restore matrix to parent's state + GLSMDraws.glEndList(); // Create parent list parentList = GL11.glGenLists(1); - GLStateManager.glNewList(parentList, GL11.GL_COMPILE); - GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); // Parent transform - GLStateManager.glCallList(childList); // Child uses push/pop - GLStateManager.glEndList(); + GLSMDraws.glNewList(parentList, GL11.GL_COMPILE); + GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); // Parent transform + GLSMDraws.glCallList(childList); // Child uses push/pop + GLSMDraws.glEndList(); DisplayListTestHelper.assertModelviewAfterCall(parentList, new Matrix4f().translate(10.0f, 0.0f, 0.0f), "child push/pop leaves only the parent transform"); } @@ -127,38 +127,38 @@ class GLSM_DisplayList_Nesting_Test { // This is a uncommon but technically valid per the spec. // Get initial stack depth - int initialDepth = GLStateManager.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH); + int initialDepth = GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH); // Create a display list that only pushes the matrix int matrixPushList = GL11.glGenLists(1); - GLStateManager.glNewList(matrixPushList, GL11.GL_COMPILE); - GLStateManager.glPushMatrix(); - GLStateManager.glEndList(); + GLSMDraws.glNewList(matrixPushList, GL11.GL_COMPILE); + GLSMMatrices.glPushMatrix(); + GLSMDraws.glEndList(); // Create a display list that only pops the matrix int matrixPopList = GL11.glGenLists(1); - GLStateManager.glNewList(matrixPopList, GL11.GL_COMPILE); - GLStateManager.glPopMatrix(); - GLStateManager.glEndList(); + GLSMDraws.glNewList(matrixPopList, GL11.GL_COMPILE); + GLSMMatrices.glPopMatrix(); + GLSMDraws.glEndList(); // Verify initial stack depth hasn't changed after compilation - assertEquals(initialDepth, GLStateManager.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH), "Stack depth should be unchanged after compiling display lists"); + assertEquals(initialDepth, GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH), "Stack depth should be unchanged after compiling display lists"); // Call the push list - should increase stack depth - GLStateManager.glCallList(matrixPushList); - int depthAfterPush = GLStateManager.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH); + GLSMDraws.glCallList(matrixPushList); + int depthAfterPush = GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH); assertEquals(initialDepth + 1, depthAfterPush, "Stack depth should increase by 1 after calling push list"); // Optionally do some operations here that would benefit from the pushed matrix - GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f); // Call the pop list - should restore stack depth - GLStateManager.glCallList(matrixPopList); - int depthAfterPop = GLStateManager.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH); + GLSMDraws.glCallList(matrixPopList); + int depthAfterPop = GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH); assertEquals(initialDepth, depthAfterPop, "Stack depth should return to initial after calling pop list"); // Cleanup - GLStateManager.glDeleteLists(matrixPushList, 1); - GLStateManager.glDeleteLists(matrixPopList, 1); + GLSMDraws.glDeleteLists(matrixPushList, 1); + GLSMDraws.glDeleteLists(matrixPopList, 1); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_PixelStore_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_PixelStore_Test.java index dffb7a157..91198fc4d 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_PixelStore_Test.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_PixelStore_Test.java @@ -21,13 +21,13 @@ public class GLSM_DisplayList_PixelStore_Test { TEX_SUB_IMAGE_2D { @Override void run(ByteBuffer src) { - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src); } }, TEX_IMAGE_2D { @Override void run(ByteBuffer src) { - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SUB, SUB, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SUB, SUB, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src); } }; @@ -36,14 +36,14 @@ public class GLSM_DisplayList_PixelStore_Test { @AfterEach void resetUnpackState() { - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); setUnpack(0, 0, 0); } private static void setUnpack(int rowLength, int skipRows, int skipPixels) { - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, rowLength); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, skipRows); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, skipPixels); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, rowLength); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, skipRows); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, skipPixels); } private static void setStridedUnpack() { @@ -61,15 +61,15 @@ public class GLSM_DisplayList_PixelStore_Test { } private static int makeTexture(int size, ByteBuffer pixels) { - final int tex = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + final int tex = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); return tex; } private static ByteBuffer readback(int size) { final ByteBuffer out = ByteBuffer.allocateDirect(size * size * 4).order(ByteOrder.nativeOrder()); - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out); + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out); return out; } @@ -101,18 +101,18 @@ public class GLSM_DisplayList_PixelStore_Test { @Test void pixelStoreExecutesImmediatelyAndIsNotRecorded() { - final int list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 7); + final int list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 7); assertEquals(7, GL11.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH), "must execute immediately during recording"); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(7, GL11.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH), "must persist after glEndList"); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0); - GLStateManager.glCallList(list); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0); + GLSMDraws.glCallList(list); assertEquals(0, GL11.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH), "must not have been recorded into the list"); - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); } @ParameterizedTest @@ -123,21 +123,21 @@ public class GLSM_DisplayList_PixelStore_Test { setStridedUnpack(); - final int list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + final int list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); upload.run(src); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(0, red(readback(SUB), SUB, 0, 0), "GL_COMPILE must not execute the upload"); setUnpack(0, 0, 0); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertStridedSubImage(readback(SUB)); assertUnpack(0, 0, 0); - GLStateManager.glDeleteLists(list, 1); - GLStateManager.glDeleteTextures(tex); + GLSMDraws.glDeleteLists(list, 1); + GLSMTextures.glDeleteTextures(tex); } @Test @@ -148,22 +148,22 @@ public class GLSM_DisplayList_PixelStore_Test { setStridedUnpack(); - final int list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src); - GLStateManager.glEndList(); + final int list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src); + GLSMDraws.glEndList(); assertStridedSubImage(readback(SUB)); setUnpack(0, 0, 0); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, zeros); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SUB, SUB, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, zeros); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertStridedSubImage(readback(SUB)); assertUnpack(0, 0, 0); - GLStateManager.glDeleteLists(list, 1); - GLStateManager.glDeleteTextures(tex); + GLSMDraws.glDeleteLists(list, 1); + GLSMTextures.glDeleteTextures(tex); } @ParameterizedTest @@ -172,20 +172,20 @@ public class GLSM_DisplayList_PixelStore_Test { final int tex = makeTexture(SUB, ByteBuffer.allocateDirect(SUB * SUB * 4).order(ByteOrder.nativeOrder())); final ByteBuffer src = makeSource(SUB); - final int list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + final int list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); upload.run(src); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); setStridedUnpack(); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertTightSubImage(readback(SUB)); assertEquals(1, GL11.glGetInteger(GL11.GL_UNPACK_ALIGNMENT), "live state must survive replay"); assertUnpack(SRC, 1, 2); - GLStateManager.glDeleteLists(list, 1); - GLStateManager.glDeleteTextures(tex); + GLSMDraws.glDeleteLists(list, 1); + GLSMTextures.glDeleteTextures(tex); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_RawTessellatorTransform_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_RawTessellatorTransform_Test.java index 73f82e6b6..750fa495b 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_RawTessellatorTransform_Test.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_RawTessellatorTransform_Test.java @@ -21,18 +21,18 @@ class GLSM_DisplayList_RawTessellatorTransform_Test { @AfterEach void cleanup() { if (testList > 0) { - GLStateManager.glDeleteLists(testList, 1); + GLSMDraws.glDeleteLists(testList, 1); testList = -1; } - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); } private CompiledDisplayList compileHalfScaled(Runnable body) { - testList = GLStateManager.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); - GLStateManager.glScalef(0.5f, 0.5f, 0.5f); + testList = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); + GLSMMatrices.glScalef(0.5f, 0.5f, 0.5f); body.run(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); final CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); assertNotNull(compiled); @@ -85,15 +85,15 @@ class GLSM_DisplayList_RawTessellatorTransform_Test { @Test void aRawDrawDoesNotFlushWhileBakedGeometryIsPending() { final CompiledDisplayList compiled = compileHalfScaled(() -> { - GLStateManager.glBegin(GL11.GL_QUADS); - GLStateManager.glVertex3f(0.0f, 0.0f, 0.0f); - GLStateManager.glVertex3f(1.0f, 0.0f, 0.0f); - GLStateManager.glVertex3f(1.0f, 1.0f, 0.0f); - GLStateManager.glVertex3f(0.0f, 1.0f, 0.0f); + GLSMDraws.glBegin(GL11.GL_QUADS); + GLSMDraws.glVertex3f(0.0f, 0.0f, 0.0f); + GLSMDraws.glVertex3f(1.0f, 0.0f, 0.0f); + GLSMDraws.glVertex3f(1.0f, 1.0f, 0.0f); + GLSMDraws.glVertex3f(0.0f, 1.0f, 0.0f); rawQuad(1.0f); - GLStateManager.glEnd(); + GLSMDraws.glEnd(); }); final IntList opcodes = compiled.getCommandOpcodes(); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_StateSet_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_StateSet_GLTest.java index 9ad701022..e353881eb 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_StateSet_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_StateSet_GLTest.java @@ -25,40 +25,40 @@ public class GLSM_DisplayList_StateSet_GLTest { @AfterEach void cleanup() { DisplayListManager.abortCompilation(); - while (GLStateManager.getAttribDepth() > 0) { - GLStateManager.popState(); + while (GLSMAttribStack.getAttribDepth() > 0) { + GLSMAttribStack.popState(); } for (int id : listsToDelete) { - GLStateManager.glDeleteLists(id, 1); + GLSMDraws.glDeleteLists(id, 1); } listsToDelete.clear(); - GLStateManager.disableBlend(); - GLStateManager.disableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.disableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMBlend.disableBlend(); + GLSMRasterizer.disableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private int newList() { - final int id = GLStateManager.glGenLists(1); + final int id = GLSMDraws.glGenLists(1); listsToDelete.add(id); return id; } private int recordCutoutBracket(int mode) { final int list = newList(); - GLStateManager.glNewList(list, mode); - final int d = GLStateManager.pushState(StateSet.CUTOUT); - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.enableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.popStateTo(d); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, mode); + final int d = GLSMAttribStack.pushState(StateSet.CUTOUT); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.enableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMAttribStack.popStateTo(d); + GLSMDraws.glEndList(); return list; } @@ -70,22 +70,22 @@ public class GLSM_DisplayList_StateSet_GLTest { @Test void compileBracketDoesNotThrowAndLeavesLiveStateUntouched() { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); - final int func0 = GLStateManager.getAlphaState().getFunction(); - final float ref0 = GLStateManager.getAlphaState().getReference(); - final int unit0 = GLStateManager.getActiveTextureUnit(); - final int depth0 = GLStateManager.getAttribDepth(); + final int func0 = GLSMDepthStencilAlpha.getAlphaState().getFunction(); + final float ref0 = GLSMDepthStencilAlpha.getAlphaState().getReference(); + final int unit0 = GLSMTextures.getActiveTextureUnit(); + final int depth0 = GLSMAttribStack.getAttribDepth(); final int list = recordCutoutBracket(GL11.GL_COMPILE); verifyIsEnabled(GL11.GL_ALPHA_TEST, true, "cache alpha test enable unchanged after COMPILE-only bracket"); - assertEquals(func0, GLStateManager.getAlphaState().getFunction(), "cache alpha func unchanged after COMPILE-only bracket"); - assertEquals(ref0, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref unchanged after COMPILE-only bracket"); - assertEquals(unit0, GLStateManager.getActiveTextureUnit(), "cache active unit unchanged after COMPILE-only bracket"); - assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged after COMPILE-only bracket"); + assertEquals(func0, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func unchanged after COMPILE-only bracket"); + assertEquals(ref0, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref unchanged after COMPILE-only bracket"); + assertEquals(unit0, GLSMTextures.getActiveTextureUnit(), "cache active unit unchanged after COMPILE-only bracket"); + assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged after COMPILE-only bracket"); assertEquals(2, commandCounts(list).getOrDefault(GLCommand.COMPLEX_REF, 0), "push and pop each record one COMPLEX_REF"); } @@ -93,149 +93,149 @@ public class GLSM_DisplayList_StateSet_GLTest { void compiledBracketReplayRestoresState() { final int list = recordCutoutBracket(GL11.GL_COMPILE); - GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.9f); - GLStateManager.disableAlphaTest(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - final int depth0 = GLStateManager.getAttribDepth(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.9f); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + final int depth0 = GLSMAttribStack.getAttribDepth(); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); - assertEquals(GL11.GL_LESS, GLStateManager.getAlphaState().getFunction(), "cache alpha func restored by replay"); - assertEquals(0.9f, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored by replay"); + assertEquals(GL11.GL_LESS, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func restored by replay"); + assertEquals(0.9f, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored by replay"); verifyIsEnabled(GL11.GL_ALPHA_TEST, false, "cache alpha test restored disabled by replay"); - assertEquals(0, GLStateManager.getActiveTextureUnit(), "cache active unit restored by replay"); + assertEquals(0, GLSMTextures.getActiveTextureUnit(), "cache active unit restored by replay"); assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "driver active unit restored by replay"); - assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged by balanced replay"); + assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged by balanced replay"); } @Test void compileAndExecuteBracketIsBalanced() { - GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.9f); - GLStateManager.disableAlphaTest(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - final int depth0 = GLStateManager.getAttribDepth(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.9f); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + final int depth0 = GLSMAttribStack.getAttribDepth(); final int list = recordCutoutBracket(GL11.GL_COMPILE_AND_EXECUTE); - assertEquals(GL11.GL_LESS, GLStateManager.getAlphaState().getFunction(), "cache alpha func restored after GL_COMPILE_AND_EXECUTE bracket"); - assertEquals(0.9f, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored after GL_COMPILE_AND_EXECUTE bracket"); + assertEquals(GL11.GL_LESS, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func restored after GL_COMPILE_AND_EXECUTE bracket"); + assertEquals(0.9f, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored after GL_COMPILE_AND_EXECUTE bracket"); verifyIsEnabled(GL11.GL_ALPHA_TEST, false, "cache alpha test restored disabled after GL_COMPILE_AND_EXECUTE bracket"); - assertEquals(0, GLStateManager.getActiveTextureUnit(), "cache active unit restored after GL_COMPILE_AND_EXECUTE bracket"); + assertEquals(0, GLSMTextures.getActiveTextureUnit(), "cache active unit restored after GL_COMPILE_AND_EXECUTE bracket"); assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "driver active unit restored after GL_COMPILE_AND_EXECUTE bracket"); - assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged after balanced GL_COMPILE_AND_EXECUTE bracket"); + assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged after balanced GL_COMPILE_AND_EXECUTE bracket"); - GLStateManager.glCallList(list); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); + GLSMDraws.glCallList(list); - assertEquals(GL11.GL_LESS, GLStateManager.getAlphaState().getFunction(), "cache alpha func restored after replay"); - assertEquals(0.9f, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored after replay"); + assertEquals(GL11.GL_LESS, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func restored after replay"); + assertEquals(0.9f, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref restored after replay"); verifyIsEnabled(GL11.GL_ALPHA_TEST, false, "cache alpha test restored disabled after replay"); - assertEquals(0, GLStateManager.getActiveTextureUnit(), "cache active unit restored after replay"); + assertEquals(0, GLSMTextures.getActiveTextureUnit(), "cache active unit restored after replay"); assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "driver active unit restored after replay"); - assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged after replay"); + assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged after replay"); } @Test void nestedListsPushInBothLevels() { - GLStateManager.enableBlend(); - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); - final boolean cull0 = GLStateManager.glIsEnabled(GL11.GL_CULL_FACE); - final int depth0 = GLStateManager.getAttribDepth(); + GLSMBlend.enableBlend(); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + final boolean cull0 = GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE); + final int depth0 = GLSMAttribStack.getAttribDepth(); final int parent = newList(); final int child = newList(); - GLStateManager.glNewList(parent, GL11.GL_COMPILE); - final int dParent = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.glNewList(child, GL11.GL_COMPILE); - final int dChild = GLStateManager.pushState(StateSet.CULL); + GLSMDraws.glNewList(parent, GL11.GL_COMPILE); + final int dParent = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMDraws.glNewList(child, GL11.GL_COMPILE); + final int dChild = GLSMAttribStack.pushState(StateSet.CULL); if (cull0) { - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); } else { - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); } - GLStateManager.popStateTo(dChild); - GLStateManager.glEndList(); - GLStateManager.disableBlend(); - GLStateManager.popStateTo(dParent); - GLStateManager.glEndList(); + GLSMAttribStack.popStateTo(dChild); + GLSMDraws.glEndList(); + GLSMBlend.disableBlend(); + GLSMAttribStack.popStateTo(dParent); + GLSMDraws.glEndList(); - assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged by nested COMPILE-only bracket"); + assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged by nested COMPILE-only bracket"); - GLStateManager.glCallList(parent); + GLSMDraws.glCallList(parent); verifyIsEnabled(GL11.GL_BLEND, true, "blend enable restored by the parent BLEND bracket after parent replay"); verifyIsEnabled(GL11.GL_CULL_FACE, cull0, "cull enable restored after parent replay"); - GLStateManager.glCallList(child); + GLSMDraws.glCallList(child); verifyIsEnabled(GL11.GL_CULL_FACE, cull0, "cull enable restored after child replay"); } @Test void nestedCompileAndExecuteChildInsideCompileParent() { - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); - final boolean cull0 = GLStateManager.glIsEnabled(GL11.GL_CULL_FACE); - final int depth0 = GLStateManager.getAttribDepth(); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + final boolean cull0 = GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE); + final int depth0 = GLSMAttribStack.getAttribDepth(); final int parent = newList(); final int child = newList(); - GLStateManager.glNewList(parent, GL11.GL_COMPILE); - final int dParent = GLStateManager.pushState(StateSet.BLEND); + GLSMDraws.glNewList(parent, GL11.GL_COMPILE); + final int dParent = GLSMAttribStack.pushState(StateSet.BLEND); - GLStateManager.glNewList(child, GL11.GL_COMPILE_AND_EXECUTE); - final int dChild = GLStateManager.pushState(StateSet.CULL); + GLSMDraws.glNewList(child, GL11.GL_COMPILE_AND_EXECUTE); + final int dChild = GLSMAttribStack.pushState(StateSet.CULL); if (cull0) { - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); } else { - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); } - GLStateManager.popStateTo(dChild); - GLStateManager.glEndList(); + GLSMAttribStack.popStateTo(dChild); + GLSMDraws.glEndList(); verifyIsEnabled(GL11.GL_CULL_FACE, cull0, "cull enable restored live immediately after the COMPILE_AND_EXECUTE child bracket closes"); - GLStateManager.popStateTo(dParent); - GLStateManager.glEndList(); + GLSMAttribStack.popStateTo(dParent); + GLSMDraws.glEndList(); - assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged after balanced nested bracket"); + assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged after balanced nested bracket"); assertEquals(2, commandCounts(parent).getOrDefault(GLCommand.COMPLEX_REF, 0), "parent list records exactly the BLEND push and pop"); assertEquals(2, commandCounts(child).getOrDefault(GLCommand.COMPLEX_REF, 0), "child list records exactly the CULL push and pop"); } @Test void unbalancedBracketIsClosedAtEndList() { - GLStateManager.enableBlend(); - final boolean blend0 = GLStateManager.glIsEnabled(GL11.GL_BLEND); - final int depth0 = GLStateManager.getAttribDepth(); + GLSMBlend.enableBlend(); + final boolean blend0 = GLSMEnable.glIsEnabled(GL11.GL_BLEND); + final int depth0 = GLSMAttribStack.getAttribDepth(); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.pushState(StateSet.BATCH); - GLStateManager.disableBlend(); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMAttribStack.pushState(StateSet.BATCH); + GLSMBlend.disableBlend(); + GLSMDraws.glEndList(); assertEquals(2, commandCounts(list).getOrDefault(GLCommand.COMPLEX_REF, 0), "glEndList closes the unbalanced push, recording a matching pop"); - GLStateManager.glCallList(list); - assertEquals(depth0, GLStateManager.getAttribDepth(), "live attrib depth unchanged after replaying an auto-closed bracket"); + GLSMDraws.glCallList(list); + assertEquals(depth0, GLSMAttribStack.getAttribDepth(), "live attrib depth unchanged after replaying an auto-closed bracket"); verifyIsEnabled(GL11.GL_BLEND, blend0, "blend enable unchanged after replaying an auto-closed bracket"); final int other = newList(); assertDoesNotThrow(() -> { - GLStateManager.glNewList(other, GL11.GL_COMPILE); - GLStateManager.glEndList(); + GLSMDraws.glNewList(other, GL11.GL_COMPILE); + GLSMDraws.glEndList(); }, "an unrelated list must compile normally after an auto-closed bracket"); } @Test void glPushAttribRecordsExactlyOnce() { final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.glPopAttrib(); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMAttribStack.glPopAttrib(); + GLSMDraws.glEndList(); final Int2IntMap counts = commandCounts(list); assertEquals(1, counts.getOrDefault(GLCommand.PUSH_ATTRIB, 0), "glPushAttrib records exactly one PUSH_ATTRIB opcode"); @@ -245,50 +245,50 @@ public class GLSM_DisplayList_StateSet_GLTest { @Test void livePushStraddlesOpenList() { - GLStateManager.enableBlend(); - final int d = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.disableBlend(); + GLSMBlend.enableBlend(); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMBlend.disableBlend(); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glEndList(); - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); - assertEquals(d, GLStateManager.getAttribDepth(), "live attrib depth restored to the pre-bracket value"); + assertEquals(d, GLSMAttribStack.getAttribDepth(), "live attrib depth restored to the pre-bracket value"); verifyIsEnabled(GL11.GL_BLEND, true, "blend enable restored by the live pop that straddled the open-then-closed list"); } @Test void livePopInsideOpenListPopsLiveAndRecordsNothing() { - GLStateManager.enableBlend(); - final int d = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.disableBlend(); + GLSMBlend.enableBlend(); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMBlend.disableBlend(); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.popStateTo(d); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMAttribStack.popStateTo(d); + GLSMDraws.glEndList(); - assertEquals(d, GLStateManager.getAttribDepth(), "live attrib depth restored by the live pop performed inside the open list"); + assertEquals(d, GLSMAttribStack.getAttribDepth(), "live attrib depth restored by the live pop performed inside the open list"); verifyIsEnabled(GL11.GL_BLEND, true, "blend enable restored live by the pop of a pre-list push"); assertEquals(0, commandCounts(list).getOrDefault(GLCommand.COMPLEX_REF, 0), "popping a pre-existing live push records nothing into the list"); } @Test void virtualDepthOverflowThrowsAtRecordTime() { - final int startDepth = GLStateManager.getAttribDepth(); + final int startDepth = GLSMAttribStack.getAttribDepth(); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); final int pushes = GLStateManager.MAX_ATTRIB_STACK_DEPTH - startDepth; for (int i = 0; i < pushes; i++) { - GLStateManager.pushState(StateSet.CUTOUT); + GLSMAttribStack.pushState(StateSet.CUTOUT); } - assertThrows(IllegalStateException.class, () -> GLStateManager.pushState(StateSet.CUTOUT), "virtual depth overflow beyond MAX_ATTRIB_STACK_DEPTH must throw at record time"); + assertThrows(IllegalStateException.class, () -> GLSMAttribStack.pushState(StateSet.CUTOUT), "virtual depth overflow beyond MAX_ATTRIB_STACK_DEPTH must throw at record time"); DisplayListManager.abortCompilation(); - assertEquals(startDepth, GLStateManager.getAttribDepth(), "aborting the overflowed compilation leaves live attrib depth untouched"); + assertEquals(startDepth, GLSMAttribStack.getAttribDepth(), "aborting the overflowed compilation leaves live attrib depth untouched"); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java index 66b802891..9636941e5 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_Stress_Test.java @@ -33,11 +33,11 @@ class GLSM_DisplayList_Stress_Test { void cleanup() { for (int list : testLists) { if (list > 0) { - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); } } testLists.clear(); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); } private int createAndTrackList() { @@ -53,12 +53,12 @@ class GLSM_DisplayList_Stress_Test { for (int i = 0; i < numLists; i++) { int list = createAndTrackList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); // Each list has a unique transform - GLStateManager.glTranslatef(i * 0.1f, 0, 0); + GLSMMatrices.glTranslatef(i * 0.1f, 0, 0); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Verify each list was compiled assertTrue(DisplayListManager.displayListExists(list), @@ -78,20 +78,20 @@ class GLSM_DisplayList_Stress_Test { final int numTransforms = 1000; int list = createAndTrackList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); // Many push/pop pairs with transforms for (int i = 0; i < numTransforms; i++) { - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(i * 0.001f, 0, 0); - GLStateManager.glRotatef(i * 0.36f, 0, 1, 0); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(i * 0.001f, 0, 0); + GLSMMatrices.glRotatef(i * 0.36f, 0, 1, 0); + GLSMMatrices.glPopMatrix(); } // Final transform that should be the result - GLStateManager.glTranslatef(42.0f, 0, 0); + GLSMMatrices.glTranslatef(42.0f, 0, 0); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(42.0f, modelviewAfterCall(list).get(12), 0.0001f, "After many push/pop pairs, only final transform should remain"); } @@ -104,12 +104,12 @@ class GLSM_DisplayList_Stress_Test { for (int cycle = 0; cycle < cycles; cycle++) { int list = GL11.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glTranslatef(cycle, 0, 0); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMMatrices.glTranslatef(cycle, 0, 0); + GLSMDraws.glEndList(); // Immediately delete - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); // Verify it's gone assertFalse(DisplayListManager.displayListExists(list), @@ -126,16 +126,16 @@ class GLSM_DisplayList_Stress_Test { // Create from innermost to outermost for (int i = 0; i < chainLength; i++) { chain[i] = createAndTrackList(); - GLStateManager.glNewList(chain[i], GL11.GL_COMPILE); + GLSMDraws.glNewList(chain[i], GL11.GL_COMPILE); // Each list translates by 1 and calls the previous list (if any) - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); if (i > 0) { - GLStateManager.glCallList(chain[i - 1]); + GLSMDraws.glCallList(chain[i - 1]); } - GLStateManager.glEndList(); + GLSMDraws.glEndList(); } assertModelviewAfterCall(chain[chainLength - 1], new Matrix4f().translate(chainLength, 0.0f, 0.0f), "chain of " + chainLength + " lists"); @@ -145,24 +145,24 @@ class GLSM_DisplayList_Stress_Test { void testManyPushPopOperations() { // Stress test push/pop stack operations int list = createAndTrackList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); // Go deep into the stack final int stackDepth = 30; // GL minimum is 32 for (int i = 0; i < stackDepth; i++) { - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); } // Pop all the way back for (int i = 0; i < stackDepth; i++) { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } // Add final known transform - GLStateManager.glTranslatef(99.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(99.0f, 0.0f, 0.0f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(99.0f, modelviewAfterCall(list).get(12), 0.0001f, "After balanced push/pop, only final transform should remain"); } @@ -176,9 +176,9 @@ class GLSM_DisplayList_Stress_Test { // Create all lists with unique transforms for (int i = 0; i < numLists; i++) { lists[i] = createAndTrackList(); - GLStateManager.glNewList(lists[i], GL11.GL_COMPILE); - GLStateManager.glTranslatef(i + 1, 0, 0); // List i translates by (i+1) - GLStateManager.glEndList(); + GLSMDraws.glNewList(lists[i], GL11.GL_COMPILE); + GLSMMatrices.glTranslatef(i + 1, 0, 0); // List i translates by (i+1) + GLSMDraws.glEndList(); } // Rapidly switch between calling different lists @@ -195,16 +195,16 @@ class GLSM_DisplayList_Stress_Test { int list = createAndTrackList(); // First compilation - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f); + GLSMDraws.glEndList(); assertEquals(5.0f, modelviewAfterCall(list).get(12), 0.0001f, "First compilation should translate by 5"); // Recompile with different transform - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); + GLSMDraws.glEndList(); assertEquals(10.0f, modelviewAfterCall(list).get(12), 0.0001f, "Recompilation should translate by 10"); } @@ -213,23 +213,23 @@ class GLSM_DisplayList_Stress_Test { void testComplexTransformSequence() { // Test a complex sequence of transforms that could expose numerical issues int list = createAndTrackList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); // Apply transforms that together should result in a known value - GLStateManager.glTranslatef(100.0f, 0.0f, 0.0f); - GLStateManager.glRotatef(90.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glTranslatef(50.0f, 0.0f, 0.0f); // This goes in Y direction after rotate - GLStateManager.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); // Cancel the rotation - GLStateManager.glTranslatef(25.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(100.0f, 0.0f, 0.0f); + GLSMMatrices.glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + GLSMMatrices.glTranslatef(50.0f, 0.0f, 0.0f); // This goes in Y direction after rotate + GLSMMatrices.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); // Cancel the rotation + GLSMMatrices.glTranslatef(25.0f, 0.0f, 0.0f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glCallList(list); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMDraws.glCallList(list); FloatBuffer actualBuf = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualBuf); + GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualBuf); // Build expected with JOML Matrix4f expected = new Matrix4f() @@ -247,6 +247,6 @@ class GLSM_DisplayList_Stress_Test { String.format("Matrix[%d] mismatch in complex transform", i)); } - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java index 58550cafa..3765347de 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_TransformCollapsing_Test.java @@ -34,14 +34,14 @@ class GLSM_DisplayList_TransformCollapsing_Test { @AfterEach void cleanup() { if (testList > 0) { - GLStateManager.glDeleteLists(testList, 1); + GLSMDraws.glDeleteLists(testList, 1); testList = -1; } if (nestedList > 0) { - GLStateManager.glDeleteLists(nestedList, 1); + GLSMDraws.glDeleteLists(nestedList, 1); nestedList = -1; } - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); } // ==================== Transform Collapsing Tests ==================== @@ -50,16 +50,16 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testConsecutiveTransformsCollapseToSingleMultMatrix() { // Multiple consecutive transforms should collapse to one MultMatrix in optimized list testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); // 5 consecutive transforms - GLStateManager.glTranslatef(1.0f, 2.0f, 3.0f); - GLStateManager.glRotatef(45.0f, 0.0f, 1.0f, 0.0f); - GLStateManager.glScalef(2.0f, 2.0f, 2.0f); - GLStateManager.glTranslatef(-0.5f, -0.5f, -0.5f); - GLStateManager.glRotatef(30.0f, 1.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(1.0f, 2.0f, 3.0f); + GLSMMatrices.glRotatef(45.0f, 0.0f, 1.0f, 0.0f); + GLSMMatrices.glScalef(2.0f, 2.0f, 2.0f); + GLSMMatrices.glTranslatef(-0.5f, -0.5f, -0.5f); + GLSMMatrices.glRotatef(30.0f, 1.0f, 0.0f, 0.0f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Verify optimization: should have collapsed to 1 MultMatrix CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); @@ -92,16 +92,16 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testPushPopPreservesStackSemantics() { // Push/Pop should maintain proper stack semantics with collapsed transforms testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); - GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); // Outer translate - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f); // Inner translate (isolated) - GLStateManager.glRotatef(90.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glPopMatrix(); - GLStateManager.glTranslatef(0.0f, 3.0f, 0.0f); // After pop + GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); // Outer translate + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f); // Inner translate (isolated) + GLSMMatrices.glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glTranslatef(0.0f, 3.0f, 0.0f); // After pop - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Verify optimization: should have Push, Pop, and collapsed MultMatrix commands CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); @@ -129,19 +129,19 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testNestedPushPopWithTransforms() { // Nested push/pop with transforms at each level testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); // Level 0 - GLStateManager.glPushMatrix(); // Enter level 1 - GLStateManager.glTranslatef(2.0f, 0.0f, 0.0f); - GLStateManager.glPushMatrix(); // Enter level 2 - GLStateManager.glTranslatef(3.0f, 0.0f, 0.0f); - GLStateManager.glPopMatrix(); // Back to level 1 - GLStateManager.glTranslatef(4.0f, 0.0f, 0.0f); // At level 1 - GLStateManager.glPopMatrix(); // Back to level 0 - GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f); // At level 0 + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); // Level 0 + GLSMMatrices.glPushMatrix(); // Enter level 1 + GLSMMatrices.glTranslatef(2.0f, 0.0f, 0.0f); + GLSMMatrices.glPushMatrix(); // Enter level 2 + GLSMMatrices.glTranslatef(3.0f, 0.0f, 0.0f); + GLSMMatrices.glPopMatrix(); // Back to level 1 + GLSMMatrices.glTranslatef(4.0f, 0.0f, 0.0f); // At level 1 + GLSMMatrices.glPopMatrix(); // Back to level 0 + GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f); // At level 0 - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Verify behavioral correctness final FloatBuffer actualBuf = modelviewAfterCall(testList); @@ -163,20 +163,20 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testCallListFlushesTransform() { // Create a nested display list nestedList = GL11.glGenLists(1); - GLStateManager.glNewList(nestedList, GL11.GL_COMPILE); - GLStateManager.glTranslatef(100.0f, 0.0f, 0.0f); // Large translate to verify it's applied - GLStateManager.glEndList(); + GLSMDraws.glNewList(nestedList, GL11.GL_COMPILE); + GLSMMatrices.glTranslatef(100.0f, 0.0f, 0.0f); // Large translate to verify it's applied + GLSMDraws.glEndList(); // Create parent list that transforms then calls nested list testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); - GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); // Before CallList - GLStateManager.glRotatef(90.0f, 0.0f, 1.0f, 0.0f); - GLStateManager.glCallList(nestedList); // Barrier - should flush transforms - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); // After CallList + GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); // Before CallList + GLSMMatrices.glRotatef(90.0f, 0.0f, 1.0f, 0.0f); + GLSMDraws.glCallList(nestedList); // Barrier - should flush transforms + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); // After CallList - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Verify optimization: MultMatrix should be emitted before CallList CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); @@ -209,13 +209,13 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testIdentityTransformNotEmitted() { // A display list with only identity-equivalent transforms should not emit MultMatrix testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); // These cancel out to identity - GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f); - GLStateManager.glTranslatef(-5.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(-5.0f, 0.0f, 0.0f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); @@ -233,11 +233,11 @@ class GLSM_DisplayList_TransformCollapsing_Test { static Stream discardedByLoadIdentity() { return Stream.of( - Arguments.of("accumulated translate", (Runnable) () -> GLStateManager.glTranslatef(100.0f, 100.0f, 100.0f)), + Arguments.of("accumulated translate", (Runnable) () -> GLSMMatrices.glTranslatef(100.0f, 100.0f, 100.0f)), Arguments.of("loaded matrix", (Runnable) () -> { final FloatBuffer loadBuf = BufferUtils.createFloatBuffer(16); new Matrix4f().translate(50.0f, 60.0f, 70.0f).rotate((float) Math.toRadians(45.0f), 1.0f, 1.0f, 0.0f).get(loadBuf); - GLStateManager.glLoadMatrix(loadBuf); + GLSMMatrices.glLoadMatrix(loadBuf); })); } @@ -245,13 +245,13 @@ class GLSM_DisplayList_TransformCollapsing_Test { @MethodSource("discardedByLoadIdentity") void testLoadIdentityDiscardsEarlierTransforms(String name, Runnable earlier) { testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); earlier.run(); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(1.0f, 2.0f, 3.0f); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(1.0f, 2.0f, 3.0f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); final FloatBuffer actualBuf = modelviewAfterCall(testList); @@ -264,20 +264,20 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testMultMatrixAccumulation() { // MultMatrix should be accumulated like other transforms testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); // Create a rotation matrix and multiply Matrix4f rotMatrix = new Matrix4f().rotate((float) Math.toRadians(90.0f), 0.0f, 1.0f, 0.0f); FloatBuffer rotBuf = BufferUtils.createFloatBuffer(16); rotMatrix.get(rotBuf); rotBuf.rewind(); - GLStateManager.glMultMatrix(rotBuf); + GLSMMatrices.glMultMatrix(rotBuf); - GLStateManager.glTranslatef(2.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(2.0f, 0.0f, 0.0f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Verify optimization: should collapse to 1 MultMatrix CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); @@ -305,10 +305,10 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testLoadMatrixSetsAbsoluteTransform() { // LoadMatrix should set an absolute matrix, not multiply testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); // First, apply a large transform - GLStateManager.glTranslatef(100.0f, 200.0f, 300.0f); + GLSMMatrices.glTranslatef(100.0f, 200.0f, 300.0f); // Then load a specific matrix (should replace, not multiply) Matrix4f loadedMatrix = new Matrix4f() @@ -317,9 +317,9 @@ class GLSM_DisplayList_TransformCollapsing_Test { FloatBuffer loadBuf = BufferUtils.createFloatBuffer(16); loadedMatrix.get(loadBuf); loadBuf.rewind(); - GLStateManager.glLoadMatrix(loadBuf); + GLSMMatrices.glLoadMatrix(loadBuf); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Verify the LOAD_MATRIX command is present CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); @@ -341,7 +341,7 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testLoadMatrixResetsRelativeTransform() { // After LoadMatrix, subsequent transforms should be relative to the loaded matrix testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); // Load a rotation matrix Matrix4f loadedMatrix = new Matrix4f() @@ -349,12 +349,12 @@ class GLSM_DisplayList_TransformCollapsing_Test { FloatBuffer loadBuf = BufferUtils.createFloatBuffer(16); loadedMatrix.get(loadBuf); loadBuf.rewind(); - GLStateManager.glLoadMatrix(loadBuf); + GLSMMatrices.glLoadMatrix(loadBuf); // Then translate - this should be relative to the loaded matrix - GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Verify behavioral correctness final FloatBuffer actualBuf = modelviewAfterCall(testList); @@ -368,23 +368,23 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testMultipleLoadMatrixCalls() { // Multiple LoadMatrix calls should each be recorded testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); // First load Matrix4f matrix1 = new Matrix4f().translate(10.0f, 0.0f, 0.0f); FloatBuffer buf1 = BufferUtils.createFloatBuffer(16); matrix1.get(buf1); buf1.rewind(); - GLStateManager.glLoadMatrix(buf1); + GLSMMatrices.glLoadMatrix(buf1); // Second load (replaces first) Matrix4f matrix2 = new Matrix4f().translate(0.0f, 20.0f, 0.0f); FloatBuffer buf2 = BufferUtils.createFloatBuffer(16); matrix2.get(buf2); buf2.rewind(); - GLStateManager.glLoadMatrix(buf2); + GLSMMatrices.glLoadMatrix(buf2); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Verify: final state should be matrix2 final FloatBuffer actualBuf = modelviewAfterCall(testList); @@ -399,15 +399,15 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testImmediateModeDrawCommandStructure() { // Verifies MultMatrix emitted before DrawRange, push/pop ordering correct testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); - GLStateManager.glPushMatrix(); - GLStateManager.glScalef(0.25f, 0.25f, 0.25f); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glScalef(0.25f, 0.25f, 0.25f); immediateQuad(2.0f); - GLStateManager.glPopMatrix(); - GLStateManager.glEndList(); + GLSMMatrices.glPopMatrix(); + GLSMDraws.glEndList(); CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); assertNotNull(compiled); @@ -425,14 +425,14 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testImmediateModeDrawMatrixValues() { // Verifies matrix values correct after playback with translate + scale testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); - GLStateManager.glTranslatef(100.0f, 50.0f, 0.0f); - GLStateManager.glScalef(0.5f, 0.5f, 1.0f); + GLSMMatrices.glTranslatef(100.0f, 50.0f, 0.0f); + GLSMMatrices.glScalef(0.5f, 0.5f, 1.0f); immediateQuad(16.0f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); // Verify transforms collapsed CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); @@ -457,56 +457,56 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testTransformsAcrossMatrixModeSwitch() { // Transforms must not leak across matrix mode boundaries // Compute expected results via GLSM (same path as display list playback) - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); - GLStateManager.glRotatef(45.0f, 0.0f, 1.0f, 0.0f); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glScalef(2.0f, 2.0f, 2.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glTranslatef(3.0f, 0.0f, 0.0f); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); + GLSMMatrices.glRotatef(45.0f, 0.0f, 1.0f, 0.0f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glScalef(2.0f, 2.0f, 2.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glTranslatef(3.0f, 0.0f, 0.0f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); FloatBuffer expectedMV = BufferUtils.createFloatBuffer(16); FloatBuffer expectedProj = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, expectedMV); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glGetFloat(GL11.GL_PROJECTION_MATRIX, expectedProj); + GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, expectedMV); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMQueries.glGetFloat(GL11.GL_PROJECTION_MATRIX, expectedProj); // Reset and test via display list - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); - GLStateManager.glRotatef(45.0f, 0.0f, 1.0f, 0.0f); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glScalef(2.0f, 2.0f, 2.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glTranslatef(3.0f, 0.0f, 0.0f); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glEndList(); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); + GLSMMatrices.glRotatef(45.0f, 0.0f, 1.0f, 0.0f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glScalef(2.0f, 2.0f, 2.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glTranslatef(3.0f, 0.0f, 0.0f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMDraws.glEndList(); - GLStateManager.glCallList(testList); + GLSMDraws.glCallList(testList); FloatBuffer actualMV = BufferUtils.createFloatBuffer(16); FloatBuffer actualProj = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualMV); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glGetFloat(GL11.GL_PROJECTION_MATRIX, actualProj); + GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualMV); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMQueries.glGetFloat(GL11.GL_PROJECTION_MATRIX, actualProj); for (int i = 0; i < 16; i++) { assertEquals(expectedMV.get(i), actualMV.get(i), 0.0001f, "MODELVIEW[" + i + "]"); @@ -514,11 +514,11 @@ class GLSM_DisplayList_TransformCollapsing_Test { } // Cleanup - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } @Test @@ -526,24 +526,24 @@ class GLSM_DisplayList_TransformCollapsing_Test { // State commands between transform and draw must not break transform capture for (int mode : new int[]{GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE}) { if (testList > 0) { - GLStateManager.glDeleteLists(testList, 1); + GLSMDraws.glDeleteLists(testList, 1); } testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, mode); + GLSMDraws.glNewList(testList, mode); - GLStateManager.glScalef(0.5f, 0.5f, 1.0f); - GLStateManager.glTranslatef(2, 2, 2); + GLSMMatrices.glScalef(0.5f, 0.5f, 1.0f); + GLSMMatrices.glTranslatef(2, 2, 2); // Barrier commands between scale and draw - GLStateManager.glDepthMask(true); - GLStateManager.disableLighting(); - GLStateManager.enableTexture(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMLighting.disableLighting(); + GLSMTextures.enableTexture(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); immediateQuad(1.0f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); assertNotNull(compiled); @@ -565,13 +565,13 @@ class GLSM_DisplayList_TransformCollapsing_Test { @Test void testRawTessellatorDrawPlaysBackWithTheTransform() { testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); - GLStateManager.glScalef(0.5f, 0.5f, 0.5f); + GLSMMatrices.glScalef(0.5f, 0.5f, 0.5f); rawQuad(1.0f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); assertNotNull(compiled); @@ -587,22 +587,22 @@ class GLSM_DisplayList_TransformCollapsing_Test { void testOptimizerResetsAfterPushMatrix() { // Optimizer must reset after PUSH_MATRIX to avoid spurious inverse transform emission testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); // T1: transforms before push (collapsed) - GLStateManager.glTranslatef(5.0f, 0.0f, 0.0f); - GLStateManager.glScalef(2.0f, 2.0f, 2.0f); + GLSMMatrices.glTranslatef(5.0f, 0.0f, 0.0f); + GLSMMatrices.glScalef(2.0f, 2.0f, 2.0f); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); // T2: transforms after push (collapsed separately) - GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); - GLStateManager.glRotatef(45.0f, 0.0f, 1.0f, 0.0f); + GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); + GLSMMatrices.glRotatef(45.0f, 0.0f, 1.0f, 0.0f); immediateQuad(1.0f); - GLStateManager.glPopMatrix(); - GLStateManager.glEndList(); + GLSMMatrices.glPopMatrix(); + GLSMDraws.glEndList(); CompiledDisplayList compiled = DisplayListManager.getDisplayList(testList); assertNotNull(compiled); @@ -649,33 +649,33 @@ class GLSM_DisplayList_TransformCollapsing_Test { final float tx2 = -1.0f, ty2 = 4.0f, tz2 = 0.5f; // Execute directly via GLSM - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(tx1, ty1, tz1); - GLStateManager.glRotatef(angle1, 0.0f, 1.0f, 0.0f); // Y-axis rotation - GLStateManager.glScalef(sx, sy, sz); - GLStateManager.glRotatef(angle2, 1.0f, 0.0f, 0.0f); // X-axis rotation - GLStateManager.glTranslatef(tx2, ty2, tz2); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(tx1, ty1, tz1); + GLSMMatrices.glRotatef(angle1, 0.0f, 1.0f, 0.0f); // Y-axis rotation + GLSMMatrices.glScalef(sx, sy, sz); + GLSMMatrices.glRotatef(angle2, 1.0f, 0.0f, 0.0f); // X-axis rotation + GLSMMatrices.glTranslatef(tx2, ty2, tz2); FloatBuffer expectedBuf = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, expectedBuf); + GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, expectedBuf); // Reset and execute via display list - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); testList = GL11.glGenLists(1); - GLStateManager.glNewList(testList, GL11.GL_COMPILE); - GLStateManager.glTranslatef(tx1, ty1, tz1); - GLStateManager.glRotatef(angle1, 0.0f, 1.0f, 0.0f); - GLStateManager.glScalef(sx, sy, sz); - GLStateManager.glRotatef(angle2, 1.0f, 0.0f, 0.0f); - GLStateManager.glTranslatef(tx2, ty2, tz2); - GLStateManager.glEndList(); + GLSMDraws.glNewList(testList, GL11.GL_COMPILE); + GLSMMatrices.glTranslatef(tx1, ty1, tz1); + GLSMMatrices.glRotatef(angle1, 0.0f, 1.0f, 0.0f); + GLSMMatrices.glScalef(sx, sy, sz); + GLSMMatrices.glRotatef(angle2, 1.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(tx2, ty2, tz2); + GLSMDraws.glEndList(); - GLStateManager.glCallList(testList); + GLSMDraws.glCallList(testList); FloatBuffer actualBuf = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualBuf); + GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, actualBuf); // Verify equivalence for (int i = 0; i < 16; i++) { @@ -683,6 +683,6 @@ class GLSM_DisplayList_TransformCollapsing_Test { String.format("Matrix[%d]: collapsed transform must equal sequential execution", i)); } - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java index ab3a51cc0..e32bc9b68 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_DisplayList_UnitTest.java @@ -24,7 +24,7 @@ class GLSM_DisplayList_UnitTest { } private static double lighting() { - final boolean enabled = GLStateManager.glIsEnabled(GL11.GL_LIGHTING); + final boolean enabled = GLSMEnable.glIsEnabled(GL11.GL_LIGHTING); verifyState(GL11.GL_LIGHTING, enabled, "driver must agree with the GLSM cache"); return enabled ? 1.0 : 0.0; } @@ -37,19 +37,19 @@ class GLSM_DisplayList_UnitTest { static Stream states() { return Stream.of( - state("glEnable(GL_LIGHTING)", () -> GLStateManager.glEnable(GL11.GL_LIGHTING), () -> GLStateManager.glDisable(GL11.GL_LIGHTING), + state("glEnable(GL_LIGHTING)", () -> GLSMEnable.glEnable(GL11.GL_LIGHTING), () -> GLSMEnable.glDisable(GL11.GL_LIGHTING), GLSM_DisplayList_UnitTest::lighting, 1.0), - state("glCullFace", () -> GLStateManager.glCullFace(GL11.GL_FRONT), () -> GLStateManager.glCullFace(GL11.GL_BACK), + state("glCullFace", () -> GLSMRasterizer.glCullFace(GL11.GL_FRONT), () -> GLSMRasterizer.glCullFace(GL11.GL_BACK), () -> GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), GL11.GL_FRONT), - state("glLogicOp", () -> GLStateManager.glLogicOp(GL11.GL_XOR), () -> GLStateManager.glLogicOp(GL11.GL_COPY), + state("glLogicOp", () -> GLSMBlend.glLogicOp(GL11.GL_XOR), () -> GLSMBlend.glLogicOp(GL11.GL_COPY), () -> GL11.glGetInteger(GL11.GL_LOGIC_OP_MODE), GL11.GL_XOR), - state("glClearDepth", () -> GLStateManager.glClearDepth(0.5), () -> GLStateManager.glClearDepth(1.0), + state("glClearDepth", () -> GLSMDepthStencilAlpha.glClearDepth(0.5), () -> GLSMDepthStencilAlpha.glClearDepth(1.0), () -> GL11.glGetDouble(GL11.GL_DEPTH_CLEAR_VALUE), 0.5), - state("glBlendColor", () -> GLStateManager.glBlendColor(0.5f, 0.4f, 0.6f, 0.8f), () -> GLStateManager.glBlendColor(0f, 0f, 0f, 0f), + state("glBlendColor", () -> GLSMBlend.glBlendColor(0.5f, 0.4f, 0.6f, 0.8f), () -> GLSMBlend.glBlendColor(0f, 0f, 0f, 0f), GLSM_DisplayList_UnitTest::blendColorRed, 0.5), - state("glFrontFace", () -> GLStateManager.glFrontFace(GL11.GL_CW), () -> GLStateManager.glFrontFace(GL11.GL_CCW), + state("glFrontFace", () -> GLSMRasterizer.glFrontFace(GL11.GL_CW), () -> GLSMRasterizer.glFrontFace(GL11.GL_CCW), () -> GL11.glGetInteger(GL11.GL_FRONT_FACE), GL11.GL_CW), - state("glHint", () -> GLStateManager.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST), () -> GLStateManager.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_DONT_CARE), + state("glHint", () -> GLSMRasterizer.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST), () -> GLSMRasterizer.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_DONT_CARE), () -> GL11.glGetInteger(GL11.GL_LINE_SMOOTH_HINT), GL11.GL_NICEST)); } @@ -59,16 +59,16 @@ class GLSM_DisplayList_UnitTest { final double initial = driver.getAsDouble(); final int list = GL11.glGenLists(1); try { - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); apply.run(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(initial, driver.getAsDouble(), 0.0001, name + " must not execute under GL_COMPILE"); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(applied, driver.getAsDouble(), 0.0001, name + " must apply when the list is called"); } finally { reset.run(); - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); } } @@ -77,34 +77,34 @@ class GLSM_DisplayList_UnitTest { void compileAndExecuteAppliesStateChangeImmediately(String name, Runnable apply, Runnable reset, DoubleSupplier driver, double applied) { final int list = GL11.glGenLists(1); try { - GLStateManager.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE); apply.run(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(applied, driver.getAsDouble(), 0.0001, name + " must apply under GL_COMPILE_AND_EXECUTE"); } finally { reset.run(); - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); } } @Test void testMultipleStateChangesInDisplayList() { int list = GL11.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.glLogicOp(GL11.GL_AND); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMBlend.glLogicOp(GL11.GL_AND); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMDraws.glEndList(); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(GL11.GL_FRONT, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "CullFace should be GL_FRONT"); assertEquals(GL11.GL_AND, GL11.glGetInteger(GL11.GL_LOGIC_OP_MODE), "LogicOp should be GL_AND"); verifyState(GL11.GL_LIGHTING, true, "GL_LIGHTING should be enabled"); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.glLogicOp(GL11.GL_COPY); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glDeleteLists(list, 1); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMBlend.glLogicOp(GL11.GL_COPY); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMDraws.glDeleteLists(list, 1); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitCaptureCoverage_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitCaptureCoverage_UnitTest.java index c0cf59aba..e96f13148 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitCaptureCoverage_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitCaptureCoverage_UnitTest.java @@ -1,22 +1,16 @@ package com.gtnewhorizons.angelica.glsm; import com.gtnewhorizons.angelica.glsm.redirect.GLSMRedirector; +import com.gtnewhorizons.angelica.glsm.testutil.GlsmClasses; import org.junit.jupiter.api.Test; -import org.objectweb.asm.ClassReader; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; -import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; -import java.io.IOException; -import java.io.InputStream; -import java.io.UncheckedIOException; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.function.Predicate; @@ -25,7 +19,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue; class GLSM_ExitCaptureCoverage_UnitTest { private static final String PACKAGE = "com/gtnewhorizons/angelica/glsm/"; - private static final String MANAGER = PACKAGE + "GLStateManager"; private static final String RENDER_SYSTEM = PACKAGE + "RenderSystem"; private static final String CAPTURE = PACKAGE + "ExitStateCapture"; @@ -45,7 +38,6 @@ class GLSM_ExitCaptureCoverage_UnitTest { // Others "glInitNames", "glPushName", "glPopName", "glLoadName", "isFramebufferEnabled", "gluUnProject", "gluErrorString"); - private final Map classes = new HashMap<>(); private final Set reaching = new HashSet<>(); private final Set notReaching = new HashSet<>(); private Set counted = RECORDING; @@ -54,7 +46,11 @@ class GLSM_ExitCaptureCoverage_UnitTest { void everyEntryPointRejectsOrRecordsTheExitCapture() { final Set entryPoints = new HashSet<>(GLSMRedirector.getGLPrefixMethodRedirects().values()); GLSMRedirector.getNamedClassMethodRedirects().values().forEach(redirects -> entryPoints.addAll(redirects.values())); - final List missing = missing(MANAGER, name -> name.startsWith("gl") || entryPoints.contains(name), method -> reachesCapture(MANAGER, method)); + final List missing = new ArrayList<>(); + for (String owner : GlsmClasses.classes()) { + missing.addAll(missing(owner, name -> name.startsWith("gl") || entryPoints.contains(name), method -> reachesCapture(owner, method))); + } + missing.sort(null); assertTrue(missing.isEmpty(), "Entry points that neither reject nor record an exit capture:\n " + String.join("\n ", missing)); } @@ -66,13 +62,13 @@ class GLSM_ExitCaptureCoverage_UnitTest { final List missing = missing(RENDER_SYSTEM, name -> !name.equals("initRenderer") && !name.equals("getVRAM") && !name.matches("(supports|has|is|getMax|getGl|parse|probe).*"), method -> reachesCapture(RENDER_SYSTEM, method) && (!calls(method, owner -> owner.startsWith(PACKAGE + "backend/") || owner.startsWith(PACKAGE + "dsa/")) - || calls(method, owner -> owner.equals(MANAGER), "rejectExitCapture", "beforeUncapturedStateChange"))); + || calls(method, GlsmClasses.classes()::contains, "rejectExitCapture", "beforeUncapturedStateChange"))); assertTrue(missing.isEmpty(), "RenderSystem methods that do not reject an exit capture:\n " + String.join("\n ", missing)); } private List missing(String owner, Predicate checked, Predicate covered) { final List missing = new ArrayList<>(); - for (MethodNode method : load(owner).methods) { + for (MethodNode method : GlsmClasses.load(owner).methods) { if ((method.access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC)) != (Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC)) continue; if ((method.access & Opcodes.ACC_SYNTHETIC) != 0) continue; if (!checked.test(method.name) || IGNORED.contains(method.name)) continue; @@ -114,38 +110,9 @@ class GLSM_ExitCaptureCoverage_UnitTest { continue; } if (!call.owner.startsWith(PACKAGE)) continue; - final String[] declaring = new String[1]; - final MethodNode target = resolve(call.owner, call.name, call.desc, declaring); - if (target != null && search(declaring[0], target, visited)) return true; + final GlsmClasses.Resolved target = GlsmClasses.resolve(call.owner, call.name, call.desc); + if (target != null && search(target.owner(), target.method(), visited)) return true; } return false; } - - private MethodNode resolve(String owner, String name, String desc, String[] declaring) { - for (String type = owner; type != null && type.startsWith(PACKAGE); ) { - final ClassNode node = load(type); - for (MethodNode method : node.methods) { - if (method.name.equals(name) && method.desc.equals(desc)) { - if (method.instructions.size() == 0) return null; - declaring[0] = type; - return method; - } - } - type = node.superName; - } - return null; - } - - private ClassNode load(String internalName) { - return classes.computeIfAbsent(internalName, name -> { - try (InputStream in = GLSM_ExitCaptureCoverage_UnitTest.class.getClassLoader().getResourceAsStream(name + ".class")) { - if (in == null) throw new IllegalStateException("Missing class file for " + name); - final ClassNode node = new ClassNode(); - new ClassReader(in).accept(node, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); - return node; - } catch (IOException e) { - throw new UncheckedIOException(e); - } - }); - } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitState_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitState_GLTest.java index 278819366..3322ccd0a 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitState_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitState_GLTest.java @@ -51,166 +51,166 @@ class GLSM_ExitState_GLTest { extendedHandler = GLSMHooks.immediateExtendedHandler; blendHandler = GLSMHooks.blendHandler; clientActiveUnit = context.clientActiveTextureUnit; - outer = GLStateManager.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.setTextureMatrix(0, new Matrix4f()); - GLStateManager.glColor4f(1, 1, 1, 1); - GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); - GLStateManager.disableColorMaterial(); - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(2, 3); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + outer = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.setTextureMatrix(0, new Matrix4f()); + GLSMCurrentAttribs.glColor4f(1, 1, 1, 1); + GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); + GLSMLighting.disableColorMaterial(); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(2, 3); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); } @AfterEach void tearDown() { GLStateManager.cancelExitCapture(); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0 + clientActiveUnit); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0 + clientActiveUnit); GLSMHooks.blendHandler = blendHandler; GLSMHooks.immediateExtendedHandler = extendedHandler; - GLStateManager.getBlendMode().setVanillaLayer(null); - GLStateManager.getBlendState().setVanillaLayer(null); - GLStateManager.setModelViewMatrix(modelView); - GLStateManager.setProjectionMatrix(projection); - GLStateManager.setTextureMatrix(0, texture); - GLStateManager.setOverlayColor(overlay.x, overlay.y, overlay.z, overlay.w); - GLStateManager.setShaderColor(shaderColor.x, shaderColor.y, shaderColor.z, shaderColor.w); - GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, lightmapX, lightmapY); - GLStateManager.popStateTo(outer); + GLSMBlend.getBlendMode().setVanillaLayer(null); + GLSMBlend.getBlendState().setVanillaLayer(null); + GLSMMatrices.setModelViewMatrix(modelView); + GLSMMatrices.setProjectionMatrix(projection); + GLSMMatrices.setTextureMatrix(0, texture); + GLSMCurrentAttribs.setOverlayColor(overlay.x, overlay.y, overlay.z, overlay.w); + GLSMCurrentAttribs.setShaderColor(shaderColor.x, shaderColor.y, shaderColor.z, shaderColor.w); + GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, lightmapX, lightmapY); + GLSMAttribStack.popStateTo(outer); } @Test void unchangedWritesStillApplyAndLeaveOtherPolygonStateAlone() { final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.disableCull(); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(7, 11); + GLSMRasterizer.disableCull(); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(7, 11); assertTrue(GLStateManager.canApplyExitState(state)); GLStateManager.applyExitState(state); - assertTrue(GLStateManager.getCullState().isEnabled()); - assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode()); - assertTrue(GLStateManager.getPolygonOffsetFillState().isEnabled()); - assertEquals(7, GLStateManager.getPolygonState().getOffsetFactor()); - assertEquals(11, GLStateManager.getPolygonState().getOffsetUnits()); + assertTrue(GLSMRasterizer.getCullState().isEnabled()); + assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode()); + assertTrue(GLSMRasterizer.getPolygonOffsetFillState().isEnabled()); + assertEquals(7, GLSMRasterizer.getPolygonState().getOffsetFactor()); + assertEquals(11, GLSMRasterizer.getPolygonState().getOffsetUnits()); } @Test void attribPopUndoesTheWritesItRestores() { final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); assertEquals(ExitState.POLYGON_OFFSET_ENABLE_WRITTEN, GLStateManager.getExitPolygonOffsetWrites()); - GLStateManager.glPushAttrib(GL11.GL_POLYGON_BIT | GL11.GL_CURRENT_BIT); - GLStateManager.glPolygonOffset(5, 6); - GLStateManager.disableCull(); - GLStateManager.glColor4f(0, 0, 0, 1); + GLSMAttribStack.glPushAttrib(GL11.GL_POLYGON_BIT | GL11.GL_CURRENT_BIT); + GLSMRasterizer.glPolygonOffset(5, 6); + GLSMRasterizer.disableCull(); + GLSMCurrentAttribs.glColor4f(0, 0, 0, 1); assertEquals(3, GLStateManager.getExitPolygonOffsetWrites()); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); assertEquals(ExitState.POLYGON_OFFSET_ENABLE_WRITTEN, GLStateManager.getExitPolygonOffsetWrites()); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.disableCull(); - GLStateManager.glColor4f(0.25F, 0.5F, 0.75F, 1); - GLStateManager.glPolygonOffset(8, 9); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.disableCull(); + GLSMCurrentAttribs.glColor4f(0.25F, 0.5F, 0.75F, 1); + GLSMRasterizer.glPolygonOffset(8, 9); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); GLStateManager.applyExitState(state); - assertFalse(GLStateManager.getCullState().isEnabled()); - assertEquals(0.25F, GLStateManager.getColor().getRed()); - assertEquals(8, GLStateManager.getPolygonState().getOffsetFactor()); - assertTrue(GLStateManager.getPolygonOffsetFillState().isEnabled()); + assertFalse(GLSMRasterizer.getCullState().isEnabled()); + assertEquals(0.25F, GLSMCurrentAttribs.getColor().getRed()); + assertEquals(8, GLSMRasterizer.getPolygonState().getOffsetFactor()); + assertTrue(GLSMRasterizer.getPolygonOffsetFillState().isEnabled()); } @ParameterizedTest @ValueSource(booleans = {false, true}) void drawsDependOnTheAlphaFunctionOnlyWhenTheyReadItFromState(boolean materialFromState) { - GLStateManager.enableAlphaTest(); + GLSMDepthStencilAlpha.enableAlphaTest(); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.glColor4f(1, 1, 1, 1); + GLSMCurrentAttribs.glColor4f(1, 1, 1, 1); GLStateManager.requireExitDrawState(materialFromState); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.glColor4f(0, 0, 0, 1); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.6F); + GLSMCurrentAttribs.glColor4f(0, 0, 0, 1); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.6F); assertEquals(!materialFromState, GLStateManager.canApplyExitState(state)); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); assertTrue(GLStateManager.canApplyExitState(state)); - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); assertFalse(GLStateManager.canApplyExitState(state)); } @ParameterizedTest @ValueSource(ints = {0, 1, 2}) void blendAndAlphaFunctionsMatterOnlyToDrawsWithThemEnabled(int mode) { - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); GLStateManager.requireExitDrawState(true); if (mode != 0) { if (mode == 2) { - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); } - GLStateManager.enableBlend(); - GLStateManager.enableAlphaTest(); + GLSMBlend.enableBlend(); + GLSMDepthStencilAlpha.enableAlphaTest(); GLStateManager.requireExitDrawState(true); } assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); assertEquals(mode != 1, GLStateManager.canApplyExitState(state)); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5F); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5F); assertEquals(mode != 1, GLStateManager.canApplyExitState(state)); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); assertTrue(GLStateManager.canApplyExitState(state)); } @Test void settingTheClientTextureUnitToItsCurrentValueIsStillRecorded() { - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMAttribStack.glPopAttrib(); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); assertTrue(GLStateManager.canApplyExitState(state)); GLStateManager.applyExitState(state); - assertEquals(0, GLStateManager.getClientActiveTextureUnit()); + assertEquals(0, GLSMTextures.getClientActiveTextureUnit()); GLStateManager.beginExitCapture(state); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); GLStateManager.applyExitState(state); - assertEquals(1, GLStateManager.getClientActiveTextureUnit()); + assertEquals(1, GLSMTextures.getClientActiveTextureUnit()); } @Test void drawAfterAnAttribPopDependsOnTheOriginalCullState() { final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.disableCull(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMRasterizer.disableCull(); GLStateManager.requireExitDrawState(false); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); GLStateManager.requireExitDrawState(false); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); assertFalse(GLStateManager.canApplyExitState(state)); } @@ -219,23 +219,23 @@ class GLSM_ExitState_GLTest { final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); assertFalse(GLStateManager.isExitLightingWritten()); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.enableLighting(); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.enableLighting(); assertTrue(GLStateManager.isExitLightingWritten()); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); assertFalse(GLStateManager.isExitLightingWritten()); GLStateManager.requireExitDrawState(false); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.getLightingState().setEnabled(!GLStateManager.getLightingState().isEnabled()); - GLStateManager.getNormalizeState().setEnabled(!GLStateManager.getNormalizeState().isEnabled()); - GLStateManager.getRescaleNormalState().setEnabled(!GLStateManager.getRescaleNormalState().isEnabled()); - GLStateManager.getLightStates()[0].setEnabled(!GLStateManager.getLightStates()[0].isEnabled()); - GLStateManager.getLightStates()[1].setEnabled(!GLStateManager.getLightStates()[1].isEnabled()); - GLStateManager.glShadeModel(GLStateManager.getShadeModelState().getValue() == GL11.GL_FLAT ? GL11.GL_SMOOTH : GL11.GL_FLAT); - GLStateManager.setShaderColor(0.1F, 0.2F, 0.3F, 0.4F); - GLStateManager.glNormal3f(0.5F, 0.25F, 0.75F); - GLStateManager.glTexCoord2f(0.75F, 0.25F); + GLSMLighting.getLightingState().setEnabled(!GLSMLighting.getLightingState().isEnabled()); + GLSMLighting.getNormalizeState().setEnabled(!GLSMLighting.getNormalizeState().isEnabled()); + GLSMLighting.getRescaleNormalState().setEnabled(!GLSMLighting.getRescaleNormalState().isEnabled()); + GLSMLighting.getLightStates()[0].setEnabled(!GLSMLighting.getLightStates()[0].isEnabled()); + GLSMLighting.getLightStates()[1].setEnabled(!GLSMLighting.getLightStates()[1].isEnabled()); + GLSMRasterizer.glShadeModel(GLSMRasterizer.getShadeModelState().getValue() == GL11.GL_FLAT ? GL11.GL_SMOOTH : GL11.GL_FLAT); + GLSMCurrentAttribs.setShaderColor(0.1F, 0.2F, 0.3F, 0.4F); + GLSMCurrentAttribs.glNormal3f(0.5F, 0.25F, 0.75F); + GLSMCurrentAttribs.glTexCoord2f(0.75F, 0.25F); assertTrue(GLStateManager.canApplyExitState(state)); } @@ -250,8 +250,8 @@ class GLSM_ExitState_GLTest { tess.hasTexture = mode != 2; tess.hasColor = tess.hasBrightness = true; GLSMHooks.immediateExtendedHandler = mode == 3 ? new FaceNormals() : null; - GLStateManager.glNormal3f(0, 1, 0); - GLStateManager.glTexCoord2f(0.25F, 0.5F); + GLSMCurrentAttribs.glNormal3f(0, 1, 0); + GLSMCurrentAttribs.glTexCoord2f(0.25F, 0.5F); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); TessellatorStreamingDrawer.fillMissingAttributes(tess); @@ -259,45 +259,45 @@ class GLSM_ExitState_GLTest { if (mode == 1) assertEquals(0x7F00, tess.rawBuffer[6]); if (mode == 2) assertEquals(Float.floatToRawIntBits(0.25F), tess.rawBuffer[3]); if (mode == 3) assertEquals(0x7F, tess.rawBuffer[6]); - GLStateManager.glNormal3f(1, 0, 0); - GLStateManager.glTexCoord2f(0.75F, 0.5F); + GLSMCurrentAttribs.glNormal3f(1, 0, 0); + GLSMCurrentAttribs.glTexCoord2f(0.75F, 0.5F); assertEquals(mode == 0 || mode == 3, GLStateManager.canApplyExitState(state)); } @ParameterizedTest @ValueSource(booleans = {false, true}) void deletingTheBoundTextureBlocksApplyingEvenIfTheCaptureUnboundIt(boolean explicitlyUnbound) { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - if (explicitlyUnbound) GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + if (explicitlyUnbound) GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); assertTrue(GLStateManager.finishExitCapture(state)); assertTrue(GLStateManager.canApplyExitState(state)); - GLStateManager.glDeleteTextures(id); + GLSMTextures.glDeleteTextures(id); assertFalse(GLStateManager.canApplyExitState(state)); } @ParameterizedTest @ValueSource(booleans = {false, true}) void textureMatrixMustMatchOnlyWhenTheCaptureMultipliedOntoIt(boolean absolute) { - GLStateManager.setTextureMatrix(0, new Matrix4f().translation(1, 2, 0)); + GLSMMatrices.setTextureMatrix(0, new Matrix4f().translation(1, 2, 0)); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glPushMatrix(); - if (absolute) GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(3, 4, 0); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glPushMatrix(); + if (absolute) GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(3, 4, 0); GLStateManager.requireExitDrawState(false); - GLStateManager.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); assertTrue(GLStateManager.finishExitCapture(state)); final Matrix4f mainTexture = new Matrix4f().translation(8, 9, 0); - GLStateManager.setTextureMatrix(0, mainTexture); + GLSMMatrices.setTextureMatrix(0, mainTexture); assertEquals(absolute, GLStateManager.canApplyExitState(state)); if (absolute) { GLStateManager.applyExitState(state); - assertEquals(mainTexture, GLStateManager.getTextures().getTextureUnitMatrix(0)); + assertEquals(mainTexture, GLSMTextures.getTextures().getTextureUnitMatrix(0)); } } @@ -305,25 +305,25 @@ class GLSM_ExitState_GLTest { void changedOrUnbalancedViewMatricesReject() { final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.glTranslatef(1, 0, 0); + GLSMMatrices.glTranslatef(1, 0, 0); assertFalse(GLStateManager.finishExitCapture(state)); - GLStateManager.setModelViewMatrix(modelView); + GLSMMatrices.setModelViewMatrix(modelView); GLStateManager.beginExitCapture(state); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); assertFalse(GLStateManager.finishExitCapture(state)); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); GLStateManager.beginExitCapture(state); - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(2, 3, 4); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(2, 3, 4); + GLSMMatrices.glPopMatrix(); assertTrue(GLStateManager.finishExitCapture(state)); GLStateManager.beginExitCapture(state); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glPopMatrix(); assertFalse(GLStateManager.finishExitCapture(state)); } @@ -331,17 +331,17 @@ class GLSM_ExitState_GLTest { @ValueSource(ints = {0, 1, 2, 3, 4, 5}) void untrackedCallsAndStateQueriesReject(int operation) { final ExitState state = new ExitState(); - final int program = GLStateManager.getActiveProgram(); + final int program = GLSMPrograms.getActiveProgram(); GLStateManager.beginExitCapture(state); switch (operation) { - case 0 -> GLStateManager.glIsEnabled(GL11.GL_CULL_FACE); - case 1 -> GLStateManager.glGetInteger(GL11.GL_DEPTH_FUNC); - case 2 -> GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); - case 3 -> GLStateManager.glUseProgram(program); - case 4 -> GLStateManager.glBlendEquation(GL14.GL_FUNC_ADD); - case 5 -> GLStateManager.fogColor((float) GLStateManager.getFogState().getFogColor().x, - (float) GLStateManager.getFogState().getFogColor().y, (float) GLStateManager.getFogState().getFogColor().z, - GLStateManager.getFogState().getFogAlpha()); + case 0 -> GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE); + case 1 -> GLSMQueries.glGetInteger(GL11.GL_DEPTH_FUNC); + case 2 -> GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); + case 3 -> GLSMPrograms.glUseProgram(program); + case 4 -> GLSMBlend.glBlendEquation(GL14.GL_FUNC_ADD); + case 5 -> GLSMFog.fogColor((float) GLSMFog.getFogState().getFogColor().x, + (float) GLSMFog.getFogState().getFogColor().y, (float) GLSMFog.getFogState().getFogColor().z, + GLSMFog.getFogState().getFogAlpha()); default -> throw new AssertionError(); } assertFalse(GLStateManager.finishExitCapture(state)); @@ -354,11 +354,11 @@ class GLSM_ExitState_GLTest { final boolean suspended = GLStateManager.suspendExitCapture(); try { assertFalse(GLStateManager.isExitCaptureActive()); - GLStateManager.glIsEnabled(GL11.GL_CULL_FACE); - GLStateManager.glColor4f(0, 0, 0, 1); + GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE); + GLSMCurrentAttribs.glColor4f(0, 0, 0, 1); BatchStateGuard.suspend(); try { - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); } finally { BatchStateGuard.resume(); } @@ -368,62 +368,62 @@ class GLSM_ExitState_GLTest { BatchStateGuard.suspend(); try { assertFalse(GLStateManager.isExitCaptureActive()); - GLStateManager.glGetInteger(GL11.GL_DEPTH_FUNC); + GLSMQueries.glGetInteger(GL11.GL_DEPTH_FUNC); } finally { BatchStateGuard.resume(); } assertTrue(GLStateManager.isExitCaptureActive()); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.glColor4f(0.5F, 1, 1, 1); + GLSMCurrentAttribs.glColor4f(0.5F, 1, 1, 1); GLStateManager.applyExitState(state); - assertEquals(0.5F, GLStateManager.getColor().getRed()); + assertEquals(0.5F, GLSMCurrentAttribs.getColor().getRed()); } @Test void attribPushedWhileSuspendedRestoresThatCapturesWrites() { final ExitState earlier = new ExitState(); GLStateManager.beginExitCapture(earlier); - GLStateManager.glColor4f(0.5F, 1, 1, 1); - GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT); - GLStateManager.glPopAttrib(); + GLSMCurrentAttribs.glColor4f(0.5F, 1, 1, 1); + GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT); + GLSMAttribStack.glPopAttrib(); assertTrue(GLStateManager.finishExitCapture(earlier)); - GLStateManager.glColor4f(0.25F, 1, 1, 1); + GLSMCurrentAttribs.glColor4f(0.25F, 1, 1, 1); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); final boolean suspended = GLStateManager.suspendExitCapture(); try { - GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT); } finally { GLStateManager.resumeExitCapture(suspended); } - GLStateManager.glColor4f(0, 0, 0, 1); - GLStateManager.glPopAttrib(); + GLSMCurrentAttribs.glColor4f(0, 0, 0, 1); + GLSMAttribStack.glPopAttrib(); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.glColor4f(0.75F, 1, 1, 1); + GLSMCurrentAttribs.glColor4f(0.75F, 1, 1, 1); GLStateManager.applyExitState(state); - assertEquals(0.75F, GLStateManager.getColor().getRed(), "the pop restored color, so the capture leaves it alone"); + assertEquals(0.75F, GLSMCurrentAttribs.getColor().getRed(), "the pop restored color, so the capture leaves it alone"); } @Test void attribPoppedWhileSuspendedUndoesTheCapturesWrites() { - GLStateManager.glColor4f(0.25F, 1, 1, 1); + GLSMCurrentAttribs.glColor4f(0.25F, 1, 1, 1); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT); - GLStateManager.glColor4f(0, 0, 0, 1); + GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT); + GLSMCurrentAttribs.glColor4f(0, 0, 0, 1); final boolean suspended = GLStateManager.suspendExitCapture(); try { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } finally { GLStateManager.resumeExitCapture(suspended); } assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.glColor4f(0.75F, 1, 1, 1); + GLSMCurrentAttribs.glColor4f(0.75F, 1, 1, 1); GLStateManager.applyExitState(state); - assertEquals(0.75F, GLStateManager.getColor().getRed(), "the pop restored color, so the capture leaves it alone"); + assertEquals(0.75F, GLSMCurrentAttribs.getColor().getRed(), "the pop restored color, so the capture leaves it alone"); } @Test @@ -431,93 +431,93 @@ class GLSM_ExitState_GLTest { final ExitState first = new ExitState(); final ExitState second = new ExitState(); GLStateManager.beginExitCapture(first); - GLStateManager.glColor4f(0.25F, 1, 1, 1); - GLStateManager.setOverlayColor(0.1F, 0.2F, 0.3F, 0.4F); + GLSMCurrentAttribs.glColor4f(0.25F, 1, 1, 1); + GLSMCurrentAttribs.setOverlayColor(0.1F, 0.2F, 0.3F, 0.4F); assertTrue(GLStateManager.finishExitCapture(first)); GLStateManager.beginExitCapture(second); - GLStateManager.glColor4f(0.75F, 1, 1, 1); + GLSMCurrentAttribs.glColor4f(0.75F, 1, 1, 1); assertTrue(GLStateManager.finishExitCapture(second)); GLStateManager.applyExitState(first); - assertEquals(0.25F, GLStateManager.getColor().getRed()); - assertEquals(0.4F, GLStateManager.getOverlayA()); + assertEquals(0.25F, GLSMCurrentAttribs.getColor().getRed()); + assertEquals(0.4F, GLSMCurrentAttribs.getOverlayA()); GLStateManager.applyExitState(second); - assertEquals(0.75F, GLStateManager.getColor().getRed()); + assertEquals(0.75F, GLSMCurrentAttribs.getColor().getRed()); first.clear(); assertFalse(GLStateManager.canApplyExitState(first)); GLStateManager.beginExitCapture(first); assertTrue(GLStateManager.finishExitCapture(first)); - GLStateManager.glColor4f(0.5F, 1, 1, 1); + GLSMCurrentAttribs.glColor4f(0.5F, 1, 1, 1); GLStateManager.applyExitState(first); - assertEquals(0.5F, GLStateManager.getColor().getRed()); + assertEquals(0.5F, GLSMCurrentAttribs.getColor().getRed()); } @ParameterizedTest @ValueSource(booleans = {false, true}) void toggledColorMaterialKeepsItsMaterialWritesUnlessAnAttribPopUndoesThem(boolean scoped) { - GLStateManager.enableColorMaterial(); - GLStateManager.disableColorMaterial(); + GLSMLighting.enableColorMaterial(); + GLSMLighting.disableColorMaterial(); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.glColor4f(1, 1, 1, 1); - if (scoped) GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.enableColorMaterial(); - GLStateManager.disableColorMaterial(); - if (scoped) GLStateManager.glPopAttrib(); + GLSMCurrentAttribs.glColor4f(1, 1, 1, 1); + if (scoped) GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.enableColorMaterial(); + GLSMLighting.disableColorMaterial(); + if (scoped) GLSMAttribStack.glPopAttrib(); assertTrue(GLStateManager.finishExitCapture(state)); final var changed = BufferUtils.createFloatBuffer(4); changed.put(new float[]{0.2F, 0.3F, 0.4F, 1}).flip(); - GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, changed); + GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, changed); assertTrue(GLStateManager.canApplyExitState(state)); GLStateManager.applyExitState(state); - assertEquals(scoped ? 0.2F : 1, GLStateManager.getFrontMaterial().ambient.x); - assertEquals(scoped ? 0.2F : 1, GLStateManager.getBackMaterial().diffuse.x); - assertFalse(GLStateManager.getColorMaterial().isEnabled()); + assertEquals(scoped ? 0.2F : 1, GLSMLighting.getFrontMaterial().ambient.x); + assertEquals(scoped ? 0.2F : 1, GLSMLighting.getBackMaterial().diffuse.x); + assertFalse(GLSMLighting.getColorMaterial().isEnabled()); } @Test void colorMaterialSettingsTheCaptureNeverTouchedAreLeftAlone() { final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.glColor4f(1, 1, 1, 1); + GLSMCurrentAttribs.glColor4f(1, 1, 1, 1); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.glColorMaterial(GL11.GL_BACK, GL11.GL_EMISSION); - GLStateManager.enableColorMaterial(); + GLSMLighting.glColorMaterial(GL11.GL_BACK, GL11.GL_EMISSION); + GLSMLighting.enableColorMaterial(); assertTrue(GLStateManager.canApplyExitState(state)); GLStateManager.applyExitState(state); - assertTrue(GLStateManager.getColorMaterial().isEnabled()); - assertEquals(GL11.GL_BACK, GLStateManager.getColorMaterialFace().getValue()); - assertEquals(GL11.GL_EMISSION, GLStateManager.getColorMaterialParameter().getValue()); + assertTrue(GLSMLighting.getColorMaterial().isEnabled()); + assertEquals(GL11.GL_BACK, GLSMLighting.getColorMaterialFace().getValue()); + assertEquals(GL11.GL_EMISSION, GLSMLighting.getColorMaterialParameter().getValue()); } @ParameterizedTest @ValueSource(booleans = {false, true}) void colorMaterialFaceMustMatchOnlyWhenTheCaptureDidNotSetIt(boolean establishesContext) { - GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE); + GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.glColor4f(1, 1, 1, 1); - if (establishesContext) GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE); - GLStateManager.enableColorMaterial(); - GLStateManager.disableColorMaterial(); + GLSMCurrentAttribs.glColor4f(1, 1, 1, 1); + if (establishesContext) GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE); + GLSMLighting.enableColorMaterial(); + GLSMLighting.disableColorMaterial(); assertTrue(GLStateManager.finishExitCapture(state)); - GLStateManager.glColorMaterial(GL11.GL_BACK, GL11.GL_EMISSION); + GLSMLighting.glColorMaterial(GL11.GL_BACK, GL11.GL_EMISSION); assertEquals(establishesContext, GLStateManager.canApplyExitState(state)); } @Test void writesUnderALockedIrisOverrideRecordAndApplyTheVanillaValues() { - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.getBlendMode().beforeModify(); - GLStateManager.getBlendState().beforeModify(); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.getBlendMode().beforeModify(); + GLSMBlend.getBlendState().beforeModify(); final LockedBlend lock = new LockedBlend(); GLSMHooks.blendHandler = lock; - GLStateManager.getBlendMode().setVanillaLayer(lock); - GLStateManager.getBlendState().setVanillaLayer(lock); + GLSMBlend.getBlendMode().setVanillaLayer(lock); + GLSMBlend.getBlendState().setVanillaLayer(lock); final ExitState state = new ExitState(); GLStateManager.beginExitCapture(state); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); assertTrue(GLStateManager.finishExitCapture(state)); lock.enabled = false; lock.blend.setAll(GL11.GL_DST_COLOR, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE); @@ -525,9 +525,9 @@ class GLSM_ExitState_GLTest { GLStateManager.applyExitState(state); assertTrue(lock.enabled); assertEquals(GL11.GL_SRC_ALPHA, lock.blend.getSrcRgb()); - assertFalse(GLStateManager.getBlendMode().isEnabled()); - assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getSrcRgb()); - assertEquals(GL11.GL_ZERO, GLStateManager.getBlendState().getDstRgb()); + assertFalse(GLSMBlend.getBlendMode().isEnabled()); + assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getSrcRgb()); + assertEquals(GL11.GL_ZERO, GLSMBlend.getBlendState().getDstRgb()); } private static final class LockedBlend implements DeferredBlendHandler, VanillaBooleanLayer, VanillaStateLayer { diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitTextureFilter_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitTextureFilter_GLTest.java index d3150231b..a138a4b29 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitTextureFilter_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ExitTextureFilter_GLTest.java @@ -24,23 +24,23 @@ class GLSM_ExitTextureFilter_GLTest { @BeforeEach void setUp() { - outer = GLStateManager.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - texture = GLStateManager.glGenTextures(); - otherTexture = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, otherTexture); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + outer = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + texture = GLSMTextures.glGenTextures(); + otherTexture = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, otherTexture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); } @AfterEach void tearDown() { GLStateManager.cancelExitCapture(); TextureUtilHooks.clearSavedFilterTexture(); - GLStateManager.glDeleteTextures(texture); - GLStateManager.glDeleteTextures(otherTexture); - GLStateManager.popStateTo(outer); + GLSMTextures.glDeleteTextures(texture); + GLSMTextures.glDeleteTextures(otherTexture); + GLSMAttribStack.popStateTo(outer); } @Test @@ -56,8 +56,8 @@ class GLSM_ExitTextureFilter_GLTest { assertFilters(GL11.GL_LINEAR_MIPMAP_LINEAR, GL11.GL_LINEAR); assertEquals(0, GLStateManager.ctx().savedFilterTextureId); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); assertTrue(GLStateManager.canApplyExitState(state)); GLStateManager.applyExitState(state); assertFilters(GL11.GL_LINEAR, GL11.GL_NEAREST); @@ -91,9 +91,9 @@ class GLSM_ExitTextureFilter_GLTest { GLStateManager.beginExitCapture(state); save(false, false, 1); switch (operation) { - case 0 -> GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); - case 1 -> GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - case 2 -> GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + case 0 -> GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); + case 1 -> GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + case 2 -> GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); default -> throw new AssertionError(); } restore(); @@ -168,14 +168,14 @@ class GLSM_ExitTextureFilter_GLTest { private boolean save(boolean blurred, boolean mipmap, float aniso) { final boolean captured = TextureUtilHooks.beginFilterSave(blurred, mipmap, aniso); try { - savedMin = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); - savedMag = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER); - savedAniso = GLStateManager.glGetTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, + savedMin = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); + savedMag = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER); + savedAniso = GLSMTextures.glGetTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, blurred ? (mipmap ? GL11.GL_LINEAR_MIPMAP_LINEAR : GL11.GL_LINEAR) : (mipmap ? GL11.GL_NEAREST_MIPMAP_LINEAR : GL11.GL_NEAREST)); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, blurred ? GL11.GL_LINEAR : GL11.GL_NEAREST); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, blurred ? GL11.GL_LINEAR : GL11.GL_NEAREST); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); if (failOperation) throw new IllegalStateException("filter save failed"); } catch (RuntimeException | Error failure) { TextureUtilHooks.filterFailed(captured); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java index 9dff72f92..f61620ba4 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_GLU_UnitTest.java @@ -39,27 +39,27 @@ public class GLSM_GLU_UnitTest { @Test void gluPerspective_accumulates() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glScalef(2.0f, 1.0f, 1.0f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glScalef(2.0f, 1.0f, 1.0f); - GLStateManager.gluPerspective(90.0f, 1.0f, 1.0f, 100.0f); + GLSMMatrices.gluPerspective(90.0f, 1.0f, 1.0f, 100.0f); Matrix4f expected = new Matrix4f() .scale(2.0f, 1.0f, 1.0f) .perspective((float) Math.toRadians(90.0f), 1.0f, 1.0f, 100.0f); assertMatrixEquals(expected, getProjectionMatrix(), "gluPerspective after scale"); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } @Test void gluLookAt_accumulates() { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(10.0f, 0.0f, 0.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(10.0f, 0.0f, 0.0f); - GLStateManager.gluLookAt( + GLSMMatrices.gluLookAt( 0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); @@ -74,15 +74,15 @@ public class GLSM_GLU_UnitTest { @Test void gluOrtho2D_matchesJOML() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); - GLStateManager.gluOrtho2D(0.0f, 800.0f, 0.0f, 600.0f); + GLSMMatrices.gluOrtho2D(0.0f, 800.0f, 0.0f, 600.0f); Matrix4f expected = new Matrix4f().ortho(0.0f, 800.0f, 0.0f, 600.0f, -1.0f, 1.0f); assertMatrixEquals(expected, getProjectionMatrix(), "gluOrtho2D"); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } @ParameterizedTest(name = "{0}") @@ -91,36 +91,36 @@ public class GLSM_GLU_UnitTest { "gluPickMatrix off-center viewport, 100, 50, 640, 480, 200, 150, 10", }) void gluPickMatrix_matchesManual(String label, int vx, int vy, int vw, int vh, float x, float y, float delta) { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); IntBuffer viewport = BufferUtils.createIntBuffer(4); viewport.put(0, vx).put(1, vy).put(2, vw).put(3, vh); - GLStateManager.gluPickMatrix(x, y, delta, delta, viewport); + GLSMMatrices.gluPickMatrix(x, y, delta, delta, viewport); Matrix4f expected = new Matrix4f() .translate((vw - 2 * (x - vx)) / delta, (vh - 2 * (y - vy)) / delta, 0.0f) .scale(vw / delta, vh / delta, 1.0f); assertMatrixEquals(expected, getProjectionMatrix(), label); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } @Test void gluPickMatrix_zeroSize_noOp() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); IntBuffer viewport = BufferUtils.createIntBuffer(4); viewport.put(0, 0).put(1, 0).put(2, 800).put(3, 600); - GLStateManager.gluPickMatrix(400.0f, 300.0f, 0.0f, 5.0f, viewport); + GLSMMatrices.gluPickMatrix(400.0f, 300.0f, 0.0f, 5.0f, viewport); // deltaX <= 0 should be a no-op, matrix stays identity assertMatrixEquals(new Matrix4f(), getProjectionMatrix(), "gluPickMatrix zero deltaX is no-op"); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } static Stream errorStrings() { @@ -139,7 +139,7 @@ public class GLSM_GLU_UnitTest { @ParameterizedTest(name = "{1}") @MethodSource("errorStrings") void gluErrorString(int code, String expected) { - assertEquals(expected, GLStateManager.gluErrorString(code)); + assertEquals(expected, GLSMMatrices.gluErrorString(code)); } static Stream gluUnProject_roundTrips() { @@ -167,7 +167,7 @@ public class GLSM_GLU_UnitTest { viewport.put(0, 0).put(1, 0).put(2, 800).put(3, 600); FloatBuffer result = BufferUtils.createFloatBuffer(3); - assertTrue(GLStateManager.gluUnProject(winX, winY, winZ, modelBuf, projBuf, viewport, result), "gluUnProject should succeed"); + assertTrue(GLSMMatrices.gluUnProject(winX, winY, winZ, modelBuf, projBuf, viewport, result), "gluUnProject should succeed"); assertEquals(0.0f, result.get(0), tolerance, "X should unproject back to 0"); assertEquals(0.0f, result.get(1), tolerance, "Y should unproject back to 0"); assertEquals(0.0f, result.get(2), tolerance, "Z should unproject back to 0"); @@ -186,14 +186,14 @@ public class GLSM_GLU_UnitTest { viewport.put(0, 0).put(1, 0).put(2, 800).put(3, 600); FloatBuffer result = BufferUtils.createFloatBuffer(3); - assertFalse(GLStateManager.gluUnProject(400, 300, 0.5f, model, proj, viewport, result)); + assertFalse(GLSMMatrices.gluUnProject(400, 300, 0.5f, model, proj, viewport, result)); } @Test void gluBuild2DMipmaps_invalidSize() { - assertEquals(100901, GLStateManager.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 0, 10, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(1))); - assertEquals(100901, GLStateManager.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 10, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(1))); + assertEquals(100901, GLSMMatrices.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 0, 10, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(1))); + assertEquals(100901, GLSMMatrices.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 10, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(1))); } @Test @@ -205,7 +205,7 @@ public class GLSM_GLU_UnitTest { for (int i = 0; i < 4 * 4 * 4; i++) pixels.put((byte) 0xFF); pixels.flip(); - int result = GLStateManager.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 4, 4, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + int result = GLSMMatrices.gluBuild2DMipmaps(GL11.GL_TEXTURE_2D, GL11.GL_RGBA, 4, 4, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); assertEquals(0, result, "gluBuild2DMipmaps should return 0 on success"); assertEquals(4, GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH)); assertEquals(1, GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 2, GL11.GL_TEXTURE_WIDTH)); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Groups_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Groups_UnitTest.java new file mode 100644 index 000000000..6443cac51 --- /dev/null +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Groups_UnitTest.java @@ -0,0 +1,126 @@ +package com.gtnewhorizons.angelica.glsm; + +import com.gtnewhorizons.angelica.glsm.redirect.GLSMRedirector; +import com.gtnewhorizons.angelica.glsm.testutil.GlsmClasses; +import org.junit.jupiter.api.Test; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.FieldNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Deque; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class GLSM_Groups_UnitTest { + + private static final String PACKAGE = "com/gtnewhorizons/angelica/glsm/"; + private static final String CORE = PACKAGE + "GLStateManager"; + + private static boolean counted(int access, String name) { + return (access & Opcodes.ACC_SYNTHETIC) == 0 && name.indexOf('$') < 0; + } + + private static String simple(String internalName) { + return internalName.substring(internalName.lastIndexOf('/') + 1); + } + + @Test + void memberNamesDeclaredOnce() { + final Map> methods = new TreeMap<>(); + final Map> fields = new TreeMap<>(); + collect(GlsmClasses.classes(), methods, fields); + final List offenders = offenders(methods, fields); + assertTrue(offenders.isEmpty(), "Member names declared in more than one class:\n " + String.join("\n ", offenders)); + } + + private static void collect(Collection classes, Map> methods, Map> fields) { + for (String type : classes) { + final ClassNode node = GlsmClasses.load(type); + for (MethodNode method : node.methods) { + if (!counted(method.access, method.name) || method.name.equals("") || method.name.equals("")) continue; + methods.computeIfAbsent(method.name, k -> new TreeSet<>()).add(simple(type)); + } + for (FieldNode field : node.fields) { + if (!counted(field.access, field.name)) continue; + fields.computeIfAbsent(field.name, k -> new TreeSet<>()).add(simple(type)); + } + } + } + + private static List offenders(Map> methods, Map> fields) { + final List offenders = new ArrayList<>(); + methods.forEach((name, declaring) -> { + if (declaring.size() > 1) offenders.add("method " + name + " declared in " + declaring); + }); + fields.forEach((name, declaring) -> { + if (declaring.size() > 1) offenders.add("field " + name + " declared in " + declaring); + }); + return offenders; + } + + @Test + void staticInitReachesOnlyOwnClassAndCore() { + final Set classes = new HashSet<>(GlsmClasses.classes()); + final List failures = new ArrayList<>(); + for (String type : classes) { + final MethodNode clinit = findMethod(GlsmClasses.load(type), ""); + if (clinit == null) continue; + final Set visited = new HashSet<>(); + final Deque pending = new ArrayDeque<>(); + visited.add(type + "." + clinit.desc); + pending.add(new GlsmClasses.Resolved(type, clinit)); + while (!pending.isEmpty()) { + final GlsmClasses.Resolved current = pending.poll(); + final String currentOwner = current.owner(); + final MethodNode body = current.method(); + for (AbstractInsnNode insn : body.instructions) { + final String owner; + final String what; + if (insn instanceof MethodInsnNode call) { + owner = call.owner; + what = call.name; + if (owner.startsWith(PACKAGE)) { + final GlsmClasses.Resolved target = GlsmClasses.resolve(owner, call.name, call.desc); + if (target != null && visited.add(target.owner() + "." + call.name + call.desc)) pending.add(target); + } + } else if (insn instanceof FieldInsnNode field) { + owner = field.owner; + what = field.name; + } else { + continue; + } + if (!classes.contains(owner) || owner.equals(type)) continue; + if (owner.equals(CORE) && !type.equals(CORE)) continue; + failures.add(simple(type) + ". via " + simple(currentOwner) + "." + body.name + ": " + simple(owner) + "." + what); + } + } + } + assertTrue(failures.isEmpty(), "Static initializers may reach only their own class and GLStateManager:\n " + String.join("\n ", new TreeSet<>(failures))); + } + + @Test + void classListMatchesPackage() { + assertEquals(GlsmClasses.packageClasses(), new TreeSet<>(GLSMRedirector.glsmClasses())); + } + + private static MethodNode findMethod(ClassNode node, String name) { + for (MethodNode method : node.methods) { + if (method.name.equals(name)) return method; + } + return null; + } +} diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_HudCacheBlendOverride_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_HudCacheBlendOverride_GLTest.java index c1d559d58..2bd1a9a57 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_HudCacheBlendOverride_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_HudCacheBlendOverride_GLTest.java @@ -17,67 +17,67 @@ public class GLSM_HudCacheBlendOverride_GLTest { } private static void assertCachedFunc(int srcRgb, int dstRgb, int srcAlpha, int dstAlpha) { - assertEquals(srcRgb, GLStateManager.glGetInteger(GL14.GL_BLEND_SRC_RGB)); - assertEquals(dstRgb, GLStateManager.glGetInteger(GL14.GL_BLEND_DST_RGB)); - assertEquals(srcAlpha, GLStateManager.glGetInteger(GL14.GL_BLEND_SRC_ALPHA)); - assertEquals(dstAlpha, GLStateManager.glGetInteger(GL14.GL_BLEND_DST_ALPHA)); + assertEquals(srcRgb, GLSMQueries.glGetInteger(GL14.GL_BLEND_SRC_RGB)); + assertEquals(dstRgb, GLSMQueries.glGetInteger(GL14.GL_BLEND_DST_RGB)); + assertEquals(srcAlpha, GLSMQueries.glGetInteger(GL14.GL_BLEND_SRC_ALPHA)); + assertEquals(dstAlpha, GLSMQueries.glGetInteger(GL14.GL_BLEND_DST_ALPHA)); } @Test void overrideChangesTheDriverFuncButNotTheCache() { try { - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.setHudCacheOverride(true); + GLSMBlend.setHudCacheOverride(true); assertCachedFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); assertCachedFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_SRC_ALPHA, GL11.GL_ONE); assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ONE); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ONE); assertCachedFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ONE); assertDriverFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.setHudCacheOverride(false); + GLSMBlend.setHudCacheOverride(false); assertCachedFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ONE); assertDriverFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ZERO, GL11.GL_ONE); } finally { - GLStateManager.setHudCacheOverride(false); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.setHudCacheOverride(false); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); } } @Test void popUnderOverrideKeepsTheOverriddenAlphaOnTheDriver() { try { - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - final int d = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.setHudCacheOverride(true); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - GLStateManager.popStateTo(d); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMBlend.setHudCacheOverride(true); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMAttribStack.popStateTo(d); assertCachedFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.setHudCacheOverride(false); + GLSMBlend.setHudCacheOverride(false); assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); } finally { - GLStateManager.setHudCacheOverride(false); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.setHudCacheOverride(false); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); } } @Test void separateAlphaIsForcedEvenWhenDstAlphaAlreadyMatches() { try { - GLStateManager.setHudCacheOverride(true); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMBlend.setHudCacheOverride(true); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE_MINUS_SRC_ALPHA); assertCachedFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE_MINUS_SRC_ALPHA); assertDriverFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); } finally { - GLStateManager.setHudCacheOverride(false); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.setHudCacheOverride(false); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ImageUnitBindingCache_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ImageUnitBindingCache_UnitTest.java index 59708145c..fe56562ab 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ImageUnitBindingCache_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ImageUnitBindingCache_UnitTest.java @@ -19,24 +19,24 @@ import static org.junit.jupiter.api.Assumptions.assumeTrue; public class GLSM_ImageUnitBindingCache_UnitTest { private static void unbind(int unit) { - GLStateManager.glBindImageTexture(unit, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8); + GLSMTextures.glBindImageTexture(unit, 0, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R8); } @Test void bindThenQueryReturnsFullTuple() { final int tex = GL11.glGenTextures(); try { - GLStateManager.glBindImageTexture(2, tex, 1, false, 3, GL15.GL_READ_ONLY, GL30.GL_RGBA32UI); + GLSMTextures.glBindImageTexture(2, tex, 1, false, 3, GL15.GL_READ_ONLY, GL30.GL_RGBA32UI); - assertEquals(tex, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 2)); - assertEquals(1, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 2)); - assertEquals(GL11.GL_FALSE, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2)); - assertEquals(3, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2)); - assertEquals(GL15.GL_READ_ONLY, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 2)); - assertEquals(GL30.GL_RGBA32UI, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 2)); + assertEquals(tex, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 2)); + assertEquals(1, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 2)); + assertEquals(GL11.GL_FALSE, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2)); + assertEquals(3, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2)); + assertEquals(GL15.GL_READ_ONLY, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 2)); + assertEquals(GL30.GL_RGBA32UI, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 2)); } finally { unbind(2); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); } } @@ -45,24 +45,24 @@ public class GLSM_ImageUnitBindingCache_UnitTest { final int a = GL11.glGenTextures(); final int b = GL11.glGenTextures(); try { - GLStateManager.glBindImageTexture(0, a, 2, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI); - final ImageUnitBinding live = GLStateManager.getImageUnitBinding(0); + GLSMTextures.glBindImageTexture(0, a, 2, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI); + final ImageUnitBinding live = GLSMTextures.getImageUnitBinding(0); assertNotNull(live); final ImageUnitBinding saved = live.copy(); - GLStateManager.glBindImageTexture(0, b, 0, true, 0, GL15.GL_WRITE_ONLY, GL30.GL_R8); - assertEquals(b, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0)); + GLSMTextures.glBindImageTexture(0, b, 0, true, 0, GL15.GL_WRITE_ONLY, GL30.GL_R8); + assertEquals(b, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0)); - GLStateManager.glBindImageTexture(0, saved.getTexture(), saved.getLevel(), saved.isLayered(), saved.getLayer(), saved.getAccess(), saved.getFormat()); + GLSMTextures.glBindImageTexture(0, saved.getTexture(), saved.getLevel(), saved.isLayered(), saved.getLayer(), saved.getAccess(), saved.getFormat()); - assertTrue(saved.sameAs(GLStateManager.getImageUnitBinding(0)), "restore must reproduce every field"); - assertEquals(a, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0)); - assertEquals(2, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 0)); - assertEquals(GL15.GL_READ_WRITE, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 0)); + assertTrue(saved.sameAs(GLSMTextures.getImageUnitBinding(0)), "restore must reproduce every field"); + assertEquals(a, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0)); + assertEquals(2, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 0)); + assertEquals(GL15.GL_READ_WRITE, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 0)); } finally { unbind(0); - GLStateManager.glDeleteTextures(a); - GLStateManager.glDeleteTextures(b); + GLSMTextures.glDeleteTextures(a); + GLSMTextures.glDeleteTextures(b); } } @@ -70,14 +70,14 @@ public class GLSM_ImageUnitBindingCache_UnitTest { void resetToZeroIsNotARestore() { final int tex = GL11.glGenTextures(); try { - GLStateManager.glBindImageTexture(0, tex, 1, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI); - GLStateManager.glBindImageTexture(0, 0, 0, true, 0, GL15.GL_WRITE_ONLY, GL30.GL_R8); + GLSMTextures.glBindImageTexture(0, tex, 1, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI); + GLSMTextures.glBindImageTexture(0, 0, 0, true, 0, GL15.GL_WRITE_ONLY, GL30.GL_R8); - assertEquals(0, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0)); - assertEquals(0, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 0)); + assertEquals(0, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0)); + assertEquals(0, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LEVEL, 0)); } finally { unbind(0); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); } } @@ -85,21 +85,21 @@ public class GLSM_ImageUnitBindingCache_UnitTest { void deletingTheBoundTextureClearsTheImageUnit() { final boolean driverHasImages = GLStateManager.capabilities != null && GLStateManager.capabilities.OpenGL42; final int tex = GL11.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); try { - GLStateManager.glBindImageTexture(1, tex, 0, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI); - assertEquals(tex, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1)); + GLSMTextures.glBindImageTexture(1, tex, 0, true, 0, GL15.GL_READ_WRITE, GL30.GL_R32UI); + assertEquals(tex, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1)); if (driverHasImages) assertEquals(tex, GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1)); - GLStateManager.glDeleteTextures(tex); - assertEquals(0, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1), "GL unbinds a deleted texture from every image unit"); + GLSMTextures.glDeleteTextures(tex); + assertEquals(0, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1), "GL unbinds a deleted texture from every image unit"); if (driverHasImages) assertEquals(0, GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1), "driver unbinds a deleted texture from every image unit"); - assertEquals(GL15.GL_READ_ONLY, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1)); - assertEquals(GL30.GL_R8, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1)); + assertEquals(GL15.GL_READ_ONLY, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1)); + assertEquals(GL30.GL_R8, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1)); if (driverHasImages) { - assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1)); - assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1)); + assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1)); + assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1)); } } finally { unbind(1); @@ -111,18 +111,18 @@ public class GLSM_ImageUnitBindingCache_UnitTest { final int a = GL11.glGenTextures(); final int b = GL11.glGenTextures(); try { - GLStateManager.glBindImageTexture(0, a, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI); - GLStateManager.glBindImageTexture(3, b, 1, false, 2, GL15.GL_WRITE_ONLY, GL30.GL_RGBA32UI); + GLSMTextures.glBindImageTexture(0, a, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI); + GLSMTextures.glBindImageTexture(3, b, 1, false, 2, GL15.GL_WRITE_ONLY, GL30.GL_RGBA32UI); - assertEquals(a, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0)); - assertEquals(b, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3)); - assertEquals(GL11.GL_TRUE, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 0)); - assertEquals(GL11.GL_FALSE, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 3)); + assertEquals(a, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0)); + assertEquals(b, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3)); + assertEquals(GL11.GL_TRUE, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 0)); + assertEquals(GL11.GL_FALSE, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 3)); } finally { unbind(0); unbind(3); - GLStateManager.glDeleteTextures(a); - GLStateManager.glDeleteTextures(b); + GLSMTextures.glDeleteTextures(a); + GLSMTextures.glDeleteTextures(b); } } @@ -130,19 +130,19 @@ public class GLSM_ImageUnitBindingCache_UnitTest { void outOfRangeUnitDoesNotCorruptNeighbours() { final int tex = GL11.glGenTextures(); try { - GLStateManager.glBindImageTexture(0, tex, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI); - final int beyond = GLStateManager.getImageUnitBinding(0) == null ? 0 : Integer.MAX_VALUE - 1; + GLSMTextures.glBindImageTexture(0, tex, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI); + final int beyond = GLSMTextures.getImageUnitBinding(0) == null ? 0 : Integer.MAX_VALUE - 1; assertFalse(beyond == 0, "unit 0 must resolve for this test to mean anything"); - GLStateManager.glBindImageTexture(beyond, tex, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI); + GLSMTextures.glBindImageTexture(beyond, tex, 0, true, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI); // Without image load/store the backend drops the call, so the driver never sees the unit. final ContextCapabilities caps = GLStateManager.capabilities; final boolean reachesDriver = caps.OpenGL42 || caps.GL_ARB_shader_image_load_store || caps.GL_EXT_shader_image_load_store; assertEquals(reachesDriver ? GL11.GL_INVALID_VALUE : GL11.GL_NO_ERROR, GL11.glGetError(), "driver must reject the out-of-range unit"); - assertEquals(tex, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0)); + assertEquals(tex, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 0)); } finally { unbind(0); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); } } @@ -152,36 +152,36 @@ public class GLSM_ImageUnitBindingCache_UnitTest { drainErrors(); final int tex = GL11.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexStorage2D(GL11.GL_TEXTURE_2D, 1, GL30.GL_R32UI, 4, 4); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexStorage2D(GL11.GL_TEXTURE_2D, 1, GL30.GL_R32UI, 4, 4); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glBindImageTexture(1, tex, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI); + GLSMTextures.glBindImageTexture(1, tex, 0, false, 0, GL15.GL_READ_ONLY, GL30.GL_R32UI); drainErrors(); - assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1)); - assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1)); - assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1)); + assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 1)); + assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 1)); + assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 1)); - assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3)); - assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 3), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 3)); - assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 3), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 3)); + assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_NAME, 3)); + assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 3), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_ACCESS, 3)); + assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 3), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_FORMAT, 3)); } finally { unbind(1); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); } } @Test void bindingTextureZeroClearsLayeredAndLayer() { try { - GLStateManager.glBindImageTexture(2, 0, 0, true, 3, GL15.GL_READ_WRITE, GL11.GL_RGBA8); + GLSMTextures.glBindImageTexture(2, 0, 0, true, 3, GL15.GL_READ_WRITE, GL11.GL_RGBA8); - assertEquals(GL11.GL_FALSE, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2)); - assertEquals(0, GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2)); + assertEquals(GL11.GL_FALSE, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2)); + assertEquals(0, GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2)); if (GLStateManager.capabilities != null && GLStateManager.capabilities.OpenGL42) { - assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2)); - assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2), GLStateManager.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2)); + assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYERED, 2)); + assertEquals(GL30.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2), GLSMQueries.glGetInteger(GL42.GL_IMAGE_BINDING_LAYER, 2)); } } finally { unbind(2); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LegacyStackQueries_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LegacyStackQueries_GLTest.java index 274f137ac..ab2cc2d9d 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LegacyStackQueries_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LegacyStackQueries_GLTest.java @@ -48,32 +48,32 @@ public class GLSM_LegacyStackQueries_GLTest { } private static int pushToLimit(int depthPname, int maxPname) { - final int max = GLStateManager.glGetInteger(maxPname); + final int max = GLSMQueries.glGetInteger(maxPname); for (int i = 0; i < max + 4; i++) { - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); } - return GLStateManager.glGetInteger(depthPname); + return GLSMQueries.glGetInteger(depthPname); } private static void popToBase(int depthPname) { - for (int i = 0; i < 128 && GLStateManager.glGetInteger(depthPname) > 1; i++) { - GLStateManager.glPopMatrix(); + for (int i = 0; i < 128 && GLSMQueries.glGetInteger(depthPname) > 1; i++) { + GLSMMatrices.glPopMatrix(); } } @Test void attribDepthTracksPushAndPop() { - final int base = GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH); + final int base = GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH); try { - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - assertEquals(base + 1, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); - GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); - assertEquals(base + 2, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); - GLStateManager.glPopAttrib(); - assertEquals(base + 1, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); - GLStateManager.glPopAttrib(); - assertEquals(base, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); - assertEquals(GLStateManager.MAX_ATTRIB_STACK_DEPTH, GLStateManager.glGetInteger(GL11.GL_MAX_ATTRIB_STACK_DEPTH)); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + assertEquals(base + 1, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); + GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); + assertEquals(base + 2, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); + GLSMAttribStack.glPopAttrib(); + assertEquals(base + 1, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); + GLSMAttribStack.glPopAttrib(); + assertEquals(base, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); + assertEquals(GLStateManager.MAX_ATTRIB_STACK_DEPTH, GLSMQueries.glGetInteger(GL11.GL_MAX_ATTRIB_STACK_DEPTH)); } finally { popAttribTo(base); } @@ -82,23 +82,23 @@ public class GLSM_LegacyStackQueries_GLTest { @Test void clientAttribDepthTracksPushAndPop() { try { - assertEquals(0, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT); - assertEquals(1, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - assertEquals(2, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); - GLStateManager.glPopClientAttrib(); - assertEquals(1, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); - GLStateManager.glPopClientAttrib(); - assertEquals(0, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); - GLStateManager.glPopClientAttrib(); - assertEquals(0, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); + assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT); + assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); + GLSMAttribStack.glPopClientAttrib(); + assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); + GLSMAttribStack.glPopClientAttrib(); + assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); + GLSMAttribStack.glPopClientAttrib(); + assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); - final int max = GLStateManager.glGetInteger(GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH); + final int max = GLSMQueries.glGetInteger(GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH); for (int i = 0; i < max + 2; i++) { - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT); } - assertEquals(max, GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); + assertEquals(max, GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH)); } finally { drainClientAttribStack(); } @@ -107,24 +107,24 @@ public class GLSM_LegacyStackQueries_GLTest { @Test void textureStackDepthIsPerActiveUnit() { try { - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - assertEquals(1, GLStateManager.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glPushMatrix(); - assertEquals(2, GLStateManager.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - assertEquals(1, GLStateManager.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - assertEquals(2, GLStateManager.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH)); - GLStateManager.glPopMatrix(); - assertEquals(1, GLStateManager.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH)); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMMatrices.glPushMatrix(); + assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH)); + GLSMMatrices.glPopMatrix(); + assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_TEXTURE_STACK_DEPTH)); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); popToBase(GL11.GL_TEXTURE_STACK_DEPTH); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } } @@ -139,21 +139,21 @@ public class GLSM_LegacyStackQueries_GLTest { @MethodSource("matrixStacks") void maxMatrixStackDepthIsExactlyReachable(String name, int mode, int depthPname, int maxPname) { try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glMatrixMode(mode); - assertEquals(1, GLStateManager.glGetInteger(depthPname)); - assertEquals(GLStateManager.glGetInteger(maxPname), pushToLimit(depthPname, maxPname)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glMatrixMode(mode); + assertEquals(1, GLSMQueries.glGetInteger(depthPname)); + assertEquals(GLSMQueries.glGetInteger(maxPname), pushToLimit(depthPname, maxPname)); } finally { - GLStateManager.glMatrixMode(mode); + GLSMMatrices.glMatrixMode(mode); popToBase(depthPname); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } } @Test void constantQueriesReportEmulatedLimits() { - assertEquals(Math.min(VertexKey.MAX_UNITS, GLStateManager.MAX_TEXTURE_UNITS), GLStateManager.glGetInteger(GL13.GL_MAX_TEXTURE_UNITS)); - assertEquals(8, GLStateManager.glGetInteger(GL11.GL_MAX_LIGHTS)); + assertEquals(Math.min(VertexKey.MAX_UNITS, GLStateManager.MAX_TEXTURE_UNITS), GLSMQueries.glGetInteger(GL13.GL_MAX_TEXTURE_UNITS)); + assertEquals(8, GLSMQueries.glGetInteger(GL11.GL_MAX_LIGHTS)); } @Test @@ -162,16 +162,16 @@ public class GLSM_LegacyStackQueries_GLTest { final int savedDraw = glCtx.drawFramebuffer; final int savedRead = glCtx.readFramebuffer; try { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); assertEquals( GL30.glGetFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, GL11.GL_STENCIL, GL30.GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE), - GLStateManager.glGetInteger(GL11.GL_STENCIL_BITS)); + GLSMQueries.glGetInteger(GL11.GL_STENCIL_BITS)); assertEquals( GL30.glGetFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, GL11.GL_DEPTH, GL30.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE), - GLStateManager.glGetInteger(GL11.GL_DEPTH_BITS)); + GLSMQueries.glGetInteger(GL11.GL_DEPTH_BITS)); } finally { - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, savedDraw); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, savedRead); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, savedDraw); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, savedRead); } } @@ -180,94 +180,94 @@ public class GLSM_LegacyStackQueries_GLTest { final GLContextState glCtx = GLStateManager.ctx(); final int savedDraw = glCtx.drawFramebuffer; final int savedRead = glCtx.readFramebuffer; - final int fbo = GLStateManager.glGenFramebuffers(); - final int depthOnly = GLStateManager.glGenRenderbuffers(); - final int depthStencil = GLStateManager.glGenRenderbuffers(); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + final int depthOnly = GLSMFramebuffer.glGenRenderbuffers(); + final int depthStencil = GLSMFramebuffer.glGenRenderbuffers(); try { - GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthOnly); - GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL14.GL_DEPTH_COMPONENT24, 16, 16); - GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthStencil); - GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, 16, 16); - GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, 0); + GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthOnly); + GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL14.GL_DEPTH_COMPONENT24, 16, 16); + GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthStencil); + GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, 16, 16); + GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, 0); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - assertEquals(0, GLStateManager.glGetInteger(GL11.GL_STENCIL_BITS)); - assertEquals(0, GLStateManager.glGetInteger(GL11.GL_DEPTH_BITS)); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_STENCIL_BITS)); + assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_DEPTH_BITS)); - GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, depthOnly); - assertEquals(0, GLStateManager.glGetInteger(GL11.GL_STENCIL_BITS)); + GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, depthOnly); + assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_STENCIL_BITS)); final int depthOnlyBits = GL30.glGetFramebufferAttachmentParameteri(GL30.GL_DRAW_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE); assertTrue(depthOnlyBits >= 24, "driver depth size " + depthOnlyBits); - assertEquals(depthOnlyBits, GLStateManager.glGetInteger(GL11.GL_DEPTH_BITS)); + assertEquals(depthOnlyBits, GLSMQueries.glGetInteger(GL11.GL_DEPTH_BITS)); - GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, depthStencil); - GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depthStencil); - assertEquals(8, GLStateManager.glGetInteger(GL11.GL_STENCIL_BITS)); - assertEquals(24, GLStateManager.glGetInteger(GL11.GL_DEPTH_BITS)); + GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, depthStencil); + GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depthStencil); + assertEquals(8, GLSMQueries.glGetInteger(GL11.GL_STENCIL_BITS)); + assertEquals(24, GLSMQueries.glGetInteger(GL11.GL_DEPTH_BITS)); } finally { - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, savedDraw); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, savedRead); - GLStateManager.glDeleteFramebuffers(fbo); - GLStateManager.glDeleteRenderbuffers(depthOnly); - GLStateManager.glDeleteRenderbuffers(depthStencil); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, savedDraw); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, savedRead); + GLSMFramebuffer.glDeleteFramebuffers(fbo); + GLSMFramebuffer.glDeleteRenderbuffers(depthOnly); + GLSMFramebuffer.glDeleteRenderbuffers(depthStencil); } } @Test void attribDepthUnchangedWhileCompilingDisplayList() { - final int base = GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH); - final int list = GLStateManager.glGenLists(1); + final int base = GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH); + final int list = GLSMDraws.glGenLists(1); try { - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - assertEquals(base, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); - GLStateManager.glPopAttrib(); - assertEquals(base, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); - GLStateManager.glEndList(); - assertEquals(base, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + assertEquals(base, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); + GLSMAttribStack.glPopAttrib(); + assertEquals(base, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); + GLSMDraws.glEndList(); + assertEquals(base, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); } finally { if (DisplayListManager.isRecording()) { - GLStateManager.glEndList(); + GLSMDraws.glEndList(); } - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); } } @Test void popAttribOnEmptyStackIsIgnored() { popAttribTo(0); - assertEquals(0, GLStateManager.getAttribDepth()); - assertDoesNotThrow(GLStateManager::glPopAttrib); - assertEquals(0, GLStateManager.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); - assertDoesNotThrow(GLStateManager::glPopAttrib); - assertEquals(0, GLStateManager.getAttribDepth()); + assertEquals(0, GLSMAttribStack.getAttribDepth()); + assertDoesNotThrow(GLSMAttribStack::glPopAttrib); + assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_ATTRIB_STACK_DEPTH)); + assertDoesNotThrow(GLSMAttribStack::glPopAttrib); + assertEquals(0, GLSMAttribStack.getAttribDepth()); } @Test void pixelStoreBitRestoresPixelStoreAndPboBindings() { final GLContextState glCtx = GLStateManager.ctx(); - final int unpackBuffer = GLStateManager.glGenBuffers(); - final int packBuffer = GLStateManager.glGenBuffers(); + final int unpackBuffer = GLSMBuffers.glGenBuffers(); + final int packBuffer = GLSMBuffers.glGenBuffers(); try { // Pack and unpack start from different values, so a pop that crosses them is caught - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 2); - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 8); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 3); - GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 5); - GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 2); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 8); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 3); + GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 5); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); final PixelStoreState unpackBefore = glCtx.pixelUnpackState; final PixelStoreState packBefore = glCtx.pixelPackState; - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 6); - GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 7); - GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 7); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 6); + GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 7); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 7); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer); assertEquals(1, glCtx.pixelUnpackState.alignment()); assertEquals(4, glCtx.pixelPackState.alignment()); assertEquals(6, glCtx.pixelUnpackState.skipRows()); @@ -276,14 +276,14 @@ public class GLSM_LegacyStackQueries_GLTest { assertEquals(4, GL11.glGetInteger(GL11.GL_PACK_ALIGNMENT)); assertEquals(6, GL11.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS)); assertEquals(7, GL11.glGetInteger(GL11.GL_PACK_SKIP_ROWS)); - GLStateManager.glPopClientAttrib(); + GLSMAttribStack.glPopClientAttrib(); assertSame(unpackBefore, glCtx.pixelUnpackState); assertSame(packBefore, glCtx.pixelPackState); - assertEquals(2, GLStateManager.glGetInteger(GL11.GL_UNPACK_ALIGNMENT)); - assertEquals(8, GLStateManager.glGetInteger(GL11.GL_PACK_ALIGNMENT)); - assertEquals(0, GLStateManager.glGetInteger(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING)); - assertEquals(0, GLStateManager.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING)); + assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_UNPACK_ALIGNMENT)); + assertEquals(8, GLSMQueries.glGetInteger(GL11.GL_PACK_ALIGNMENT)); + assertEquals(0, GLSMQueries.glGetInteger(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING)); + assertEquals(0, GLSMQueries.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING)); assertEquals(2, GL11.glGetInteger(GL11.GL_UNPACK_ALIGNMENT)); assertEquals(8, GL11.glGetInteger(GL11.GL_PACK_ALIGNMENT)); assertEquals(3, GL11.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS)); @@ -293,52 +293,52 @@ public class GLSM_LegacyStackQueries_GLTest { assertEquals(0, GL11.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING)); } finally { drainClientAttribStack(); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0); - GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 0); - GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); - GLStateManager.glDeleteBuffers(unpackBuffer); - GLStateManager.glDeleteBuffers(packBuffer); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0); + GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 0); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); + GLSMBuffers.glDeleteBuffers(unpackBuffer); + GLSMBuffers.glDeleteBuffers(packBuffer); } } @Test void pixelStoreIsNotRestoredWithoutPixelStoreBit() { final GLContextState glCtx = GLStateManager.ctx(); - final int unpackBuffer = GLStateManager.glGenBuffers(); - final int packBuffer = GLStateManager.glGenBuffers(); + final int unpackBuffer = GLSMBuffers.glGenBuffers(); + final int packBuffer = GLSMBuffers.glGenBuffers(); try { - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 2); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer); - GLStateManager.glPopClientAttrib(); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 2); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, unpackBuffer); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, packBuffer); + GLSMAttribStack.glPopClientAttrib(); assertEquals(1, glCtx.pixelUnpackState.alignment()); assertEquals(2, glCtx.pixelPackState.alignment()); - assertEquals(unpackBuffer, GLStateManager.glGetInteger(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING)); - assertEquals(packBuffer, GLStateManager.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING)); + assertEquals(unpackBuffer, GLSMQueries.glGetInteger(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING)); + assertEquals(packBuffer, GLSMQueries.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING)); assertEquals(1, GL11.glGetInteger(GL11.GL_UNPACK_ALIGNMENT)); assertEquals(2, GL11.glGetInteger(GL11.GL_PACK_ALIGNMENT)); assertEquals(unpackBuffer, GL11.glGetInteger(GL21.GL_PIXEL_UNPACK_BUFFER_BINDING)); assertEquals(packBuffer, GL11.glGetInteger(GL21.GL_PIXEL_PACK_BUFFER_BINDING)); } finally { drainClientAttribStack(); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); - GLStateManager.glDeleteBuffers(unpackBuffer); - GLStateManager.glDeleteBuffers(packBuffer); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_UNPACK_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); + GLSMBuffers.glDeleteBuffers(unpackBuffer); + GLSMBuffers.glDeleteBuffers(packBuffer); } } @@ -346,25 +346,25 @@ public class GLSM_LegacyStackQueries_GLTest { void pixelStoreWithReturnsSameInstanceForUnchangedValue() { final GLContextState glCtx = GLStateManager.ctx(); try { - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 9); - GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 11); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 9); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 11); final PixelStoreState unpack = glCtx.pixelUnpackState; final PixelStoreState pack = glCtx.pixelPackState; - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 9); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, unpack.alignment()); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SWAP_BYTES, 0); - GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 11); - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, pack.alignment()); - GLStateManager.glPixelStorei(GL11.GL_PACK_LSB_FIRST, 0); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 9); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, unpack.alignment()); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SWAP_BYTES, 0); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 11); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, pack.alignment()); + GLSMTextures.glPixelStorei(GL11.GL_PACK_LSB_FIRST, 0); assertSame(unpack, glCtx.pixelUnpackState); assertSame(pack, glCtx.pixelPackState); assertSame(unpack, unpack.with(GL11.GL_UNPACK_ROW_LENGTH, 9)); assertSame(pack, pack.with(GL11.GL_PACK_ROW_LENGTH, 11)); } finally { - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0); - GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0); } } @@ -375,28 +375,28 @@ public class GLSM_LegacyStackQueries_GLTest { final FloatBuffer savedDirection = BufferUtils.createFloatBuffer(16); final FloatBuffer savedCutoff = BufferUtils.createFloatBuffer(16); final FloatBuffer savedAttenuation = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, savedDiffuse); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_POSITION, savedPosition); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, savedDirection); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, savedCutoff); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, savedAttenuation); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, savedDiffuse); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_POSITION, savedPosition); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, savedDirection); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, savedCutoff); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, savedAttenuation); final IntBuffer ints = BufferUtils.createIntBuffer(16); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); try { - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); final FloatBuffer values = BufferUtils.createFloatBuffer(4); values.put(0, 0.25f).put(1, 0.5f).put(2, 1.0f).put(3, -0.5f); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, values); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, values); values.put(0, 3.9f).put(1, -2.7f).put(2, 0.5f).put(3, 1.0f); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, values); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, values); values.put(0, 2.5f).put(1, -1.5f).put(2, -3.9f).put(3, 0.0f); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, values); - GLStateManager.glLightf(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, 45.75f); - GLStateManager.glLightf(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, 2.5f); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, values); + GLSMLighting.glLightf(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, 45.75f); + GLSMLighting.glLightf(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, 2.5f); ints.position(2); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, ints); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, ints); assertEquals(2, ints.position()); assertEquals(536870911, ints.get(2)); assertEquals(1073741823, ints.get(3)); @@ -404,42 +404,42 @@ public class GLSM_LegacyStackQueries_GLTest { assertEquals(-1073741823, ints.get(5)); ints.position(0); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_POSITION, ints); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_POSITION, ints); assertEquals(3, ints.get(0)); assertEquals(-2, ints.get(1)); assertEquals(0, ints.get(2)); assertEquals(1, ints.get(3)); ints.put(3, -777); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, ints); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, ints); assertEquals(2, ints.get(0)); assertEquals(-1, ints.get(1)); assertEquals(-3, ints.get(2)); assertEquals(-777, ints.get(3)); ints.put(1, -777); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, ints); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, ints); assertEquals(45, ints.get(0)); assertEquals(-777, ints.get(1)); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, ints); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, ints); assertEquals(2, ints.get(0)); ints.put(0, -777); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_EMISSION, ints); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_EMISSION, ints); assertEquals(-777, ints.get(0)); - GLStateManager.glGetLight(GL11.GL_LIGHT1, GL11.GL_SHININESS, ints); + GLSMLighting.glGetLight(GL11.GL_LIGHT1, GL11.GL_SHININESS, ints); assertEquals(-777, ints.get(0)); } finally { - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); savedDiffuse.limit(4); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, savedDiffuse); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, savedDiffuse); savedPosition.limit(4); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, savedPosition); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, savedPosition); savedDirection.limit(4); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, savedDirection); - GLStateManager.glLightf(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, savedCutoff.get(0)); - GLStateManager.glLightf(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, savedAttenuation.get(0)); - GLStateManager.glPopMatrix(); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_SPOT_DIRECTION, savedDirection); + GLSMLighting.glLightf(GL11.GL_LIGHT1, GL11.GL_SPOT_CUTOFF, savedCutoff.get(0)); + GLSMLighting.glLightf(GL11.GL_LIGHT1, GL11.GL_LINEAR_ATTENUATION, savedAttenuation.get(0)); + GLSMMatrices.glPopMatrix(); } } @@ -448,20 +448,20 @@ public class GLSM_LegacyStackQueries_GLTest { final FloatBuffer savedSpecular = BufferUtils.createFloatBuffer(16); final FloatBuffer savedShininess = BufferUtils.createFloatBuffer(16); final FloatBuffer savedIndexes = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, savedSpecular); - GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_SHININESS, savedShininess); - GLStateManager.glGetMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, savedIndexes); + GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, savedSpecular); + GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_SHININESS, savedShininess); + GLSMLighting.glGetMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, savedIndexes); final IntBuffer ints = BufferUtils.createIntBuffer(16); try { final FloatBuffer values = BufferUtils.createFloatBuffer(4); values.put(0, 0.5f).put(1, 0.75f).put(2, 1.0f).put(3, 0.0f); - GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, values); - GLStateManager.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 12.6f); + GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, values); + GLSMLighting.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 12.6f); values.put(0, 2.5f).put(1, -2.5f).put(2, 7.4f).put(3, 0.0f); - GLStateManager.glMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, values); + GLSMLighting.glMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, values); ints.position(1); - GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, ints); + GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, ints); assertEquals(1, ints.position()); assertEquals(1073741823, ints.get(1)); assertEquals(1610612735, ints.get(2)); @@ -470,28 +470,28 @@ public class GLSM_LegacyStackQueries_GLTest { ints.position(0); ints.put(1, -777); - GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_SHININESS, ints); + GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_SHININESS, ints); assertEquals(13, ints.get(0)); assertEquals(-777, ints.get(1)); ints.put(3, -777); - GLStateManager.glGetMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, ints); + GLSMLighting.glGetMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, ints); assertEquals(3, ints.get(0)); assertEquals(-3, ints.get(1)); assertEquals(7, ints.get(2)); assertEquals(-777, ints.get(3)); ints.put(0, -777); - GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_POSITION, ints); + GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_POSITION, ints); assertEquals(-777, ints.get(0)); - GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPOT_CUTOFF, ints); + GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_SPOT_CUTOFF, ints); assertEquals(-777, ints.get(0)); } finally { savedSpecular.limit(4); - GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, savedSpecular); - GLStateManager.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, savedShininess.get(0)); + GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR, savedSpecular); + GLSMLighting.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, savedShininess.get(0)); savedIndexes.limit(4); - GLStateManager.glMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, savedIndexes); + GLSMLighting.glMaterial(GL11.GL_BACK, GL11.GL_COLOR_INDEXES, savedIndexes); } } @@ -501,21 +501,21 @@ public class GLSM_LegacyStackQueries_GLTest { final float[][] saved = new float[4][4]; try { for (int unit = 0; unit < 4; unit++) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - GLStateManager.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMQueries.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf); for (int i = 0; i < 4; i++) { saved[unit][i] = buf.get(i); } } - GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.25f, 0.5f); - GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE1, 240.0f, 16.0f); - GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE2, 0.75f, 0.125f); - GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE3, 0.375f, 0.625f); + GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.25f, 0.5f); + GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE1, 240.0f, 16.0f); + GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE2, 0.75f, 0.125f); + GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE3, 0.375f, 0.625f); final float[][] expected = { { 0.25f, 0.5f }, { 240.0f, 16.0f }, { 0.75f, 0.125f }, { 0.375f, 0.625f } }; for (int unit = 0; unit < 4; unit++) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - GLStateManager.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMQueries.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf); assertEquals(expected[unit][0], buf.get(0), "s of unit " + unit); assertEquals(expected[unit][1], buf.get(1), "t of unit " + unit); assertEquals(0.0f, buf.get(2), "r of unit " + unit); @@ -523,9 +523,9 @@ public class GLSM_LegacyStackQueries_GLTest { } } finally { for (int unit = 0; unit < 4; unit++) { - GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE0 + unit, saved[unit][0], saved[unit][1]); + GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE0 + unit, saved[unit][0], saved[unit][1]); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } } @@ -534,26 +534,26 @@ public class GLSM_LegacyStackQueries_GLTest { final FloatBuffer buf = BufferUtils.createFloatBuffer(16); final int unit = GLStateManager.ctx().ffp.currentTexCoords.length + 1; try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.25f, 0.5f); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.25f, 0.5f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); for (int i = 0; i < 4; i++) { buf.put(i, -7.0f); } - GLStateManager.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf); + GLSMQueries.glGetFloat(GL11.GL_CURRENT_TEXTURE_COORDS, buf); assertEquals(0.0f, buf.get(0)); assertEquals(0.0f, buf.get(1)); assertEquals(0.0f, buf.get(2)); assertEquals(1.0f, buf.get(3)); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.0f, 0.0f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.0f, 0.0f); } } @Test void legacyQueriesNeverReachTheDriver() { - final int base = GLStateManager.getAttribDepth(); + final int base = GLSMAttribStack.getAttribDepth(); final IntBuffer ints = BufferUtils.createIntBuffer(16); final FloatBuffer floats = BufferUtils.createFloatBuffer(16); final DoubleBuffer doubles = BufferUtils.createDoubleBuffer(16); @@ -562,29 +562,29 @@ public class GLSM_LegacyStackQueries_GLTest { final float[] floatArray = new float[16]; final double[] doubleArray = new double[16]; try { - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_PIXEL_STORE_BIT); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); assumeDriverRejectsLegacyPnames(); for (final int pname : LEGACY_PNAMES) { drainErrors(); - final int scalar = GLStateManager.glGetInteger(pname); - GLStateManager.glGetFloat(pname); - GLStateManager.glGetBoolean(pname); - GLStateManager.glIsEnabled(pname); + final int scalar = GLSMQueries.glGetInteger(pname); + GLSMQueries.glGetFloat(pname); + GLSMQueries.glGetBoolean(pname); + GLSMEnable.glIsEnabled(pname); ints.clear(); ints.put(0, -12345); - GLStateManager.glGetInteger(pname, ints); + GLSMQueries.glGetInteger(pname, ints); floats.clear(); - GLStateManager.glGetFloat(pname, floats); + GLSMQueries.glGetFloat(pname, floats); doubles.clear(); - GLStateManager.glGetDouble(pname, doubles); + GLSMQueries.glGetDouble(pname, doubles); bytes.clear(); - GLStateManager.glGetBoolean(pname, bytes); + GLSMQueries.glGetBoolean(pname, bytes); intArray[0] = -12345; - GLStateManager.glGetInteger(pname, intArray); - GLStateManager.glGetFloat(pname, floatArray); - GLStateManager.glGetDouble(pname, doubleArray); + GLSMQueries.glGetInteger(pname, intArray); + GLSMQueries.glGetFloat(pname, floatArray); + GLSMQueries.glGetDouble(pname, doubleArray); if (LegacyQueries.count(LegacyQueries.desc(pname)) == 1) { assertEquals(scalar, ints.get(0), "IntBuffer overload for " + hex(pname)); assertEquals(scalar, intArray[0], "int[] overload for " + hex(pname)); @@ -592,7 +592,7 @@ public class GLSM_LegacyStackQueries_GLTest { assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "driver error after querying " + hex(pname)); } } finally { - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); drainClientAttribStack(); popAttribTo(base); } @@ -605,33 +605,33 @@ public class GLSM_LegacyStackQueries_GLTest { final DoubleBuffer doubles = BufferUtils.createDoubleBuffer(16); final FloatBuffer savedColor = BufferUtils.createFloatBuffer(16); final FloatBuffer savedNormal = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor); - GLStateManager.glGetFloat(GL11.GL_CURRENT_NORMAL, savedNormal); - final int savedFunc = GLStateManager.glGetInteger(GL11.GL_ALPHA_TEST_FUNC); - final float savedRef = GLStateManager.glGetFloat(GL11.GL_ALPHA_TEST_REF); - final float savedStart = GLStateManager.glGetFloat(GL11.GL_FOG_START); - final float savedEnd = GLStateManager.glGetFloat(GL11.GL_FOG_END); - final float savedDensity = GLStateManager.glGetFloat(GL11.GL_FOG_DENSITY); - final boolean savedLighting = GLStateManager.glIsEnabled(GL11.GL_LIGHTING); - final boolean savedFog = GLStateManager.glIsEnabled(GL11.GL_FOG); - final int savedShade = GLStateManager.glGetInteger(GL11.GL_SHADE_MODEL); - final int savedHint = GLStateManager.glGetInteger(GL11.GL_FOG_HINT); - final float savedMinSize = GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); + GLSMQueries.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor); + GLSMQueries.glGetFloat(GL11.GL_CURRENT_NORMAL, savedNormal); + final int savedFunc = GLSMQueries.glGetInteger(GL11.GL_ALPHA_TEST_FUNC); + final float savedRef = GLSMQueries.glGetFloat(GL11.GL_ALPHA_TEST_REF); + final float savedStart = GLSMQueries.glGetFloat(GL11.GL_FOG_START); + final float savedEnd = GLSMQueries.glGetFloat(GL11.GL_FOG_END); + final float savedDensity = GLSMQueries.glGetFloat(GL11.GL_FOG_DENSITY); + final boolean savedLighting = GLSMEnable.glIsEnabled(GL11.GL_LIGHTING); + final boolean savedFog = GLSMEnable.glIsEnabled(GL11.GL_FOG); + final int savedShade = GLSMQueries.glGetInteger(GL11.GL_SHADE_MODEL); + final int savedHint = GLSMQueries.glGetInteger(GL11.GL_FOG_HINT); + final float savedMinSize = GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); try { - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); - GLStateManager.glFogf(GL11.GL_FOG_START, -1.5f); - GLStateManager.glFogf(GL11.GL_FOG_END, 2.5f); - GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.25f); - GLStateManager.glColor4f(0.25f, 0.5f, 0.75f, 1f); - GLStateManager.glNormal3f(0f, -0.5f, 1f); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glEnable(GL11.GL_FOG); - GLStateManager.glShadeModel(GL11.GL_FLAT); - GLStateManager.glHint(GL11.GL_FOG_HINT, GL11.GL_NICEST); - GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 2.5f); - GLStateManager.glTranslatef(1.5f, -2.5f, 3f); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMFog.glFogf(GL11.GL_FOG_START, -1.5f); + GLSMFog.glFogf(GL11.GL_FOG_END, 2.5f); + GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.25f); + GLSMCurrentAttribs.glColor4f(0.25f, 0.5f, 0.75f, 1f); + GLSMCurrentAttribs.glNormal3f(0f, -0.5f, 1f); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_FOG); + GLSMRasterizer.glShadeModel(GL11.GL_FLAT); + GLSMRasterizer.glHint(GL11.GL_FOG_HINT, GL11.GL_NICEST); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 2.5f); + GLSMMatrices.glTranslatef(1.5f, -2.5f, 3f); for (final int pname : LEGACY_PNAMES) { final int desc = LegacyQueries.desc(pname); final int type = LegacyQueries.type(desc); @@ -639,47 +639,47 @@ public class GLSM_LegacyStackQueries_GLTest { final String name = hex(pname); if (count == 1) { if (type == LegacyQueries.BOOL) { - final boolean b = GLStateManager.glGetBoolean(pname); - assertEquals(b ? 1 : 0, GLStateManager.glGetInteger(pname), "int of bool " + name); - assertEquals(b ? 1.0f : 0.0f, GLStateManager.glGetFloat(pname), "float of bool " + name); + final boolean b = GLSMQueries.glGetBoolean(pname); + assertEquals(b ? 1 : 0, GLSMQueries.glGetInteger(pname), "int of bool " + name); + assertEquals(b ? 1.0f : 0.0f, GLSMQueries.glGetFloat(pname), "float of bool " + name); } else if (type == LegacyQueries.INT) { - final int i = GLStateManager.glGetInteger(pname); - assertEquals((float) i, GLStateManager.glGetFloat(pname), "float of int " + name); - assertEquals(i != 0, GLStateManager.glGetBoolean(pname), "bool of int " + name); + final int i = GLSMQueries.glGetInteger(pname); + assertEquals((float) i, GLSMQueries.glGetFloat(pname), "float of int " + name); + assertEquals(i != 0, GLSMQueries.glGetBoolean(pname), "bool of int " + name); } else { - final float f = GLStateManager.glGetFloat(pname); - assertEquals(LegacyQueries.toInt(type, f), GLStateManager.glGetInteger(pname), "int of float " + name); - assertEquals(f != 0.0f, GLStateManager.glGetBoolean(pname), "bool of float " + name); + final float f = GLSMQueries.glGetFloat(pname); + assertEquals(LegacyQueries.toInt(type, f), GLSMQueries.glGetInteger(pname), "int of float " + name); + assertEquals(f != 0.0f, GLSMQueries.glGetBoolean(pname), "bool of float " + name); } } else { floats.clear(); - GLStateManager.glGetFloat(pname, floats); + GLSMQueries.glGetFloat(pname, floats); ints.clear(); - GLStateManager.glGetInteger(pname, ints); + GLSMQueries.glGetInteger(pname, ints); doubles.clear(); - GLStateManager.glGetDouble(pname, doubles); + GLSMQueries.glGetDouble(pname, doubles); for (int i = 0; i < count; i++) { final float f = floats.get(i); assertEquals(LegacyQueries.toInt(type, f), ints.get(i), "int element " + i + " of " + name); assertEquals((double) f, doubles.get(i), "double element " + i + " of " + name); } - assertEquals(floats.get(0), GLStateManager.glGetFloat(pname), "scalar float of " + name); + assertEquals(floats.get(0), GLSMQueries.glGetFloat(pname), "scalar float of " + name); } } } finally { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPopMatrix(); - GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, savedMinSize); - GLStateManager.glHint(GL11.GL_FOG_HINT, savedHint); - GLStateManager.glShadeModel(savedShade); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, savedMinSize); + GLSMRasterizer.glHint(GL11.GL_FOG_HINT, savedHint); + GLSMRasterizer.glShadeModel(savedShade); setEnabled(GL11.GL_FOG, savedFog); setEnabled(GL11.GL_LIGHTING, savedLighting); - GLStateManager.glNormal3f(savedNormal.get(0), savedNormal.get(1), savedNormal.get(2)); - GLStateManager.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3)); - GLStateManager.glFogf(GL11.GL_FOG_DENSITY, savedDensity); - GLStateManager.glFogf(GL11.GL_FOG_END, savedEnd); - GLStateManager.glFogf(GL11.GL_FOG_START, savedStart); - GLStateManager.glAlphaFunc(savedFunc, savedRef); + GLSMCurrentAttribs.glNormal3f(savedNormal.get(0), savedNormal.get(1), savedNormal.get(2)); + GLSMCurrentAttribs.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3)); + GLSMFog.glFogf(GL11.GL_FOG_DENSITY, savedDensity); + GLSMFog.glFogf(GL11.GL_FOG_END, savedEnd); + GLSMFog.glFogf(GL11.GL_FOG_START, savedStart); + GLSMDepthStencilAlpha.glAlphaFunc(savedFunc, savedRef); } } @@ -695,34 +695,34 @@ public class GLSM_LegacyStackQueries_GLTest { @Test void edgeFlagIsCompiledIntoDisplayLists() { - final int list = GLStateManager.glGenLists(1); + final int list = GLSMDraws.glGenLists(1); try { - GLStateManager.glEdgeFlag(true); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glEdgeFlag(false); - GLStateManager.glEndList(); - assertTrue(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG), "compiling must not change the live edge flag"); - GLStateManager.glCallList(list); - assertFalse(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG)); + GLSMCurrentAttribs.glEdgeFlag(true); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMCurrentAttribs.glEdgeFlag(false); + GLSMDraws.glEndList(); + assertTrue(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG), "compiling must not change the live edge flag"); + GLSMDraws.glCallList(list); + assertFalse(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG)); } finally { - GLStateManager.glEdgeFlag(true); - GLStateManager.glDeleteLists(list, 1); + GLSMCurrentAttribs.glEdgeFlag(true); + GLSMDraws.glDeleteLists(list, 1); } } @Test void textureBitRestoresPerUnitTextureEnables() { - final int base = GLStateManager.getAttribDepth(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - final boolean cube = GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP); - final boolean texture2d = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_2D); + final int base = GLSMAttribStack.getAttribDepth(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + final boolean cube = GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP); + final boolean texture2d = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_2D); try { - GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT); setEnabled(GL13.GL_TEXTURE_CUBE_MAP, !cube); setEnabled(GL11.GL_TEXTURE_2D, !texture2d); - GLStateManager.glPopAttrib(); - assertEquals(cube, GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP)); - assertEquals(texture2d, GLStateManager.glIsEnabled(GL11.GL_TEXTURE_2D)); + GLSMAttribStack.glPopAttrib(); + assertEquals(cube, GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP)); + assertEquals(texture2d, GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_2D)); } finally { popAttribTo(base); setEnabled(GL13.GL_TEXTURE_CUBE_MAP, cube); @@ -733,49 +733,49 @@ public class GLSM_LegacyStackQueries_GLTest { @Test void crossTypeQueriesConvert() { final FloatBuffer savedColor = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor); - final int savedFunc = GLStateManager.glGetInteger(GL11.GL_ALPHA_TEST_FUNC); - final float savedRef = GLStateManager.glGetFloat(GL11.GL_ALPHA_TEST_REF); - final float savedStart = GLStateManager.glGetFloat(GL11.GL_FOG_START); - final boolean savedLighting = GLStateManager.glIsEnabled(GL11.GL_LIGHTING); + GLSMQueries.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor); + final int savedFunc = GLSMQueries.glGetInteger(GL11.GL_ALPHA_TEST_FUNC); + final float savedRef = GLSMQueries.glGetFloat(GL11.GL_ALPHA_TEST_REF); + final float savedStart = GLSMQueries.glGetFloat(GL11.GL_FOG_START); + final boolean savedLighting = GLSMEnable.glIsEnabled(GL11.GL_LIGHTING); final IntBuffer ints = BufferUtils.createIntBuffer(16); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); try { - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); - assertEquals(1073741823, GLStateManager.glGetInteger(GL11.GL_ALPHA_TEST_REF)); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); + assertEquals(1073741823, GLSMQueries.glGetInteger(GL11.GL_ALPHA_TEST_REF)); - assertEquals((float) GLStateManager.glGetInteger(GL11.GL_FOG_MODE), GLStateManager.glGetFloat(GL11.GL_FOG_MODE)); + assertEquals((float) GLSMQueries.glGetInteger(GL11.GL_FOG_MODE), GLSMQueries.glGetFloat(GL11.GL_FOG_MODE)); - GLStateManager.glFogf(GL11.GL_FOG_START, -1.5f); - assertEquals(-2, GLStateManager.glGetInteger(GL11.GL_FOG_START)); + GLSMFog.glFogf(GL11.GL_FOG_START, -1.5f); + assertEquals(-2, GLSMQueries.glGetInteger(GL11.GL_FOG_START)); - GLStateManager.glEnable(GL11.GL_LIGHTING); - assertEquals(1, GLStateManager.glGetInteger(GL11.GL_LIGHTING)); - GLStateManager.glDisable(GL11.GL_LIGHTING); - assertEquals(0, GLStateManager.glGetInteger(GL11.GL_LIGHTING)); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_LIGHTING)); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + assertEquals(0, GLSMQueries.glGetInteger(GL11.GL_LIGHTING)); - GLStateManager.glColor4f(1f, 0.5f, 0f, 1f); + GLSMCurrentAttribs.glColor4f(1f, 0.5f, 0f, 1f); ints.clear(); - GLStateManager.glGetInteger(GL11.GL_CURRENT_COLOR, ints); + GLSMQueries.glGetInteger(GL11.GL_CURRENT_COLOR, ints); assertEquals(2147483647, ints.get(0)); assertEquals(1073741823, ints.get(1)); assertEquals(0, ints.get(2)); assertEquals(2147483647, ints.get(3)); - GLStateManager.glLoadIdentity(); - GLStateManager.glGetInteger(GL11.GL_MODELVIEW_MATRIX, ints); + GLSMMatrices.glLoadIdentity(); + GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_MATRIX, ints); assertEquals(2147483647, ints.get(0), "matrix elements scale like normalized floats"); assertEquals(0, ints.get(1)); assertEquals(2147483647, ints.get(15)); - assertEquals(2147483647, GLStateManager.glGetInteger(GL11.GL_MODELVIEW_MATRIX)); - assertEquals(1.0f, GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX)); + assertEquals(2147483647, GLSMQueries.glGetInteger(GL11.GL_MODELVIEW_MATRIX)); + assertEquals(1.0f, GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX)); } finally { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPopMatrix(); - GLStateManager.glFogf(GL11.GL_FOG_START, savedStart); - GLStateManager.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3)); - GLStateManager.glAlphaFunc(savedFunc, savedRef); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); + GLSMFog.glFogf(GL11.GL_FOG_START, savedStart); + GLSMCurrentAttribs.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3)); + GLSMDepthStencilAlpha.glAlphaFunc(savedFunc, savedRef); setEnabled(GL11.GL_LIGHTING, savedLighting); } } @@ -798,8 +798,8 @@ public class GLSM_LegacyStackQueries_GLTest { final DoubleBuffer doubles = BufferUtils.createDoubleBuffer(32); final FloatBuffer reference = BufferUtils.createFloatBuffer(32); final FloatBuffer savedColor = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor); - final float savedStart = GLStateManager.glGetFloat(GL11.GL_FOG_START); + GLSMQueries.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor); + final float savedStart = GLSMQueries.glGetFloat(GL11.GL_FOG_START); try { for (int i = 0; i < 32; i++) { ints.put(i, -777); @@ -808,14 +808,14 @@ public class GLSM_LegacyStackQueries_GLTest { } ints.position(4); - GLStateManager.glGetInteger(GL11.GL_MATRIX_MODE, ints); - assertEquals(GLStateManager.glGetInteger(GL11.GL_MATRIX_MODE), ints.get(4)); + GLSMQueries.glGetInteger(GL11.GL_MATRIX_MODE, ints); + assertEquals(GLSMQueries.glGetInteger(GL11.GL_MATRIX_MODE), ints.get(4)); assertEquals(-777, ints.get(0)); floats.position(4); - GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, floats); + GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, floats); reference.clear(); - GLStateManager.glGetFloat(GL11.GL_MODELVIEW_MATRIX, reference); + GLSMQueries.glGetFloat(GL11.GL_MODELVIEW_MATRIX, reference); for (int i = 0; i < 16; i++) { assertEquals(reference.get(i), floats.get(4 + i), "modelview element " + i); } @@ -824,18 +824,18 @@ public class GLSM_LegacyStackQueries_GLTest { for (int i = 0; i < 32; i++) { ints.put(i, -777); } - GLStateManager.glColor4f(0.25f, 0.5f, 0.75f, 1f); + GLSMCurrentAttribs.glColor4f(0.25f, 0.5f, 0.75f, 1f); ints.position(4); - GLStateManager.glGetInteger(GL11.GL_CURRENT_COLOR, ints); + GLSMQueries.glGetInteger(GL11.GL_CURRENT_COLOR, ints); assertEquals(536870911, ints.get(4)); assertEquals(1073741823, ints.get(5)); assertEquals(1610612735, ints.get(6)); assertEquals(2147483647, ints.get(7)); assertEquals(-777, ints.get(0)); - GLStateManager.glFogf(GL11.GL_FOG_START, 3.5f); + GLSMFog.glFogf(GL11.GL_FOG_START, 3.5f); doubles.position(4); - GLStateManager.glGetDouble(GL11.GL_FOG_START, doubles); + GLSMQueries.glGetDouble(GL11.GL_FOG_START, doubles); assertEquals(3.5, doubles.get(4)); assertEquals(-777.0, doubles.get(0)); @@ -843,16 +843,16 @@ public class GLSM_LegacyStackQueries_GLTest { floats.put(i, -777f); } floats.position(4); - GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, floats); + GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, floats); reference.clear(); - GLStateManager.glGetMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, reference); + GLSMLighting.glGetMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, reference); for (int i = 0; i < 4; i++) { assertEquals(reference.get(i), floats.get(4 + i), "diffuse element " + i); } assertEquals(-777f, floats.get(0)); } finally { - GLStateManager.glFogf(GL11.GL_FOG_START, savedStart); - GLStateManager.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3)); + GLSMFog.glFogf(GL11.GL_FOG_START, savedStart); + GLSMCurrentAttribs.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3)); } } @@ -863,53 +863,53 @@ public class GLSM_LegacyStackQueries_GLTest { @Test void hintsRoundTripAndFollowHintBit() { - final int base = GLStateManager.getAttribDepth(); + final int base = GLSMAttribStack.getAttribDepth(); final int[] saved = new int[HINT_TARGETS.length]; for (int i = 0; i < HINT_TARGETS.length; i++) { - saved[i] = GLStateManager.glGetInteger(HINT_TARGETS[i]); + saved[i] = GLSMQueries.glGetInteger(HINT_TARGETS[i]); } try { for (final int target : HINT_TARGETS) { final String name = hex(target); - assertEquals(GL11.GL_DONT_CARE, GLStateManager.glGetInteger(target), "default " + name); - GLStateManager.glHint(target, GL11.GL_NICEST); - assertEquals(GL11.GL_NICEST, GLStateManager.glGetInteger(target), "nicest " + name); + assertEquals(GL11.GL_DONT_CARE, GLSMQueries.glGetInteger(target), "default " + name); + GLSMRasterizer.glHint(target, GL11.GL_NICEST); + assertEquals(GL11.GL_NICEST, GLSMQueries.glGetInteger(target), "nicest " + name); if (isDriverHint(target)) assertEquals(GL11.GL_NICEST, GL11.glGetInteger(target), "driver nicest " + name); - GLStateManager.glHint(target, 12345); - assertEquals(GL11.GL_NICEST, GLStateManager.glGetInteger(target), "invalid mode " + name); + GLSMRasterizer.glHint(target, 12345); + assertEquals(GL11.GL_NICEST, GLSMQueries.glGetInteger(target), "invalid mode " + name); if (isDriverHint(target)) assertEquals(GL11.GL_NICEST, GL11.glGetInteger(target), "driver invalid mode " + name); } - GLStateManager.glPushAttrib(GL11.GL_HINT_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_HINT_BIT); for (final int target : HINT_TARGETS) { - GLStateManager.glHint(target, GL11.GL_FASTEST); - assertEquals(GL11.GL_FASTEST, GLStateManager.glGetInteger(target), "fastest " + hex(target)); + GLSMRasterizer.glHint(target, GL11.GL_FASTEST); + assertEquals(GL11.GL_FASTEST, GLSMQueries.glGetInteger(target), "fastest " + hex(target)); if (isDriverHint(target)) assertEquals(GL11.GL_FASTEST, GL11.glGetInteger(target), "driver fastest " + hex(target)); } - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); for (final int target : HINT_TARGETS) { - assertEquals(GL11.GL_NICEST, GLStateManager.glGetInteger(target), "restored " + hex(target)); + assertEquals(GL11.GL_NICEST, GLSMQueries.glGetInteger(target), "restored " + hex(target)); if (isDriverHint(target)) assertEquals(GL11.GL_NICEST, GL11.glGetInteger(target), "driver restored " + hex(target)); } - assertEquals(GL11.GL_RENDER, GLStateManager.glGetInteger(GL11.GL_RENDER_MODE)); + assertEquals(GL11.GL_RENDER, GLSMQueries.glGetInteger(GL11.GL_RENDER_MODE)); } finally { popAttribTo(base); for (int i = 0; i < HINT_TARGETS.length; i++) { - GLStateManager.glHint(HINT_TARGETS[i], saved[i]); + GLSMRasterizer.glHint(HINT_TARGETS[i], saved[i]); } } } @Test void pointParametersRoundTripAndFollowPointBit() { - final int base = GLStateManager.getAttribDepth(); + final int base = GLSMAttribStack.getAttribDepth(); final FloatBuffer attenuation = BufferUtils.createFloatBuffer(16); final FloatBuffer savedAttenuation = BufferUtils.createFloatBuffer(16); - final float savedMin = GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN); - final float savedMax = GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX); - final float savedFade = GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE); - final int savedOrigin = GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN); - GLStateManager.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, savedAttenuation); - GLStateManager.glPushAttrib(GL11.GL_POINT_BIT); + final float savedMin = GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN); + final float savedMax = GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX); + final float savedFade = GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE); + final int savedOrigin = GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN); + GLSMQueries.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, savedAttenuation); + GLSMAttribStack.glPushAttrib(GL11.GL_POINT_BIT); try { assertEquals(0f, savedMin); assertEquals(driverMaxPointSize(), savedMax); @@ -919,120 +919,120 @@ public class GLSM_LegacyStackQueries_GLTest { assertEquals(0f, savedAttenuation.get(2)); assertEquals(GL20.GL_UPPER_LEFT, savedOrigin); - GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 0.5f); - GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 2.5f); - GLStateManager.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 4.5f); - assertEquals(0.5f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN)); - assertEquals(2.5f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX)); - assertEquals(4.5f, GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE)); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 0.5f); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 2.5f); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 4.5f); + assertEquals(0.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN)); + assertEquals(2.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX)); + assertEquals(4.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE)); assertEquals(4.5f, GL11.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE)); - GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, -1f); - assertEquals(0.5f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN)); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, -1f); + assertEquals(0.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN)); attenuation.put(0, 0.5f).put(1, 0.25f).put(2, 0.125f); attenuation.position(0).limit(3); - GLStateManager.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); + GLSMRasterizer.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); attenuation.clear(); for (int i = 0; i < 16; i++) { attenuation.put(i, -777f); } - GLStateManager.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); + GLSMQueries.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); assertEquals(0.5f, attenuation.get(0)); assertEquals(0.25f, attenuation.get(1)); assertEquals(0.125f, attenuation.get(2)); - GLStateManager.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_LOWER_LEFT); - assertEquals(GL20.GL_LOWER_LEFT, GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); + GLSMRasterizer.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_LOWER_LEFT); + assertEquals(GL20.GL_LOWER_LEFT, GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); assertEquals(GL20.GL_LOWER_LEFT, GL11.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); - GLStateManager.glPushAttrib(GL11.GL_POINT_BIT); - GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 1f); - GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 3f); - GLStateManager.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 2f); + GLSMAttribStack.glPushAttrib(GL11.GL_POINT_BIT); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 1f); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 3f); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 2f); attenuation.put(0, 1f).put(1, 1f).put(2, 1f); attenuation.position(0).limit(3); - GLStateManager.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); - GLStateManager.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_UPPER_LEFT); - assertEquals(1f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN)); - assertEquals(GL20.GL_UPPER_LEFT, GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); + GLSMRasterizer.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); + GLSMRasterizer.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_UPPER_LEFT); + assertEquals(1f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN)); + assertEquals(GL20.GL_UPPER_LEFT, GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); assertEquals(GL20.GL_UPPER_LEFT, GL11.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); - GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, Float.NaN); - assertTrue(Float.isNaN(GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN))); - GLStateManager.glPopAttrib(); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, Float.NaN); + assertTrue(Float.isNaN(GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN))); + GLSMAttribStack.glPopAttrib(); - assertEquals(0.5f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN)); - assertEquals(2.5f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX)); - assertEquals(4.5f, GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE)); + assertEquals(0.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN)); + assertEquals(2.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX)); + assertEquals(4.5f, GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE)); assertEquals(4.5f, GL11.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE)); - assertEquals(GL20.GL_LOWER_LEFT, GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); + assertEquals(GL20.GL_LOWER_LEFT, GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); assertEquals(GL20.GL_LOWER_LEFT, GL11.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); attenuation.clear(); - GLStateManager.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); + GLSMQueries.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); assertEquals(0.5f, attenuation.get(0)); assertEquals(0.25f, attenuation.get(1)); assertEquals(0.125f, attenuation.get(2)); } finally { popAttribTo(base); - assertEquals(savedMax, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX)); + assertEquals(savedMax, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX)); } } @Test void cacheOnlyEnablesRoundTrip() { - final int base = GLStateManager.getAttribDepth(); - final boolean savedSprite = GLStateManager.glIsEnabled(GL20.GL_POINT_SPRITE); - final boolean savedTwoSide = GLStateManager.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE); - final boolean savedEdge = GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - final boolean savedCube0 = GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - final boolean savedCube1 = GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + final int base = GLSMAttribStack.getAttribDepth(); + final boolean savedSprite = GLSMEnable.glIsEnabled(GL20.GL_POINT_SPRITE); + final boolean savedTwoSide = GLSMEnable.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE); + final boolean savedEdge = GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + final boolean savedCube0 = GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + final boolean savedCube1 = GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); try { assertEnableRoundTrip(GL20.GL_POINT_SPRITE, false); assertEnableRoundTrip(GL20.GL_VERTEX_PROGRAM_TWO_SIDE, false); assertEnableRoundTrip(GL13.GL_TEXTURE_CUBE_MAP, false); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.glEnable(GL20.GL_POINT_SPRITE); - GLStateManager.glEnable(GL20.GL_VERTEX_PROGRAM_TWO_SIDE); - GLStateManager.glEnable(GL13.GL_TEXTURE_CUBE_MAP); - assertTrue(GLStateManager.glIsEnabled(GL20.GL_POINT_SPRITE)); - assertTrue(GLStateManager.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE)); - assertTrue(GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP)); - GLStateManager.glPopAttrib(); - assertFalse(GLStateManager.glIsEnabled(GL20.GL_POINT_SPRITE)); - assertFalse(GLStateManager.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE)); - assertFalse(GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP)); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMEnable.glEnable(GL20.GL_POINT_SPRITE); + GLSMEnable.glEnable(GL20.GL_VERTEX_PROGRAM_TWO_SIDE); + GLSMEnable.glEnable(GL13.GL_TEXTURE_CUBE_MAP); + assertTrue(GLSMEnable.glIsEnabled(GL20.GL_POINT_SPRITE)); + assertTrue(GLSMEnable.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE)); + assertTrue(GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP)); + GLSMAttribStack.glPopAttrib(); + assertFalse(GLSMEnable.glIsEnabled(GL20.GL_POINT_SPRITE)); + assertFalse(GLSMEnable.glIsEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE)); + assertFalse(GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glDisable(GL13.GL_TEXTURE_CUBE_MAP); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glEnable(GL13.GL_TEXTURE_CUBE_MAP); - assertTrue(GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - assertFalse(GLStateManager.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP)); - assertFalse(GLStateManager.glGetBoolean(GL13.GL_TEXTURE_CUBE_MAP)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - assertTrue(GLStateManager.glGetBoolean(GL13.GL_TEXTURE_CUBE_MAP)); - GLStateManager.glDisable(GL13.GL_TEXTURE_CUBE_MAP); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMEnable.glDisable(GL13.GL_TEXTURE_CUBE_MAP); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMEnable.glEnable(GL13.GL_TEXTURE_CUBE_MAP); + assertTrue(GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + assertFalse(GLSMEnable.glIsEnabled(GL13.GL_TEXTURE_CUBE_MAP)); + assertFalse(GLSMQueries.glGetBoolean(GL13.GL_TEXTURE_CUBE_MAP)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + assertTrue(GLSMQueries.glGetBoolean(GL13.GL_TEXTURE_CUBE_MAP)); + GLSMEnable.glDisable(GL13.GL_TEXTURE_CUBE_MAP); assertTrue(savedEdge); - GLStateManager.glEdgeFlag(false); - assertFalse(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG)); - GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT); - GLStateManager.glEdgeFlag(true); - assertTrue(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG)); - GLStateManager.glPopAttrib(); - assertFalse(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG)); + GLSMCurrentAttribs.glEdgeFlag(false); + assertFalse(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG)); + GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT); + GLSMCurrentAttribs.glEdgeFlag(true); + assertTrue(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG)); + GLSMAttribStack.glPopAttrib(); + assertFalse(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG)); } finally { popAttribTo(base); - GLStateManager.glEdgeFlag(savedEdge); + GLSMCurrentAttribs.glEdgeFlag(savedEdge); setEnabled(GL20.GL_POINT_SPRITE, savedSprite); setEnabled(GL20.GL_VERTEX_PROGRAM_TWO_SIDE, savedTwoSide); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); setEnabled(GL13.GL_TEXTURE_CUBE_MAP, savedCube1); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); setEnabled(GL13.GL_TEXTURE_CUBE_MAP, savedCube0); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java index 1b5b713c0..0531a703f 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_Lighting_UnitTest.java @@ -15,20 +15,20 @@ public class GLSM_Lighting_UnitTest { @Test void testLightEnablement() { verifyState(GL11.GL_LIGHT0, false, "GL_LIGHT0 Initial State"); - GLStateManager.glEnable(GL11.GL_LIGHT0); + GLSMEnable.glEnable(GL11.GL_LIGHT0); verifyState(GL11.GL_LIGHT0, true, "GL_LIGHT0 Enabled"); verifyState(GL11.GL_LIGHT1, false, "GL_LIGHT1 Initial State"); - GLStateManager.glEnable(GL11.GL_LIGHT1); + GLSMEnable.glEnable(GL11.GL_LIGHT1); verifyState(GL11.GL_LIGHT1, true, "GL_LIGHT1 Enabled State"); - GLStateManager.glDisable(GL11.GL_LIGHT0); - GLStateManager.glDisable(GL11.GL_LIGHT1); + GLSMEnable.glDisable(GL11.GL_LIGHT0); + GLSMEnable.glDisable(GL11.GL_LIGHT1); } @Test void testLightValues() { - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); verifyLightState(GL11.GL_LIGHT0, GL11.GL_AMBIENT, new float[]{0F, 0F, 0F, 1F}, "GL_LIGHT0 Initial Ambient"); verifyLightState(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, new float[]{1F, 1F, 1F, 1F}, "GL_LIGHT0 Initial Diffuse"); @@ -40,176 +40,176 @@ public class GLSM_Lighting_UnitTest { verifyLightState(GL11.GL_LIGHT1, GL11.GL_SPECULAR, new float[]{0F, 0F, 0F, 1F}, "GL_LIGHT1 Initial Specular"); verifyLightState(GL11.GL_LIGHT1, GL11.GL_POSITION, new float[]{0F, 0F, 1F, 0F}, "GL_LIGHT1 Initial Position"); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.25F, 0.5F, 0.25F, 0.5F)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.25F, 0.5F, 0.25F, 0.5F)); verifyLightState(GL11.GL_LIGHT0, GL11.GL_AMBIENT, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 Ambient Changed State"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.3F, 0.4F, 0.5F, 0.6F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.3F, 0.4F, 0.5F, 0.6F)); verifyLightState(GL11.GL_LIGHT0, GL11.GL_AMBIENT, new float[]{0.3F, 0.4F, 0.5F, 0.6F}, "GL_LIGHT0 attrib push state changed check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyLightState(GL11.GL_LIGHT0, GL11.GL_AMBIENT, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 attrib pop state check"); // The position is stored in eye coordinates, so we're moving around the modelview matrix before changing them // That way we can test that the client side transformation of them via GLSM is working and matches the OpenGL // transformation. This doesn't seem like float precision should break this test, but it may be possible for it // to need tweaked a bit more. - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(25.0F, 25.0F, 25.0F); - GLStateManager.glRotatef(35.0F, 10.0F, 15.0F, 20.0F); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.25F, 0.5F, 0.25F, 0.0F)); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(25.0F, 25.0F, 25.0F); + GLSMMatrices.glRotatef(35.0F, 10.0F, 15.0F, 20.0F); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.25F, 0.5F, 0.25F, 0.0F)); verifyLightState(GL11.GL_LIGHT0, GL11.GL_POSITION, new float[]{0.1090F, 0.5189F, 0.3062F, 0.0F}, "GL_LIGHT0 Position Changed State"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.3F, 0.4F, 0.5F, 0.0F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(0.3F, 0.4F, 0.5F, 0.0F)); verifyLightState(GL11.GL_LIGHT0, GL11.GL_POSITION, new float[]{0.2824F, 0.4200F, 0.4937F, 0.0F}, "GL_LIGHT0 attrib push state changed check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyLightState(GL11.GL_LIGHT0, GL11.GL_POSITION, new float[]{0.1090F, 0.5189F, 0.3062F, 0.0F}, "GL_LIGHT0 attrib pop state check"); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.25F, 0.5F)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.25F, 0.5F, 0.25F, 0.5F)); verifyLightState(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 Diffuse Changed State"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.3F, 0.4F, 0.5F, 0.6F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.3F, 0.4F, 0.5F, 0.6F)); verifyLightState(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, new float[]{0.3F, 0.4F, 0.5F, 0.6F}, "GL_LIGHT0 attrib push state changed check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyLightState(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 attrib pop state check"); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.25F, 0.5F, 0.25F, 0.5F)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.25F, 0.5F, 0.25F, 0.5F)); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPECULAR, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 Specular Changed State"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.3F, 0.4F, 0.5F, 0.6F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.3F, 0.4F, 0.5F, 0.6F)); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPECULAR, new float[]{0.3F, 0.4F, 0.5F, 0.6F}, "GL_LIGHT0 attrib push state changed check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPECULAR, new float[]{0.25F, 0.5F, 0.25F, 0.5F}, "GL_LIGHT0 attrib pop state check"); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(25.0F, 25.0F, 25.0F); - GLStateManager.glRotatef(35.0F, 10.0F, 15.0F, 20.0F); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.25F, 0.5F, 0.25F, 0.0F)); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(25.0F, 25.0F, 25.0F); + GLSMMatrices.glRotatef(35.0F, 10.0F, 15.0F, 20.0F); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.25F, 0.5F, 0.25F, 0.0F)); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, new float[]{0.1090F, 0.5189F, 0.3062F}, "GL_LIGHT0 Spot Direction Changed State"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.3F, 0.4F, 0.5F, 0.0F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floats(0.3F, 0.4F, 0.5F, 0.0F)); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, new float[]{0.2824F, 0.4200F, 0.4937F}, "GL_LIGHT0 attrib push state changed check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, new float[]{0.1090F, 0.5189F, 0.3062F}, "GL_LIGHT0 attrib pop state check"); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 1.0F); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 1.0F); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, new float[]{1.0F}, "GL_LIGHT0 Spot Exponent Changed State"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 2.0F); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 2.0F); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, new float[]{2.0F}, "GL_LIGHT0 attrib push state changed check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, new float[]{1.0F}, "GL_LIGHT0 attrib pop state check"); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 20.0F); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 20.0F); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, new float[]{20.0F}, "GL_LIGHT0 Spot Cutoff Changed State"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 40.0F); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 40.0F); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, new float[]{40.0F}, "GL_LIGHT0 attrib push state changed check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyLightState(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, new float[]{20.0F}, "GL_LIGHT0 attrib pop state check"); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 10.0F); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 10.0F); verifyLightState(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 Constant Attenuation Changed State"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 20.0F); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 20.0F); verifyLightState(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, new float[]{20.0F}, "GL_LIGHT0 attrib push state changed check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyLightState(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 attrib pop state check"); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, 10.0F); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, 10.0F); verifyLightState(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 Linear Attenuation Changed State"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, 20.0F); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, 20.0F); verifyLightState(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, new float[]{20.0F}, "GL_LIGHT0 attrib push state changed check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyLightState(GL11.GL_LIGHT0, GL11.GL_LINEAR_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 attrib pop state check"); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, 10.0F); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, 10.0F); verifyLightState(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 Quadratic Attenuation Changed State"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, 20.0F); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, 20.0F); verifyLightState(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, new float[]{20.0F}, "GL_LIGHT0 attrib push state changed check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyLightState(GL11.GL_LIGHT0, GL11.GL_QUADRATIC_ATTENUATION, new float[]{10.0F}, "GL_LIGHT0 attrib pop state check"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } @Test void testLightModel() { verifyState(GL11.GL_LIGHT_MODEL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, "GL_LIGHT_MODEL_AMBIENT initial state"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F)); verifyState(GL11.GL_LIGHT_MODEL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, "GL_LIGHT_MODEL_AMBIENT changed state"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_LIGHT_MODEL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}); verifyState(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SINGLE_COLOR); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR); verifyState(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SINGLE_COLOR); verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, false); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 0.8F); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 0.8F); verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, true); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, false); verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, false); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightModeli(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightModeli(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1); verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, true); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, false); verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, false); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightModelf(GL11.GL_LIGHT_MODEL_TWO_SIDE, 0.8F); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightModelf(GL11.GL_LIGHT_MODEL_TWO_SIDE, 0.8F); verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, true); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, false); verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, false); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glLightModeli(GL11.GL_LIGHT_MODEL_TWO_SIDE, 1); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glLightModeli(GL11.GL_LIGHT_MODEL_TWO_SIDE, 1); verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, true); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_LIGHT_MODEL_TWO_SIDE, false); } @Test void testColorMaterial() { verifyState(GL11.GL_COLOR_MATERIAL, false); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT | GL11.GL_CURRENT_BIT); - GLStateManager.glColor4f(0.8F, 0.6F, 0.4F, 0.2F); - GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT); - GLStateManager.glEnable(GL11.GL_COLOR_MATERIAL); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT | GL11.GL_CURRENT_BIT); + GLSMCurrentAttribs.glColor4f(0.8F, 0.6F, 0.4F, 0.2F); + GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT); + GLSMEnable.glEnable(GL11.GL_COLOR_MATERIAL); verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); - GLStateManager.glDisable(GL11.GL_COLOR_MATERIAL); + GLSMEnable.glDisable(GL11.GL_COLOR_MATERIAL); verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); verifyState(GL11.GL_COLOR_MATERIAL, false); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_COLOR_MATERIAL, false); verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, ""); verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT_AND_BACK); verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_AMBIENT_AND_DIFFUSE); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT_AND_DIFFUSE); verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT); verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_AMBIENT_AND_DIFFUSE); - GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR); + GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR); verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT); verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_SPECULAR); - GLStateManager.glColorMaterial(GL11.GL_BACK, GL11.GL_DIFFUSE); + GLSMLighting.glColorMaterial(GL11.GL_BACK, GL11.GL_DIFFUSE); verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_BACK); verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_DIFFUSE); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT_AND_BACK); verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_AMBIENT_AND_DIFFUSE); } @@ -217,65 +217,65 @@ public class GLSM_Lighting_UnitTest { @Test void testMaterial() { verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, ""); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F)); verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, ""); verifyMaterialState(GL11.GL_BACK, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, ""); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT, floats(0.8F, 0.6F, 0.4F, 0.2F)); verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); verifyMaterialState(GL11.GL_BACK, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, ""); verifyMaterialState(GL11.GL_BACK, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, ""); verifyMaterialState(GL11.GL_FRONT, GL11.GL_DIFFUSE, new float[]{0.8F, 0.8F, 0.8F, 1.0F}, ""); verifyMaterialState(GL11.GL_BACK, GL11.GL_DIFFUSE, new float[]{0.8F, 0.8F, 0.8F, 1.0F}, ""); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, floats(0.8F, 0.6F, 0.4F, 0.2F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE, floats(0.8F, 0.6F, 0.4F, 0.2F)); verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); verifyMaterialState(GL11.GL_BACK, GL11.GL_AMBIENT, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); verifyMaterialState(GL11.GL_FRONT, GL11.GL_DIFFUSE, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); verifyMaterialState(GL11.GL_BACK, GL11.GL_DIFFUSE, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyMaterialState(GL11.GL_FRONT, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, ""); verifyMaterialState(GL11.GL_BACK, GL11.GL_AMBIENT, new float[]{0.2F, 0.2F, 0.2F, 1.0F}, ""); verifyMaterialState(GL11.GL_FRONT, GL11.GL_DIFFUSE, new float[]{0.8F, 0.8F, 0.8F, 1.0F}, ""); verifyMaterialState(GL11.GL_BACK, GL11.GL_DIFFUSE, new float[]{0.8F, 0.8F, 0.8F, 1.0F}, ""); verifyMaterialState(GL11.GL_BACK, GL11.GL_SPECULAR, new float[]{0.0F, 0.0F, 0.0F, 1.0F}, ""); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glMaterial(GL11.GL_BACK, GL11.GL_SPECULAR, floats(0.8F, 0.6F, 0.4F, 0.2F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glMaterial(GL11.GL_BACK, GL11.GL_SPECULAR, floats(0.8F, 0.6F, 0.4F, 0.2F)); verifyMaterialState(GL11.GL_BACK, GL11.GL_SPECULAR, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyMaterialState(GL11.GL_BACK, GL11.GL_SPECULAR, new float[]{0.0F, 0.0F, 0.0F, 1.0F}, ""); verifyMaterialState(GL11.GL_BACK, GL11.GL_EMISSION, new float[]{0.0F, 0.0F, 0.0F, 1.0F}, ""); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glMaterial(GL11.GL_BACK, GL11.GL_EMISSION, floats(0.8F, 0.6F, 0.4F, 0.2F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glMaterial(GL11.GL_BACK, GL11.GL_EMISSION, floats(0.8F, 0.6F, 0.4F, 0.2F)); verifyMaterialState(GL11.GL_BACK, GL11.GL_EMISSION, new float[]{0.8F, 0.6F, 0.4F, 0.2F}, ""); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyMaterialState(GL11.GL_BACK, GL11.GL_EMISSION, new float[]{0.0F, 0.0F, 0.0F, 1.0F}, ""); verifyMaterialState(GL11.GL_FRONT, GL11.GL_SHININESS, new float[]{0.0F}, ""); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 5.5F); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 5.5F); verifyMaterialState(GL11.GL_FRONT, GL11.GL_SHININESS, new float[]{5.5F}, ""); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyMaterialState(GL11.GL_FRONT, GL11.GL_SHININESS, new float[]{0.0F}, ""); verifyMaterialState(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, new float[]{0.0F, 1.0F, 1.0F}, ""); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, floats(0.8F, 0.6F, 0.4F, 0.0F)); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, floats(0.8F, 0.6F, 0.4F, 0.0F)); if (GLStateManager.vendorIsNVIDIA()) { verifyMaterialState(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, new float[]{0.8F, 0.4F, 0.6F}, ""); } else { verifyMaterialState(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, new float[]{0.8F, 0.6F, 0.4F}, ""); } - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyMaterialState(GL11.GL_FRONT, GL11.GL_COLOR_INDEXES, new float[]{0.0F, 1.0F, 1.0F}, ""); } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LineStipple_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LineStipple_GLTest.java index 4115eb40d..e80f79957 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LineStipple_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_LineStipple_GLTest.java @@ -34,48 +34,48 @@ public class GLSM_LineStipple_GLTest { @BeforeEach void setUp() { - final ViewportState vp = GLStateManager.getViewportState(); + final ViewportState vp = GLSMRasterizer.getViewportState(); savedX = vp.x; savedY = vp.y; savedW = vp.width; savedH = vp.height; - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, 12, 0L); - GLStateManager.glEnableVertexAttribArray(POSITION_LOC); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMVertexInput.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, 12, 0L); + GLSMVertexInput.glEnableVertexAttribArray(POSITION_LOC); - GLStateManager.glViewport(0, 0, W, 1); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glOrtho(0, W, 0, 1, -1, 1); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glColor4f(1f, 1f, 1f, 1f); + GLSMRasterizer.glViewport(0, 0, W, 1); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glOrtho(0, W, 0, 1, -1, 1); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMCurrentAttribs.glColor4f(1f, 1f, 1f, 1f); } @AfterEach void tearDown() { - GLStateManager.glDisable(GL11.GL_LINE_STIPPLE); - GLStateManager.glLineStipple(1, (short) 0xFFFF); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPopMatrix(); - GLStateManager.glViewport(savedX, savedY, savedW, savedH); - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - if (vbo != 0) GLStateManager.glDeleteBuffers(vbo); - if (vao != 0) GLStateManager.glDeleteVertexArrays(vao); + GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE); + GLSMRasterizer.glLineStipple(1, (short) 0xFFFF); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); + GLSMRasterizer.glViewport(savedX, savedY, savedW, savedH); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo); + if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao); } private boolean[] renderLine(float x0, float x1) { @@ -88,18 +88,18 @@ public class GLSM_LineStipple_GLTest { verts.clear(); for (float x : xs) verts.putFloat(x).putFloat(0.5f).putFloat(0f); verts.flip(); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STREAM_DRAW); - GLStateManager.glDrawArrays(xs.length == 2 ? GL11.GL_LINES : GL11.GL_LINE_STRIP, 0, xs.length); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STREAM_DRAW); + GLSMDraws.glDrawArrays(xs.length == 2 ? GL11.GL_LINES : GL11.GL_LINE_STRIP, 0, xs.length); } private void clear() { - GLStateManager.glClearColor(0f, 0f, 0f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0f, 0f, 0f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); } private boolean[] readCoverage() { pixels.clear(); - GLStateManager.glReadPixels(0, 0, W, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + GLSMFramebuffer.glReadPixels(0, 0, W, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "GL error during readback"); final boolean[] covered = new boolean[W]; @@ -116,8 +116,8 @@ public class GLSM_LineStipple_GLTest { } private static void stipple(int factor, int pattern) { - GLStateManager.glEnable(GL11.GL_LINE_STIPPLE); - GLStateManager.glLineStipple(factor, (short) pattern); + GLSMEnable.glEnable(GL11.GL_LINE_STIPPLE); + GLSMRasterizer.glLineStipple(factor, (short) pattern); } static Stream patterns() { @@ -136,11 +136,11 @@ public class GLSM_LineStipple_GLTest { @ParameterizedTest(name = "{0}") @MethodSource("patterns") void patternSelectsTheCoveredPixels(String name, boolean enabled, int factor, int pattern, IntPredicate on) { - GLStateManager.glLineStipple(factor, (short) pattern); + GLSMRasterizer.glLineStipple(factor, (short) pattern); if (enabled) { - GLStateManager.glEnable(GL11.GL_LINE_STIPPLE); + GLSMEnable.glEnable(GL11.GL_LINE_STIPPLE); } else { - GLStateManager.glDisable(GL11.GL_LINE_STIPPLE); + GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE); } assertArrayEquals(expected(on), renderLine(0f, W)); } @@ -175,7 +175,7 @@ public class GLSM_LineStipple_GLTest { stipple(1, 0xAAAA); renderLine(0f, W); - GLStateManager.glDisable(GL11.GL_LINE_STIPPLE); + GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE); assertArrayEquals(expected(i -> true), renderLine(0f, W)); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java index 361656cef..0b1670208 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MatrixStack_UnitTest.java @@ -18,7 +18,7 @@ public class GLSM_MatrixStack_UnitTest { Matrix4f getMatrix(int matrix, boolean cached) { buffer.clear(); if(cached) { - GLStateManager.glGetFloat(matrix, buffer); + GLSMQueries.glGetFloat(matrix, buffer); } else { GL11.glGetFloat(matrix, buffer); } @@ -60,28 +60,28 @@ public class GLSM_MatrixStack_UnitTest { @ParameterizedTest @EnumSource(MatrixMode.class) void validateMatrixOperations(MatrixMode matrix) { - GLStateManager.glMatrixMode(matrix.mode); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(matrix.mode); + GLSMMatrices.glLoadIdentity(); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); Matrix4fStack testMatrix = new Matrix4fStack(2); validateMatrix(testMatrix, matrix.getEnum, "Identity " + matrix.name + " Matrix"); - GLStateManager.glScalef(2.0f, 2.0f, 2.0f); + GLSMMatrices.glScalef(2.0f, 2.0f, 2.0f); testMatrix.scale(2.0f); validateMatrix(testMatrix, matrix.getEnum, "Scaled " + matrix.name + " Matrix"); - GLStateManager.glTranslatef(2.0f, 2.0f, 2.0f); + GLSMMatrices.glTranslatef(2.0f, 2.0f, 2.0f); testMatrix.translate(2.0f, 2.0f, 2.0f); validateMatrix(testMatrix, matrix.getEnum, "Translated " + matrix.name + " Matrix"); - GLStateManager.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); + GLSMMatrices.glRotatef(180.0f, 0.0f, 0.0f, 1.0f); testMatrix.rotate((float) Math.toRadians(180.0f), 0.0f, 0.0f, 1.0f); validateMatrix(testMatrix, matrix.getEnum, "Rotated " + matrix.name + " Matrix"); - GLStateManager.glOrtho(0, 800, 0, 600, -1, 1); + GLSMMatrices.glOrtho(0, 800, 0, 600, -1, 1); testMatrix.ortho(0, 800, 0, 600, -1, 1); validateMatrix(testMatrix, matrix.getEnum, "Ortho " + matrix.name + " Matrix"); @@ -90,13 +90,13 @@ public class GLSM_MatrixStack_UnitTest { testLoad.m12(12f); testLoad.get(buffer); - GLStateManager.glLoadMatrix(buffer); + GLSMMatrices.glLoadMatrix(buffer); validateMatrix(testLoad, matrix.getEnum, "Loaded " + matrix.name + " Matrix"); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); testMatrix.identity(); validateMatrix(testMatrix, matrix.getEnum, "Popped " + matrix.name + " Matrix"); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MaxBoundTextureUnit_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MaxBoundTextureUnit_UnitTest.java index a317c4f18..2eb82c2a7 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MaxBoundTextureUnit_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_MaxBoundTextureUnit_UnitTest.java @@ -13,23 +13,23 @@ public class GLSM_MaxBoundTextureUnit_UnitTest { void testHighWaterMarkTracksNonZeroBindsOnly() { final int texId = GL11.glGenTextures(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE5); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); - assertTrue(GLStateManager.getMaxBoundTextureUnit() >= 5); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE5); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); + assertTrue(GLSMTextures.getMaxBoundTextureUnit() >= 5); - final int before = GLStateManager.getMaxBoundTextureUnit(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + before + 3); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - assertEquals(before, GLStateManager.getMaxBoundTextureUnit(), "binding 0 must not raise the mark"); + final int before = GLSMTextures.getMaxBoundTextureUnit(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + before + 3); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + assertEquals(before, GLSMTextures.getMaxBoundTextureUnit(), "binding 0 must not raise the mark"); - GLStateManager.trackMaxBoundTextureUnit(before + 7); - assertEquals(before + 7, GLStateManager.getMaxBoundTextureUnit()); - GLStateManager.trackMaxBoundTextureUnit(0); - assertEquals(before + 7, GLStateManager.getMaxBoundTextureUnit(), "mark is monotonic"); + GLSMTextures.trackMaxBoundTextureUnit(before + 7); + assertEquals(before + 7, GLSMTextures.getMaxBoundTextureUnit()); + GLSMTextures.trackMaxBoundTextureUnit(0); + assertEquals(before + 7, GLSMTextures.getMaxBoundTextureUnit(), "mark is monotonic"); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE5); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE5); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); GL11.glDeleteTextures(texId); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_OffContextCreation_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_OffContextCreation_GLTest.java index 1b7987e36..8df9a05dd 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_OffContextCreation_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_OffContextCreation_GLTest.java @@ -31,24 +31,24 @@ public class GLSM_OffContextCreation_GLTest { private static Map creationCalls() { final Map calls = new LinkedHashMap<>(); - calls.put("glGenTextures()", GLStateManager::glGenTextures); - calls.put("glGenTextures(IntBuffer)", () -> GLStateManager.glGenTextures(BufferUtils.createIntBuffer(1))); - calls.put("glGenSamplers()", GLStateManager::glGenSamplers); - calls.put("glGenSamplers(IntBuffer)", () -> GLStateManager.glGenSamplers(BufferUtils.createIntBuffer(1))); - calls.put("glGenSamplers(int[])", () -> GLStateManager.glGenSamplers(new int[1])); - calls.put("glGenBuffers()", GLStateManager::glGenBuffers); - calls.put("glGenBuffers(IntBuffer)", () -> GLStateManager.glGenBuffers(BufferUtils.createIntBuffer(1))); - calls.put("glGenBuffers(int[])", () -> GLStateManager.glGenBuffers(new int[1])); - calls.put("glCreateBuffers()", GLStateManager::glCreateBuffers); - calls.put("glCreateBuffers(IntBuffer)", () -> GLStateManager.glCreateBuffers(BufferUtils.createIntBuffer(1))); - calls.put("glCreateBuffers(int[])", () -> GLStateManager.glCreateBuffers(new int[1])); - calls.put("glGenVertexArrays()", GLStateManager::glGenVertexArrays); - calls.put("glGenFramebuffers()", GLStateManager::glGenFramebuffers); - calls.put("glGenRenderbuffers()", GLStateManager::glGenRenderbuffers); - calls.put("glGenQueries()", GLStateManager::glGenQueries); - calls.put("glGenQueries(IntBuffer)", () -> GLStateManager.glGenQueries(BufferUtils.createIntBuffer(1))); - calls.put("glCreateShader", () -> GLStateManager.glCreateShader(GL20.GL_VERTEX_SHADER)); - calls.put("glCreateProgram", GLStateManager::glCreateProgram); + calls.put("glGenTextures()", GLSMTextures::glGenTextures); + calls.put("glGenTextures(IntBuffer)", () -> GLSMTextures.glGenTextures(BufferUtils.createIntBuffer(1))); + calls.put("glGenSamplers()", GLSMTextures::glGenSamplers); + calls.put("glGenSamplers(IntBuffer)", () -> GLSMTextures.glGenSamplers(BufferUtils.createIntBuffer(1))); + calls.put("glGenSamplers(int[])", () -> GLSMTextures.glGenSamplers(new int[1])); + calls.put("glGenBuffers()", GLSMBuffers::glGenBuffers); + calls.put("glGenBuffers(IntBuffer)", () -> GLSMBuffers.glGenBuffers(BufferUtils.createIntBuffer(1))); + calls.put("glGenBuffers(int[])", () -> GLSMBuffers.glGenBuffers(new int[1])); + calls.put("glCreateBuffers()", GLSMBuffers::glCreateBuffers); + calls.put("glCreateBuffers(IntBuffer)", () -> GLSMBuffers.glCreateBuffers(BufferUtils.createIntBuffer(1))); + calls.put("glCreateBuffers(int[])", () -> GLSMBuffers.glCreateBuffers(new int[1])); + calls.put("glGenVertexArrays()", GLSMVertexInput::glGenVertexArrays); + calls.put("glGenFramebuffers()", GLSMFramebuffer::glGenFramebuffers); + calls.put("glGenRenderbuffers()", GLSMFramebuffer::glGenRenderbuffers); + calls.put("glGenQueries()", GLSMQueries::glGenQueries); + calls.put("glGenQueries(IntBuffer)", () -> GLSMQueries.glGenQueries(BufferUtils.createIntBuffer(1))); + calls.put("glCreateShader", () -> GLSMPrograms.glCreateShader(GL20.GL_VERTEX_SHADER)); + calls.put("glCreateProgram", GLSMPrograms::glCreateProgram); calls.put("RenderSystem.createTexture", () -> RenderSystem.createTexture(GL11.GL_TEXTURE_2D)); calls.put("RenderSystem.createFramebuffer", RenderSystem::createFramebuffer); return calls; @@ -67,9 +67,9 @@ public class GLSM_OffContextCreation_GLTest { void creationOnSharedContextThreadPasses() throws Exception { sharedDrawable = new SharedDrawable(Display.getDrawable()); DrawableContexts.run(sharedDrawable, "glsm-shared-context", () -> { - final int texture = GLStateManager.glGenTextures(); + final int texture = GLSMTextures.glGenTextures(); assertNotEquals(0, texture, "no texture name on a thread that owns a shared context"); - GLStateManager.glDeleteTextures(texture); + GLSMTextures.glDeleteTextures(texture); }); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PerThread_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PerThread_UnitTest.java index bc54b7809..1e6b38bea 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PerThread_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PerThread_UnitTest.java @@ -93,16 +93,16 @@ public class GLSM_PerThread_UnitTest { GLStateManager.enterWorkerContext(); try { final int count = tid + 1; - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - final int gen0 = GLStateManager.getMvGeneration(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + final int gen0 = GLSMMatrices.getMvGeneration(); - for (int k = 0; k < count; k++) GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); + for (int k = 0; k < count; k++) GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); barrier.await(); - assertEquals(gen0 + count, GLStateManager.getMvGeneration(), "mvGeneration must advance only by this thread's own translate count"); - final Matrix4f m = new Matrix4f(GLStateManager.getModelViewMatrix()); + assertEquals(gen0 + count, GLSMMatrices.getMvGeneration(), "mvGeneration must advance only by this thread's own translate count"); + final Matrix4f m = new Matrix4f(GLSMMatrices.getModelViewMatrix()); assertEquals((float) count, m.m30(), 1e-6f, "accumulated X translation must reflect only this thread's ops"); } finally { GLStateManager.exitWorkerContext(); @@ -116,14 +116,14 @@ public class GLSM_PerThread_UnitTest { runThreaded(n, (tid, barrier) -> { GLStateManager.enterWorkerContext(); try { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(5.0f + tid, 0.0f, 0.0f); - assertEquals(5.0f + tid, new Matrix4f(GLStateManager.getModelViewMatrix()).m30(), 1e-6f, "translation must apply within the pushed scope"); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(5.0f + tid, 0.0f, 0.0f); + assertEquals(5.0f + tid, new Matrix4f(GLSMMatrices.getModelViewMatrix()).m30(), 1e-6f, "translation must apply within the pushed scope"); barrier.await(); - GLStateManager.glPopMatrix(); - assertEquals(0.0f, new Matrix4f(GLStateManager.getModelViewMatrix()).m30(), 1e-6f, "pop must restore this thread's matrix independent of other threads"); + GLSMMatrices.glPopMatrix(); + assertEquals(0.0f, new Matrix4f(GLSMMatrices.getModelViewMatrix()).m30(), 1e-6f, "pop must restore this thread's matrix independent of other threads"); } finally { GLStateManager.exitWorkerContext(); } @@ -149,18 +149,18 @@ public class GLSM_PerThread_UnitTest { runThreaded(n, (tid, barrier) -> { final GLContextState c = GLStateManager.enterWorkerContext(); try { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); barrier.await(); for (int i = 0; i < iterations; i++) { c.activeProgram = tid; - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); - GLStateManager.glPopMatrix(); - if (GLStateManager.getActiveProgram() != tid) mismatches.incrementAndGet(); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); + GLSMMatrices.glPopMatrix(); + if (GLSMPrograms.getActiveProgram() != tid) mismatches.incrementAndGet(); if (c.activeProgram != tid) mismatches.incrementAndGet(); } - assertEquals(0.0f, new Matrix4f(GLStateManager.getModelViewMatrix()).m30(), 1e-6f, "balanced push/pop must leave this thread's matrix at identity"); + assertEquals(0.0f, new Matrix4f(GLSMMatrices.getModelViewMatrix()).m30(), 1e-6f, "balanced push/pop must leave this thread's matrix at identity"); } finally { GLStateManager.exitWorkerContext(); } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PolygonOffsetClamp_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PolygonOffsetClamp_UnitTest.java index 6c7ef44fb..d2fca995c 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PolygonOffsetClamp_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PolygonOffsetClamp_UnitTest.java @@ -13,7 +13,7 @@ public class GLSM_PolygonOffsetClamp_UnitTest { @AfterEach void reset() { - GLStateManager.glPolygonOffset(0.0f, 0.0f); + GLSMRasterizer.glPolygonOffset(0.0f, 0.0f); } private static float cachedClamp() { @@ -22,7 +22,7 @@ public class GLSM_PolygonOffsetClamp_UnitTest { @Test void zeroClampTakesThePlainPath() { - GLStateManager.glPolygonOffsetClamp(1.5f, 2.5f, 0.0f); + GLSMRasterizer.glPolygonOffsetClamp(1.5f, 2.5f, 0.0f); assertEquals(1.5f, GLStateManager.ctx().polygonState.getOffsetFactor()); assertEquals(2.5f, GLStateManager.ctx().polygonState.getOffsetUnits()); assertEquals(1.5f, GL11.glGetFloat(GL11.GL_POLYGON_OFFSET_FACTOR)); @@ -33,13 +33,13 @@ public class GLSM_PolygonOffsetClamp_UnitTest { @Test void plainOffsetClearsTheCachedClamp() { GLStateManager.ctx().polygonState.setOffsetClamp(0.25f); - GLStateManager.glPolygonOffset(1.0f, 1.0f); + GLSMRasterizer.glPolygonOffset(1.0f, 1.0f); assertEquals(0.0f, cachedClamp()); } @Test void nonZeroClampFailsByNameOnTheGLBackend() { - final UnsupportedOperationException e = assertThrows(UnsupportedOperationException.class, () -> GLStateManager.glPolygonOffsetClamp(1.0f, 1.0f, 0.5f)); + final UnsupportedOperationException e = assertThrows(UnsupportedOperationException.class, () -> GLSMRasterizer.glPolygonOffsetClamp(1.0f, 1.0f, 0.5f)); assertTrue(e.getMessage().contains("polygon offset clamp"), e::getMessage); assertTrue(e.getMessage().indexOf(':') > 0, () -> "message must name the backend: " + e.getMessage()); } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PopAttribMaskFidelity_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PopAttribMaskFidelity_GLTest.java index e54817739..e8a003fea 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PopAttribMaskFidelity_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PopAttribMaskFidelity_GLTest.java @@ -18,7 +18,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class GLSM_PopAttribMaskFidelity_GLTest { private static int scanClipPlaneMask() { - final BooleanStateStack[] planes = GLStateManager.getClipPlaneStates(); + final BooleanStateStack[] planes = GLSMRasterizer.getClipPlaneStates(); int mask = 0; for (int i = 0; i < planes.length; i++) { if (planes[i].isEnabled()) mask |= (1 << i); @@ -29,7 +29,7 @@ public class GLSM_PopAttribMaskFidelity_GLTest { private static void verifyClipPlaneMask(String message) { final int scanned = scanClipPlaneMask(); assertEquals(scanned, GLStateManager.ctx().clipPlaneEnabledMask, message + " - mask mismatch"); - assertEquals(scanned != 0, GLStateManager.anyClipPlaneEnabled(), message + " - anyClipPlaneEnabled mismatch"); + assertEquals(scanned != 0, GLSMRasterizer.anyClipPlaneEnabled(), message + " - anyClipPlaneEnabled mismatch"); } @Test @@ -37,13 +37,13 @@ public class GLSM_PopAttribMaskFidelity_GLTest { try { verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull - Initial"); - GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_CULL_FACE); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull - Not a GL_COLOR_BUFFER_BIT member, must stay toggled"); } finally { - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); } } @@ -52,18 +52,18 @@ public class GLSM_PopAttribMaskFidelity_GLTest { try { verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull - Initial"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull - After enable inside inner bracket"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull - Inner pop is not a member, must stay toggled"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull - Outer pop is a member, must restore to pre-inner value"); } finally { - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); } } @@ -72,18 +72,18 @@ public class GLSM_PopAttribMaskFidelity_GLTest { try { verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull - Initial"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull - After enable at outer depth"); - GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull - Inner pop is not a member, must stay toggled"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull - Outer pop is a member, must restore"); } finally { - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); } } @@ -92,16 +92,16 @@ public class GLSM_PopAttribMaskFidelity_GLTest { try { verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial"); - GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glEnable(GL11.GL_BLEND); + GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_BLEND); verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After multiple toggles at one depth"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, false, "Blend - GL_COLOR_BUFFER_BIT member, must restore original"); } finally { - GLStateManager.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_BLEND); } } @@ -111,18 +111,18 @@ public class GLSM_PopAttribMaskFidelity_GLTest { verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting - Initial"); verifyIsEnabled(GL11.GL_LIGHT0, false, "Light0 - Initial"); - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glEnable(GL11.GL_LIGHT0); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_LIGHT0); verifyIsEnabled(GL11.GL_LIGHTING, true, "Lighting - After enable"); verifyIsEnabled(GL11.GL_LIGHT0, true, "Light0 - After enable"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting - GL_LIGHTING_BIT member, must restore"); verifyIsEnabled(GL11.GL_LIGHT0, false, "Light0 - GL_LIGHTING_BIT member, must restore"); } finally { - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glDisable(GL11.GL_LIGHT0); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_LIGHT0); } } @@ -131,15 +131,15 @@ public class GLSM_PopAttribMaskFidelity_GLTest { try { verifyClipPlaneMask("Initial"); - GLStateManager.glEnable(GL11.GL_CLIP_PLANE0); + GLSMEnable.glEnable(GL11.GL_CLIP_PLANE0); verifyIsEnabled(GL11.GL_CLIP_PLANE0, true, "Clip0 - After enable"); verifyClipPlaneMask("After enable"); - GLStateManager.glDisable(GL11.GL_CLIP_PLANE0); + GLSMEnable.glDisable(GL11.GL_CLIP_PLANE0); verifyIsEnabled(GL11.GL_CLIP_PLANE0, false, "Clip0 - After disable"); verifyClipPlaneMask("After disable"); } finally { - GLStateManager.glDisable(GL11.GL_CLIP_PLANE0); + GLSMEnable.glDisable(GL11.GL_CLIP_PLANE0); } } @@ -155,16 +155,16 @@ public class GLSM_PopAttribMaskFidelity_GLTest { try { verifyClipPlaneMask("Initial"); - GLStateManager.glPushAttrib(bit); - GLStateManager.glEnable(plane); + GLSMAttribStack.glPushAttrib(bit); + GLSMEnable.glEnable(plane); verifyIsEnabled(plane, true, "After enable inside " + bitName); verifyClipPlaneMask("After enable inside " + bitName); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(plane, !member, member ? bitName + " member, must restore" : "Not a " + bitName + " member, must stay toggled"); verifyClipPlaneMask("After " + bitName + " pop"); } finally { - GLStateManager.glDisable(plane); + GLSMEnable.glDisable(plane); } } @@ -173,29 +173,29 @@ public class GLSM_PopAttribMaskFidelity_GLTest { final int[] boxA = { 10, 20, 100, 200 }; final int[] boxB = { 30, 40, 50, 60 }; try { - GLStateManager.glScissor(boxA[0], boxA[1], boxA[2], boxA[3]); - GLStateManager.disableScissorTest(); + GLSMRasterizer.glScissor(boxA[0], boxA[1], boxA[2], boxA[3]); + GLSMRasterizer.disableScissorTest(); verifyState(GL11.GL_SCISSOR_BOX, boxA, "Scissor box - Initial"); verifyIsEnabled(GL11.GL_SCISSOR_TEST, false, "Scissor - Initial"); - GLStateManager.glPushAttrib(GL11.GL_SCISSOR_BIT); - GLStateManager.enableScissorTest(); - GLStateManager.glScissor(boxB[0], boxB[1], boxB[2], boxB[3]); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_SCISSOR_BIT); + GLSMRasterizer.enableScissorTest(); + GLSMRasterizer.glScissor(boxB[0], boxB[1], boxB[2], boxB[3]); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_SCISSOR_BOX, boxA, "Scissor box - GL_SCISSOR_BIT member, must restore"); verifyIsEnabled(GL11.GL_SCISSOR_TEST, false, "Scissor - GL_SCISSOR_BIT member, must restore"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.enableScissorTest(); - GLStateManager.glScissor(boxB[0], boxB[1], boxB[2], boxB[3]); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMRasterizer.enableScissorTest(); + GLSMRasterizer.glScissor(boxB[0], boxB[1], boxB[2], boxB[3]); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_SCISSOR_BOX, boxB, "Scissor box - Not a GL_ENABLE_BIT member, must stay changed"); verifyIsEnabled(GL11.GL_SCISSOR_TEST, false, "Scissor - GL_ENABLE_BIT member, must restore"); } finally { - GLStateManager.disableScissorTest(); - GLStateManager.glScissor(0, 0, 800, 600); + GLSMRasterizer.disableScissorTest(); + GLSMRasterizer.glScissor(0, 0, 800, 600); } } @@ -204,27 +204,27 @@ public class GLSM_PopAttribMaskFidelity_GLTest { try { verifyIsEnabled(GL30.GL_RASTERIZER_DISCARD, false, "RasterizerDiscard - Initial"); - GLStateManager.glEnable(GL30.GL_RASTERIZER_DISCARD); + GLSMEnable.glEnable(GL30.GL_RASTERIZER_DISCARD); verifyIsEnabled(GL30.GL_RASTERIZER_DISCARD, true, "RasterizerDiscard - After enable"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.glDisable(GL30.GL_RASTERIZER_DISCARD); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMEnable.glDisable(GL30.GL_RASTERIZER_DISCARD); verifyIsEnabled(GL30.GL_RASTERIZER_DISCARD, false, "RasterizerDiscard - After disable inside GL_ENABLE_BIT"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL30.GL_RASTERIZER_DISCARD, false, "RasterizerDiscard - Not a GL_ENABLE_BIT member, must stay disabled"); } finally { - GLStateManager.glDisable(GL30.GL_RASTERIZER_DISCARD); + GLSMEnable.glDisable(GL30.GL_RASTERIZER_DISCARD); } } @Test void clearDepthIsClamped() { try { - GLStateManager.glClearDepth(2.0); + GLSMDepthStencilAlpha.glClearDepth(2.0); verifyState(GL11.GL_DEPTH_CLEAR_VALUE, 1.0f, "Depth clear value - glClearDepth(2.0) must clamp to 1.0"); } finally { - GLStateManager.glClearDepth(1.0); + GLSMDepthStencilAlpha.glClearDepth(1.0); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java index 095cea57e..b962084ea 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_PushPop_UnitTest.java @@ -54,9 +54,9 @@ class GLSM_PushPop_UnitTest { for (GLBit bit : bits) { verifyState(bit.glEnum(), bit.initial(), bit.name() + " Initial State"); if (bit.initial()) { - GLStateManager.glDisable(bit.glEnum()); + GLSMEnable.glDisable(bit.glEnum()); } else { - GLStateManager.glEnable(bit.glEnum()); + GLSMEnable.glEnable(bit.glEnum()); } verifyState(bit.glEnum(), !bit.initial(), bit.name() + " Toggle State"); } @@ -71,7 +71,7 @@ class GLSM_PushPop_UnitTest { @Test void testPushPopColorBufferBit() { - GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); /* * GL_COLOR_BUFFER_BIT * GL_ALPHA_TEST enable bit @@ -89,20 +89,20 @@ class GLSM_PushPop_UnitTest { * Color mode and index mode writemasks */ - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_NEVER, 1f); - GLStateManager.enableBlend(); - GLStateManager.glDisable(GL11.GL_DITHER); - GLStateManager.glEnable(GL11.GL_COLOR_LOGIC_OP); - GLStateManager.glEnable(GL11.GL_INDEX_LOGIC_OP); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.glBlendColor(1f, 1f, 1f, 1f); - GLStateManager.glBlendEquationSeparate(GL14.GL_FUNC_REVERSE_SUBTRACT, GL14.GL_FUNC_REVERSE_SUBTRACT); - GLStateManager.glDrawBuffer(GL11.GL_FRONT_AND_BACK); - GLStateManager.glLogicOp(GL11.GL_OR); - GLStateManager.glColor4f(0.5f, 0.5f, 0.5f, 0.5f); // This should not be reset - GLStateManager.glColorMask(false, false, false, false); - GLStateManager.glClearColor(0.5f, 0.5f, 0.5f, 0.5f); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_NEVER, 1f); + GLSMBlend.enableBlend(); + GLSMEnable.glDisable(GL11.GL_DITHER); + GLSMEnable.glEnable(GL11.GL_COLOR_LOGIC_OP); + GLSMEnable.glEnable(GL11.GL_INDEX_LOGIC_OP); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMBlend.glBlendColor(1f, 1f, 1f, 1f); + GLSMBlend.glBlendEquationSeparate(GL14.GL_FUNC_REVERSE_SUBTRACT, GL14.GL_FUNC_REVERSE_SUBTRACT); + GLSMFramebuffer.glDrawBuffer(GL11.GL_FRONT_AND_BACK); + GLSMBlend.glLogicOp(GL11.GL_OR); + GLSMCurrentAttribs.glColor4f(0.5f, 0.5f, 0.5f, 0.5f); // This should not be reset + GLSMBlend.glColorMask(false, false, false, false); + GLSMBlend.glClearColor(0.5f, 0.5f, 0.5f, 0.5f); verifyIsEnabled(GL11.GL_ALPHA_TEST, true, "Alpha Test Enable"); @@ -124,7 +124,7 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_COLOR_CLEAR_VALUE, FLOAT_ARRAY_4_POINT_5, "Color Clear Value"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_ALPHA_TEST, false, "Alpha Test Enable - Reset"); verifyState(GL11.GL_ALPHA_TEST_FUNC, GL11.GL_ALWAYS, "Alpha Test Function - Reset"); verifyState(GL11.GL_ALPHA_TEST_REF, 0f, "Alpha Test Reference - Reset"); @@ -135,7 +135,7 @@ class GLSM_PushPop_UnitTest { verifyState(GL14.GL_BLEND_EQUATION, GL14.GL_FUNC_ADD, "Blend Equation - Reset"); verifyState(GL20.GL_BLEND_EQUATION_ALPHA, GL14.GL_FUNC_ADD, "Blend Equation Alpha - Reset"); verifyIsEnabled(GL11.GL_DITHER, true, "Dither Enable - Reset"); - verifyState(GL11.GL_DRAW_BUFFER, GLStateManager.DEFAULT_DRAW_BUFFER, "Draw Buffer - Reset"); + verifyState(GL11.GL_DRAW_BUFFER, GLSMFramebuffer.DEFAULT_DRAW_BUFFER, "Draw Buffer - Reset"); verifyIsEnabled(GL11.GL_COLOR_LOGIC_OP, false, "Color Logic Op Enable - Reset"); verifyIsEnabled(GL11.GL_INDEX_LOGIC_OP, false, "Index Logic Op Enable - Reset"); verifyState(GL11.GL_LOGIC_OP_MODE, GL11.GL_COPY, "Logic Op Mode - Reset"); @@ -149,10 +149,10 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_CURRENT_COLOR, FLOAT_ARRAY_4_1, "Initial Color State"); // Verify no state leakage from other tests verifyState(GL11.GL_CURRENT_TEXTURE_COORDS, FLOAT_ARRAY_4_0001, "Initial Texture Coordinates"); - GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT); - GLStateManager.glColor4f(0.5f, 0.5f, 0.5f, 0.5f); - GLStateManager.glNormal3f(0.5f, 0.5f, 0.5f); - GLStateManager.glTexCoord4f(0.5f, 0.5f, 0.5f, 0.5f); + GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT); + GLSMCurrentAttribs.glColor4f(0.5f, 0.5f, 0.5f, 0.5f); + GLSMCurrentAttribs.glNormal3f(0.5f, 0.5f, 0.5f); + GLSMCurrentAttribs.glTexCoord4f(0.5f, 0.5f, 0.5f, 0.5f); verifyState(GL11.GL_CURRENT_COLOR, FLOAT_ARRAY_4_POINT_5, "Current Color"); @@ -160,7 +160,7 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_CURRENT_TEXTURE_COORDS, FLOAT_ARRAY_4_POINT_5, "Texture coordinates"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_CURRENT_COLOR, FLOAT_ARRAY_4_1, "Current Color - reset"); verifyState(GL11.GL_CURRENT_NORMAL, FLOAT_ARRAY_3_001, "Current normal - reset"); verifyState(GL11.GL_CURRENT_TEXTURE_COORDS, FLOAT_ARRAY_4_0001, "Texture coordinates - reset"); @@ -170,18 +170,18 @@ class GLSM_PushPop_UnitTest { void testPushPopDepthBufferBit() { verifyState(GL11.GL_DEPTH_WRITEMASK, true, "GL_DEPTH_WRITEMASK Initial State"); - GLStateManager.glPushAttrib(GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_DEPTH_TEST); - GLStateManager.glDepthFunc(GL11.GL_NEVER); - GLStateManager.glClearDepth(0.5f); // Not currently Implemented in GLSM - GLStateManager.glDepthMask(false); + GLSMAttribStack.glPushAttrib(GL11.GL_DEPTH_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_DEPTH_TEST); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_NEVER); + GLSMDepthStencilAlpha.glClearDepth(0.5f); // Not currently Implemented in GLSM + GLSMDepthStencilAlpha.glDepthMask(false); verifyState(GL11.GL_DEPTH_TEST, true, "Depth Test"); verifyState(GL11.GL_DEPTH_FUNC, GL11.GL_NEVER, "Depth Function"); verifyState(GL11.GL_DEPTH_CLEAR_VALUE, 0.5f, "Depth Clear Value"); verifyState(GL11.GL_DEPTH_WRITEMASK, false, "Depth Write Mask"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_DEPTH_TEST, false, "Depth Test - Reset"); verifyState(GL11.GL_DEPTH_FUNC, GL11.GL_LESS, "Depth Function - Reset"); verifyState(GL11.GL_DEPTH_CLEAR_VALUE, 1f, "Depth Clear Value - Reset"); @@ -259,10 +259,10 @@ class GLSM_PushPop_UnitTest { bits.add(new GLBit(GL11.GL_TEXTURE_GEN_R, "Texture Gen R", false)); bits.add(new GLBit(GL11.GL_TEXTURE_GEN_Q, "Texture Gen Q", false)); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); toggleAndVerify(bits); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyReset(bits); } @@ -270,15 +270,15 @@ class GLSM_PushPop_UnitTest { @Test void testPushPopFogBit() { final FloatBuffer floatBuffer = BufferUtils.createFloatBuffer(16); - GLStateManager.glPushAttrib(GL11.GL_FOG_BIT); - GLStateManager.glEnable(GL11.GL_FOG); + GLSMAttribStack.glPushAttrib(GL11.GL_FOG_BIT); + GLSMEnable.glEnable(GL11.GL_FOG); floatBuffer.put(FLOAT_ARRAY_4_POINT_5).flip(); - GLStateManager.glFog(GL11.GL_FOG_COLOR, floatBuffer); + GLSMFog.glFog(GL11.GL_FOG_COLOR, floatBuffer); - GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.5f); - GLStateManager.glFogf(GL11.GL_FOG_END, 0.5f); - GLStateManager.glFogf(GL11.GL_FOG_START, 0.5f); - GLStateManager.glFogf(GL11.GL_FOG_MODE, GL11.GL_LINEAR); + GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.5f); + GLSMFog.glFogf(GL11.GL_FOG_END, 0.5f); + GLSMFog.glFogf(GL11.GL_FOG_START, 0.5f); + GLSMFog.glFogf(GL11.GL_FOG_MODE, GL11.GL_LINEAR); // Fog index not tracked by GLSM (MC 1.7.10 never uses it) verifyIsEnabled(GL11.GL_FOG, true, "Fog Enable"); @@ -288,7 +288,7 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_FOG_START, 0.5f, "Fog Start"); verifyState(GL11.GL_FOG_MODE, GL11.GL_LINEAR, "Fog Mode"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_FOG, false, "Fog Enable - Reset"); verifyState(GL11.GL_FOG_COLOR, FLOAT_ARRAY_4_0, "Fog Color - Reset"); verifyState(GL11.GL_FOG_DENSITY, 1f, "Fog Density - Reset"); @@ -308,23 +308,23 @@ class GLSM_PushPop_UnitTest { bits.add(new GLBit(GL11.GL_LIGHT0 + i, "Light " + i, false)); } - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT); // Ambient scene color ?? - GLStateManager.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1f); - GLStateManager.glLightModelf(GL11.GL_LIGHT_MODEL_TWO_SIDE, 1f); + GLSMLighting.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1f); + GLSMLighting.glLightModelf(GL11.GL_LIGHT_MODEL_TWO_SIDE, 1f); floatBuffer.put(FLOAT_ARRAY_4_POINT_5).flip(); - GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floatBuffer); - GLStateManager.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floatBuffer); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floatBuffer); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floatBuffer); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floatBuffer); + GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floatBuffer); + GLSMLighting.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floatBuffer); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floatBuffer); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floatBuffer); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floatBuffer); floatBuffer.put(FLOAT_ARRAY_4_0010).flip(); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floatBuffer); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPOT_DIRECTION, floatBuffer); floatBuffer.put(FLOAT_ARRAY_4_0).flip(); - GLStateManager.glShadeModel(GL11.GL_FLAT); + GLSMRasterizer.glShadeModel(GL11.GL_FLAT); verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT, "Color Material Face"); @@ -342,7 +342,7 @@ class GLSM_PushPop_UnitTest { toggleAndVerify(bits); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_COLOR_MATERIAL_FACE, GL11.GL_FRONT_AND_BACK, "Color Material Face - Reset"); verifyState(GL11.GL_COLOR_MATERIAL_PARAMETER, GL11.GL_AMBIENT_AND_DIFFUSE, "Color Material Parameter - Reset"); verifyState(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, false, "Light Model Local Viewer - Reset"); @@ -372,38 +372,38 @@ class GLSM_PushPop_UnitTest { final int tex1 = GL11.glGenTextures(); final int tex2 = GL11.glGenTextures(); - GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex1); + GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex1); verifyState(GL11.GL_TEXTURE_BINDING_2D, tex1, "Texture Binding - Unit 0"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "Active Texture"); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding - Unit 1 - Switch"); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex2); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex2); verifyState(GL11.GL_TEXTURE_BINDING_2D, tex2, "Texture Binding - Unit 1 - Set"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "Active Texture"); verifyState(GL11.GL_TEXTURE_BINDING_2D, tex1, "Texture Binding - Unit 0"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "Active Texture"); verifyState(GL11.GL_TEXTURE_BINDING_2D, tex2, "Texture Binding - Unit 1"); toggleAndVerify(bits); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "Active Texture Unit 0 - Reset"); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Unit 0 - Reset"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Unit 1 - Reset"); verifyReset(bits); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDeleteTextures(tex1); - GLStateManager.glDeleteTextures(tex2); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glDeleteTextures(tex1); + GLSMTextures.glDeleteTextures(tex2); } @Test @@ -414,34 +414,34 @@ class GLSM_PushPop_UnitTest { final int tex1 = GL11.glGenTextures(); final int tex2 = GL11.glGenTextures(); - GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex1); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex1); + GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex1); - GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT); verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "Active Texture"); verifyState(GL11.GL_TEXTURE_BINDING_2D, tex1, "Texture Binding - Unit 1"); - GLStateManager.glDeleteTextures(tex2); + GLSMTextures.glDeleteTextures(tex2); verifyState(GL11.GL_TEXTURE_BINDING_2D, tex1, "Texture Binding - Unit 1"); - GLStateManager.glDeleteTextures(tex1); + GLSMTextures.glDeleteTextures(tex1); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Deleted - Unit 1"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Deleted - Unit 0"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "Active Texture - Reset 1"); // After pop, binding a deleted texture is driver-specific: // - Mesa: calls bindTexture_no_error which recreates the texture, returns tex1 // - Nvidia: refuses to bind deleted texture, returns 0 int binding = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); assertTrue(binding == 0 || binding == tex1, "Texture Binding after pop with deleted texture - Unit 1: expected 0 or " + tex1 + ", got " + binding); - GLStateManager.glDeleteTextures(tex1); + GLSMTextures.glDeleteTextures(tex1); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Deleted - Unit 1"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding Deleted - Unit 0"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "Active Texture - Reset 2"); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Texture Binding - Reset 2"); } @@ -452,16 +452,16 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_NORMALIZE, false, "Initial Normalize"); verifyState(GL12.GL_RESCALE_NORMAL, false, "Initial Rescale Normal"); - GLStateManager.glPushAttrib(GL11.GL_TRANSFORM_BIT); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glEnable(GL11.GL_NORMALIZE); - GLStateManager.glEnable(GL12.GL_RESCALE_NORMAL); + GLSMAttribStack.glPushAttrib(GL11.GL_TRANSFORM_BIT); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMEnable.glEnable(GL11.GL_NORMALIZE); + GLSMEnable.glEnable(GL12.GL_RESCALE_NORMAL); verifyState(GL11.GL_MATRIX_MODE, GL11.GL_PROJECTION, "Matrix Mode"); verifyState(GL11.GL_NORMALIZE, true, "Normalize"); verifyState(GL12.GL_RESCALE_NORMAL, true, "Rescale Normal"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_MATRIX_MODE, GL11.GL_MODELVIEW, "Matrix Mode - Reset"); verifyState(GL11.GL_NORMALIZE, false, "Normalize - Reset"); verifyState(GL12.GL_RESCALE_NORMAL, false, "Rescale Normal - Reset"); @@ -469,18 +469,18 @@ class GLSM_PushPop_UnitTest { @Test void testPushPopViewportBit() { - GLStateManager.glViewport(0, 0, 800, 600); + GLSMRasterizer.glViewport(0, 0, 800, 600); verifyState(GL11.GL_VIEWPORT, new int[] { 0, 0, 800, 600 }, "Viewport - Initial"); verifyState(GL11.GL_DEPTH_RANGE, new float[] { 0.0f, 1.0f }, "Depth Range - Initial"); - GLStateManager.glPushAttrib(GL11.GL_VIEWPORT_BIT); - GLStateManager.glViewport(1, 1, 100, 100); - GLStateManager.glDepthRange(0.5, 1.0); + GLSMAttribStack.glPushAttrib(GL11.GL_VIEWPORT_BIT); + GLSMRasterizer.glViewport(1, 1, 100, 100); + GLSMDepthStencilAlpha.glDepthRange(0.5, 1.0); verifyState(GL11.GL_VIEWPORT, new int[] { 1, 1, 100, 100 }, "Viewport"); verifyState(GL11.GL_DEPTH_RANGE, new float[] { 0.5f, 1.0f }, "Depth Range"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_VIEWPORT, new int[] { 0, 0, 800, 600 }, "Viewport - Reset"); verifyState(GL11.GL_DEPTH_RANGE, new float[] { 0.0f, 1.0f }, "Depth Range - Reset"); } @@ -492,16 +492,16 @@ class GLSM_PushPop_UnitTest { verifyIsEnabled(GL11.GL_LINE_SMOOTH, false, "Line Smooth - Initial"); verifyIsEnabled(GL11.GL_LINE_STIPPLE, false, "Line Stipple - Initial"); - GLStateManager.glPushAttrib(GL11.GL_LINE_BIT); - GLStateManager.glLineWidth(2.5f); - GLStateManager.glEnable(GL11.GL_LINE_SMOOTH); - GLStateManager.glEnable(GL11.GL_LINE_STIPPLE); + GLSMAttribStack.glPushAttrib(GL11.GL_LINE_BIT); + GLSMRasterizer.glLineWidth(2.5f); + GLSMEnable.glEnable(GL11.GL_LINE_SMOOTH); + GLSMEnable.glEnable(GL11.GL_LINE_STIPPLE); verifyState(GL11.GL_LINE_WIDTH, 2.5f, "Line Width"); verifyIsEnabled(GL11.GL_LINE_SMOOTH, true, "Line Smooth"); verifyIsEnabled(GL11.GL_LINE_STIPPLE, true, "Line Stipple"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_LINE_WIDTH, 1.0f, "Line Width - Reset"); verifyIsEnabled(GL11.GL_LINE_SMOOTH, false, "Line Smooth - Reset"); verifyIsEnabled(GL11.GL_LINE_STIPPLE, false, "Line Stipple - Reset"); @@ -517,14 +517,14 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_POINT_SIZE, 1.0f, "Point Size - Initial"); verifyIsEnabled(GL11.GL_POINT_SMOOTH, false, "Point Smooth - Initial"); - GLStateManager.glPushAttrib(GL11.GL_POINT_BIT); - GLStateManager.glPointSize(5.0f); - GLStateManager.glEnable(GL11.GL_POINT_SMOOTH); + GLSMAttribStack.glPushAttrib(GL11.GL_POINT_BIT); + GLSMRasterizer.glPointSize(5.0f); + GLSMEnable.glEnable(GL11.GL_POINT_SMOOTH); verifyState(GL11.GL_POINT_SIZE, 5.0f, "Point Size"); verifyIsEnabled(GL11.GL_POINT_SMOOTH, true, "Point Smooth"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_POINT_SIZE, 1.0f, "Point Size - Reset"); verifyIsEnabled(GL11.GL_POINT_SMOOTH, false, "Point Smooth - Reset"); } @@ -557,17 +557,17 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_POLYGON_OFFSET_FACTOR, 0.0f, "Polygon Offset Factor - Initial"); verifyState(GL11.GL_POLYGON_OFFSET_UNITS, 0.0f, "Polygon Offset Units - Initial"); - GLStateManager.glPushAttrib(GL11.GL_POLYGON_BIT); - GLStateManager.glEnable(GL11.GL_CULL_FACE); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.glFrontFace(GL11.GL_CW); - GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); - GLStateManager.glEnable(GL11.GL_POLYGON_SMOOTH); - GLStateManager.glEnable(GL11.GL_POLYGON_STIPPLE); - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_LINE); - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_POINT); - GLStateManager.glPolygonOffset(1.5f, 2.0f); + GLSMAttribStack.glPushAttrib(GL11.GL_POLYGON_BIT); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMRasterizer.glFrontFace(GL11.GL_CW); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); + GLSMEnable.glEnable(GL11.GL_POLYGON_SMOOTH); + GLSMEnable.glEnable(GL11.GL_POLYGON_STIPPLE); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_LINE); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_POINT); + GLSMRasterizer.glPolygonOffset(1.5f, 2.0f); verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull Face"); verifyState(GL11.GL_CULL_FACE_MODE, GL11.GL_FRONT, "Cull Face Mode"); @@ -581,7 +581,7 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_POLYGON_OFFSET_FACTOR, 1.5f, "Polygon Offset Factor"); verifyState(GL11.GL_POLYGON_OFFSET_UNITS, 2.0f, "Polygon Offset Units"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull Face - Reset"); verifyState(GL11.GL_CULL_FACE_MODE, GL11.GL_BACK, "Cull Face Mode - Reset"); verifyState(GL11.GL_FRONT_FACE, GL11.GL_CCW, "Front Face - Reset"); @@ -621,12 +621,12 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_STENCIL_CLEAR_VALUE, 0, "Stencil Clear Value - Initial"); verifyState(GL11.GL_STENCIL_WRITEMASK, initialWriteMask, "Stencil Write Mask - Initial"); - GLStateManager.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.glStencilFunc(GL11.GL_LESS, 127, 0x7F); - GLStateManager.glStencilOp(GL11.GL_INCR, GL11.GL_DECR, GL11.GL_REPLACE); - GLStateManager.glStencilMask(0x0F); - GLStateManager.glClearStencil(64); + GLSMAttribStack.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_LESS, 127, 0x7F); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_INCR, GL11.GL_DECR, GL11.GL_REPLACE); + GLSMDepthStencilAlpha.glStencilMask(0x0F); + GLSMDepthStencilAlpha.glClearStencil(64); verifyIsEnabled(GL11.GL_STENCIL_TEST, true, "Stencil Test"); verifyState(GL11.GL_STENCIL_FUNC, GL11.GL_LESS, "Stencil Func"); @@ -638,7 +638,7 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_STENCIL_CLEAR_VALUE, 64, "Stencil Clear Value"); verifyState(GL11.GL_STENCIL_WRITEMASK, 0x0F, "Stencil Write Mask"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_STENCIL_TEST, false, "Stencil Test - Reset"); verifyState(GL11.GL_STENCIL_FUNC, GL11.GL_ALWAYS, "Stencil Func - Reset"); verifyState(GL11.GL_STENCIL_REF, 0, "Stencil Ref - Reset"); @@ -671,14 +671,14 @@ class GLSM_PushPop_UnitTest { verifyState(GL20.GL_STENCIL_BACK_PASS_DEPTH_PASS, GL11.GL_KEEP, "Stencil Back Pass Depth Pass - Initial"); verifyState(GL20.GL_STENCIL_BACK_WRITEMASK, initialBackWriteMask, "Stencil Back Write Mask - Initial"); - GLStateManager.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT); // Use separate functions to set different front/back state - GLStateManager.glStencilFuncSeparate(GL11.GL_FRONT, GL11.GL_LESS, 10, 0x0A); - GLStateManager.glStencilFuncSeparate(GL11.GL_BACK, GL11.GL_GREATER, 20, 0x0B); - GLStateManager.glStencilOpSeparate(GL11.GL_FRONT, GL11.GL_INCR, GL11.GL_DECR, GL11.GL_ZERO); - GLStateManager.glStencilOpSeparate(GL11.GL_BACK, GL11.GL_KEEP, GL11.GL_INVERT, GL11.GL_REPLACE); - GLStateManager.glStencilMaskSeparate(GL11.GL_FRONT, 0x11); - GLStateManager.glStencilMaskSeparate(GL11.GL_BACK, 0x22); + GLSMDepthStencilAlpha.glStencilFuncSeparate(GL11.GL_FRONT, GL11.GL_LESS, 10, 0x0A); + GLSMDepthStencilAlpha.glStencilFuncSeparate(GL11.GL_BACK, GL11.GL_GREATER, 20, 0x0B); + GLSMDepthStencilAlpha.glStencilOpSeparate(GL11.GL_FRONT, GL11.GL_INCR, GL11.GL_DECR, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glStencilOpSeparate(GL11.GL_BACK, GL11.GL_KEEP, GL11.GL_INVERT, GL11.GL_REPLACE); + GLSMDepthStencilAlpha.glStencilMaskSeparate(GL11.GL_FRONT, 0x11); + GLSMDepthStencilAlpha.glStencilMaskSeparate(GL11.GL_BACK, 0x22); // Verify front state verifyState(GL11.GL_STENCIL_FUNC, GL11.GL_LESS, "Stencil Front Func"); @@ -698,7 +698,7 @@ class GLSM_PushPop_UnitTest { verifyState(GL20.GL_STENCIL_BACK_PASS_DEPTH_PASS, GL11.GL_REPLACE, "Stencil Back Pass Depth Pass"); verifyState(GL20.GL_STENCIL_BACK_WRITEMASK, 0x22, "Stencil Back Write Mask"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); // Verify front state reset verifyState(GL11.GL_STENCIL_FUNC, GL11.GL_ALWAYS, "Stencil Front Func - Reset"); verifyState(GL11.GL_STENCIL_REF, 0, "Stencil Front Ref - Reset"); @@ -726,21 +726,21 @@ class GLSM_PushPop_UnitTest { verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial"); verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting - Initial"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.enableBlend(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMBlend.enableBlend(); verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After first enable"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.disableBlend(); - GLStateManager.enableLighting(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMBlend.disableBlend(); + GLSMLighting.enableLighting(); verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After second push disable"); verifyIsEnabled(GL11.GL_LIGHTING, true, "Lighting - After enable at depth 2"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After first pop (should restore to depth 1 value)"); verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting - After first pop (should restore to depth 1 value)"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After second pop (should restore to initial)"); verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting - After second pop (should restore to initial)"); } @@ -750,17 +750,17 @@ class GLSM_PushPop_UnitTest { // Test: modify state only at depth 2, not at depth 1 verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); // Don't modify blend at depth 1 - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.enableBlend(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMBlend.enableBlend(); verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After enable at depth 2"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop to depth 1 (should restore)"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop to depth 0 (should still be false)"); } @@ -769,18 +769,18 @@ class GLSM_PushPop_UnitTest { // Test: modify state only at depth 1, not at depth 2 verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.enableBlend(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMBlend.enableBlend(); verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After enable at depth 1"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); // Don't modify blend at depth 2 verifyIsEnabled(GL11.GL_BLEND, true, "Blend - At depth 2 (unchanged)"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After pop to depth 1 (should still be true)"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop to depth 0 (should restore to initial)"); } @@ -789,13 +789,13 @@ class GLSM_PushPop_UnitTest { // Test: multiple modifications to same state at same depth should only save once verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.enableBlend(); // First modification - should save false - GLStateManager.disableBlend(); // Second modification - should NOT save again - GLStateManager.enableBlend(); // Third modification - should NOT save again + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMBlend.enableBlend(); // First modification - should save false + GLSMBlend.disableBlend(); // Second modification - should NOT save again + GLSMBlend.enableBlend(); // Third modification - should NOT save again verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After multiple toggles"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop (should restore original false)"); } @@ -804,23 +804,23 @@ class GLSM_PushPop_UnitTest { // Test: three levels of nesting verifyIsEnabled(GL11.GL_BLEND, false, "Blend - Initial"); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.enableBlend(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMBlend.enableBlend(); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.disableBlend(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMBlend.disableBlend(); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); - GLStateManager.enableBlend(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMBlend.enableBlend(); verifyIsEnabled(GL11.GL_BLEND, true, "Blend - At depth 3"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop to depth 2"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, true, "Blend - After pop to depth 1"); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, false, "Blend - After pop to depth 0"); } @@ -843,48 +843,48 @@ class GLSM_PushPop_UnitTest { final int texB = GL11.glGenTextures(); final int texC = GL11.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texA); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texA); verifyState(GL11.GL_TEXTURE_BINDING_2D, texA, "Initial binding unit 0"); verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "Initial active unit"); // Verify unit 1 starts with no texture and TEXTURE_2D disabled - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "Initial binding unit 1"); verifyIsEnabled(GL11.GL_TEXTURE_2D, false, "Initial TEXTURE_2D state unit 1"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); // Create display list that changes texture state on multiple units final int listId = GL11.glGenLists(1); - GLStateManager.glNewList(listId, GL11.GL_COMPILE); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texB); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texC); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glEndList(); + GLSMDraws.glNewList(listId, GL11.GL_COMPILE); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texB); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texC); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMDraws.glEndList(); // === Begin pattern === - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); // Switch to TEXTURE1, enable GL_TEXTURE_2D, switch back - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); verifyIsEnabled(GL11.GL_TEXTURE_2D, true, "TEXTURE_2D enabled on unit 1"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); // Call display list (simulates calling vanilla model/entity display lists) DisplayListManager.glCallList(listId); // Verify state changed by display list verifyState(GL11.GL_TEXTURE_BINDING_2D, texB, "After display list - unit 0 binding"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); verifyState(GL11.GL_TEXTURE_BINDING_2D, texC, "After display list - unit 1 binding"); verifyIsEnabled(GL11.GL_TEXTURE_2D, true, "After display list - TEXTURE_2D still enabled on unit 1"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); // Pop attrib - should restore all state - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); // === CRITICAL VERIFICATIONS === // If any of these fail, we've found the bug @@ -896,19 +896,19 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_TEXTURE_BINDING_2D, texA, "After pop - unit 0 binding"); // Unit 1 state should be fully restored - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "After pop - unit 1 binding"); verifyIsEnabled(GL11.GL_TEXTURE_2D, false, "After pop - TEXTURE_2D disabled on unit 1"); // Cleanup - reset all state to defaults - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(texA); - GLStateManager.glDeleteTextures(texB); - GLStateManager.glDeleteTextures(texC); - GLStateManager.glDeleteLists(listId, 1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(texA); + GLSMTextures.glDeleteTextures(texB); + GLSMTextures.glDeleteTextures(texC); + GLSMDraws.glDeleteLists(listId, 1); } @Test @@ -922,23 +922,23 @@ class GLSM_PushPop_UnitTest { final int texA = GL11.glGenTextures(); final int texB = GL11.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texA); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texA); verifyState(GL11.GL_TEXTURE_BINDING_2D, texA, "Initial binding"); // Create display list with its own push/pop final int listId = GL11.glGenLists(1); - GLStateManager.glNewList(listId, GL11.GL_COMPILE); - GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texB); - GLStateManager.glPopAttrib(); - GLStateManager.glEndList(); + GLSMDraws.glNewList(listId, GL11.GL_COMPILE); + GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texB); + GLSMAttribStack.glPopAttrib(); + GLSMDraws.glEndList(); // Outer push - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); // Change texture - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "After unbind in outer push"); // Call display list with nested push/pop @@ -948,16 +948,16 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "After display list with nested push/pop"); // Outer pop - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); // Should restore to original texA verifyState(GL11.GL_TEXTURE_BINDING_2D, texA, "After outer pop"); // Cleanup - reset state to defaults - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(texA); - GLStateManager.glDeleteTextures(texB); - GLStateManager.glDeleteLists(listId, 1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(texA); + GLSMTextures.glDeleteTextures(texB); + GLSMDraws.glDeleteLists(listId, 1); } @Test @@ -970,53 +970,53 @@ class GLSM_PushPop_UnitTest { final int texC = GL11.glGenTextures(); // Initial state: texA on unit 0, nothing on unit 1 - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texA); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texA); // Create display list that only modifies unit 0 final int listId = GL11.glGenLists(1); - GLStateManager.glNewList(listId, GL11.GL_COMPILE); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texC); - GLStateManager.glEndList(); + GLSMDraws.glNewList(listId, GL11.GL_COMPILE); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texC); + GLSMDraws.glEndList(); // Push, then work on unit 1 - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texB); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texB); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); // Call display list - modifies unit 0 while we're "on" unit 1 DisplayListManager.glCallList(listId); // Verify: unit 0 changed, unit 1 unchanged - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); verifyState(GL11.GL_TEXTURE_BINDING_2D, texC, "After list - unit 0 changed to texC"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); verifyState(GL11.GL_TEXTURE_BINDING_2D, texB, "After list - unit 1 still texB"); verifyIsEnabled(GL11.GL_TEXTURE_2D, true, "After list - unit 1 still enabled"); // Pop - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); // Both units should be restored verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "After pop - active unit"); verifyState(GL11.GL_TEXTURE_BINDING_2D, texA, "After pop - unit 0 restored to texA"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); verifyState(GL11.GL_TEXTURE_BINDING_2D, 0, "After pop - unit 1 restored to 0"); verifyIsEnabled(GL11.GL_TEXTURE_2D, false, "After pop - unit 1 disabled"); // Cleanup - reset all state to defaults - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(texA); - GLStateManager.glDeleteTextures(texB); - GLStateManager.glDeleteTextures(texC); - GLStateManager.glDeleteLists(listId, 1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(texA); + GLSMTextures.glDeleteTextures(texB); + GLSMTextures.glDeleteTextures(texC); + GLSMDraws.glDeleteLists(listId, 1); } @Test @@ -1028,15 +1028,15 @@ class GLSM_PushPop_UnitTest { // Create display list that sets color to red final int listId = GL11.glGenLists(1); - GLStateManager.glNewList(listId, GL11.GL_COMPILE); - GLStateManager.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glEndList(); + GLSMDraws.glNewList(listId, GL11.GL_COMPILE); + GLSMCurrentAttribs.glColor4f(1.0f, 0.0f, 0.0f, 1.0f); + GLSMDraws.glEndList(); // Push (note: GL_CURRENT_BIT includes color) - GLStateManager.glPushAttrib(GL11.GL_CURRENT_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_CURRENT_BIT); // Set color to green - GLStateManager.glColor4f(0.0f, 1.0f, 0.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(0.0f, 1.0f, 0.0f, 1.0f); verifyState(GL11.GL_CURRENT_COLOR, new float[]{0.0f, 1.0f, 0.0f, 1.0f}, "After setting green"); // Call display list - sets to red @@ -1044,12 +1044,12 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_CURRENT_COLOR, new float[]{1.0f, 0.0f, 0.0f, 1.0f}, "After display list - red"); // Pop - should restore to white (initial state before push) - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_CURRENT_COLOR, FLOAT_ARRAY_4_1, "After pop - restored to white"); // Cleanup - ensure color is reset to white - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glDeleteLists(listId, 1); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMDraws.glDeleteLists(listId, 1); } @Test @@ -1064,17 +1064,17 @@ class GLSM_PushPop_UnitTest { // Create display list that enables blend with specific function final int listId = GL11.glGenLists(1); - GLStateManager.glNewList(listId, GL11.GL_COMPILE); - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - GLStateManager.glEndList(); + GLSMDraws.glNewList(listId, GL11.GL_COMPILE); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMDraws.glEndList(); // Push - GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); // Set different blend state - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); // Call display list - changes blend function DisplayListManager.glCallList(listId); @@ -1083,15 +1083,15 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_BLEND_DST, GL11.GL_ONE, "After list - blend dst ONE"); // Pop - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_BLEND, false, "After pop - blend disabled"); verifyState(GL11.GL_BLEND_SRC, GL11.GL_ONE, "After pop - blend src restored"); verifyState(GL11.GL_BLEND_DST, GL11.GL_ZERO, "After pop - blend dst restored"); // Cleanup - ensure blend is reset to defaults - GLStateManager.disableBlend(); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glDeleteLists(listId, 1); + GLSMBlend.disableBlend(); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); + GLSMDraws.glDeleteLists(listId, 1); // Verify GLSM cache matches actual GL state (exposes cache sync bugs) verifyState(GL11.GL_CURRENT_COLOR, FLOAT_ARRAY_4_1, "color should still be white"); @@ -1100,67 +1100,67 @@ class GLSM_PushPop_UnitTest { @Test void testTextureUnitPopAttribRestoresCorrectUnit() { // Setup: Unit 0 ENABLED, Unit 1 disabled - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); verifyIsEnabled(GL11.GL_TEXTURE_2D, true, "Initial - Unit 0 enabled"); - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); // Modify ONLY unit 1 - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); // Unit 0 should still be enabled - bug causes it to be disabled verifyIsEnabled(GL11.GL_TEXTURE_2D, true, "After pop - Unit 0 still enabled"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); verifyIsEnabled(GL11.GL_TEXTURE_2D, false, "After pop - Unit 1 disabled"); // Cleanup - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); } @Test void testBlendFuncGL11AliasesMatchGL14() { - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); verifyState(GL11.GL_BLEND_SRC, GL11.GL_SRC_ALPHA, "Blend Source"); verifyState(GL14.GL_BLEND_SRC_RGB, GL11.GL_SRC_ALPHA, "Blend Source RGB"); verifyState(GL11.GL_BLEND_DST, GL11.GL_ONE_MINUS_SRC_ALPHA, "Blend Destination"); verifyState(GL14.GL_BLEND_DST_RGB, GL11.GL_ONE_MINUS_SRC_ALPHA, "Blend Destination RGB"); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); } @Test void testBlendFuncSeparateGL11AliasesTrackRgb() { - GLStateManager.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); verifyState(GL11.GL_BLEND_SRC, GL11.GL_SRC_ALPHA, "Blend Source"); verifyState(GL11.GL_BLEND_DST, GL11.GL_ONE_MINUS_SRC_ALPHA, "Blend Destination"); verifyState(GL14.GL_BLEND_SRC_ALPHA, GL11.GL_ONE, "Blend Source Alpha"); verifyState(GL14.GL_BLEND_DST_ALPHA, GL11.GL_ZERO, "Blend Destination Alpha"); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); } @Test void testUntouchedPushPopRoundTripLeavesStateIdentical() { - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.glLineWidth(3.0f); - GLStateManager.glViewport(2, 2, 640, 480); - GLStateManager.glCullFace(GL11.GL_FRONT); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMRasterizer.glLineWidth(3.0f); + GLSMRasterizer.glViewport(2, 2, 640, 480); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPopAttrib(); verifyState(GL11.GL_DEPTH_FUNC, GL11.GL_LEQUAL, "Depth Func - untouched round trip"); verifyState(GL11.GL_BLEND_SRC, GL11.GL_SRC_ALPHA, "Blend Source - untouched round trip"); @@ -1170,10 +1170,10 @@ class GLSM_PushPop_UnitTest { verifyState(GL11.GL_CULL_FACE_MODE, GL11.GL_FRONT, "Cull Face Mode - untouched round trip"); verifyState(GL13.GL_ACTIVE_TEXTURE, GL13.GL_TEXTURE0, "Active Texture - untouched round trip"); - GLStateManager.glDepthFunc(GL11.GL_LESS); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glLineWidth(1.0f); - GLStateManager.glViewport(0, 0, 800, 600); - GLStateManager.glCullFace(GL11.GL_BACK); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); + GLSMRasterizer.glLineWidth(1.0f); + GLSMRasterizer.glViewport(0, 0, 800, 600); + GLSMRasterizer.glCullFace(GL11.GL_BACK); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_RetainedState_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_RetainedState_GLTest.java index f5921ab8e..49a0a0c0b 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_RetainedState_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_RetainedState_GLTest.java @@ -18,59 +18,59 @@ public class GLSM_RetainedState_GLTest { private static final StateSet ALL = StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS); private static void baseline() { - GLStateManager.enableCull(); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glDepthMask(true); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMRasterizer.enableCull(); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } private static void mutate(int texture) { - GLStateManager.disableCull(); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ONE); - GLStateManager.glDepthMask(false); - GLStateManager.glDepthFunc(GL11.GL_ALWAYS); - GLStateManager.glAlphaFunc(GL11.GL_GEQUAL, 0.5F); - GLStateManager.glColor4f(0.25F, 0.5F, 0.75F, 0.5F); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMRasterizer.disableCull(); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ONE); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GEQUAL, 0.5F); + GLSMCurrentAttribs.glColor4f(0.25F, 0.5F, 0.75F, 0.5F); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); } private static void assertBaseline() { - assertTrue(GLStateManager.glIsEnabled(GL11.GL_CULL_FACE)); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE)); assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE)); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_BLEND)); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_BLEND)); assertFalse(GL11.glIsEnabled(GL11.GL_BLEND)); assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB)); assertEquals(GL11.GL_ZERO, GL11.glGetInteger(GL14.GL_BLEND_DST_ALPHA)); assertTrue(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK)); assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC)); - assertEquals(GL11.GL_GREATER, GLStateManager.glGetInteger(GL11.GL_ALPHA_TEST_FUNC)); - assertEquals(1.0F, GLStateManager.getColor().getRed(), 0.0F); + assertEquals(GL11.GL_GREATER, GLSMQueries.glGetInteger(GL11.GL_ALPHA_TEST_FUNC)); + assertEquals(1.0F, GLSMCurrentAttribs.getColor().getRed(), 0.0F); assertEquals(0, driverTextureBinding(0)); } private static void assertMutated(int texture) { - assertFalse(GLStateManager.glIsEnabled(GL11.GL_CULL_FACE)); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE)); assertFalse(GL11.glIsEnabled(GL11.GL_CULL_FACE)); - assertTrue(GLStateManager.glIsEnabled(GL11.GL_BLEND)); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_BLEND)); assertTrue(GL11.glIsEnabled(GL11.GL_BLEND)); assertEquals(GL11.GL_DST_COLOR, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB)); assertEquals(GL11.GL_ZERO, GL11.glGetInteger(GL14.GL_BLEND_DST_RGB)); assertEquals(GL11.GL_ONE, GL11.glGetInteger(GL14.GL_BLEND_SRC_ALPHA)); assertEquals(GL11.GL_ONE, GL11.glGetInteger(GL14.GL_BLEND_DST_ALPHA)); - assertEquals(GL11.GL_DST_COLOR, GLStateManager.glGetInteger(GL14.GL_BLEND_SRC_RGB)); + assertEquals(GL11.GL_DST_COLOR, GLSMQueries.glGetInteger(GL14.GL_BLEND_SRC_RGB)); assertFalse(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK)); assertEquals(GL11.GL_ALWAYS, GL11.glGetInteger(GL11.GL_DEPTH_FUNC)); - assertEquals(GL11.GL_GEQUAL, GLStateManager.glGetInteger(GL11.GL_ALPHA_TEST_FUNC)); - assertEquals(0.25F, GLStateManager.getColor().getRed(), 0.0F); - assertEquals(0.5F, GLStateManager.getColor().getAlpha(), 0.0F); + assertEquals(GL11.GL_GEQUAL, GLSMQueries.glGetInteger(GL11.GL_ALPHA_TEST_FUNC)); + assertEquals(0.25F, GLSMCurrentAttribs.getColor().getRed(), 0.0F); + assertEquals(0.5F, GLSMCurrentAttribs.getColor().getAlpha(), 0.0F); assertEquals(texture, driverTextureBinding(0)); - assertEquals(texture, GLStateManager.getBoundTextureForServerState(0)); + assertEquals(texture, GLSMTextures.getBoundTextureForServerState(0)); } @Test @@ -79,18 +79,18 @@ public class GLSM_RetainedState_GLTest { final RetainedState retained = new RetainedState(); try { baseline(); - final int d = GLStateManager.pushState(ALL); + final int d = GLSMAttribStack.pushState(ALL); mutate(texture); - GLStateManager.retainModifiedState(d, retained); - GLStateManager.popStateTo(d); + GLSMAttribStack.retainModifiedState(d, retained); + GLSMAttribStack.popStateTo(d); assertBaseline(); - GLStateManager.applyRetainedState(retained); + GLSMAttribStack.applyRetainedState(retained); assertMutated(texture); baseline(); assertBaseline(); - GLStateManager.applyRetainedState(retained); + GLSMAttribStack.applyRetainedState(retained); assertMutated(texture); } finally { baseline(); @@ -104,15 +104,15 @@ public class GLSM_RetainedState_GLTest { final RetainedState retained = new RetainedState(); try { baseline(); - final int d = GLStateManager.pushState(ALL); + final int d = GLSMAttribStack.pushState(ALL); mutate(texture); - GLStateManager.retainModifiedState(d, retained); - GLStateManager.popStateTo(d); + GLSMAttribStack.retainModifiedState(d, retained); + GLSMAttribStack.popStateTo(d); - final int outer = GLStateManager.pushState(ALL); - GLStateManager.applyRetainedState(retained); + final int outer = GLSMAttribStack.pushState(ALL); + GLSMAttribStack.applyRetainedState(retained); assertMutated(texture); - GLStateManager.popStateTo(outer); + GLSMAttribStack.popStateTo(outer); assertBaseline(); } finally { baseline(); @@ -125,18 +125,18 @@ public class GLSM_RetainedState_GLTest { final RetainedState retained = new RetainedState(); try { baseline(); - final int d = GLStateManager.pushState(ALL); - GLStateManager.enableBlend(); - final int nested = GLStateManager.pushState(ALL); - GLStateManager.disableCull(); - GLStateManager.popStateTo(nested); - GLStateManager.retainModifiedState(d, retained); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(ALL); + GLSMBlend.enableBlend(); + final int nested = GLSMAttribStack.pushState(ALL); + GLSMRasterizer.disableCull(); + GLSMAttribStack.popStateTo(nested); + GLSMAttribStack.retainModifiedState(d, retained); + GLSMAttribStack.popStateTo(d); - GLStateManager.applyRetainedState(retained); + GLSMAttribStack.applyRetainedState(retained); assertTrue(GL11.glIsEnabled(GL11.GL_BLEND)); assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE)); - assertTrue(GLStateManager.glIsEnabled(GL11.GL_CULL_FACE)); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE)); } finally { baseline(); } @@ -148,26 +148,26 @@ public class GLSM_RetainedState_GLTest { final RetainedState retained = new RetainedState(); try { baseline(); - final int d = GLStateManager.pushState(ALL); + final int d = GLSMAttribStack.pushState(ALL); mutate(texture); - GLStateManager.retainModifiedState(d, retained); - GLStateManager.popStateTo(d); - GLStateManager.applyRetainedState(retained); + GLSMAttribStack.retainModifiedState(d, retained); + GLSMAttribStack.popStateTo(d); + GLSMAttribStack.applyRetainedState(retained); final GLContextState glCtx = GLStateManager.ctx(); - final long backendCalls = GLStateManager.attribBackendCalls; + final long backendCalls = GLSMAttribStack.attribBackendCalls; final int colorGen = glCtx.colorGeneration; final int fragmentGen = glCtx.fragmentGeneration; final int batchGen = glCtx.batchStateGeneration; - GLStateManager.applyRetainedState(retained); - assertEquals(backendCalls, GLStateManager.attribBackendCalls); + GLSMAttribStack.applyRetainedState(retained); + assertEquals(backendCalls, GLSMAttribStack.attribBackendCalls); assertEquals(colorGen, glCtx.colorGeneration); assertEquals(fragmentGen, glCtx.fragmentGeneration); assertEquals(batchGen, glCtx.batchStateGeneration); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.applyRetainedState(retained); - assertEquals(backendCalls + 3, GLStateManager.attribBackendCalls); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMAttribStack.applyRetainedState(retained); + assertEquals(backendCalls + 3, GLSMAttribStack.attribBackendCalls); assertMutated(texture); } finally { baseline(); @@ -181,20 +181,20 @@ public class GLSM_RetainedState_GLTest { final RetainedState second = new RetainedState(); try { baseline(); - int d = GLStateManager.pushState(ALL); - GLStateManager.enableBlend(); - GLStateManager.retainModifiedState(d, first); - GLStateManager.popStateTo(d); + int d = GLSMAttribStack.pushState(ALL); + GLSMBlend.enableBlend(); + GLSMAttribStack.retainModifiedState(d, first); + GLSMAttribStack.popStateTo(d); - d = GLStateManager.pushState(ALL); - GLStateManager.disableCull(); - GLStateManager.retainModifiedState(d, second); - GLStateManager.popStateTo(d); + d = GLSMAttribStack.pushState(ALL); + GLSMRasterizer.disableCull(); + GLSMAttribStack.retainModifiedState(d, second); + GLSMAttribStack.popStateTo(d); - GLStateManager.applyRetainedState(first); + GLSMAttribStack.applyRetainedState(first); assertFalse(GL11.glIsEnabled(GL11.GL_BLEND)); assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE)); - GLStateManager.applyRetainedState(second); + GLSMAttribStack.applyRetainedState(second); assertFalse(GL11.glIsEnabled(GL11.GL_BLEND)); assertFalse(GL11.glIsEnabled(GL11.GL_CULL_FACE)); } finally { @@ -207,21 +207,21 @@ public class GLSM_RetainedState_GLTest { final RetainedState retained = new RetainedState(); try { baseline(); - GLStateManager.glClearColor(0.25F, 0.5F, 0.75F, 1.0F); - final int outer = GLStateManager.pushState(ALL); - GLStateManager.glClearColor(0.0F, 0.0F, 0.0F, 0.0F); - final int inner = GLStateManager.pushState(ALL); - GLStateManager.enableBlend(); - GLStateManager.retainModifiedState(inner, retained); - GLStateManager.popStateTo(outer); + GLSMBlend.glClearColor(0.25F, 0.5F, 0.75F, 1.0F); + final int outer = GLSMAttribStack.pushState(ALL); + GLSMBlend.glClearColor(0.0F, 0.0F, 0.0F, 0.0F); + final int inner = GLSMAttribStack.pushState(ALL); + GLSMBlend.enableBlend(); + GLSMAttribStack.retainModifiedState(inner, retained); + GLSMAttribStack.popStateTo(outer); - GLStateManager.applyRetainedState(retained); + GLSMAttribStack.applyRetainedState(retained); assertTrue(GL11.glIsEnabled(GL11.GL_BLEND)); - assertEquals(0.25F, GLStateManager.getClearColor().getRed(), 0.0F); - assertEquals(1.0F, GLStateManager.getClearColor().getAlpha(), 0.0F); + assertEquals(0.25F, GLSMBlend.getClearColor().getRed(), 0.0F); + assertEquals(1.0F, GLSMBlend.getClearColor().getAlpha(), 0.0F); } finally { baseline(); - GLStateManager.glClearColor(0.0F, 0.0F, 0.0F, 0.0F); + GLSMBlend.glClearColor(0.0F, 0.0F, 0.0F, 0.0F); } } @@ -231,18 +231,18 @@ public class GLSM_RetainedState_GLTest { final int program = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS); try { baseline(); - final int d = GLStateManager.pushState(ALL); - GLStateManager.glUseProgram(program); - GLStateManager.retainModifiedState(d, retained); - GLStateManager.popStateTo(d); - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(program); + final int d = GLSMAttribStack.pushState(ALL); + GLSMPrograms.glUseProgram(program); + GLSMAttribStack.retainModifiedState(d, retained); + GLSMAttribStack.popStateTo(d); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(program); drainErrors(); - GLStateManager.applyRetainedState(retained); - assertEquals(0, GLStateManager.getActiveProgram()); + GLSMAttribStack.applyRetainedState(retained); + assertEquals(0, GLSMPrograms.getActiveProgram()); } finally { - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); baseline(); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SamplerBinding_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SamplerBinding_GLTest.java index dd732c800..d19970eda 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SamplerBinding_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SamplerBinding_GLTest.java @@ -32,10 +32,10 @@ class GLSM_SamplerBinding_GLTest { void unbindTestUnits() { if (!RenderSystem.supportsSamplerObjects()) return; for (int unit = 0; unit < UNITS; unit++) { - GLStateManager.glBindSampler(unit, 0); + GLSMTextures.glBindSampler(unit, 0); GL33.glBindSampler(unit, 0); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private static int driverBinding(int unit) { @@ -48,7 +48,7 @@ class GLSM_SamplerBinding_GLTest { private static void assertUnits(String context, int... expected) { for (int unit = 0; unit < expected.length; unit++) { - assertEquals(expected[unit], GLStateManager.getSamplerBinding(unit), context + ": cache unit " + unit); + assertEquals(expected[unit], GLSMTextures.getSamplerBinding(unit), context + ": cache unit " + unit); assertEquals(expected[unit], driverBinding(unit), context + ": driver unit " + unit); } } @@ -64,7 +64,7 @@ class GLSM_SamplerBinding_GLTest { final int sampler = RenderSystem.genSampler(); try { RenderSystem.bindSamplerToUnit(0, sampler); - GLStateManager.glBindSampler(0, 0); + GLSMTextures.glBindSampler(0, 0); assertEquals(0, driverBinding(0), "setup: GLSM unbind must reach the driver"); RenderSystem.bindSamplerToUnit(0, sampler); @@ -78,16 +78,16 @@ class GLSM_SamplerBinding_GLTest { @Test void deleteClearsEveryUnitAndTheNextBindReachesDriver() { final int sampler = RenderSystem.genSampler(); - GLStateManager.glBindSampler(1, sampler); - GLStateManager.glBindSampler(3, sampler); + GLSMTextures.glBindSampler(1, sampler); + GLSMTextures.glBindSampler(3, sampler); - GLStateManager.glDeleteSamplers(sampler); + GLSMTextures.glDeleteSamplers(sampler); assertUnits("after delete", 0, 0, 0, 0); final int next = RenderSystem.genSampler(); try { - GLStateManager.glBindSampler(1, next); + GLSMTextures.glBindSampler(1, next); assertEquals(next, driverBinding(1), "bind after delete never reached the driver"); } finally { RenderSystem.destroySampler(next); @@ -98,17 +98,17 @@ class GLSM_SamplerBinding_GLTest { void samplerBindingQueryAnswersForTheActiveUnit() { final int sampler = RenderSystem.genSampler(); try { - GLStateManager.glBindSampler(1, sampler); + GLSMTextures.glBindSampler(1, sampler); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); assertEquals(GL11.glGetInteger(GL33.GL_SAMPLER_BINDING), - GLStateManager.glGetInteger(GL33.GL_SAMPLER_BINDING)); - assertEquals(sampler, GLStateManager.glGetInteger(GL33.GL_SAMPLER_BINDING)); + GLSMQueries.glGetInteger(GL33.GL_SAMPLER_BINDING)); + assertEquals(sampler, GLSMQueries.glGetInteger(GL33.GL_SAMPLER_BINDING)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); assertEquals(GL11.glGetInteger(GL33.GL_SAMPLER_BINDING), - GLStateManager.glGetInteger(GL33.GL_SAMPLER_BINDING)); - assertEquals(0, GLStateManager.glGetInteger(GL33.GL_SAMPLER_BINDING)); + GLSMQueries.glGetInteger(GL33.GL_SAMPLER_BINDING)); + assertEquals(0, GLSMQueries.glGetInteger(GL33.GL_SAMPLER_BINDING)); } finally { RenderSystem.destroySampler(sampler); } @@ -120,8 +120,8 @@ class GLSM_SamplerBinding_GLTest { final Runnable previousFlush = BatchStateGuard.flush; final AtomicInteger flushes = new AtomicInteger(); try { - GLStateManager.glBindSampler(1, sampler); - GLStateManager.glBindSampler(3, sampler); + GLSMTextures.glBindSampler(1, sampler); + GLSMTextures.glBindSampler(3, sampler); BatchStateGuard.flush = () -> { assertEquals(sampler, driverBinding(1), "deferred draws must see the original bindings"); assertEquals(sampler, driverBinding(3), "deferred draws must see the original bindings"); @@ -134,8 +134,8 @@ class GLSM_SamplerBinding_GLTest { assertEquals(1, flushes.get(), "bulk unbind should drain deferred draws once"); assertEquals(0, driverBinding(1), "unit 1 still bound on the driver"); assertEquals(0, driverBinding(3), "unit 3 still bound on the driver"); - assertEquals(0, GLStateManager.getSamplerBinding(1)); - assertEquals(0, GLStateManager.getSamplerBinding(3)); + assertEquals(0, GLSMTextures.getSamplerBinding(1)); + assertEquals(0, GLSMTextures.getSamplerBinding(3)); } finally { BatchStateGuard.flush = previousFlush; RenderSystem.destroySampler(sampler); @@ -147,14 +147,14 @@ class GLSM_SamplerBinding_GLTest { final int highUnit = RenderSystem.getMaxCombinedTextureImageUnits() - 1; final int sampler = RenderSystem.genSampler(); try { - GLStateManager.glBindSampler(2, sampler); - GLStateManager.glBindSampler(highUnit, sampler); + GLSMTextures.glBindSampler(2, sampler); + GLSMTextures.glBindSampler(highUnit, sampler); GL33.glBindSampler(2, 0); GL33.glBindSampler(highUnit, 0); assertEquals(0, driverBinding(2), "setup failed to diverge the driver"); assertEquals(0, driverBinding(highUnit), "setup failed to diverge the driver"); - GLStateManager.replayStateToBackend(); + GLSMAttribStack.replayStateToBackend(); assertEquals(sampler, driverBinding(2), "replay dropped a cached sampler binding"); assertEquals(sampler, driverBinding(highUnit), "replay skipped the highest bound unit"); @@ -169,16 +169,16 @@ class GLSM_SamplerBinding_GLTest { final int low = RenderSystem.genSampler(); final int high = RenderSystem.genSampler(); try { - GLStateManager.glBindSampler(1, low); - GLStateManager.glBindSampler(3, high); - GLStateManager.glBindSampler(highUnit, high); + GLSMTextures.glBindSampler(1, low); + GLSMTextures.glBindSampler(3, high); + GLSMTextures.glBindSampler(highUnit, high); assertEquals(highUnit, GLStateManager.ctx().samplerUnits.getHighestBoundUnit()); - GLStateManager.glBindSampler(highUnit, 0); + GLSMTextures.glBindSampler(highUnit, 0); assertEquals(3, GLStateManager.ctx().samplerUnits.getHighestBoundUnit()); assertEquals(0, driverBinding(highUnit)); - GLStateManager.glBindSampler(highUnit, high); + GLSMTextures.glBindSampler(highUnit, high); RenderSystem.destroySampler(high); assertEquals(1, GLStateManager.ctx().samplerUnits.getHighestBoundUnit()); assertEquals(0, driverBinding(highUnit)); @@ -188,7 +188,7 @@ class GLSM_SamplerBinding_GLTest { assertEquals(-1, GLStateManager.ctx().samplerUnits.getHighestBoundUnit()); assertEquals(0, driverBinding(1)); - GLStateManager.glBindSampler(highUnit, low); + GLSMTextures.glBindSampler(highUnit, low); RenderSystem.unbindAllSamplers(); RenderSystem.unbindAllSamplers(); assertEquals(-1, GLStateManager.ctx().samplerUnits.getHighestBoundUnit()); @@ -203,7 +203,7 @@ class GLSM_SamplerBinding_GLTest { void intBufferGenFillsFromPositionWithBindableSamplers() { final IntBuffer buf = ints(-1, 0, 0); buf.position(1); - GLStateManager.glGenSamplers(buf); + GLSMTextures.glGenSamplers(buf); final int a = buf.get(1); final int b = buf.get(2); try { @@ -213,15 +213,15 @@ class GLSM_SamplerBinding_GLTest { assertNotEquals(0, b); assertNotEquals(a, b); - GLStateManager.glBindSampler(0, a); - GLStateManager.glBindSampler(1, b); + GLSMTextures.glBindSampler(0, a); + GLSMTextures.glBindSampler(1, b); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "generated name rejected by the driver"); assertEquals(a, driverBinding(0)); assertEquals(b, driverBinding(1)); } finally { - GLStateManager.glDeleteSamplers(a); - GLStateManager.glDeleteSamplers(b); + GLSMTextures.glDeleteSamplers(a); + GLSMTextures.glDeleteSamplers(b); } } @@ -233,22 +233,22 @@ class GLSM_SamplerBinding_GLTest { final IntBuffer buf = ints(-1, a, b); buf.position(1); - GLStateManager.glBindSamplers(1, 2, buf); + GLSMTextures.glBindSamplers(1, 2, buf); assertEquals(1, buf.position(), "count form must not move the buffer position"); assertUnits("count form", 0, a, b, 0); - GLStateManager.glBindSampler(1, 0); - GLStateManager.glBindSampler(2, 0); + GLSMTextures.glBindSampler(1, 0); + GLSMTextures.glBindSampler(2, 0); buf.position(1); - GLStateManager.glBindSamplers(1, buf); + GLSMTextures.glBindSamplers(1, buf); assertEquals(1, buf.position(), "remaining form must not move the buffer position"); assertUnits("remaining form", 0, a, b, 0); - GLStateManager.glBindSamplers(1, (IntBuffer) null); + GLSMTextures.glBindSamplers(1, (IntBuffer) null); assertUnits("null remaining form", 0, a, b, 0); - GLStateManager.glBindSamplers(2, new int[]{a, b}); + GLSMTextures.glBindSamplers(2, new int[]{a, b}); assertUnits("int[] form", 0, a, a, b); } finally { RenderSystem.destroySampler(a); @@ -261,16 +261,16 @@ class GLSM_SamplerBinding_GLTest { final int prior = RenderSystem.genSampler(); final int next = RenderSystem.genSampler(); try { - for (int unit = 0; unit < UNITS; unit++) GLStateManager.glBindSampler(unit, prior); + for (int unit = 0; unit < UNITS; unit++) GLSMTextures.glBindSampler(unit, prior); - GLStateManager.glBindSamplers(1, 2, (IntBuffer) null); + GLSMTextures.glBindSamplers(1, 2, (IntBuffer) null); assertUnits("null count form", prior, 0, 0, prior); - for (int unit = 0; unit < UNITS; unit++) GLStateManager.glBindSampler(unit, prior); + for (int unit = 0; unit < UNITS; unit++) GLSMTextures.glBindSampler(unit, prior); final IntBuffer buf = ints(next, next); - assertThrows(IllegalArgumentException.class, () -> GLStateManager.glBindSamplers(0, UNITS, buf)); + assertThrows(IllegalArgumentException.class, () -> GLSMTextures.glBindSamplers(0, UNITS, buf)); assertEquals(0, buf.position()); assertUnits("short buffer", prior, prior, prior, prior); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java index 0d3d98567..58085f7f8 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ServerSideState_UnitTest.java @@ -244,12 +244,12 @@ public class GLSM_ServerSideState_UnitTest { static Stream texParams() { return Stream.of( new TexParam("glTexParameteri MIN_FILTER", GL11.GL_LINEAR, GL11.GL_NEAREST, - v -> GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, (int) v), - () -> GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER), + v -> GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, (int) v), + () -> GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER), () -> GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER)), new TexParam("glTexParameterf LOD_BIAS", 0.0f, 1.5f, - v -> GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, v), - () -> GLStateManager.glGetTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS), + v -> GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, v), + () -> GLSMTextures.glGetTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS), () -> GL11.glGetTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS))); } @@ -262,14 +262,14 @@ public class GLSM_ServerSideState_UnitTest { int texId = GL11.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); param.set.accept(param.initial); assertEquals(param.initial, param.glsm.get(), 0.001f, "Initial GLSM value"); assertEquals(param.initial, param.driver.get(), 0.001f, "Initial GL value"); executeOnSharedDrawable(() -> { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); int boundTex = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); assertEquals(texId, boundTex, "SharedDrawable should have texId bound"); @@ -280,14 +280,14 @@ public class GLSM_ServerSideState_UnitTest { assertEquals(param.changed, param.driver.get(), 0.001f, "SharedDrawable GL value"); }); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); assertEquals(param.changed, param.glsm.get(), 0.001f, "Main thread GLSM value"); assertEquals(param.changed, param.driver.get(), 0.001f, "Main thread GL value"); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(texId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(texId); } } @@ -302,59 +302,59 @@ public class GLSM_ServerSideState_UnitTest { int texIdB = GL11.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdA); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdA); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdB); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdB); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdA); - int initialA_GLSM = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdA); + int initialA_GLSM = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); int initialA_GL = GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); assertEquals(GL11.GL_LINEAR, initialA_GLSM, "texIdA initial GLSM should be LINEAR"); assertEquals(GL11.GL_LINEAR, initialA_GL, "texIdA initial GL should be LINEAR"); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdB); - int initialB_GLSM = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdB); + int initialB_GLSM = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); int initialB_GL = GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); assertEquals(GL11.GL_LINEAR_MIPMAP_LINEAR, initialB_GLSM, "texIdB initial GLSM should be LINEAR_MIPMAP_LINEAR"); assertEquals(GL11.GL_LINEAR_MIPMAP_LINEAR, initialB_GL, "texIdB initial GL should be LINEAR_MIPMAP_LINEAR"); - assertEquals(texIdB, GLStateManager.getBoundTextureForServerState(), "Main thread should have texIdB bound"); + assertEquals(texIdB, GLSMTextures.getBoundTextureForServerState(), "Main thread should have texIdB bound"); // SharedDrawable: bind texIdA and change its MIN_FILTER to NEAREST // Main thread has texIdB bound, but SharedDrawable should correctly update texIdA's params, not texIdB's executeOnSharedDrawable(() -> { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdA); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdA); int bound = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); assertEquals(texIdA, bound, "SharedDrawable should have texIdA bound"); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - int glsmValue = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); + int glsmValue = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); assertEquals(GL11.GL_NEAREST, glsmValue, "SharedDrawable GLSM should return NEAREST for texIdA"); int glValue = GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); assertEquals(GL11.GL_NEAREST, glValue, "SharedDrawable GL should be NEAREST for texIdA"); }); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdA); - int finalA_GLSM = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdA); + int finalA_GLSM = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); int finalA_GL = GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); assertEquals(GL11.GL_NEAREST, finalA_GLSM, "texIdA final GLSM should be NEAREST (SharedDrawable's update)"); assertEquals(GL11.GL_NEAREST, finalA_GL, "texIdA final GL should be NEAREST"); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texIdB); - int finalB_GLSM = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texIdB); + int finalB_GLSM = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); int finalB_GL = GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); assertEquals(GL11.GL_LINEAR_MIPMAP_LINEAR, finalB_GLSM, "texIdB should NOT be modified by SharedDrawable"); assertEquals(GL11.GL_LINEAR_MIPMAP_LINEAR, finalB_GL, "texIdB GL should NOT be modified"); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(texIdA); - GLStateManager.glDeleteTextures(texIdB); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(texIdA); + GLSMTextures.glDeleteTextures(texIdB); } } @@ -367,24 +367,24 @@ public class GLSM_ServerSideState_UnitTest { int texId2 = GL11.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId1); - assertEquals(texId1, GLStateManager.getBoundTextureForServerState(), "Main thread cache should show texId1 bound"); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId1); + assertEquals(texId1, GLSMTextures.getBoundTextureForServerState(), "Main thread cache should show texId1 bound"); executeOnSharedDrawable(() -> { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId2); - assertEquals(texId2, GLStateManager.getBoundTextureForServerState(), "SharedDrawable cache should show texId2 bound"); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId2); + assertEquals(texId2, GLSMTextures.getBoundTextureForServerState(), "SharedDrawable cache should show texId2 bound"); assertEquals(texId2, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "SharedDrawable actual GL binding should be texId2"); }); - assertEquals(texId1, GLStateManager.getBoundTextureForServerState(), "Main thread cache should still show texId1 (client-side state is per-context)"); + assertEquals(texId1, GLSMTextures.getBoundTextureForServerState(), "Main thread cache should still show texId1 (client-side state is per-context)"); int actualBinding = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); assertEquals(texId1, actualBinding, "Main thread actual GL binding should still be texId1"); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(texId1); - GLStateManager.glDeleteTextures(texId2); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(texId1); + GLSMTextures.glDeleteTextures(texId2); } } @@ -396,21 +396,21 @@ public class GLSM_ServerSideState_UnitTest { int texId = GL11.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - int initialWidth = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); - int initialHeight = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); + int initialWidth = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); + int initialHeight = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); assertEquals(64, initialWidth, "Initial width should be 64"); assertEquals(64, initialHeight, "Initial height should be 64"); // SharedDrawable: re-upload with different dimensions executeOnSharedDrawable(() -> { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 128, 256, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 128, 256, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - int sharedWidth = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); - int sharedHeight = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); + int sharedWidth = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); + int sharedHeight = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); assertEquals(128, sharedWidth, "SharedDrawable GLSM width should be 128"); assertEquals(256, sharedHeight, "SharedDrawable GLSM height should be 256"); @@ -420,10 +420,10 @@ public class GLSM_ServerSideState_UnitTest { assertEquals(256, glHeight, "SharedDrawable GL height should be 256"); }); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); - int finalWidth = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); - int finalHeight = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); + int finalWidth = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); + int finalHeight = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); assertEquals(128, finalWidth, "Main thread GLSM width should be 128"); assertEquals(256, finalHeight, "Main thread GLSM height should be 256"); @@ -433,44 +433,44 @@ public class GLSM_ServerSideState_UnitTest { assertEquals(256, glHeight, "Main thread GL height should be 256"); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(texId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(texId); } } @Test void testDeleteTexturesFromSharedDrawable() throws InterruptedException { - final int texId = GLStateManager.glGenTextures(); + final int texId = GLSMTextures.glGenTextures(); int flushGen = 0; try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 32, 32, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, 32, 32, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - assertEquals(GL11.GL_LINEAR, GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER), "Cache should have LINEAR before delete"); + assertEquals(GL11.GL_LINEAR, GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER), "Cache should have LINEAR before delete"); assertTrue(GL11.glIsTexture(texId), "Texture should exist before delete"); executeOnSharedDrawable(() -> { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); - GLStateManager.glDeleteTextures(texId); - assertEquals(0, GLStateManager.getBoundTextureForServerState(), "Delete should unbind from the deleting context"); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glDeleteTextures(texId); + assertEquals(0, GLSMTextures.getBoundTextureForServerState(), "Delete should unbind from the deleting context"); assertTrue(GL11.glIsTexture(texId), "Texture name should still be valid (deferred delete)"); }); - assertEquals(texId, GLStateManager.getBoundTextureForServerState(), "Main thread binding should survive until the flush"); + assertEquals(texId, GLSMTextures.getBoundTextureForServerState(), "Main thread binding should survive until the flush"); - final int deferredGen = GLStateManager.glGenTextures(); + final int deferredGen = GLSMTextures.glGenTextures(); GL11.glDeleteTextures(deferredGen); assertTrue(GL11.glIsTexture(texId), "Delete should stay deferred while the splash is not complete"); SplashWindow.setSplashComplete(true); - flushGen = GLStateManager.glGenTextures(); + flushGen = GLSMTextures.glGenTextures(); assertFalse(GL11.glIsTexture(texId), "Texture should be gone after the post-splash flush"); - assertEquals(0, GLStateManager.getBoundTextureForServerState(), "Flush should scrub the main thread binding"); + assertEquals(0, GLSMTextures.getBoundTextureForServerState(), "Flush should scrub the main thread binding"); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); if (flushGen != 0) GL11.glDeleteTextures(flushGen); if (GL11.glIsTexture(texId)) { GL11.glDeleteTextures(texId); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SharedDrawableContext_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SharedDrawableContext_GLTest.java index c9b121933..b2dbfde38 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SharedDrawableContext_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SharedDrawableContext_GLTest.java @@ -45,9 +45,9 @@ public class GLSM_SharedDrawableContext_GLTest { @AfterEach void cleanup() { - if (indexedList != 0) GLStateManager.glDeleteLists(indexedList, 1); - if (listVbo != 0) GLStateManager.glDeleteBuffers(listVbo); - if (listEbo != 0) GLStateManager.glDeleteBuffers(listEbo); + if (indexedList != 0) GLSMDraws.glDeleteLists(indexedList, 1); + if (listVbo != 0) GLSMBuffers.glDeleteBuffers(listVbo); + if (listEbo != 0) GLSMBuffers.glDeleteBuffers(listEbo); if (sharedDrawable != null) { DrawableContexts.destroy(sharedDrawable); sharedDrawable = null; @@ -109,52 +109,52 @@ public class GLSM_SharedDrawableContext_GLTest { @Test void foreignThreadCannotFinishOrRecordIntoActiveList() throws Exception { sharedDrawable = new SharedDrawable(Display.getDrawable()); - final int existing = GLStateManager.glGenLists(1); - final int active = GLStateManager.glGenLists(1); - final int rejected = GLStateManager.glGenLists(1); - GLStateManager.glNewList(existing, GL11.GL_COMPILE); - GLStateManager.enableBlend(); - GLStateManager.glEndList(); - GLStateManager.disableBlend(); + final int existing = GLSMDraws.glGenLists(1); + final int active = GLSMDraws.glGenLists(1); + final int rejected = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(existing, GL11.GL_COMPILE); + GLSMBlend.enableBlend(); + GLSMDraws.glEndList(); + GLSMBlend.disableBlend(); final CountDownLatch started = new CountDownLatch(1); final CountDownLatch finish = new CountDownLatch(1); final TestThreads.Worker worker = DrawableContexts.start(sharedDrawable, "SharedDrawableContext-List-Thread", () -> { - GLStateManager.glNewList(active, GL11.GL_COMPILE); + GLSMDraws.glNewList(active, GL11.GL_COMPILE); started.countDown(); if (!finish.await(5, TimeUnit.SECONDS)) throw new AssertionError("finish timed out"); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); }); try { try { assertTrue(started.await(5, TimeUnit.SECONDS)); - assertThrows(IllegalStateException.class, () -> GLStateManager.glNewList(rejected, GL11.GL_COMPILE)); - assertThrows(IllegalStateException.class, GLStateManager::glEndList); - assertEquals(0, GLStateManager.getListMode()); + assertThrows(IllegalStateException.class, () -> GLSMDraws.glNewList(rejected, GL11.GL_COMPILE)); + assertThrows(IllegalStateException.class, GLSMDraws::glEndList); + assertEquals(0, GLSMDraws.getListMode()); DisplayListManager.abortIfLeaked(); assertThrows(IllegalStateException.class, DisplayListManager::abortCompilation); - GLStateManager.glCallList(existing); - assertTrue(GLStateManager.glIsEnabled(GL11.GL_BLEND)); - assertEquals(0, GLStateManager.getListMode()); + GLSMDraws.glCallList(existing); + assertTrue(GLSMEnable.glIsEnabled(GL11.GL_BLEND)); + assertEquals(0, GLSMDraws.getListMode()); } finally { finish.countDown(); worker.join(); } assertTrue(DisplayListManager.displayListExists(active)); - GLStateManager.glCallList(active); + GLSMDraws.glCallList(active); } finally { - GLStateManager.glDeleteLists(existing, 1); - GLStateManager.glDeleteLists(active, 1); - GLStateManager.glDeleteLists(rejected, 1); - GLStateManager.disableBlend(); + GLSMDraws.glDeleteLists(existing, 1); + GLSMDraws.glDeleteLists(active, 1); + GLSMDraws.glDeleteLists(rejected, 1); + GLSMBlend.disableBlend(); } } @Test void simultaneousListStartsClaimOneOwner() throws Exception { sharedDrawable = new SharedDrawable(Display.getDrawable()); - final int first = GLStateManager.glGenLists(1); - final int second = GLStateManager.glGenLists(1); + final int first = GLSMDraws.glGenLists(1); + final int second = GLSMDraws.glGenLists(1); final CyclicBarrier start = new CyclicBarrier(2); final CountDownLatch attempted = new CountDownLatch(2); final AtomicInteger completed = new AtomicInteger(); @@ -162,7 +162,7 @@ public class GLSM_SharedDrawableContext_GLTest { final TestThreads.Worker worker = DrawableContexts.start(sharedDrawable, "SharedDrawableContext-List-Race-Thread", () -> { start.await(); try { - GLStateManager.glNewList(second, GL11.GL_COMPILE); + GLSMDraws.glNewList(second, GL11.GL_COMPILE); } catch (IllegalStateException expected) { rejected.incrementAndGet(); attempted.countDown(); @@ -170,27 +170,27 @@ public class GLSM_SharedDrawableContext_GLTest { } attempted.countDown(); if (!attempted.await(5, TimeUnit.SECONDS)) throw new AssertionError("attempts timed out"); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); completed.incrementAndGet(); }); try { start.await(); try { - GLStateManager.glNewList(first, GL11.GL_COMPILE); + GLSMDraws.glNewList(first, GL11.GL_COMPILE); } catch (IllegalStateException expected) { rejected.incrementAndGet(); attempted.countDown(); } - if (GLStateManager.getListMode() != 0) { + if (GLSMDraws.getListMode() != 0) { attempted.countDown(); assertTrue(attempted.await(5, TimeUnit.SECONDS)); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); completed.incrementAndGet(); } worker.join(); } finally { - GLStateManager.glDeleteLists(first, 1); - GLStateManager.glDeleteLists(second, 1); + GLSMDraws.glDeleteLists(first, 1); + GLSMDraws.glDeleteLists(second, 1); } assertEquals(1, completed.get()); assertEquals(1, rejected.get()); @@ -208,23 +208,23 @@ public class GLSM_SharedDrawableContext_GLTest { final FloatBuffer vertices = BufferUtils.createFloatBuffer(9); vertices.put(new float[] { -0.5f, -0.5f, 0f, 0.5f, -0.5f, 0f, 0f, 0.5f, 0f }); vertices.flip(); - final int vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW); + final int vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW); FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, 12, 0); VAOManager.setCurrentVertexFlags(0); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); GLStateManager.releaseContext(sharedDrawable); GLStateManager.makeCurrent(sharedDrawable); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); assertNotEquals(0, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM), "invalidateProgram must force a rebind after replay clears the program to 0"); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDeleteBuffers(vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glDeleteBuffers(vbo); } finally { sm.deactivate(); } @@ -241,20 +241,20 @@ public class GLSM_SharedDrawableContext_GLTest { indices.putShort((short) 0).putShort((short) 1).putShort((short) 2); indices.flip(); - listVbo = GLStateManager.glGenBuffers(); - listEbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindVertexArray(GLStateManager.glGenVertexArrays()); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, listVbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW); - GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0L); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, listEbo); - GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); + listVbo = GLSMBuffers.glGenBuffers(); + listEbo = GLSMBuffers.glGenBuffers(); + GLSMVertexInput.glBindVertexArray(GLSMVertexInput.glGenVertexArrays()); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, listVbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW); + GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0L); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, listEbo); + GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); - indexedList = GLStateManager.glGenLists(1); - GLStateManager.glNewList(indexedList, GL11.GL_COMPILE); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); - GLStateManager.glEndList(); + indexedList = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(indexedList, GL11.GL_COMPILE); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMDraws.glEndList(); final IndexedDrawBatch batch = indexedBatch(); batch.bind(); @@ -274,13 +274,13 @@ public class GLSM_SharedDrawableContext_GLTest { ShaderManager.enable(); sm.activate(); try { - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); indexedBatch().bind(); assertEquals(indexedBatch().getSharedEBO(), GL11.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING)); } finally { sm.deactivate(); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } } @@ -289,63 +289,63 @@ public class GLSM_SharedDrawableContext_GLTest { final int list = compileIndexedListOnSharedDrawable(); final IntBuffer made = BufferUtils.createIntBuffer(4096); while (!GL30.glIsVertexArray(sharedContextVao) && made.hasRemaining()) { - final int v = GLStateManager.glGenVertexArrays(); + final int v = GLSMVertexInput.glGenVertexArrays(); made.put(v); - if (v == sharedContextVao) GLStateManager.glBindVertexArray(v); + if (v == sharedContextVao) GLSMVertexInput.glBindVertexArray(v); } - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); assumeTrue(GL30.glIsVertexArray(sharedContextVao)); - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); indexedList = 0; assertTrue(GL30.glIsVertexArray(sharedContextVao)); made.flip(); - while (made.hasRemaining()) GLStateManager.glDeleteVertexArrays(made.get()); + while (made.hasRemaining()) GLSMVertexInput.glDeleteVertexArrays(made.get()); } @Test void recordedVaoBindReplaysOnlyOnItsCompileContext() throws Exception { - final int bound = GLStateManager.glGenVertexArrays(); - final int local = GLStateManager.glGenVertexArrays(); - final int localList = GLStateManager.glGenLists(1); - final int foreignList = GLStateManager.glGenLists(1); - GLStateManager.glNewList(localList, GL11.GL_COMPILE); - GLStateManager.glBindVertexArray(local); - GLStateManager.glEndList(); + final int bound = GLSMVertexInput.glGenVertexArrays(); + final int local = GLSMVertexInput.glGenVertexArrays(); + final int localList = GLSMDraws.glGenLists(1); + final int foreignList = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(localList, GL11.GL_COMPILE); + GLSMVertexInput.glBindVertexArray(local); + GLSMDraws.glEndList(); sharedDrawable = new SharedDrawable(Display.getDrawable()); DrawableContexts.run(sharedDrawable, "SharedDrawableContext-VaoBind-Thread", () -> { int foreign; - do foreign = GLStateManager.glGenVertexArrays(); while (foreign == bound); - GLStateManager.glNewList(foreignList, GL11.GL_COMPILE); - GLStateManager.glBindVertexArray(foreign); - GLStateManager.glEndList(); + do foreign = GLSMVertexInput.glGenVertexArrays(); while (foreign == bound); + GLSMDraws.glNewList(foreignList, GL11.GL_COMPILE); + GLSMVertexInput.glBindVertexArray(foreign); + GLSMDraws.glEndList(); }); - GLStateManager.glBindVertexArray(bound); - GLStateManager.glCallList(foreignList); - assertEquals(bound, GLStateManager.getBoundVAO()); + GLSMVertexInput.glBindVertexArray(bound); + GLSMDraws.glCallList(foreignList); + assertEquals(bound, GLSMVertexInput.getBoundVAO()); assertEquals(bound, GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING)); - GLStateManager.glCallList(localList); - assertEquals(local, GLStateManager.getBoundVAO()); + GLSMDraws.glCallList(localList); + assertEquals(local, GLSMVertexInput.getBoundVAO()); assertEquals(local, GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING)); - GLStateManager.glBindVertexArray(0); - GLStateManager.glDeleteVertexArrays(bound); - GLStateManager.glDeleteVertexArrays(local); - GLStateManager.glDeleteLists(localList, 1); - GLStateManager.glDeleteLists(foreignList, 1); + GLSMVertexInput.glBindVertexArray(0); + GLSMVertexInput.glDeleteVertexArrays(bound); + GLSMVertexInput.glDeleteVertexArrays(local); + GLSMDraws.glDeleteLists(localList, 1); + GLSMDraws.glDeleteLists(foreignList, 1); } @Test void deferredTextureDeletesWaitForSplashAndScrubDrawableContexts() throws Exception { sharedDrawable = new SharedDrawable(Display.getDrawable()); - final int t = GLStateManager.glGenTextures(); + final int t = GLSMTextures.glGenTextures(); final AtomicReference workerCtxRef = new AtomicReference<>(); DrawableContexts.run(sharedDrawable, "SharedDrawableContext-DeferredDelete-Thread", () -> { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t); workerCtxRef.set(GLStateManager.ctx()); }); @@ -355,14 +355,14 @@ public class GLSM_SharedDrawableContext_GLTest { try { SplashWindow.setSplashComplete(false); - GLStateManager.glDeleteTextures(t); - deferredGen = GLStateManager.glGenTextures(); + GLSMTextures.glDeleteTextures(t); + deferredGen = GLSMTextures.glGenTextures(); assertTrue(GL11.glIsTexture(t), "delete must stay deferred while the splash is not complete"); assertEquals(t, workerCtx.textures.getTextureUnitBindings(0).getBinding(), "worker ctx binding must survive until the flush"); SplashWindow.setSplashComplete(true); - flushGen = GLStateManager.glGenTextures(); + flushGen = GLSMTextures.glGenTextures(); assertFalse(GL11.glIsTexture(t), "the flush must delete the texture once the splash is complete"); assertEquals(0, workerCtx.textures.getTextureUnitBindings(0).getBinding(), "the flush must scrub the drawable context's binding"); @@ -384,21 +384,21 @@ public class GLSM_SharedDrawableContext_GLTest { workerCtxRef.set(GLStateManager.ctx()); barrier.await(); for (int i = 0; i < 20000; i++) { - final int t = GLStateManager.pushState(StateSet.FONT); - GLStateManager.glNormal3f(0.1f, 0.2f, 0.3f); - GLStateManager.popStateTo(t); + final int t = GLSMAttribStack.pushState(StateSet.FONT); + GLSMCurrentAttribs.glNormal3f(0.1f, 0.2f, 0.3f); + GLSMAttribStack.popStateTo(t); } - GLStateManager.glNormal3f(0.1f, 0.2f, 0.3f); + GLSMCurrentAttribs.glNormal3f(0.1f, 0.2f, 0.3f); }); try { barrier.await(); for (int i = 0; i < 20000; i++) { - final int t = GLStateManager.pushState(StateSet.FONT); - GLStateManager.glNormal3f(0.25f, 0.5f, 0.75f); - GLStateManager.popStateTo(t); + final int t = GLSMAttribStack.pushState(StateSet.FONT); + GLSMCurrentAttribs.glNormal3f(0.25f, 0.5f, 0.75f); + GLSMAttribStack.popStateTo(t); } - GLStateManager.glNormal3f(0.25f, 0.5f, 0.75f); + GLSMCurrentAttribs.glNormal3f(0.25f, 0.5f, 0.75f); worker.join(); final GLContextState workerCtx = workerCtxRef.get(); @@ -412,7 +412,7 @@ public class GLSM_SharedDrawableContext_GLTest { assertEquals(0.2f, workerCtx.ffp.currentNormal.y, 0.0f); assertEquals(0.3f, workerCtx.ffp.currentNormal.z, 0.0f); } finally { - GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SplashCachingCoverage_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SplashCachingCoverage_UnitTest.java index 1ed94343c..cceac5dd7 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SplashCachingCoverage_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_SplashCachingCoverage_UnitTest.java @@ -29,21 +29,21 @@ public class GLSM_SplashCachingCoverage_UnitTest { @AfterEach void leaveSplashWindow() throws IllegalAccessException { SplashWindow.leave(); - GLStateManager.glDepthFunc(GL11.GL_LESS); - GLStateManager.glCullFace(GL11.GL_BACK); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS); + GLSMRasterizer.glCullFace(GL11.GL_BACK); } @Test void popAttribDoesNotRevertDepthFuncSetDuringSplash() throws IllegalAccessException { - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); SplashWindow.setSplashComplete(true); GLStateManager.setDrawableGLHolder(Thread.currentThread()); - GLStateManager.glPushAttrib(GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_DEPTH_BUFFER_BIT); + GLSMAttribStack.glPopAttrib(); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "popAttrib reverted to the stale default"); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "popAttrib reverted to the stale default"); assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC)); } @@ -77,26 +77,26 @@ public class GLSM_SplashCachingCoverage_UnitTest { @Test void replayPushesCachedStateWithoutDisturbingIt() { - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glCullFace(GL11.GL_FRONT); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "cache write dropped while caching=false"); - assertEquals(GL11.GL_FRONT, GLStateManager.getPolygonState().getCullFaceMode(), "cache write dropped while caching=false"); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "cache write dropped while caching=false"); + assertEquals(GL11.GL_FRONT, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache write dropped while caching=false"); - GLStateManager.replayStateToBackend(); + GLSMAttribStack.replayStateToBackend(); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "replay must not mutate the cache"); - assertEquals(GL11.GL_FRONT, GLStateManager.getPolygonState().getCullFaceMode(), "replay must not mutate the cache"); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "replay must not mutate the cache"); + assertEquals(GL11.GL_FRONT, GLSMRasterizer.getPolygonState().getCullFaceMode(), "replay must not mutate the cache"); } @Test void replayPushesDepthFuncToRealGL() { assertNotNull(BackendManager.RENDER_BACKEND, "no backend: replay would no-op and this test would pass vacuously"); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); GL11.glDepthFunc(GL11.GL_LESS); assertEquals(GL11.GL_LESS, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "setup failed to diverge real GL"); - GLStateManager.replayStateToBackend(); + GLSMAttribStack.replayStateToBackend(); assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "cached depth func never reached real GL; GUI draws at equal depth would be rejected"); } @@ -105,7 +105,7 @@ public class GLSM_SplashCachingCoverage_UnitTest { void firstFrameAfterSplashSeedsRealGL() throws IllegalAccessException { assertNotNull(BackendManager.RENDER_BACKEND, "no backend: this test would pass vacuously"); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); GL11.glDepthFunc(GL11.GL_LESS); SplashWindow.setSplashComplete(false); @@ -123,7 +123,7 @@ public class GLSM_SplashCachingCoverage_UnitTest { @Test void splashCompleteRequestsSeedOnceAndIssuesNoGLItself() throws IllegalAccessException { - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); GL11.glDepthFunc(GL11.GL_LESS); SplashWindow.setSplashComplete(false); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateQueryRoundTrip_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateQueryRoundTrip_UnitTest.java index f3416b7ba..2b9bd8236 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateQueryRoundTrip_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateQueryRoundTrip_UnitTest.java @@ -22,64 +22,64 @@ public class GLSM_StateQueryRoundTrip_UnitTest { @Test void activeTextureRoundTrips() { try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE3); - assertEquals(GL13.GL_TEXTURE3, GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "must return the GL_TEXTURE# enum, not the unit index"); - assertEquals(GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3); + assertEquals(GL13.GL_TEXTURE3, GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "must return the GL_TEXTURE# enum, not the unit index"); + assertEquals(GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } } @Test void invalidTextureUnitIsIgnored() { try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.glActiveTexture(0); - assertEquals(GL13.GL_TEXTURE2, GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); + GLSMTextures.glActiveTexture(0); + assertEquals(GL13.GL_TEXTURE2, GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); assertEquals(GL13.GL_TEXTURE2, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_UNITS); - assertEquals(GL13.GL_TEXTURE2, GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + GLStateManager.MAX_TEXTURE_UNITS); + assertEquals(GL13.GL_TEXTURE2, GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); assertEquals(GL13.GL_TEXTURE2, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } } @Test void depthWriteMaskRoundTripsAsInteger() { try { - GLStateManager.glDepthMask(false); - assertEquals(GL11.GL_FALSE, GLStateManager.glGetInteger(GL11.GL_DEPTH_WRITEMASK)); + GLSMDepthStencilAlpha.glDepthMask(false); + assertEquals(GL11.GL_FALSE, GLSMQueries.glGetInteger(GL11.GL_DEPTH_WRITEMASK)); assertEquals(GL11.GL_FALSE, GL11.glGetInteger(GL11.GL_DEPTH_WRITEMASK)); - GLStateManager.glDepthMask(true); - assertEquals(GL11.GL_TRUE, GLStateManager.glGetInteger(GL11.GL_DEPTH_WRITEMASK)); + GLSMDepthStencilAlpha.glDepthMask(true); + assertEquals(GL11.GL_TRUE, GLSMQueries.glGetInteger(GL11.GL_DEPTH_WRITEMASK)); assertEquals(GL11.GL_TRUE, GL11.glGetInteger(GL11.GL_DEPTH_WRITEMASK)); } finally { - GLStateManager.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthMask(true); } } @Test void cullFaceModeRoundTrips() { try { - GLStateManager.glCullFace(GL11.GL_FRONT); - assertEquals(GL11.GL_FRONT, GLStateManager.glGetInteger(GL11.GL_CULL_FACE_MODE)); - assertEquals(GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), GLStateManager.glGetInteger(GL11.GL_CULL_FACE_MODE)); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + assertEquals(GL11.GL_FRONT, GLSMQueries.glGetInteger(GL11.GL_CULL_FACE_MODE)); + assertEquals(GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), GLSMQueries.glGetInteger(GL11.GL_CULL_FACE_MODE)); } finally { - GLStateManager.glCullFace(GL11.GL_BACK); + GLSMRasterizer.glCullFace(GL11.GL_BACK); } } @Test void polygonModeRoundTripsBothFaces() { try { - GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); - assertEquals(GL11.GL_LINE, GLStateManager.glGetInteger(GL11.GL_POLYGON_MODE)); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); + assertEquals(GL11.GL_LINE, GLSMQueries.glGetInteger(GL11.GL_POLYGON_MODE)); final IntBuffer params = BufferUtils.createIntBuffer(2); - GLStateManager.glGetInteger(GL11.GL_POLYGON_MODE, params); + GLSMQueries.glGetInteger(GL11.GL_POLYGON_MODE, params); assertEquals(GL11.GL_LINE, params.get(0), "front mode"); assertEquals(GL11.GL_LINE, params.get(1), "back mode"); @@ -87,41 +87,41 @@ public class GLSM_StateQueryRoundTrip_UnitTest { assertEquals(GL11.GL_LINE, driver.get(0), "driver front mode"); assertEquals(GL11.GL_LINE, driver.get(1), "driver back mode"); } finally { - GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); } } @Test void pixelUnpackStateRoundTrips() { try { - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 64); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 2); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 3); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 64); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 2); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 3); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); - assertEquals(64, GLStateManager.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH)); - assertEquals(2, GLStateManager.glGetInteger(GL11.GL_UNPACK_SKIP_PIXELS)); - assertEquals(3, GLStateManager.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS)); - assertEquals(1, GLStateManager.glGetInteger(GL11.GL_UNPACK_ALIGNMENT)); + assertEquals(64, GLSMQueries.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH)); + assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_UNPACK_SKIP_PIXELS)); + assertEquals(3, GLSMQueries.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS)); + assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_UNPACK_ALIGNMENT)); assertEquals(64, GL11.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH)); assertEquals(2, GL11.glGetInteger(GL11.GL_UNPACK_SKIP_PIXELS)); assertEquals(3, GL11.glGetInteger(GL11.GL_UNPACK_SKIP_ROWS)); assertEquals(1, GL11.glGetInteger(GL11.GL_UNPACK_ALIGNMENT)); } finally { - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 0); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 0); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); } } @Test void viewportFillsAllFourComponentsViaIntArray() { - GLStateManager.glViewport(3, 5, 17, 23); + GLSMRasterizer.glViewport(3, 5, 17, 23); final int[] params = new int[4]; - GLStateManager.glGetInteger(GL11.GL_VIEWPORT, params); + GLSMQueries.glGetInteger(GL11.GL_VIEWPORT, params); assertEquals(3, params[0]); assertEquals(5, params[1]); assertEquals(17, params[2]); @@ -136,13 +136,13 @@ public class GLSM_StateQueryRoundTrip_UnitTest { @Test void saveDisturbRestoreIsIdentity() { - final int activeTexture = GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE); - final int depthWriteMask = GLStateManager.glGetInteger(GL11.GL_DEPTH_WRITEMASK); - final int cullMode = GLStateManager.glGetInteger(GL11.GL_CULL_FACE_MODE); - final int polygonMode = GLStateManager.glGetInteger(GL11.GL_POLYGON_MODE); - final int unpackAlignment = GLStateManager.glGetInteger(GL11.GL_UNPACK_ALIGNMENT); + final int activeTexture = GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE); + final int depthWriteMask = GLSMQueries.glGetInteger(GL11.GL_DEPTH_WRITEMASK); + final int cullMode = GLSMQueries.glGetInteger(GL11.GL_CULL_FACE_MODE); + final int polygonMode = GLSMQueries.glGetInteger(GL11.GL_POLYGON_MODE); + final int unpackAlignment = GLSMQueries.glGetInteger(GL11.GL_UNPACK_ALIGNMENT); final int[] viewport = new int[4]; - GLStateManager.glGetInteger(GL11.GL_VIEWPORT, viewport); + GLSMQueries.glGetInteger(GL11.GL_VIEWPORT, viewport); final int driverActiveTexture = GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE); final int driverDepthWriteMask = GL11.glGetInteger(GL11.GL_DEPTH_WRITEMASK); final int driverCullMode = GL11.glGetInteger(GL11.GL_CULL_FACE_MODE); @@ -150,27 +150,27 @@ public class GLSM_StateQueryRoundTrip_UnitTest { final int driverUnpackAlignment = GL11.glGetInteger(GL11.GL_UNPACK_ALIGNMENT); final IntBuffer driverViewport = driverInts(GL11.GL_VIEWPORT); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + 4); - GLStateManager.glDepthMask(false); - GLStateManager.glCullFace(GL11.GL_FRONT_AND_BACK); - GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_POINT); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 8); - GLStateManager.glViewport(1, 1, 2, 2); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + 4); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMRasterizer.glCullFace(GL11.GL_FRONT_AND_BACK); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_POINT); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 8); + GLSMRasterizer.glViewport(1, 1, 2, 2); - GLStateManager.glActiveTexture(activeTexture); - GLStateManager.glDepthMask(depthWriteMask == GL11.GL_TRUE); - GLStateManager.glCullFace(cullMode); - GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, polygonMode); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, unpackAlignment); - GLStateManager.glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + GLSMTextures.glActiveTexture(activeTexture); + GLSMDepthStencilAlpha.glDepthMask(depthWriteMask == GL11.GL_TRUE); + GLSMRasterizer.glCullFace(cullMode); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, polygonMode); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, unpackAlignment); + GLSMRasterizer.glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); - assertEquals(activeTexture, GLStateManager.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); - assertEquals(depthWriteMask, GLStateManager.glGetInteger(GL11.GL_DEPTH_WRITEMASK)); - assertEquals(cullMode, GLStateManager.glGetInteger(GL11.GL_CULL_FACE_MODE)); - assertEquals(polygonMode, GLStateManager.glGetInteger(GL11.GL_POLYGON_MODE)); - assertEquals(unpackAlignment, GLStateManager.glGetInteger(GL11.GL_UNPACK_ALIGNMENT)); + assertEquals(activeTexture, GLSMQueries.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); + assertEquals(depthWriteMask, GLSMQueries.glGetInteger(GL11.GL_DEPTH_WRITEMASK)); + assertEquals(cullMode, GLSMQueries.glGetInteger(GL11.GL_CULL_FACE_MODE)); + assertEquals(polygonMode, GLSMQueries.glGetInteger(GL11.GL_POLYGON_MODE)); + assertEquals(unpackAlignment, GLSMQueries.glGetInteger(GL11.GL_UNPACK_ALIGNMENT)); final int[] restored = new int[4]; - GLStateManager.glGetInteger(GL11.GL_VIEWPORT, restored); + GLSMQueries.glGetInteger(GL11.GL_VIEWPORT, restored); assertEquals(viewport[0], restored[0]); assertEquals(viewport[1], restored[1]); assertEquals(viewport[2], restored[2]); @@ -189,16 +189,16 @@ public class GLSM_StateQueryRoundTrip_UnitTest { @Test void uncachedTexParameterFallsThroughToTheDriver() { - final int tex = GLStateManager.glGenTextures(); + final int tex = GLSMTextures.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R, GL12.GL_CLAMP_TO_EDGE); - assertEquals(GL12.GL_CLAMP_TO_EDGE, GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R), "uncached pname must fall through to the driver"); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R, GL12.GL_CLAMP_TO_EDGE); + assertEquals(GL12.GL_CLAMP_TO_EDGE, GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R), "uncached pname must fall through to the driver"); assertEquals(GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R), - GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R), "uncached pname must match the driver"); + GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_WRAP_R), "uncached pname must match the driver"); } finally { - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateSet_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateSet_GLTest.java index 25cb827c3..d422ac9c8 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateSet_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_StateSet_GLTest.java @@ -24,29 +24,29 @@ public class GLSM_StateSet_GLTest { @AfterEach void resetState() { - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glBlendColor(0.0f, 0.0f, 0.0f, 0.0f); - GLStateManager.glBlendEquation(GL14.GL_FUNC_ADD); - GLStateManager.disableLighting(); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); - GLStateManager.disableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_LESS); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.glShadeModel(GL11.GL_SMOOTH); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(0.0f, 0.0f); - GLStateManager.disableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.disableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); - GLStateManager.disableColorMaterial(); - GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.glBlendColor(0.0f, 0.0f, 0.0f, 0.0f); + GLSMBlend.glBlendEquation(GL14.GL_FUNC_ADD); + GLSMLighting.disableLighting(); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, true, true, true); + GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(0.0f, 0.0f); + GLSMRasterizer.disableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); + GLSMLighting.disableColorMaterial(); + GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); } private static boolean[] driverColorWriteMask() { @@ -57,53 +57,53 @@ public class GLSM_StateSet_GLTest { @Test void batchRestoresBlendAxisAndLightingBooleanButNotStencil() { - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.disableLighting(); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMLighting.disableLighting(); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); - final int d = GLStateManager.pushState(StateSet.BATCH); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); - GLStateManager.enableLighting(); - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.BATCH); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + GLSMLighting.enableLighting(); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMAttribStack.popStateTo(d); verifyIsEnabled(GL11.GL_BLEND, true, "Blend enable - restored by BATCH pop"); assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb"); assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_DST_RGB), "driver blend dst rgb"); - assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb"); - assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GLStateManager.getBlendState().getDstRgb(), "cache blend dst rgb"); + assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb"); + assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GLSMBlend.getBlendState().getDstRgb(), "cache blend dst rgb"); verifyIsEnabled(GL11.GL_LIGHTING, false, "Lighting enable - restored by BATCH pop"); verifyIsEnabled(GL11.GL_STENCIL_TEST, true, "Stencil test - not a BATCH member, must stay toggled"); } @Test void fontRestoresDepthAxisShadeModelAndPolygonOffsetButNotStencil() { - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glShadeModel(GL11.GL_SMOOTH); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(0.0f, 0.0f); - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(0.0f, 0.0f); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); - final int d = GLStateManager.pushState(StateSet.FONT); - GLStateManager.disableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_ALWAYS); - GLStateManager.glShadeModel(GL11.GL_FLAT); - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(-10.0f, -10.0f); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.FONT); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS); + GLSMRasterizer.glShadeModel(GL11.GL_FLAT); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(-10.0f, -10.0f); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); + GLSMAttribStack.popStateTo(d); verifyIsEnabled(GL11.GL_DEPTH_TEST, true, "Depth test enable - restored by FONT pop"); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "cache depth func"); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "cache depth func"); assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "driver depth func"); - assertEquals(GL11.GL_SMOOTH, GLStateManager.getShadeModelState().getValue(), "cache shade model"); + assertEquals(GL11.GL_SMOOTH, GLSMRasterizer.getShadeModelState().getValue(), "cache shade model"); verifyIsEnabled(GL11.GL_POLYGON_OFFSET_FILL, false, "Polygon offset fill - restored by FONT pop"); - assertEquals(0.0f, GLStateManager.getPolygonState().getOffsetFactor(), "cache polygon offset factor"); + assertEquals(0.0f, GLSMRasterizer.getPolygonState().getOffsetFactor(), "cache polygon offset factor"); assertEquals(0.0f, GL11.glGetFloat(GL11.GL_POLYGON_OFFSET_FACTOR), "driver polygon offset factor"); - assertEquals(0.0f, GLStateManager.getPolygonState().getOffsetUnits(), "cache polygon offset units"); + assertEquals(0.0f, GLSMRasterizer.getPolygonState().getOffsetUnits(), "cache polygon offset units"); assertEquals(0.0f, GL11.glGetFloat(GL11.GL_POLYGON_OFFSET_UNITS), "driver polygon offset units"); verifyIsEnabled(GL11.GL_STENCIL_TEST, false, "Stencil test - not a FONT member, must stay toggled"); } @@ -113,442 +113,442 @@ public class GLSM_StateSet_GLTest { final int p0 = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS); final int p1 = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS); try { - GLStateManager.glUseProgram(p0); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMPrograms.glUseProgram(p0); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); - final int d = GLStateManager.pushState(StateSet.FONT_PIPELINE); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); - GLStateManager.glDepthFunc(GL11.GL_ALWAYS); - GLStateManager.glUseProgram(p1); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.FONT_PIPELINE); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS); + GLSMPrograms.glUseProgram(p1); + GLSMAttribStack.popStateTo(d); - assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - restored by FONT_PIPELINE pop"); + assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - restored by FONT_PIPELINE pop"); assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb - restored by FONT_PIPELINE pop"); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "cache depth func - restored by FONT_PIPELINE pop"); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "cache depth func - restored by FONT_PIPELINE pop"); assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "driver depth func - restored by FONT_PIPELINE pop"); - assertEquals(p1, GLStateManager.getActiveProgram(), "program - not a FONT_PIPELINE member, must stay toggled"); + assertEquals(p1, GLSMPrograms.getActiveProgram(), "program - not a FONT_PIPELINE member, must stay toggled"); - GLStateManager.glUseProgram(p0); + GLSMPrograms.glUseProgram(p0); } finally { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(p0); - GLStateManager.glDeleteProgram(p1); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(p0); + GLSMPrograms.glDeleteProgram(p1); } } @Test void handRestoresBlendAxisAndUnit1TexturingButNotColorMask() { - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.enableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.glColorMask(true, true, true, true); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.enableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); - final int d = GLStateManager.pushState(StateSet.HAND); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); - GLStateManager.glColorMask(false, false, false, false); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.HAND); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + GLSMBlend.glColorMask(false, false, false, false); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMAttribStack.popStateTo(d); verifyIsEnabled(GL11.GL_BLEND, true, "Blend enable - restored by HAND pop"); - assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb"); + assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb"); assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb"); - assertTrue(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled(), "unit 1 texturing - restored by HAND pop"); + assertTrue(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled(), "unit 1 texturing - restored by HAND pop"); final boolean[] driverMask = driverColorWriteMask(); assertFalse(driverMask[0] || driverMask[1] || driverMask[2] || driverMask[3], "driver color mask - not a HAND member, must stay toggled"); - assertFalse(GLStateManager.getColorMask().red || GLStateManager.getColorMask().green - || GLStateManager.getColorMask().blue || GLStateManager.getColorMask().alpha, "cache color mask - not a HAND member, must stay toggled"); + assertFalse(GLSMBlend.getColorMask().red || GLSMBlend.getColorMask().green + || GLSMBlend.getColorMask().blue || GLSMBlend.getColorMask().alpha, "cache color mask - not a HAND member, must stay toggled"); } @Test void masksRestoresDepthMaskAndColorMaskButNotDepthTestEnable() { - GLStateManager.glDepthMask(true); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glColorMask(true, false, true, false); - GLStateManager.disableDepthTest(); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMBlend.glColorMask(true, false, true, false); + GLSMDepthStencilAlpha.disableDepthTest(); - final int d = GLStateManager.pushState(StateSet.MASKS); - GLStateManager.glDepthMask(false); - GLStateManager.glDepthFunc(GL11.GL_ALWAYS); - GLStateManager.glColorMask(false, true, false, true); - GLStateManager.enableDepthTest(); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.MASKS); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS); + GLSMBlend.glColorMask(false, true, false, true); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMAttribStack.popStateTo(d); assertTrue(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), "driver depth write mask - restored by MASKS pop"); - assertTrue(GLStateManager.getDepthState().isEnabled(), "cache depth write mask - restored by MASKS pop"); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc(), "cache depth func"); + assertTrue(GLSMDepthStencilAlpha.getDepthState().isEnabled(), "cache depth write mask - restored by MASKS pop"); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "cache depth func"); assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "driver depth func"); final boolean[] driverMask = driverColorWriteMask(); assertTrue(driverMask[0] && !driverMask[1] && driverMask[2] && !driverMask[3], "driver color mask - restored by MASKS pop"); - assertTrue(GLStateManager.getColorMask().red && !GLStateManager.getColorMask().green - && GLStateManager.getColorMask().blue && !GLStateManager.getColorMask().alpha, "cache color mask - restored by MASKS pop"); + assertTrue(GLSMBlend.getColorMask().red && !GLSMBlend.getColorMask().green + && GLSMBlend.getColorMask().blue && !GLSMBlend.getColorMask().alpha, "cache color mask - restored by MASKS pop"); verifyIsEnabled(GL11.GL_DEPTH_TEST, true, "Depth test enable - not a MASKS member, must stay toggled"); } @Test void cullRestoresPolygonAxisAndCullEnableButNotBlendFunc() { - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - final int d = GLStateManager.pushState(StateSet.CULL); - GLStateManager.disableCull(); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.CULL); + GLSMRasterizer.disableCull(); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + GLSMAttribStack.popStateTo(d); verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull enable - restored by CULL pop"); - assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode"); + assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode"); assertEquals(GL11.GL_BACK, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode"); verifyIsEnabled(GL11.GL_BLEND, false, "Blend enable - not a CULL member, must stay toggled"); - assertEquals(GL11.GL_DST_COLOR, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - not a CULL member, must stay toggled"); + assertEquals(GL11.GL_DST_COLOR, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - not a CULL member, must stay toggled"); assertEquals(GL11.GL_DST_COLOR, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb - not a CULL member, must stay toggled"); } @Test void blendRestoresBlendAxisButNotCull() { - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); - final int d = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); - GLStateManager.disableCull(); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + GLSMRasterizer.disableCull(); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMAttribStack.popStateTo(d); verifyIsEnabled(GL11.GL_BLEND, true, "Blend enable - restored by BLEND pop"); - assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb"); + assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb"); assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb"); verifyIsEnabled(GL11.GL_CULL_FACE, false, "Cull enable - not a BLEND member, must stay toggled"); - assertEquals(GL11.GL_FRONT, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode - not a BLEND member, must stay toggled"); + assertEquals(GL11.GL_FRONT, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode - not a BLEND member, must stay toggled"); assertEquals(GL11.GL_FRONT, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode - not a BLEND member, must stay toggled"); } @Test void alphaRestoresAlphaAxisButNotBlend() { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - final int d = GLStateManager.pushState(StateSet.ALPHA); - GLStateManager.disableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.1f); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.ALPHA); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.1f); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + GLSMAttribStack.popStateTo(d); verifyIsEnabled(GL11.GL_ALPHA_TEST, true, "Alpha test enable - restored by ALPHA pop"); - assertEquals(GL11.GL_GREATER, GLStateManager.getAlphaState().getFunction(), "cache alpha func"); - assertEquals(0.5f, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref"); + assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func"); + assertEquals(0.5f, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref"); verifyIsEnabled(GL11.GL_BLEND, false, "Blend enable - not an ALPHA member, must stay toggled"); - assertEquals(GL11.GL_DST_COLOR, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - not an ALPHA member, must stay toggled"); + assertEquals(GL11.GL_DST_COLOR, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - not an ALPHA member, must stay toggled"); assertEquals(GL11.GL_DST_COLOR, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb - not an ALPHA member, must stay toggled"); } @Test void cutoutRestoresAlphaAxisAndUnit1TexturingButNotBlend() { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.enableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.enableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - final int d = GLStateManager.pushState(StateSet.CUTOUT); - GLStateManager.disableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.1f); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + final int d = GLSMAttribStack.pushState(StateSet.CUTOUT); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.1f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); final int fragBefore = GLStateManager.ctx().fragmentGeneration; - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); assertEquals(fragBefore + 1, GLStateManager.ctx().fragmentGeneration, "CUTOUT pop must bump fragment generation once when the value changed inside the bracket"); verifyIsEnabled(GL11.GL_ALPHA_TEST, true, "Alpha test enable - restored by CUTOUT pop"); - assertEquals(GL11.GL_GREATER, GLStateManager.getAlphaState().getFunction(), "cache alpha func"); - assertEquals(0.5f, GLStateManager.getAlphaState().getReference(), 0.0001f, "cache alpha ref"); - assertTrue(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled(), "unit 1 texturing - restored by CUTOUT pop"); + assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "cache alpha func"); + assertEquals(0.5f, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "cache alpha ref"); + assertTrue(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled(), "unit 1 texturing - restored by CUTOUT pop"); verifyIsEnabled(GL11.GL_BLEND, false, "Blend enable - not a CUTOUT member, must stay toggled"); - assertEquals(GL11.GL_DST_COLOR, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - not a CUTOUT member, must stay toggled"); + assertEquals(GL11.GL_DST_COLOR, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - not a CUTOUT member, must stay toggled"); assertEquals(GL11.GL_DST_COLOR, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb - not a CUTOUT member, must stay toggled"); } @Test void nonMemberMutationsInsideBracketSaveAndDiscardNothing() { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); - final int d = GLStateManager.pushState(StateSet.CUTOUT); - final long discardsBefore = GLStateManager.attribDiscards; + final int d = GLSMAttribStack.pushState(StateSet.CUTOUT); + final long discardsBefore = GLSMAttribStack.attribDiscards; try { - final long savedBefore = GLStateManager.attribSlotsSaved; - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); - GLStateManager.glDepthFunc(GL11.GL_ALWAYS); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - assertEquals(savedBefore, GLStateManager.attribSlotsSaved, "non-member mutations must not save slots"); + final long savedBefore = GLSMAttribStack.attribSlotsSaved; + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + assertEquals(savedBefore, GLSMAttribStack.attribSlotsSaved, "non-member mutations must not save slots"); } finally { - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); } - assertEquals(discardsBefore, GLStateManager.attribDiscards, "non-member mutations must not leave slots to discard"); - assertEquals(GL11.GL_DST_COLOR, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - not a CUTOUT member, must stay toggled"); + assertEquals(discardsBefore, GLSMAttribStack.attribDiscards, "non-member mutations must not leave slots to discard"); + assertEquals(GL11.GL_DST_COLOR, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - not a CUTOUT member, must stay toggled"); } @Test void unchangedSettersSaveNothing() { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glBlendColor(0.1f, 0.2f, 0.3f, 0.4f); - GLStateManager.glBlendEquation(GL14.GL_FUNC_ADD); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.enableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, true, true, true); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.glBlendColor(0.1f, 0.2f, 0.3f, 0.4f); + GLSMBlend.glBlendEquation(GL14.GL_FUNC_ADD); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.enableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); - final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS)); + final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS)); try { - final long savedBefore = GLStateManager.attribSlotsSaved; - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glBlendColor(0.1f, 0.2f, 0.3f, 0.4f); - GLStateManager.glBlendEquation(GL14.GL_FUNC_ADD); - GLStateManager.glBlendEquationSeparate(GL14.GL_FUNC_ADD, GL14.GL_FUNC_ADD); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.enableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - assertEquals(1, GLStateManager.attribSlotsSaved - savedBefore, "only the active unit change may save a slot"); + final long savedBefore = GLSMAttribStack.attribSlotsSaved; + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, true, true, true); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.glBlendColor(0.1f, 0.2f, 0.3f, 0.4f); + GLSMBlend.glBlendEquation(GL14.GL_FUNC_ADD); + GLSMBlend.glBlendEquationSeparate(GL14.GL_FUNC_ADD, GL14.GL_FUNC_ADD); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.enableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + assertEquals(1, GLSMAttribStack.attribSlotsSaved - savedBefore, "only the active unit change may save a slot"); } finally { - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); } - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - final int d2 = GLStateManager.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS)); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + final int d2 = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS)); try { - final long savedBefore = GLStateManager.attribSlotsSaved; - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - assertEquals(0, GLStateManager.attribSlotsSaved - savedBefore, "unchanged glBlendFunc must not save a slot"); + final long savedBefore = GLSMAttribStack.attribSlotsSaved; + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + assertEquals(0, GLSMAttribStack.attribSlotsSaved - savedBefore, "unchanged glBlendFunc must not save a slot"); } finally { - GLStateManager.popStateTo(d2); + GLSMAttribStack.popStateTo(d2); } } @Test void bracketDoesNotInheritMembersOfAnEarlierBracketAtItsDepth() { for (boolean nested : new boolean[] {false, true}) { - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glDepthFunc(GL11.GL_LESS); - final int outer = nested ? GLStateManager.pushState(StateSet.CULL) : GLStateManager.getAttribDepth(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS); + final int outer = nested ? GLSMAttribStack.pushState(StateSet.CULL) : GLSMAttribStack.getAttribDepth(); try { - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GLStateManager.glPopAttrib(); - final int d = GLStateManager.pushState(StateSet.CUTOUT); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPopAttrib(); + final int d = GLSMAttribStack.pushState(StateSet.CUTOUT); try { - final long savedBefore = GLStateManager.attribSlotsSaved; - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); - GLStateManager.glDepthFunc(GL11.GL_ALWAYS); - assertEquals(savedBefore, GLStateManager.attribSlotsSaved, "nested=" + nested); + final long savedBefore = GLSMAttribStack.attribSlotsSaved; + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS); + assertEquals(savedBefore, GLSMAttribStack.attribSlotsSaved, "nested=" + nested); } finally { - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); } } finally { - GLStateManager.popStateTo(outer); + GLSMAttribStack.popStateTo(outer); } } } @Test void cullFaceModeRestoredThroughBatchBracketRegression2117() { - GLStateManager.glCullFace(GL11.GL_BACK); - final int d = GLStateManager.pushState(StateSet.BATCH); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.popStateTo(d); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + final int d = GLSMAttribStack.pushState(StateSet.BATCH); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMAttribStack.popStateTo(d); - assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode"); + assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode"); assertEquals(GL11.GL_BACK, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode"); } @Test void batchRestoresUnit0And1BindingsAndActiveUnitButNotUnit2() { if (GLStateManager.MAX_TEXTURE_UNITS < 3) return; - final int tex0Base = GLStateManager.glGenTextures(); - final int tex1Base = GLStateManager.glGenTextures(); - final int tex2Base = GLStateManager.glGenTextures(); - final int tex0Dirty = GLStateManager.glGenTextures(); - final int tex1Dirty = GLStateManager.glGenTextures(); - final int tex2Dirty = GLStateManager.glGenTextures(); + final int tex0Base = GLSMTextures.glGenTextures(); + final int tex1Base = GLSMTextures.glGenTextures(); + final int tex2Base = GLSMTextures.glGenTextures(); + final int tex0Dirty = GLSMTextures.glGenTextures(); + final int tex1Dirty = GLSMTextures.glGenTextures(); + final int tex2Dirty = GLSMTextures.glGenTextures(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex0Base); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex1Base); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + 2); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex2Base); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex0Base); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex1Base); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + 2); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex2Base); - final int d = GLStateManager.pushState(StateSet.BATCH); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex0Dirty); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex1Dirty); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + 2); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex2Dirty); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.BATCH); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex0Dirty); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex1Dirty); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + 2); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex2Dirty); + GLSMAttribStack.popStateTo(d); - assertEquals(2, GLStateManager.getActiveTextureUnit(), "cache active unit - restored by BATCH pop"); + assertEquals(2, GLSMTextures.getActiveTextureUnit(), "cache active unit - restored by BATCH pop"); assertEquals(GL13.GL_TEXTURE0 + 2, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "driver active unit - restored by BATCH pop"); - assertEquals(tex0Base, GLStateManager.getTextures().getTextureUnitBindings(0).getBinding(), "cache unit 0 binding - restored by BATCH pop"); + assertEquals(tex0Base, GLSMTextures.getTextures().getTextureUnitBindings(0).getBinding(), "cache unit 0 binding - restored by BATCH pop"); assertEquals(tex0Base, driverTextureBinding(0), "driver unit 0 binding - restored by BATCH pop"); - assertEquals(tex1Base, GLStateManager.getTextures().getTextureUnitBindings(1).getBinding(), "cache unit 1 binding - restored by BATCH pop"); + assertEquals(tex1Base, GLSMTextures.getTextures().getTextureUnitBindings(1).getBinding(), "cache unit 1 binding - restored by BATCH pop"); assertEquals(tex1Base, driverTextureBinding(1), "driver unit 1 binding - restored by BATCH pop"); - assertEquals(tex2Dirty, GLStateManager.getTextures().getTextureUnitBindings(2).getBinding(), "cache unit 2 binding - not a BATCH member, must stay toggled"); + assertEquals(tex2Dirty, GLSMTextures.getTextures().getTextureUnitBindings(2).getBinding(), "cache unit 2 binding - not a BATCH member, must stay toggled"); assertEquals(tex2Dirty, driverTextureBinding(2), "driver unit 2 binding - not a BATCH member, must stay toggled"); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + 2); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDeleteTextures(tex0Base); - GLStateManager.glDeleteTextures(tex1Base); - GLStateManager.glDeleteTextures(tex2Base); - GLStateManager.glDeleteTextures(tex0Dirty); - GLStateManager.glDeleteTextures(tex1Dirty); - GLStateManager.glDeleteTextures(tex2Dirty); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + 2); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glDeleteTextures(tex0Base); + GLSMTextures.glDeleteTextures(tex1Base); + GLSMTextures.glDeleteTextures(tex2Base); + GLSMTextures.glDeleteTextures(tex0Dirty); + GLSMTextures.glDeleteTextures(tex1Dirty); + GLSMTextures.glDeleteTextures(tex2Dirty); } } @Test void popStateToRepairsUnbalancedInnerPush() { - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); - final int d = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.pushState(StateSet.CULL); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.popStateTo(d); - assertEquals(d, GLStateManager.getAttribDepth()); - assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getSrcRgb(), "popStateTo repairs the unbalanced non-member push and carries the change through to the BLEND member pop, restoring the pre-bracket baseline"); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMAttribStack.pushState(StateSet.CULL); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMAttribStack.popStateTo(d); + assertEquals(d, GLSMAttribStack.getAttribDepth()); + assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getSrcRgb(), "popStateTo repairs the unbalanced non-member push and carries the change through to the BLEND member pop, restoring the pre-bracket baseline"); assertEquals(GL11.GL_ONE, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb"); } @Test void popStateToToleratesUnbalancedInnerPop() { - final int d = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.popState(); - assertEquals(d, GLStateManager.getAttribDepth()); - GLStateManager.popStateTo(d); - assertEquals(d, GLStateManager.getAttribDepth()); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMAttribStack.popState(); + assertEquals(d, GLSMAttribStack.getAttribDepth()); + GLSMAttribStack.popStateTo(d); + assertEquals(d, GLSMAttribStack.getAttribDepth()); } @Test void exceptionMidBracketLeavesDepthAndStateCorrectViaFinally() { - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - final int depthBefore = GLStateManager.getAttribDepth(); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + final int depthBefore = GLSMAttribStack.getAttribDepth(); final RuntimeException thrown = assertThrows(RuntimeException.class, () -> { - final int d = GLStateManager.pushState(StateSet.BLEND); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); try { - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); throw new RuntimeException("boom"); } finally { - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); } }); assertEquals("boom", thrown.getMessage()); - assertEquals(depthBefore, GLStateManager.getAttribDepth()); + assertEquals(depthBefore, GLSMAttribStack.getAttribDepth()); verifyIsEnabled(GL11.GL_BLEND, true, "Blend enable - restored despite exception"); - assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - restored despite exception"); + assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - restored despite exception"); } @Test void allAttribBitsNestedInsideInternalBracketRestoresBothLevels() { - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); - final int d = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMAttribStack.glPopAttrib(); verifyIsEnabled(GL11.GL_CULL_FACE, true, "Cull enable - restored by inner GL_ALL_ATTRIB_BITS pop"); - assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode - restored by inner GL_ALL_ATTRIB_BITS pop"); + assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode - restored by inner GL_ALL_ATTRIB_BITS pop"); assertEquals(GL11.GL_BACK, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode - restored by inner GL_ALL_ATTRIB_BITS pop"); - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); verifyIsEnabled(GL11.GL_BLEND, false, "Blend enable - restored by outer BLEND pop"); - assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - restored by outer BLEND pop"); + assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - restored by outer BLEND pop"); } @Test void internalBracketNestedInsideAllAttribBitsRestoresBothLevels() { - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); try { - GLStateManager.glCullFace(GL11.GL_FRONT); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); - final int d = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMAttribStack.popStateTo(d); verifyIsEnabled(GL11.GL_BLEND, false, "Blend enable - restored by inner BLEND pop"); - assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getSrcRgb(), "cache blend src rgb - restored by inner BLEND pop"); - assertEquals(GL11.GL_FRONT, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode - change survives, not a BLEND member"); + assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getSrcRgb(), "cache blend src rgb - restored by inner BLEND pop"); + assertEquals(GL11.GL_FRONT, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode - change survives, not a BLEND member"); assertEquals(GL11.GL_FRONT, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode - change survives, not a BLEND member"); } finally { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } - assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face mode - restored by outer GL_ALL_ATTRIB_BITS pop"); + assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face mode - restored by outer GL_ALL_ATTRIB_BITS pop"); assertEquals(GL11.GL_BACK, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face mode - restored by outer GL_ALL_ATTRIB_BITS pop"); } @@ -557,19 +557,19 @@ public class GLSM_StateSet_GLTest { final int p0 = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS); final int p1 = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS); try { - GLStateManager.glUseProgram(p0); + GLSMPrograms.glUseProgram(p0); - final int d = GLStateManager.pushState(StateSet.FONT); - GLStateManager.glUseProgram(p1); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.FONT); + GLSMPrograms.glUseProgram(p1); + GLSMAttribStack.popStateTo(d); - assertEquals(p0, GLStateManager.getActiveProgram(), "cache active program restored"); + assertEquals(p0, GLSMPrograms.getActiveProgram(), "cache active program restored"); assertEquals(p0, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM), "driver current program restored"); assertFalse(ShaderManager.getInstance().isActive(), "FFP must stay inactive when a real program was bound before the bracket"); } finally { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(p0); - GLStateManager.glDeleteProgram(p1); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(p0); + GLSMPrograms.glDeleteProgram(p1); } } @@ -577,34 +577,34 @@ public class GLSM_StateSet_GLTest { void rProgramFontReactivatesFfpAfterBracket() { final int p1 = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS); try { - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); assertTrue(ShaderManager.getInstance().isActive(), "FFP must be active before the bracket"); - final int d = GLStateManager.pushState(StateSet.FONT); - GLStateManager.glUseProgram(p1); + final int d = GLSMAttribStack.pushState(StateSet.FONT); + GLSMPrograms.glUseProgram(p1); assertFalse(ShaderManager.getInstance().isActive(), "FFP must deactivate once a real program binds"); - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); - assertEquals(0, GLStateManager.getActiveProgram(), "cache active program restored to the FFP sentinel"); + assertEquals(0, GLSMPrograms.getActiveProgram(), "cache active program restored to the FFP sentinel"); assertTrue(ShaderManager.getInstance().isActive(), "FFP must be active again after the pop"); } finally { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(p1); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(p1); } } @Test void blendPopDoesNotBumpFragmentOrLightingGeneration() { - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - final int d = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO); final int fragBefore = GLStateManager.ctx().fragmentGeneration; final int lightBefore = GLStateManager.ctx().lightingGeneration; - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); assertEquals(fragBefore, GLStateManager.ctx().fragmentGeneration, "BLEND pop must not bump fragment generation"); assertEquals(lightBefore, GLStateManager.ctx().lightingGeneration, "BLEND pop must not bump lighting generation"); @@ -612,113 +612,113 @@ public class GLSM_StateSet_GLTest { @Test void alphaPopBumpsFragmentGenerationWhenChanged() { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); - final int d = GLStateManager.pushState(StateSet.ALPHA); - GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.1f); + final int d = GLSMAttribStack.pushState(StateSet.ALPHA); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.1f); final int fragBefore = GLStateManager.ctx().fragmentGeneration; - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); assertEquals(fragBefore + 1, GLStateManager.ctx().fragmentGeneration, "ALPHA pop must bump fragment generation once when the value changed inside the bracket"); } @Test void textureBitBracketRestoresUnit1BindingAndActiveUnit() { - final int texBase = GLStateManager.glGenTextures(); - final int texDirty = GLStateManager.glGenTextures(); + final int texBase = GLSMTextures.glGenTextures(); + final int texDirty = GLSMTextures.glGenTextures(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texBase); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texDirty); - GLStateManager.popStateTo(d); - assertEquals(0, GLStateManager.getActiveTextureUnit(), "cache active unit restored by GL_TEXTURE_BIT pop"); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texBase); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT)); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texDirty); + GLSMAttribStack.popStateTo(d); + assertEquals(0, GLSMTextures.getActiveTextureUnit(), "cache active unit restored by GL_TEXTURE_BIT pop"); assertEquals(GL13.GL_TEXTURE0, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE), "driver active unit restored by GL_TEXTURE_BIT pop"); - assertEquals(texBase, GLStateManager.getTextures().getTextureUnitBindings(1).getBinding(), "cache unit 1 binding restored by GL_TEXTURE_BIT pop"); + assertEquals(texBase, GLSMTextures.getTextures().getTextureUnitBindings(1).getBinding(), "cache unit 1 binding restored by GL_TEXTURE_BIT pop"); assertEquals(texBase, driverTextureBinding(1), "driver unit 1 binding restored by GL_TEXTURE_BIT pop"); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDeleteTextures(texBase); - GLStateManager.glDeleteTextures(texDirty); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glDeleteTextures(texBase); + GLSMTextures.glDeleteTextures(texDirty); } } @Test void textureBitBracketRestoresTexEnvModeAndColor() { - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); final FloatBuffer zero = BufferUtils.createFloatBuffer(4); zero.put(0.0f).put(0.0f).put(0.0f).put(0.0f).flip(); - GLStateManager.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, zero); - final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT)); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL); + GLSMTexEnvGen.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, zero); + final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_TEXTURE_BIT)); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL); final FloatBuffer dirty = BufferUtils.createFloatBuffer(4); dirty.put(0.1f).put(0.2f).put(0.3f).put(0.4f).flip(); - GLStateManager.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, dirty); - GLStateManager.popStateTo(d); - assertEquals(GL11.GL_MODULATE, GLStateManager.getTextures().getTexEnvState(0).mode, "cache tex env mode restored by GL_TEXTURE_BIT pop"); - assertEquals(0.0f, GLStateManager.getTextures().getTexEnvState(0).envColorR, 0.0001f, "cache tex env color restored by GL_TEXTURE_BIT pop"); + GLSMTexEnvGen.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, dirty); + GLSMAttribStack.popStateTo(d); + assertEquals(GL11.GL_MODULATE, GLSMTextures.getTextures().getTexEnvState(0).mode, "cache tex env mode restored by GL_TEXTURE_BIT pop"); + assertEquals(0.0f, GLSMTextures.getTextures().getTexEnvState(0).envColorR, 0.0001f, "cache tex env color restored by GL_TEXTURE_BIT pop"); } @Test void lightingBitBracketRestoresBakedFrontMaterialAfterColorMaterialToggle() { - GLStateManager.glColor4f(0.9f, 0.9f, 0.9f, 0.9f); - GLStateManager.enableColorMaterial(); - GLStateManager.disableColorMaterial(); - final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_LIGHTING_BIT)); - GLStateManager.glColor4f(0.1f, 0.2f, 0.3f, 0.4f); - GLStateManager.enableColorMaterial(); - GLStateManager.popStateTo(d); - assertEquals(0.9f, GLStateManager.getFrontMaterial().ambient.x, 0.0001f, "cache front material ambient restored by GL_LIGHTING_BIT pop"); - assertEquals(0.9f, GLStateManager.getFrontMaterial().diffuse.x, 0.0001f, "cache front material diffuse restored by GL_LIGHTING_BIT pop"); + GLSMCurrentAttribs.glColor4f(0.9f, 0.9f, 0.9f, 0.9f); + GLSMLighting.enableColorMaterial(); + GLSMLighting.disableColorMaterial(); + final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_LIGHTING_BIT)); + GLSMCurrentAttribs.glColor4f(0.1f, 0.2f, 0.3f, 0.4f); + GLSMLighting.enableColorMaterial(); + GLSMAttribStack.popStateTo(d); + assertEquals(0.9f, GLSMLighting.getFrontMaterial().ambient.x, 0.0001f, "cache front material ambient restored by GL_LIGHTING_BIT pop"); + assertEquals(0.9f, GLSMLighting.getFrontMaterial().diffuse.x, 0.0001f, "cache front material diffuse restored by GL_LIGHTING_BIT pop"); } @Test void batchAppliesPassLightingAndRestoresLiveLighting() { - final boolean lightmapWas = GLStateManager.getTextures().getTextureUnitStates(1).isEnabled(); + final boolean lightmapWas = GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled(); final LightingSnapshot pass = new LightingSnapshot(); try { - GLStateManager.glEnable(GL11.GL_LIGHT0); - GLStateManager.glEnable(GL11.GL_LIGHT1); - GLStateManager.enableColorMaterial(); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 2.0f); - GLStateManager.captureLighting(pass); + GLSMEnable.glEnable(GL11.GL_LIGHT0); + GLSMEnable.glEnable(GL11.GL_LIGHT1); + GLSMLighting.enableColorMaterial(); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 2.0f); + GLSMLighting.captureLighting(pass); - GLStateManager.glDisable(GL11.GL_LIGHT0); - GLStateManager.glDisable(GL11.GL_LIGHT1); - GLStateManager.disableColorMaterial(); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 1.0f); - GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(false); - final int liveGeneration = GLStateManager.getLightingGeneration(); + GLSMEnable.glDisable(GL11.GL_LIGHT0); + GLSMEnable.glDisable(GL11.GL_LIGHT1); + GLSMLighting.disableColorMaterial(); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 1.0f); + GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(false); + final int liveGeneration = GLSMLighting.getLightingGeneration(); - final int d = GLStateManager.pushState(StateSet.BATCH); - GLStateManager.applyLighting(pass); - GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(true); - assertTrue(GLStateManager.getLightStates()[0].isEnabled(), "light 0 from the pass"); - assertTrue(GLStateManager.getLightStates()[1].isEnabled(), "light 1 from the pass"); - assertTrue(GLStateManager.getColorMaterial().isEnabled(), "color material from the pass"); - assertEquals(2.0f, GLStateManager.getLightDataStates()[0].constantAttenuation, "light 0 data from the pass"); - assertTrue(GLStateManager.getLightingGeneration() != liveGeneration, "lighting uniforms marked dirty"); - final int passGeneration = GLStateManager.getLightingGeneration(); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.BATCH); + GLSMLighting.applyLighting(pass); + GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(true); + assertTrue(GLSMLighting.getLightStates()[0].isEnabled(), "light 0 from the pass"); + assertTrue(GLSMLighting.getLightStates()[1].isEnabled(), "light 1 from the pass"); + assertTrue(GLSMLighting.getColorMaterial().isEnabled(), "color material from the pass"); + assertEquals(2.0f, GLSMLighting.getLightDataStates()[0].constantAttenuation, "light 0 data from the pass"); + assertTrue(GLSMLighting.getLightingGeneration() != liveGeneration, "lighting uniforms marked dirty"); + final int passGeneration = GLSMLighting.getLightingGeneration(); + GLSMAttribStack.popStateTo(d); - assertFalse(GLStateManager.getLightStates()[0].isEnabled(), "light 0 restored by BATCH pop"); - assertFalse(GLStateManager.getLightStates()[1].isEnabled(), "light 1 restored by BATCH pop"); - assertFalse(GLStateManager.getColorMaterial().isEnabled(), "color material restored by BATCH pop"); - assertEquals(1.0f, GLStateManager.getLightDataStates()[0].constantAttenuation, "light 0 data restored by BATCH pop"); - assertFalse(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled(), "lightmap enable restored by BATCH pop"); - assertTrue(GLStateManager.getLightingGeneration() != passGeneration, "lighting uniforms marked dirty after pop"); + assertFalse(GLSMLighting.getLightStates()[0].isEnabled(), "light 0 restored by BATCH pop"); + assertFalse(GLSMLighting.getLightStates()[1].isEnabled(), "light 1 restored by BATCH pop"); + assertFalse(GLSMLighting.getColorMaterial().isEnabled(), "color material restored by BATCH pop"); + assertEquals(1.0f, GLSMLighting.getLightDataStates()[0].constantAttenuation, "light 0 data restored by BATCH pop"); + assertFalse(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled(), "lightmap enable restored by BATCH pop"); + assertTrue(GLSMLighting.getLightingGeneration() != passGeneration, "lighting uniforms marked dirty after pop"); } finally { - GLStateManager.glDisable(GL11.GL_LIGHT0); - GLStateManager.glDisable(GL11.GL_LIGHT1); - GLStateManager.disableColorMaterial(); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 1.0f); - GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(lightmapWas); + GLSMEnable.glDisable(GL11.GL_LIGHT0); + GLSMEnable.glDisable(GL11.GL_LIGHT1); + GLSMLighting.disableColorMaterial(); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 1.0f); + GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(lightmapWas); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureBindingTargetCache_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureBindingTargetCache_UnitTest.java index 0e842718f..7a5ef76e4 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureBindingTargetCache_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureBindingTargetCache_UnitTest.java @@ -15,24 +15,24 @@ public class GLSM_TextureBindingTargetCache_UnitTest { final int t3d = GL11.glGenTextures(); final int t2d = GL11.glGenTextures(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE3); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d); - assertEquals(t3d, GLStateManager.getBoundTextureForServerState(3), "cache must track a 3D bind"); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d); + assertEquals(t3d, GLSMTextures.getBoundTextureForServerState(3), "cache must track a 3D bind"); assertEquals(t3d, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D), "3D bind must reach the driver"); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t2d); - assertEquals(t2d, GLStateManager.getBoundTextureForServerState(3), "cache must track the 2D bind after a 3D bind"); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t2d); + assertEquals(t2d, GLSMTextures.getBoundTextureForServerState(3), "cache must track the 2D bind after a 3D bind"); assertEquals(t2d, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D)); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d); - assertEquals(t3d, GLStateManager.getBoundTextureForServerState(3), "cache must track the 3D re-bind"); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d); + assertEquals(t3d, GLSMTextures.getBoundTextureForServerState(3), "cache must track the 3D re-bind"); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } finally { - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDeleteTextures(t3d); - GLStateManager.glDeleteTextures(t2d); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glDeleteTextures(t3d); + GLSMTextures.glDeleteTextures(t2d); } } @@ -40,19 +40,19 @@ public class GLSM_TextureBindingTargetCache_UnitTest { void proxyTargetBindIsNeitherForwardedNorCached() { final int t2d = GL11.glGenTextures(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE5); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t2d); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE5); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t2d); - GLStateManager.glBindTexture(GL11.GL_PROXY_TEXTURE_2D, 0); - GLStateManager.glBindTexture(GL12.GL_PROXY_TEXTURE_3D, t2d); + GLSMTextures.glBindTexture(GL11.GL_PROXY_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL12.GL_PROXY_TEXTURE_3D, t2d); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "a proxy target must never reach the driver"); - assertEquals(t2d, GLStateManager.getBoundTextureForServerState(5), "a proxy bind must not disturb the cache"); + assertEquals(t2d, GLSMTextures.getBoundTextureForServerState(5), "a proxy bind must not disturb the cache"); assertEquals(t2d, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D)); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDeleteTextures(t2d); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glDeleteTextures(t2d); } } @@ -61,22 +61,22 @@ public class GLSM_TextureBindingTargetCache_UnitTest { final int t3d = GL11.glGenTextures(); final int t2d = GL11.glGenTextures(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, t3d); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, t3d); - GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t2d); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t2d); + GLSMAttribStack.glPopAttrib(); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "restore must not re-bind a 3D texture as 2D"); - assertEquals(t3d, GLStateManager.getBoundTextureForServerState(2), "cache must restore the pre-push binding"); + assertEquals(t3d, GLSMTextures.getBoundTextureForServerState(2), "cache must restore the pre-push binding"); assertEquals(t3d, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D), "restore must use the recorded target"); } finally { - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDeleteTextures(t3d); - GLStateManager.glDeleteTextures(t2d); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glDeleteTextures(t3d); + GLSMTextures.glDeleteTextures(t2d); } } @@ -84,14 +84,14 @@ public class GLSM_TextureBindingTargetCache_UnitTest { void unbindIsNotElidedAcrossTargets() { final int t2d = GL11.glGenTextures(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE4); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t2d); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE4); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t2d); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); assertEquals(0, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "2D unbind after a 3D unbind must reach the driver"); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDeleteTextures(t2d); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glDeleteTextures(t2d); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java index 04c2273ce..9226a756f 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureInfoCache_UnitTest.java @@ -48,9 +48,9 @@ public class GLSM_TextureInfoCache_UnitTest { void testNonGenericUploadCachesWithoutRoundtrip() { int texId = GL11.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); ByteBuffer pixels = BufferUtils.createByteBuffer(64 * 64 * 4); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); TextureInfo info = TextureInfoCache.INSTANCE.getInfo(texId); assertFalse(info.needsInternalFormatResolve()); @@ -66,9 +66,9 @@ public class GLSM_TextureInfoCache_UnitTest { void testGenericCompressedPreservesAsPassedInternalFormat() { int texId = GL11.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); ByteBuffer pixels = BufferUtils.createByteBuffer(64 * 64 * 4); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL13.GL_COMPRESSED_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL13.GL_COMPRESSED_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); TextureInfo info = TextureInfoCache.INSTANCE.getInfo(texId); assertEquals(GL13.GL_COMPRESSED_RGBA, info.getInternalFormat()); @@ -83,15 +83,15 @@ public class GLSM_TextureInfoCache_UnitTest { void testRepeatedQueryAfterResolveUsesCache() { int texId = GL11.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); ByteBuffer pixels = BufferUtils.createByteBuffer(64 * 64 * 4); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL13.GL_COMPRESSED_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL13.GL_COMPRESSED_RGBA, 64, 64, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); TextureInfo info = TextureInfoCache.INSTANCE.getInfo(texId); assertTrue(info.needsInternalFormatResolve()); - int first = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_INTERNAL_FORMAT); + int first = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_INTERNAL_FORMAT); assertFalse(info.needsInternalFormatResolve()); - int second = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_INTERNAL_FORMAT); + int second = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_INTERNAL_FORMAT); assertEquals(GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_INTERNAL_FORMAT), second); assertEquals(first, second); } finally { @@ -137,7 +137,7 @@ public class GLSM_TextureInfoCache_UnitTest { GLStateManager.setDrawableGLHolder(null); // Current thread != null, so caching disabled assertFalse(GLStateManager.isCachingEnabled()); - GLStateManager.glDeleteTextures(texId); + GLSMTextures.glDeleteTextures(texId); SplashWindow.setSplashComplete(true); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureUploadGeneration_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureUploadGeneration_GLTest.java index ecd0fbf4b..65ff8eda7 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureUploadGeneration_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_TextureUploadGeneration_GLTest.java @@ -16,9 +16,9 @@ import static org.junit.jupiter.api.Assertions.assertNotSame; public class GLSM_TextureUploadGeneration_GLTest { private static int allocate(int size) { - final int texId = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texId); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(size * size * 4)); + final int texId = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texId); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(size * size * 4)); return texId; } @@ -26,14 +26,14 @@ public class GLSM_TextureUploadGeneration_GLTest { void aLevelBeyondTheShiftWidthClampsToOne() { final int texId = allocate(64); try { - assertEquals(64, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH)); - assertEquals(1, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 6, GL11.GL_TEXTURE_WIDTH)); - assertEquals(1, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 31, GL11.GL_TEXTURE_WIDTH)); - assertEquals(1, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 32, GL11.GL_TEXTURE_WIDTH)); - assertEquals(1, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 64, GL11.GL_TEXTURE_HEIGHT)); + assertEquals(64, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH)); + assertEquals(1, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 6, GL11.GL_TEXTURE_WIDTH)); + assertEquals(1, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 31, GL11.GL_TEXTURE_WIDTH)); + assertEquals(1, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 32, GL11.GL_TEXTURE_WIDTH)); + assertEquals(1, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 64, GL11.GL_TEXTURE_HEIGHT)); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(texId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(texId); } } @@ -46,13 +46,13 @@ public class GLSM_TextureUploadGeneration_GLTest { TextureInfoCache.INSTANCE.onDeleteTexture(texId); final ByteBuffer pixels = BufferUtils.createByteBuffer(4 * 4 * 4); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 4, 4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 4, 4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); final TextureInfo second = TextureInfoCache.INSTANCE.getInfo(texId); assertNotSame(first, second, "a deleted id drops its entry, so the replacement must be a distinct instance"); assertEquals(firstGeneration, second.getUploadGeneration(), "generations alias across a delete/recreate cycle, which is exactly why identity has to carry the distinction"); } finally { - GLStateManager.glDeleteTextures(texId); + GLSMTextures.glDeleteTextures(texId); } } @@ -64,16 +64,16 @@ public class GLSM_TextureUploadGeneration_GLTest { final int afterAlloc = info.getUploadGeneration(); assertNotEquals(0, afterAlloc); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(2 * 2 * 4)); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(2 * 2 * 4)); assertNotEquals(afterAlloc, info.getUploadGeneration(), "content changed, so anything caching the pixels is stale"); final int afterSub = info.getUploadGeneration(); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 1, 0, 0, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(4)); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 1, 0, 0, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, BufferUtils.createByteBuffer(4)); assertEquals(afterSub, info.getUploadGeneration(), "only level 0 is tracked"); // Level 1 was never allocated, so the driver rejects that upload. assertEquals(GL11.GL_INVALID_OPERATION, GL11.glGetError()); } finally { - GLStateManager.glDeleteTextures(texId); + GLSMTextures.glDeleteTextures(texId); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java index d81e1b83d..404cd8f9e 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_VAO_UnitTest.java @@ -23,7 +23,7 @@ public class GLSM_VAO_UnitTest { @AfterEach void resetClientArrayState() { UniversalVAO.bindVertexArray(0); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); GLSMUtil.setClientState(GL11.GL_NORMAL_ARRAY, false); } @@ -48,14 +48,14 @@ public class GLSM_VAO_UnitTest { final int vaoVertexType = GL11.GL_INT; final int vaoVertexStride = vaoVertexSize * 4; - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); verifyState(GL13.GL_CLIENT_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "GL_CLIENT_ACTIVE_TEXTURE - Setup"); // Set the vertex attrib to a defined state int vbo = GL15.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexPointer(defaultVertexSize, defaultVertexType, defaultVertexStride, 0L); + GLSMVertexInput.glVertexPointer(defaultVertexSize, defaultVertexType, defaultVertexStride, 0L); GLSMUtil.setClientState(GL11.GL_NORMAL_ARRAY, true); verifyState(GL11.GL_NORMAL_ARRAY, true, "GL_NORMAL_ARRAY - Enabled"); @@ -64,7 +64,7 @@ public class GLSM_VAO_UnitTest { verifyState(GL11.GL_VERTEX_ARRAY_TYPE, defaultVertexType, "GL_VERTEX_ARRAY_TYPE - Setup"); verifyState(GL11.GL_VERTEX_ARRAY_STRIDE, defaultVertexStride, "GL_VERTEX_ARRAY_STRIDE - Setup"); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); // Verify VAO & VBO creation int vao = UniversalVAO.genVertexArrays(); @@ -73,7 +73,7 @@ public class GLSM_VAO_UnitTest { UniversalVAO.bindVertexArray(vao); verifyState(GL30.GL_VERTEX_ARRAY_BINDING, vao, "GL_VERTEX_ARRAY_BINDING - Bound"); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); verifyState(GL15.GL_ARRAY_BUFFER_BINDING, vbo, "GL_ARRAY_BUFFER_BINDING - Bound"); verifyState(GL13.GL_CLIENT_ACTIVE_TEXTURE, GL13.GL_TEXTURE1, "GL_CLIENT_ACTIVE_TEXTURE - Preserved"); @@ -86,13 +86,13 @@ public class GLSM_VAO_UnitTest { GLSMUtil.setClientState(GL11.GL_VERTEX_ARRAY, vaoVertexEnabled); verifyState(GL11.GL_VERTEX_ARRAY, vaoVertexEnabled, "GL_VERTEX_ARRAY - Enabled"); - GLStateManager.glVertexPointer(vaoVertexSize, vaoVertexType, vaoVertexStride, 0L); + GLSMVertexInput.glVertexPointer(vaoVertexSize, vaoVertexType, vaoVertexStride, 0L); verifyState(GL11.GL_VERTEX_ARRAY_SIZE, vaoVertexSize, "GL_VERTEX_ARRAY_SIZE - Set"); verifyState(GL11.GL_VERTEX_ARRAY_TYPE, vaoVertexType, "GL_VERTEX_ARRAY_TYPE - Set"); verifyState(GL11.GL_VERTEX_ARRAY_STRIDE, vaoVertexStride, "GL_VERTEX_ARRAY_STRIDE - Set"); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); // Check if everything got reset to default UniversalVAO.bindVertexArray(0); @@ -116,64 +116,64 @@ public class GLSM_VAO_UnitTest { UniversalVAO.bindVertexArray(0); - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); UniversalVAO.bindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); verifyState(GL30.GL_VERTEX_ARRAY_BINDING, vao, "GL_VERTEX_ARRAY_BINDING - Not affected by glPushAttrib"); verifyState(GL15.GL_ARRAY_BUFFER_BINDING, vbo, "GL_ARRAY_BUFFER_BINDING - Not affected by glPushAttrib"); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); UniversalVAO.bindVertexArray(0); - GLStateManager.glDeleteBuffers(vbo); + GLSMBuffers.glDeleteBuffers(vbo); UniversalVAO.deleteVertexArrays(vao); } @Test void testGenericAttributeSupersedesFfpConventional() { withVaoAndVbo(() -> { - GLStateManager.glVertexAttribPointer(0, 1, GL11.GL_FLOAT, false, 0, 0L); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L); + GLSMVertexInput.glVertexAttribPointer(0, 1, GL11.GL_FLOAT, false, 0, 0L); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L); Assertions.assertEquals(1, VAOManager.get(0).size, "enabled generic attribute must supersede the FFP conventional array at the same location"); Assertions.assertEquals(1, driverAttrib0Size()); Assertions.assertTrue(VAOManager.get(0).genericPointer, "location must remain generic-sourced"); - GLStateManager.glDisableVertexAttribArray(0); + GLSMVertexInput.glDisableVertexAttribArray(0); }); } @Test void testGenericAttributeWinsRegardlessOfOrder() { withVaoAndVbo(() -> { - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L); - GLStateManager.glVertexAttribPointer(0, 1, GL11.GL_FLOAT, false, 0, 0L); - GLStateManager.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L); + GLSMVertexInput.glVertexAttribPointer(0, 1, GL11.GL_FLOAT, false, 0, 0L); + GLSMVertexInput.glEnableVertexAttribArray(0); Assertions.assertEquals(1, VAOManager.get(0).size, "generic attribute set after the FFP conventional array must still win"); Assertions.assertEquals(1, driverAttrib0Size()); Assertions.assertTrue(VAOManager.get(0).genericPointer, "location must remain generic-sourced"); - GLStateManager.glDisableVertexAttribArray(0); + GLSMVertexInput.glDisableVertexAttribArray(0); }); } @Test void testFfpConventionalAppliesWithoutGenericAttribute() { withVaoAndVbo(() -> { - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L); - GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L); + GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY); Assertions.assertEquals(3, VAOManager.get(0).size, "plain FFP conventional array must apply when no generic attribute occupies the location"); Assertions.assertEquals(3, driverAttrib0Size()); Assertions.assertFalse(VAOManager.get(0).genericPointer, "location must be conventional-sourced"); - GLStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glDisableClientState(GL11.GL_VERTEX_ARRAY); }); } @@ -187,13 +187,13 @@ public class GLSM_VAO_UnitTest { final int vao = UniversalVAO.genVertexArrays(); UniversalVAO.bindVertexArray(vao); final int vbo = GL15.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); try { body.run(); } finally { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); UniversalVAO.bindVertexArray(0); - GLStateManager.glDeleteBuffers(vbo); + GLSMBuffers.glDeleteBuffers(vbo); UniversalVAO.deleteVertexArrays(vao); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ValueStackCow_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ValueStackCow_GLTest.java index f257d9b30..27666bc26 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ValueStackCow_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_ValueStackCow_GLTest.java @@ -29,8 +29,8 @@ public class GLSM_ValueStackCow_GLTest { private static void ensureFixtureTextures() { if (fixtureTexA == -1) { - fixtureTexA = GLStateManager.glGenTextures(); - fixtureTexB = GLStateManager.glGenTextures(); + fixtureTexA = GLSMTextures.glGenTextures(); + fixtureTexB = GLSMTextures.glGenTextures(); final int bound = GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); GL11.glBindTexture(GL11.GL_TEXTURE_2D, fixtureTexB); GL11.glBindTexture(GL11.GL_TEXTURE_2D, bound); @@ -39,8 +39,8 @@ public class GLSM_ValueStackCow_GLTest { @AfterAll static void deleteFixtureTextures() { - if (fixtureTexA > 0) GLStateManager.glDeleteTextures(fixtureTexA); - if (fixtureTexB > 0) GLStateManager.glDeleteTextures(fixtureTexB); + if (fixtureTexA > 0) GLSMTextures.glDeleteTextures(fixtureTexA); + if (fixtureTexB > 0) GLSMTextures.glDeleteTextures(fixtureTexB); fixtureTexA = fixtureTexB = -1; } @@ -59,97 +59,97 @@ public class GLSM_ValueStackCow_GLTest { }; private static final Runnable[] MUTATIONS = { - () -> GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.1f), - () -> GLStateManager.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO), - () -> GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO), - () -> GLStateManager.glBlendEquation(GL14.GL_FUNC_SUBTRACT), - () -> GLStateManager.glBlendEquationSeparate(GL14.GL_FUNC_SUBTRACT, GL14.GL_FUNC_REVERSE_SUBTRACT), - () -> GLStateManager.glBlendColor(0.5f, 0.6f, 0.7f, 0.8f), - () -> GLStateManager.glColorMask(false, true, false, true), - () -> GLStateManager.glClearColor(1.0f, 0.5f, 0.25f, 0.75f), - () -> GLStateManager.glDrawBuffer(GL11.GL_NONE), - () -> GLStateManager.glLogicOp(GL11.GL_XOR), - () -> GLStateManager.glDepthFunc(GL11.GL_ALWAYS), - () -> GLStateManager.glDepthMask(false), - () -> GLStateManager.glClearDepth(0.25), - () -> GLStateManager.glStencilFunc(GL11.GL_NOTEQUAL, 3, 0x0F), - () -> GLStateManager.glStencilOp(GL11.GL_REPLACE, GL11.GL_INCR, GL11.GL_DECR), - () -> GLStateManager.glStencilMask(0x0F), - () -> GLStateManager.glClearStencil(9), - () -> GLStateManager.glViewport(1, 2, 3, 4), - () -> GLStateManager.glScissor(1, 2, 3, 4), - () -> GLStateManager.glDepthRange(0.2, 0.8), - () -> GLStateManager.glLineWidth(3.0f), - () -> GLStateManager.glLineStipple(3, (short) 0x00FF), - () -> GLStateManager.glPointSize(4.0f), - () -> GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE), - () -> GLStateManager.glCullFace(GL11.GL_FRONT), - () -> GLStateManager.glFrontFace(GL11.GL_CW), - () -> GLStateManager.glPolygonOffset(3.0f, 4.0f), - () -> GLStateManager.fogColor(0.5f, 0.6f, 0.7f, 0.8f), - () -> GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.5f), - () -> GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR), - () -> GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 12.0f), - () -> GLStateManager.glLighti(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 45), - () -> GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, buf4(1.0f, 2.0f, 3.0f, 1.0f)), - () -> GLStateManager.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f), - () -> GLStateManager.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR), - () -> GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, buf4(0.5f, 0.6f, 0.7f, 0.8f)), - () -> GLStateManager.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 32.0f), - () -> GLStateManager.glMateriali(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 32), - () -> GLStateManager.glMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, buf4(0.1f, 0.2f, 0.3f, 0.4f)), - () -> GLStateManager.glShadeModel(GL11.GL_FLAT), - () -> GLStateManager.glColorMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR), - () -> GLStateManager.glMatrixMode(GL11.GL_PROJECTION), - () -> GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + 2), + () -> GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.1f), + () -> GLSMBlend.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO), + () -> GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO), + () -> GLSMBlend.glBlendEquation(GL14.GL_FUNC_SUBTRACT), + () -> GLSMBlend.glBlendEquationSeparate(GL14.GL_FUNC_SUBTRACT, GL14.GL_FUNC_REVERSE_SUBTRACT), + () -> GLSMBlend.glBlendColor(0.5f, 0.6f, 0.7f, 0.8f), + () -> GLSMBlend.glColorMask(false, true, false, true), + () -> GLSMBlend.glClearColor(1.0f, 0.5f, 0.25f, 0.75f), + () -> GLSMFramebuffer.glDrawBuffer(GL11.GL_NONE), + () -> GLSMBlend.glLogicOp(GL11.GL_XOR), + () -> GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS), + () -> GLSMDepthStencilAlpha.glDepthMask(false), + () -> GLSMDepthStencilAlpha.glClearDepth(0.25), + () -> GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_NOTEQUAL, 3, 0x0F), + () -> GLSMDepthStencilAlpha.glStencilOp(GL11.GL_REPLACE, GL11.GL_INCR, GL11.GL_DECR), + () -> GLSMDepthStencilAlpha.glStencilMask(0x0F), + () -> GLSMDepthStencilAlpha.glClearStencil(9), + () -> GLSMRasterizer.glViewport(1, 2, 3, 4), + () -> GLSMRasterizer.glScissor(1, 2, 3, 4), + () -> GLSMDepthStencilAlpha.glDepthRange(0.2, 0.8), + () -> GLSMRasterizer.glLineWidth(3.0f), + () -> GLSMRasterizer.glLineStipple(3, (short) 0x00FF), + () -> GLSMRasterizer.glPointSize(4.0f), + () -> GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE), + () -> GLSMRasterizer.glCullFace(GL11.GL_FRONT), + () -> GLSMRasterizer.glFrontFace(GL11.GL_CW), + () -> GLSMRasterizer.glPolygonOffset(3.0f, 4.0f), + () -> GLSMFog.fogColor(0.5f, 0.6f, 0.7f, 0.8f), + () -> GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.5f), + () -> GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR), + () -> GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_SPOT_EXPONENT, 12.0f), + () -> GLSMLighting.glLighti(GL11.GL_LIGHT0, GL11.GL_SPOT_CUTOFF, 45), + () -> GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, buf4(1.0f, 2.0f, 3.0f, 1.0f)), + () -> GLSMLighting.glLightModelf(GL11.GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f), + () -> GLSMLighting.glLightModeli(GL12.GL_LIGHT_MODEL_COLOR_CONTROL, GL12.GL_SEPARATE_SPECULAR_COLOR), + () -> GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, buf4(0.5f, 0.6f, 0.7f, 0.8f)), + () -> GLSMLighting.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 32.0f), + () -> GLSMLighting.glMateriali(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 32), + () -> GLSMLighting.glMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE, buf4(0.1f, 0.2f, 0.3f, 0.4f)), + () -> GLSMRasterizer.glShadeModel(GL11.GL_FLAT), + () -> GLSMLighting.glColorMaterial(GL11.GL_FRONT, GL11.GL_SPECULAR), + () -> GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION), + () -> GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + 2), () -> { ensureFixtureTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, fixtureTexA); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, fixtureTexA); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); }, - () -> GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL), - () -> GLStateManager.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, buf4(0.1f, 0.2f, 0.3f, 0.4f)), - () -> GLStateManager.glSecondaryColor3ub((byte) 255, (byte) 128, (byte) 64), + () -> GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL), + () -> GLSMTexEnvGen.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, buf4(0.1f, 0.2f, 0.3f, 0.4f)), + () -> GLSMCurrentAttribs.glSecondaryColor3ub((byte) 255, (byte) 128, (byte) 64), () -> { - GLStateManager.disableBlend(); - GLStateManager.enableBlend(); + GLSMBlend.disableBlend(); + GLSMBlend.enableBlend(); }, () -> { - GLStateManager.disableAlphaTest(); - GLStateManager.enableAlphaTest(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.enableAlphaTest(); }, () -> { - GLStateManager.glDisable(GL11.GL_CULL_FACE); - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); }, () -> { assumeTrue(GLStateManager.capabilities.GL_ARB_direct_state_access, "test requires GL_ARB_direct_state_access"); ensureFixtureTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, fixtureTexA); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, fixtureTexA); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); new DSAARB().bindTextureToUnit(1, fixtureTexB); } }; @Test void everyMutationSiteReachesTheSaveHook() { - final int entryDepth = GLStateManager.getAttribDepth(); + final int entryDepth = GLSMAttribStack.getAttribDepth(); try { for (int i = 0; i < MUTATIONS.length; i++) { - final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS)); + final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ALL_ATTRIB_BITS)); try { - final long before = GLStateManager.attribSlotsSaved; + final long before = GLSMAttribStack.attribSlotsSaved; MUTATIONS[i].run(); - assertTrue(GLStateManager.attribSlotsSaved - before >= 1, NAMES[i] + ": mutation site did not reach the save hook"); + assertTrue(GLSMAttribStack.attribSlotsSaved - before >= 1, NAMES[i] + ": mutation site did not reach the save hook"); } finally { - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); } } } finally { - GLStateManager.popStateTo(entryDepth); + GLSMAttribStack.popStateTo(entryDepth); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_WorkerContextStacks_GLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_WorkerContextStacks_GLTest.java index 203b747e0..72884530a 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_WorkerContextStacks_GLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/GLSM_WorkerContextStacks_GLTest.java @@ -18,16 +18,16 @@ public class GLSM_WorkerContextStacks_GLTest { void enableBitBracketRestoresOnWorkerContext() { GLStateManager.enterWorkerContext(); try { - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); - final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT)); - GLStateManager.glEnable(GL11.GL_CULL_FACE); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT)); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); + GLSMAttribStack.popStateTo(d); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_CULL_FACE), "cull face restored on the worker context"); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE), "cull face restored on the worker context"); verifyIsEnabled(GL11.GL_CULL_FACE, false, "driver cull face restored on the worker context"); } finally { - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); GLStateManager.exitWorkerContext(); } } @@ -36,44 +36,44 @@ public class GLSM_WorkerContextStacks_GLTest { void colorBufferBitBracketRestoresOnWorkerContext() { GLStateManager.enterWorkerContext(); try { - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); - final int d = GLStateManager.pushState(StateSet.forMask(GL11.GL_COLOR_BUFFER_BIT)); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_COLOR_BUFFER_BIT)); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMAttribStack.popStateTo(d); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_BLEND), "blend enable restored on the worker context"); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_BLEND), "blend enable restored on the worker context"); verifyIsEnabled(GL11.GL_BLEND, false, "driver blend enable restored on the worker context"); - assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getSrcRgb(), "blend src rgb restored on the worker context"); + assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getSrcRgb(), "blend src rgb restored on the worker context"); assertEquals(GL11.GL_ONE, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb restored on the worker context"); } finally { - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); GLStateManager.exitWorkerContext(); } } @Test void workerResetLeavesPrimaryContextUntouched() { - GLStateManager.glDisable(GL11.GL_CULL_FACE); - final int primaryDepthBefore = GLStateManager.getAttribDepth(); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); + final int primaryDepthBefore = GLSMAttribStack.getAttribDepth(); GLStateManager.enterWorkerContext(); try { - GLStateManager.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT)); - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT)); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); GLStateManager.reset(); - assertEquals(0, GLStateManager.getAttribDepth(), "worker attrib depth drained by its own reset"); + assertEquals(0, GLSMAttribStack.getAttribDepth(), "worker attrib depth drained by its own reset"); } finally { GLStateManager.exitWorkerContext(); } - assertEquals(primaryDepthBefore, GLStateManager.getAttribDepth(), "primary context depth untouched by the worker reset"); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_CULL_FACE), "primary context cull face untouched by the worker reset"); + assertEquals(primaryDepthBefore, GLSMAttribStack.getAttribDepth(), "primary context depth untouched by the worker reset"); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_CULL_FACE), "primary context cull face untouched by the worker reset"); } @Test diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ImmediateModeThreadIsolationTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ImmediateModeThreadIsolationTest.java index 31b714590..0c62de5da 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ImmediateModeThreadIsolationTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ImmediateModeThreadIsolationTest.java @@ -49,12 +49,12 @@ class ImmediateModeThreadIsolationTest { final TestThreads.Body spam = () -> { start.await(); while (!stop.get()) { - GLStateManager.glBegin(GL11.GL_QUADS); - GLStateManager.glVertex3f(0, 0, 0); - GLStateManager.glVertex3f(1, 0, 0); - GLStateManager.glVertex3f(1, 1, 0); - GLStateManager.glVertex3f(0, 1, 0); - GLStateManager.glEnd(); + GLSMDraws.glBegin(GL11.GL_QUADS); + GLSMDraws.glVertex3f(0, 0, 0); + GLSMDraws.glVertex3f(1, 0, 0); + GLSMDraws.glVertex3f(1, 1, 0); + GLSMDraws.glVertex3f(0, 1, 0); + GLSMDraws.glEnd(); } }; final TestThreads.Worker t1 = TestThreads.start("iso-spam-1", spam); @@ -64,15 +64,15 @@ class ImmediateModeThreadIsolationTest { final List lists = new ArrayList<>(); try { for (int i = 0; i < 50; i++) { - final int list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glBegin(GL11.GL_QUADS); - GLStateManager.glVertex3f(0, 0, 0); - GLStateManager.glVertex3f(1, 0, 0); - GLStateManager.glVertex3f(1, 1, 0); - GLStateManager.glVertex3f(0, 1, 0); - GLStateManager.glEnd(); - GLStateManager.glEndList(); + final int list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glBegin(GL11.GL_QUADS); + GLSMDraws.glVertex3f(0, 0, 0); + GLSMDraws.glVertex3f(1, 0, 0); + GLSMDraws.glVertex3f(1, 1, 0); + GLSMDraws.glVertex3f(0, 1, 0); + GLSMDraws.glEnd(); + GLSMDraws.glEndList(); lists.add(list); } } finally { @@ -85,7 +85,7 @@ class ImmediateModeThreadIsolationTest { final CompiledDisplayList compiled = DisplayListManager.getDisplayList(list); assertNotNull(compiled, "list " + list + " should be compiled"); assertEquals(1, compiled.getCommandCounts().getOrDefault(GLCommand.DRAW_RANGE, 0), "list " + list + " should contain exactly the main thread's draw"); - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/InstancedQuadDrawGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/InstancedQuadDrawGLTest.java index 9f78c17c8..06ed3fde4 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/InstancedQuadDrawGLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/InstancedQuadDrawGLTest.java @@ -29,43 +29,43 @@ class InstancedQuadDrawGLTest { @BeforeEach void setup() { program = GlTestSupport.program(VS, FS); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); final FloatBuffer verts = BufferUtils.createFloatBuffer(8); verts.put(new float[] {0, 0, 1, 0, 1, 1, 0, 1}).flip(); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW); - GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 0, 0L); - GLStateManager.glEnableVertexAttribArray(0); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW); + GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 0, 0L); + GLSMVertexInput.glEnableVertexAttribArray(0); final IntBuffer idx = BufferUtils.createIntBuffer(4); idx.put(new int[] {0, 1, 2, 3}).flip(); - ebo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, idx, GL15.GL_STATIC_DRAW); + ebo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, idx, GL15.GL_STATIC_DRAW); } @AfterEach void cleanup() { - GLStateManager.glUseProgram(0); - if (program != 0) GLStateManager.glDeleteProgram(program); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - if (vbo != 0) GLStateManager.glDeleteBuffers(vbo); - if (ebo != 0) GLStateManager.glDeleteBuffers(ebo); + GLSMPrograms.glUseProgram(0); + if (program != 0) GLSMPrograms.glDeleteProgram(program); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo); + if (ebo != 0) GLSMBuffers.glDeleteBuffers(ebo); } static Stream draws() { return Stream.of( - draw("GL_QUADS instanced array draw must be emulated, not rejected", ebo -> GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, 4, 3)), + draw("GL_QUADS instanced array draw must be emulated, not rejected", ebo -> GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, 4, 3)), draw("non-quad instanced array draw passes through cleanly", ebo -> { - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); - GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 3); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 3); }), draw("GL_QUADS instanced element draw must be emulated, not rejected", ebo -> { - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glDrawElementsInstanced(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_INT, 0L, 3); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMDraws.glDrawElementsInstanced(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_INT, 0L, 3); })); } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java index d454e7329..2874aaf1a 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/VertexAttribDefaultBridgeTest.java @@ -34,24 +34,24 @@ class VertexAttribDefaultBridgeTest { @Test void testGlColor4fSetsVertexAttrib() { - GLStateManager.glColor4f(0.5f, 0.25f, 0.75f, 0.8f); - GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); + GLSMCurrentAttribs.glColor4f(0.5f, 0.25f, 0.75f, 0.8f); + GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); assertAttrib(COLOR_ATTRIB, "color", 0.5f, 0.25f, 0.75f, 0.8f); } @Test void testGlNormal3fSetsVertexAttrib() { - GLStateManager.glNormal3f(0.0f, 1.0f, 0.0f); - GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); + GLSMCurrentAttribs.glNormal3f(0.0f, 1.0f, 0.0f); + GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); assertAttrib(NORMAL_ATTRIB, "normal", 0.0f, 1.0f, 0.0f); } @Test void testSetLightmapTextureCoordsOnUnit1SetsVertexAttrib() { - GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, 240.0f, 128.0f); - GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); + GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, 240.0f, 128.0f); + GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); assertAttrib(SECONDARY_UV_ATTRIB, "lightmap", 240.0f, 128.0f, 0.0f, 1.0f); } @@ -59,37 +59,37 @@ class VertexAttribDefaultBridgeTest { @Test void testGlTexCoord2fSetsVertexAttrib() { // glTexCoord2f outside recording → sets default vertex attrib 2 (PRIMARY_UV) - GLStateManager.glTexCoord2f(0.5f, 0.75f); - GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); + GLSMCurrentAttribs.glTexCoord2f(0.5f, 0.75f); + GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); assertAttrib(PRIMARY_UV_ATTRIB, "texcoord", 0.5f, 0.75f); } @Test void testCacheDedup_SameColorTwice_AttribStillCorrect() { - GLStateManager.glColor4f(0.3f, 0.6f, 0.9f, 1.0f); + GLSMCurrentAttribs.glColor4f(0.3f, 0.6f, 0.9f, 1.0f); // Second call is a cache hit — changeColor not called. // Vertex attrib should still hold the correct value from the first call. - GLStateManager.glColor4f(0.3f, 0.6f, 0.9f, 1.0f); - GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); + GLSMCurrentAttribs.glColor4f(0.3f, 0.6f, 0.9f, 1.0f); + GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); assertAttrib(COLOR_ATTRIB, "color after dedup", 0.3f, 0.6f, 0.9f, 1.0f); } @Test void testCompileMode_DoesNotSetVertexAttrib() { - GLStateManager.glColor4f(0.1f, 0.2f, 0.3f, 1.0f); - GLStateManager.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); + GLSMCurrentAttribs.glColor4f(0.1f, 0.2f, 0.3f, 1.0f); + GLSMCurrentAttribs.flushDeferredVertexAttribs(GLStateManager.ctx(), false, false, false, false); - int listId = GLStateManager.glGenLists(1); - GLStateManager.glNewList(listId, GL11.GL_COMPILE); + int listId = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(listId, GL11.GL_COMPILE); // Color during COMPILE should NOT reach changeColor (early return) - GLStateManager.glColor4f(0.9f, 0.8f, 0.7f, 0.6f); + GLSMCurrentAttribs.glColor4f(0.9f, 0.8f, 0.7f, 0.6f); assertAttrib(COLOR_ATTRIB, "color unchanged during COMPILE", 0.1f, 0.2f, 0.3f, 1.0f); - GLStateManager.glEndList(); - GLStateManager.glDeleteLists(listId, 1); + GLSMDraws.glEndList(); + GLSMDraws.glDeleteLists(listId, 1); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupportedBindingTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupportedBindingTest.java index 3c935ab52..1b84e797d 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupportedBindingTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/dsa/DSAUnsupportedBindingTest.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.glsm.dsa; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import org.junit.jupiter.api.Test; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; @@ -19,11 +19,11 @@ public class DSAUnsupportedBindingTest { @Test void nonTwoDParameterEditsRestoreTheTargetBinding() { - final int a = GLStateManager.glGenTextures(); + final int a = GLSMTextures.glGenTextures(); final int c = GL11.glGenTextures(); final int d = GL11.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, a); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, a); for (int tex : new int[] { c, d }) { GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, tex); for (int i = 0; i < 6; i++) { @@ -39,39 +39,39 @@ public class DSAUnsupportedBindingTest { GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, 0); GL11.glDeleteTextures(c); GL11.glDeleteTextures(d); - GLStateManager.glDeleteTextures(a); + GLSMTextures.glDeleteTextures(a); } } @Test void twoDParameterEditRestoresTheCachedBinding() { - final int a = GLStateManager.glGenTextures(); - final int b = GLStateManager.glGenTextures(); + final int a = GLSMTextures.glGenTextures(); + final int b = GLSMTextures.glGenTextures(); try { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, a); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, a); dsa.texParameteri(b, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - assertEquals(a, GLStateManager.getBoundTextureForServerState()); + assertEquals(a, GLSMTextures.getBoundTextureForServerState()); assertEquals(a, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D)); GL11.glBindTexture(GL11.GL_TEXTURE_2D, b); assertEquals(GL11.GL_NEAREST, GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER)); GL11.glBindTexture(GL11.GL_TEXTURE_2D, a); } finally { - GLStateManager.glDeleteTextures(a); - GLStateManager.glDeleteTextures(b); + GLSMTextures.glDeleteTextures(a); + GLSMTextures.glDeleteTextures(b); } } @Test void twoDEditWithANonTwoDTextureBoundRestoresTheDriverTwoDBinding() { - final int y = GLStateManager.glGenTextures(); - final int t = GLStateManager.glGenTextures(); + final int y = GLSMTextures.glGenTextures(); + final int t = GLSMTextures.glGenTextures(); final int x = GL11.glGenTextures(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE3); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, t); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, y); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, x); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, t); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, y); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, x); drainErrors(); dsa.texParameteri(t, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); @@ -79,17 +79,17 @@ public class DSAUnsupportedBindingTest { assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); assertEquals(y, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D)); assertEquals(x, GL11.glGetInteger(GL12.GL_TEXTURE_BINDING_3D)); - assertEquals(y, GLStateManager.getBoundTextureForServerState()); + assertEquals(y, GLSMTextures.getBoundTextureForServerState()); GL11.glBindTexture(GL11.GL_TEXTURE_2D, t); assertEquals(GL11.GL_NEAREST, GL11.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER)); GL11.glBindTexture(GL11.GL_TEXTURE_2D, y); } finally { GL11.glBindTexture(GL12.GL_TEXTURE_3D, 0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDeleteTextures(y); - GLStateManager.glDeleteTextures(t); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glDeleteTextures(y); + GLSMTextures.glDeleteTextures(t); GL11.glDeleteTextures(x); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java index da7ff82af..ca98e8091 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPCombineShaderTest.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLCompatTest; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMTexEnvGen; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.states.TexEnvState; import org.junit.jupiter.api.AfterEach; @@ -42,14 +45,14 @@ class FFPCombineShaderTest { // Reset texture units to defaults (unbind so a later test does not see a stale binding) for (int i = 3; i >= 0; i--) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.getTextures().getTexEnvState(i).reset(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.getTextures().getTexEnvState(i).reset(); if (i > 0) { - GLStateManager.getTextures().getTextureUnitStates(i).disable(); + GLSMTextures.getTextures().getTextureUnitStates(i).disable(); } } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); for (int t : texturesToDelete) GL11.glDeleteTextures(t); texturesToDelete.clear(); } @@ -57,23 +60,23 @@ class FFPCombineShaderTest { private int bindUnitTexture() { final int tex = GL11.glGenTextures(); texturesToDelete.add(tex); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); return tex; } @Test void testTexEnvStateTracking() { // Unit 0: COMBINE mode, SUBTRACT RGB, REPLACE alpha - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL13.GL_SUBTRACT); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, GL11.GL_REPLACE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_ONE_MINUS_SRC_COLOR); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL13.GL_SUBTRACT); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, GL11.GL_REPLACE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_ONE_MINUS_SRC_COLOR); - TexEnvState env0 = GLStateManager.getTextures().getTexEnvState(0); + TexEnvState env0 = GLSMTextures.getTextures().getTexEnvState(0); assertEquals(GL13.GL_COMBINE, env0.mode); assertEquals(GL13.GL_SUBTRACT, env0.combineRgb); assertEquals(GL11.GL_REPLACE, env0.combineAlpha); @@ -83,11 +86,11 @@ class FFPCombineShaderTest { assertEquals(GL11.GL_ONE_MINUS_SRC_COLOR, env0.operandRgb[1]); // Unit 2: independent state - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL11.GL_ADD); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL11.GL_ADD); - TexEnvState env2 = GLStateManager.getTextures().getTexEnvState(2); + TexEnvState env2 = GLSMTextures.getTextures().getTexEnvState(2); assertEquals(GL13.GL_COMBINE, env2.mode); assertEquals(GL11.GL_ADD, env2.combineRgb); @@ -179,22 +182,22 @@ class FFPCombineShaderTest { enableCombineUnit(GL13.GL_TEXTURE0, glFunc, GL11.GL_REPLACE); // Set up appropriate sources - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); if (numArgs >= 2) { - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_ALPHA, GL13.GL_PREVIOUS); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_ALPHA, GL11.GL_SRC_ALPHA); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_ALPHA, GL13.GL_PREVIOUS); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_ALPHA, GL11.GL_SRC_ALPHA); } if (numArgs >= 3) { - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE2_RGB, GL13.GL_PREVIOUS); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_RGB, GL11.GL_SRC_ALPHA); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE2_ALPHA, GL13.GL_PREVIOUS); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_ALPHA, GL11.GL_SRC_ALPHA); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE2_RGB, GL13.GL_PREVIOUS); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_RGB, GL11.GL_SRC_ALPHA); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE2_ALPHA, GL13.GL_PREVIOUS); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_ALPHA, GL11.GL_SRC_ALPHA); } FragmentKey fk = FragmentKey.fromState(); @@ -231,7 +234,7 @@ class FFPCombineShaderTest { void testMultiTexCoordRoutesToShaderManager() { // Not in immediate mode or display list recording, so should go to ShaderManager.currentTexCoord GLStateManager.ctx().ffp.setTexCoord(0.0f, 0.0f, 0.0f, 1.0f); // reset - GLStateManager.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.5f, 0.75f); + GLSMCurrentAttribs.glMultiTexCoord2f(GL13.GL_TEXTURE0, 0.5f, 0.75f); var texCoord = ShaderManager.getCurrentTexCoord(); assertEquals(0.5f, texCoord.x, 1e-6f, "s coordinate should be 0.5"); @@ -241,7 +244,7 @@ class FFPCombineShaderTest { @Test void testMultiTexCoord2dDelegatesToFloat() { GLStateManager.ctx().ffp.setTexCoord(0.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glMultiTexCoord2d(GL13.GL_TEXTURE0, 0.5, 0.75); + GLSMCurrentAttribs.glMultiTexCoord2d(GL13.GL_TEXTURE0, 0.5, 0.75); var texCoord = ShaderManager.getCurrentTexCoord(); assertEquals(0.5f, texCoord.x, 1e-6f, "double 0.5 should arrive as float 0.5"); @@ -256,43 +259,43 @@ class FFPCombineShaderTest { * Unit 3: MODULATE (simple) */ private void enableCombineUnit(int unit, int rgbFunc, int alphaFunc) { - GLStateManager.glActiveTexture(unit); - GLStateManager.enableTexture(); + GLSMTextures.glActiveTexture(unit); + GLSMTextures.enableTexture(); bindUnitTexture(); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, rgbFunc); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, alphaFunc); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL13.GL_COMBINE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, rgbFunc); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, alphaFunc); } private void setupXaeroState() { // Unit 0: COMBINE / SUBTRACT enableCombineUnit(GL13.GL_TEXTURE0, GL13.GL_SUBTRACT, GL11.GL_REPLACE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PRIMARY_COLOR); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); // Unit 1: disabled (skip — default is disabled) // Unit 2: COMBINE / ADD enableCombineUnit(GL13.GL_TEXTURE2, GL11.GL_ADD, GL11.GL_REPLACE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PREVIOUS); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_RGB, GL11.GL_TEXTURE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE1_RGB, GL13.GL_PREVIOUS); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_SOURCE0_ALPHA, GL11.GL_TEXTURE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); // Unit 3: simple MODULATE - GLStateManager.glActiveTexture(GL13.GL_TEXTURE3); - GLStateManager.enableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3); + GLSMTextures.enableTexture(); bindUnitTexture(); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); // Restore active unit - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private int compileShader(String source, int type) { diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUnboundTextureUnitTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUnboundTextureUnitTest.java index 9a1cfaf95..f05f62e86 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUnboundTextureUnitTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUnboundTextureUnitTest.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.lwjgl.opengl.GL11; @@ -21,11 +21,11 @@ class FFPUnboundTextureUnitTest { @AfterEach void cleanup() { for (int i = 3; i >= 0; i--) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - if (i > 0) GLStateManager.getTextures().getTextureUnitStates(i).disable(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + if (i > 0) GLSMTextures.getTextures().getTextureUnitStates(i).disable(); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); for (int t : texturesToDelete) GL11.glDeleteTextures(t); texturesToDelete.clear(); } @@ -33,19 +33,19 @@ class FFPUnboundTextureUnitTest { private void bindUnitTexture() { final int tex = GL11.glGenTextures(); texturesToDelete.add(tex); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); } @Test void enabledUnitWithoutTextureIsExcluded() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.enableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.enableTexture(); bindUnitTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.enableTexture(); // enabled, nothing bound - GLStateManager.glActiveTexture(GL13.GL_TEXTURE3); - GLStateManager.enableTexture(); // enabled, nothing bound - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTextures.enableTexture(); // enabled, nothing bound + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3); + GLSMTextures.enableTexture(); // enabled, nothing bound + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); final FragmentKey fk = FragmentKey.fromState(); assertEquals(1, fk.nrEnabledUnits(), "units 2/3 have no texture bound -> excluded -> only unit 0"); @@ -55,13 +55,13 @@ class FFPUnboundTextureUnitTest { @Test void enabledUnitsWithTextureAreCounted() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.enableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.enableTexture(); bindUnitTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.enableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTextures.enableTexture(); bindUnitTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); final FragmentKey fk = FragmentKey.fromState(); assertTrue(fk.unitEnabled(0)); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUniformValuesTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUniformValuesTest.java index e2617b805..9890f6636 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUniformValuesTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPUniformValuesTest.java @@ -1,6 +1,10 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.GLStateManager; import org.junit.jupiter.api.Test; import org.lwjgl.BufferUtils; @@ -19,26 +23,26 @@ class FFPUniformValuesTest { @Test void uploadedValuesMatchState() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(1.0f, 2.0f, 3.0f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(1.0f, 2.0f, 3.0f); - GLStateManager.glColor4f(0.25f, 0.5f, 0.75f, 1.0f); + GLSMCurrentAttribs.glColor4f(0.25f, 0.5f, 0.75f, 1.0f); - GLStateManager.enableFog(); - GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); - GLStateManager.glFogf(GL11.GL_FOG_START, 10.0f); - GLStateManager.glFogf(GL11.GL_FOG_END, 20.0f); + GLSMFog.enableFog(); + GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); + GLSMFog.glFogf(GL11.GL_FOG_START, 10.0f); + GLSMFog.glFogf(GL11.GL_FOG_END, 20.0f); final FloatBuffer fogColor = BufferUtils.createFloatBuffer(4); fogColor.put(0.1f).put(0.2f).put(0.3f).put(0.4f).flip(); - GLStateManager.glFog(GL11.GL_FOG_COLOR, fogColor); + GLSMFog.glFog(GL11.GL_FOG_COLOR, fogColor); - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.35f); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.35f); final VertexKey vk = VertexKey.fromState(false, false, false, false, 0); final FragmentKey fk = FragmentKey.fromState(); @@ -77,14 +81,14 @@ class FFPUniformValuesTest { program.destroy(); uniforms.destroy(); - GLStateManager.disableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); - GLStateManager.disableFog(); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPopMatrix(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); + GLSMFog.disableFog(); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLightingGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLightingGLTest.java index e1b377956..1da47dc8f 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLightingGLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FFPVertexLightingGLTest.java @@ -2,7 +2,18 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.joml.Vector3f; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -43,81 +54,81 @@ class FFPVertexLightingGLTest { @BeforeEach void setUpState() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glViewport(0, 0, 800, 600); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); - GLStateManager.disableBlend(); - GLStateManager.disableTexture(); - GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMRasterizer.glViewport(0, 0, 800, 600); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); + GLSMBlend.disableBlend(); + GLSMTextures.disableTexture(); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f); standardItemLighting(); - GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION, floats(0.0f, 0.0f, 0.0f, 1.0f)); - GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f)); - GLStateManager.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 0.0f); + GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION, floats(0.0f, 0.0f, 0.0f, 1.0f)); + GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f)); + GLSMLighting.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 0.0f); } @AfterEach void cleanup() { - GLStateManager.glDisable(GL11.GL_NORMALIZE); - GLStateManager.glDisable(GL12.GL_RESCALE_NORMAL); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glDisable(GL11.GL_LIGHT0); - GLStateManager.glDisable(GL11.GL_LIGHT1); - GLStateManager.glDisable(GL11.GL_LIGHT2); - GLStateManager.glDisable(GL11.GL_COLOR_MATERIAL); + GLSMEnable.glDisable(GL11.GL_NORMALIZE); + GLSMEnable.glDisable(GL12.GL_RESCALE_NORMAL); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_LIGHT0); + GLSMEnable.glDisable(GL11.GL_LIGHT1); + GLSMEnable.glDisable(GL11.GL_LIGHT2); + GLSMEnable.glDisable(GL11.GL_COLOR_MATERIAL); final ShaderManager sm = ShaderManager.getInstance(); if (sm.isActive()) sm.deactivate(); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); if (vbo != 0) { - GLStateManager.glDeleteBuffers(vbo); + GLSMBuffers.glDeleteBuffers(vbo); vbo = 0; } if (vao != 0) { - GLStateManager.glDeleteVertexArrays(vao); + GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; } } private static void standardItemLighting() { - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glEnable(GL11.GL_LIGHT0); - GLStateManager.glEnable(GL11.GL_LIGHT1); - GLStateManager.glEnable(GL11.GL_COLOR_MATERIAL); - GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); - GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.4f, 0.4f, 0.4f, 1.0f)); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_LIGHT0); + GLSMEnable.glEnable(GL11.GL_LIGHT1); + GLSMEnable.glEnable(GL11.GL_COLOR_MATERIAL); + GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); + GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.4f, 0.4f, 0.4f, 1.0f)); light(GL11.GL_LIGHT0, 0.2f, 1.0f, -0.7f); light(GL11.GL_LIGHT1, -0.2f, 1.0f, 0.7f); } private static void light(int light, float x, float y, float z) { - GLStateManager.glLight(light, GL11.GL_POSITION, floats(x, y, z, 0.0f)); - GLStateManager.glLight(light, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f)); - GLStateManager.glLight(light, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f)); - GLStateManager.glLight(light, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f)); + GLSMLighting.glLight(light, GL11.GL_POSITION, floats(x, y, z, 0.0f)); + GLSMLighting.glLight(light, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f)); + GLSMLighting.glLight(light, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f)); + GLSMLighting.glLight(light, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f)); } private static String gateState() { - final var material = GLStateManager.getFrontMaterial(); - return "lighting=" + GLStateManager.getLightingState().isEnabled() - + " colorMaterial=" + GLStateManager.getColorMaterial().isEnabled() - + " cmParam=0x" + Integer.toHexString(GLStateManager.getColorMaterialParameter().getValue()) + final var material = GLSMLighting.getFrontMaterial(); + return "lighting=" + GLSMLighting.getLightingState().isEnabled() + + " colorMaterial=" + GLSMLighting.getColorMaterial().isEnabled() + + " cmParam=0x" + Integer.toHexString(GLSMLighting.getColorMaterialParameter().getValue()) + " emission=" + material.emission + " specular=" + material.specular + " shininess=" + material.shininess - + " lmAmbient=" + GLStateManager.getLightModel().ambient - + " light0=" + GLStateManager.getLightStates()[0].isEnabled() - + " light1=" + GLStateManager.getLightStates()[1].isEnabled(); + + " lmAmbient=" + GLSMLighting.getLightModel().ambient + + " light0=" + GLSMLighting.getLightStates()[0].isEnabled() + + " light1=" + GLSMLighting.getLightStates()[1].isEnabled(); } private void buildTriangle() { - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); final ByteBuffer data = BufferUtils.createByteBuffer(3 * STRIDE); putVertex(data, -0.9f, -0.9f); @@ -125,13 +136,13 @@ class FFPVertexLightingGLTest { putVertex(data, 0.0f, 0.9f); data.flip(); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); - GLStateManager.glEnableVertexAttribArray(POSITION_LOC); - GLStateManager.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, STRIDE, 0L); - GLStateManager.glEnableVertexAttribArray(COLOR_LOC); - GLStateManager.glVertexAttribPointer(COLOR_LOC, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, 12L); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); + GLSMVertexInput.glEnableVertexAttribArray(POSITION_LOC); + GLSMVertexInput.glVertexAttribPointer(POSITION_LOC, 3, GL11.GL_FLOAT, false, STRIDE, 0L); + GLSMVertexInput.glEnableVertexAttribArray(COLOR_LOC); + GLSMVertexInput.glVertexAttribPointer(COLOR_LOC, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, 12L); VAOManager.setCurrentVertexFlags(COLOR_BIT); } @@ -148,9 +159,9 @@ class FFPVertexLightingGLTest { ShaderManager.enable(); sm.activate(); - GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "FFP draw must not raise a GL error"); final int[] pixel = FfpFixture.readPixel(400, 200); @@ -177,24 +188,24 @@ class FFPVertexLightingGLTest { @ParameterizedTest(name = "{0}") @MethodSource("normals") void normalMatchesGeneratedShader(String name, float x, float y, float z, float factorCeiling) { - GLStateManager.glNormal3f(x, y, z); + GLSMCurrentAttribs.glNormal3f(x, y, z); assertSolverMatchesShader(name); assertTrue(factor.x < factorCeiling, name + ": factor must stay below " + factorCeiling + ", got " + factor.x); } @Test void rescaleNormalMatchesGeneratedShader() { - GLStateManager.glEnable(GL12.GL_RESCALE_NORMAL); - GLStateManager.glScalef(1.0f, 2.0f, 1.0f); - GLStateManager.glNormal3f(0.0f, 1.0f, 0.0f); + GLSMEnable.glEnable(GL12.GL_RESCALE_NORMAL); + GLSMMatrices.glScalef(1.0f, 2.0f, 1.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 1.0f, 0.0f); assertSolverMatchesShader("rescale normal"); } @Test void normalizeMatchesGeneratedShader() { - GLStateManager.glEnable(GL11.GL_NORMALIZE); - GLStateManager.glScalef(1.0f, 2.0f, 1.0f); - GLStateManager.glNormal3f(0.0f, 1.0f, 0.0f); + GLSMEnable.glEnable(GL11.GL_NORMALIZE); + GLSMMatrices.glScalef(1.0f, 2.0f, 1.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 1.0f, 0.0f); assertSolverMatchesShader("normalize"); assertTrue(factor.x > 1.2f, "normalize restores the unit normal, which must pick up more diffuse than rescale's 0.5-long one, got " + factor.x); } @@ -202,14 +213,14 @@ class FFPVertexLightingGLTest { static Stream unrepresentableStates() { return Stream.of( unrepresentable("emission is additive, so the lit colour is not vertexColor * factor", - () -> GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION, floats(0.1f, 0.1f, 0.1f, 1.0f))), + () -> GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION, floats(0.1f, 0.1f, 0.1f, 1.0f))), unrepresentable("specular is additive, so the lit colour is not vertexColor * factor", () -> { - GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_SPECULAR, floats(1.0f, 1.0f, 1.0f, 1.0f)); - GLStateManager.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 16.0f); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(1.0f, 1.0f, 1.0f, 1.0f)); + GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_SPECULAR, floats(1.0f, 1.0f, 1.0f, 1.0f)); + GLSMLighting.glMaterialf(GL11.GL_FRONT_AND_BACK, GL11.GL_SHININESS, 16.0f); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(1.0f, 1.0f, 1.0f, 1.0f)); }), unrepresentable("only AMBIENT_AND_DIFFUSE makes the lit colour scale with the vertex colour", - () -> GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION))); + () -> GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_EMISSION))); } private static Arguments unrepresentable(String reason, Runnable state) { @@ -230,7 +241,7 @@ class FFPVertexLightingGLTest { final Vector3f twoLights = new Vector3f(factor); light(GL11.GL_LIGHT2, 0.0f, 0.0f, 1.0f); - GLStateManager.glEnable(GL11.GL_LIGHT2); + GLSMEnable.glEnable(GL11.GL_LIGHT2); assertTrue(FFPVertexLighting.modulatesVertexColor(factor), FFPVertexLightingGLTest::gateState); assertEquals(twoLights, factor, "VertexShaderGenerator emits only GL_LIGHT0/GL_LIGHT1, so text must not see GL_LIGHT2 either"); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FfpUniformBlockDedupTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FfpUniformBlockDedupTest.java index dcab77a52..e1553bc3f 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FfpUniformBlockDedupTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/FfpUniformBlockDedupTest.java @@ -1,6 +1,13 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTexEnvGen; import com.gtnewhorizons.angelica.glsm.GLStateManager; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.Test; @@ -32,28 +39,28 @@ class FfpUniformBlockDedupTest { } private static void resetState() { - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glLineWidth(1.0f); - GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); - GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f); - GLStateManager.glTexCoord2f(0.0f, 0.0f); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMRasterizer.glLineWidth(1.0f); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f); + GLSMCurrentAttribs.glTexCoord2f(0.0f, 0.0f); GLStateManager.ctx().lastBrightnessX = 0.0f; GLStateManager.ctx().lastBrightnessY = 0.0f; - GLStateManager.glFog(GL11.GL_FOG_COLOR, floats(0.0f, 0.0f, 0.0f, 1.0f)); - GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 1.0f); - GLStateManager.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, floats(0.0f, 0.0f, 0.0f, 0.0f)); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(1.0f, 1.0f, 1.0f, 1.0f)); - GLStateManager.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 0.0f); - GLStateManager.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1.0f, 0.0f, 0.0f, 0.0f)); - GLStateManager.glClipPlane(GL11.GL_CLIP_PLANE0, doubles(0.0, 0.0, 0.0, 0.0)); - GLStateManager.glLineStipple(1, (short) 0xFFFF); - GLStateManager.glViewport(0, 0, 854, 480); + GLSMFog.glFog(GL11.GL_FOG_COLOR, floats(0.0f, 0.0f, 0.0f, 1.0f)); + GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 1.0f); + GLSMTexEnvGen.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, floats(0.0f, 0.0f, 0.0f, 0.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(1.0f, 1.0f, 1.0f, 1.0f)); + GLSMLighting.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 0.0f); + GLSMTexEnvGen.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1.0f, 0.0f, 0.0f, 0.0f)); + GLSMRasterizer.glClipPlane(GL11.GL_CLIP_PLANE0, doubles(0.0, 0.0, 0.0, 0.0)); + GLSMRasterizer.glLineStipple(1, (short) 0xFFFF); + GLSMRasterizer.glViewport(0, 0, 854, 480); } @Test @@ -65,13 +72,13 @@ class FfpUniformBlockDedupTest { assertEquals(1, uniforms.blockWrites, "first upload always writes"); final int firstOffset = boundRangeStart(); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); uniforms.upload(GLStateManager.ctx()); assertEquals(1, uniforms.blockWrites, "a dirty generation with unchanged bytes must not write"); assertEquals(1, uniforms.blockSkips, "and must be counted as a skip"); assertEquals(firstOffset, boundRangeStart(), "the skipped write must not advance the ring or rebind"); - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); uniforms.upload(GLStateManager.ctx()); assertEquals(2, uniforms.blockWrites, "a changed matrix must write"); assertEquals(1, uniforms.blockSkips, "a write is not a skip"); @@ -123,33 +130,33 @@ class FfpUniformBlockDedupTest { @TestFactory List everyStagingCategoryForcesAWrite() { final List tests = new ArrayList<>(); - addCategory(tests, "modelViewMatrix", () -> GLStateManager.glTranslatef(0.0f, 3.0f, 0.0f)); + addCategory(tests, "modelViewMatrix", () -> GLSMMatrices.glTranslatef(0.0f, 3.0f, 0.0f)); addCategory(tests, "projectionMatrix", () -> { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glTranslatef(0.0f, 0.0f, 5.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glTranslatef(0.0f, 0.0f, 5.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); }); - addCategory(tests, "normalMatrix", () -> GLStateManager.glRotatef(35.0f, 0.0f, 1.0f, 0.0f)); + addCategory(tests, "normalMatrix", () -> GLSMMatrices.glRotatef(35.0f, 0.0f, 1.0f, 0.0f)); addCategory(tests, "textureMatrix", () -> { - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glTranslatef(0.5f, 0.25f, 0.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glTranslatef(0.5f, 0.25f, 0.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); }); - addCategory(tests, "lighting", () -> GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.3f, 0.6f, 0.9f, 1.0f))); - addCategory(tests, "materialShininess", () -> GLStateManager.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 42.0f)); - addCategory(tests, "currentColor", () -> GLStateManager.glColor4f(0.25f, 0.5f, 0.75f, 1.0f)); - addCategory(tests, "currentNormal", () -> GLStateManager.glNormal3f(0.0f, 1.0f, 0.0f)); - addCategory(tests, "currentTexCoord", () -> GLStateManager.glTexCoord2f(0.125f, 0.375f)); + addCategory(tests, "lighting", () -> GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.3f, 0.6f, 0.9f, 1.0f))); + addCategory(tests, "materialShininess", () -> GLSMLighting.glMaterialf(GL11.GL_FRONT, GL11.GL_SHININESS, 42.0f)); + addCategory(tests, "currentColor", () -> GLSMCurrentAttribs.glColor4f(0.25f, 0.5f, 0.75f, 1.0f)); + addCategory(tests, "currentNormal", () -> GLSMCurrentAttribs.glNormal3f(0.0f, 1.0f, 0.0f)); + addCategory(tests, "currentTexCoord", () -> GLSMCurrentAttribs.glTexCoord2f(0.125f, 0.375f)); addCategory(tests, "lightmapCoord", () -> GLStateManager.ctx().lastBrightnessX = 96.0f); - addCategory(tests, "texGenPlane", () -> GLStateManager.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(0.5f, 0.0f, 0.0f, 0.25f))); - addCategory(tests, "clipPlane", () -> GLStateManager.glClipPlane(GL11.GL_CLIP_PLANE0, doubles(0.0, 1.0, 0.0, 7.0))); - addCategory(tests, "alphaRef", () -> GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.35f)); - addCategory(tests, "fogColor", () -> GLStateManager.glFog(GL11.GL_FOG_COLOR, floats(0.1f, 0.2f, 0.3f, 0.4f))); - addCategory(tests, "fogDensity", () -> GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.75f)); - addCategory(tests, "texEnvColor", () -> GLStateManager.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, floats(0.9f, 0.8f, 0.7f, 0.6f))); - addCategory(tests, "lineWidth", () -> GLStateManager.glLineWidth(3.0f)); - addCategory(tests, "lineStipple", () -> GLStateManager.glLineStipple(2, (short) 0x00FF)); - addCategory(tests, "viewport", () -> GLStateManager.glViewport(0, 0, 640, 480)); + addCategory(tests, "texGenPlane", () -> GLSMTexEnvGen.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(0.5f, 0.0f, 0.0f, 0.25f))); + addCategory(tests, "clipPlane", () -> GLSMRasterizer.glClipPlane(GL11.GL_CLIP_PLANE0, doubles(0.0, 1.0, 0.0, 7.0))); + addCategory(tests, "alphaRef", () -> GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.35f)); + addCategory(tests, "fogColor", () -> GLSMFog.glFog(GL11.GL_FOG_COLOR, floats(0.1f, 0.2f, 0.3f, 0.4f))); + addCategory(tests, "fogDensity", () -> GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.75f)); + addCategory(tests, "texEnvColor", () -> GLSMTexEnvGen.glTexEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, floats(0.9f, 0.8f, 0.7f, 0.6f))); + addCategory(tests, "lineWidth", () -> GLSMRasterizer.glLineWidth(3.0f)); + addCategory(tests, "lineStipple", () -> GLSMRasterizer.glLineStipple(2, (short) 0x00FF)); + addCategory(tests, "viewport", () -> GLSMRasterizer.glViewport(0, 0, 640, 480)); return tests; } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedFFPDrawGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedFFPDrawGLTest.java index fc08cbc49..4f3f6626d 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedFFPDrawGLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/InstancedFFPDrawGLTest.java @@ -1,6 +1,16 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; @@ -90,9 +100,9 @@ class InstancedFFPDrawGLTest { CubeParityFixture.disableDirectionalLight(); CubeParityFixture.deleteResources(); ParticleParityFixture.deleteResources(); - if (templateVbo != 0) { GLStateManager.glDeleteBuffers(templateVbo); templateVbo = 0; } - if (instanceVbo != 0) { GLStateManager.glDeleteBuffers(instanceVbo); instanceVbo = 0; } - if (vao != 0) { GLStateManager.glDeleteVertexArrays(vao); vao = 0; } + if (templateVbo != 0) { GLSMBuffers.glDeleteBuffers(templateVbo); templateVbo = 0; } + if (instanceVbo != 0) { GLSMBuffers.glDeleteBuffers(instanceVbo); instanceVbo = 0; } + if (vao != 0) { GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; } } @Test @@ -100,7 +110,7 @@ class InstancedFFPDrawGLTest { GLSMHooks.pendingProgramSelection = LOGGING_SELECTION; GLSMHooks.blendHandler = new LoggingBlendHandler(); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 0); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 0); drainErrors(); assertEquals(List.of("resolve", "flush"), log); @@ -109,12 +119,12 @@ class InstancedFFPDrawGLTest { @Test void resolveIsSuppressedWhileDisplayListIsRecording() { GLSMHooks.pendingProgramSelection = LOGGING_SELECTION; - final int list = GLStateManager.glGenLists(1); + final int list = GLSMDraws.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); GLSMHooks.resolvePendingProgram(); assertTrue(log.isEmpty()); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); GLSMHooks.resolvePendingProgram(); assertEquals(List.of("resolve"), log); @@ -144,7 +154,7 @@ class InstancedFFPDrawGLTest { } private void assertCubeParity(boolean lightmap, boolean lit) { - GLStateManager.glViewport(0, 0, PARITY_SIZE, PARITY_SIZE); + GLSMRasterizer.glViewport(0, 0, PARITY_SIZE, PARITY_SIZE); CubeParityFixture.setupScene(lightmap, lit); FfpFixture.activateFfp(); @@ -167,7 +177,7 @@ class InstancedFFPDrawGLTest { @Test void particleUnit0TextureMatrixMatchesReference() { final ParticleParityFixture.Rotation rot = ParticleParityFixture.Rotation.of(35f, -12f, false); - GLStateManager.glViewport(0, 0, PARITY_SIZE, PARITY_SIZE); + GLSMRasterizer.glViewport(0, 0, PARITY_SIZE, PARITY_SIZE); ParticleParityFixture.setupScene(true); FfpFixture.activateFfp(); @@ -188,14 +198,14 @@ class InstancedFFPDrawGLTest { @Test void entityAttribSelectsColorPerInstance() { - GLStateManager.glViewport(0, 0, INTEGER_WIDTH, INTEGER_HEIGHT); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); + GLSMRasterizer.glViewport(0, 0, INTEGER_WIDTH, INTEGER_HEIGHT); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); FfpFixture.EntityIdInstances.build(0.66f); - GLStateManager.glClearColor(0f, 0f, 0f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0f, 0f, 0f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); FfpFixture.EntityIdInstances.draw(); @@ -219,9 +229,9 @@ class InstancedFFPDrawGLTest { @Test void instancedSourceUsesInstanceAttribs() { - GLStateManager.setFfpInstancing(Instancing.TEMPLATE); + GLSMPrograms.setFfpInstancing(Instancing.TEMPLATE); final VertexKey key = VertexKey.fromState(true, true, false, false, 0b10); - GLStateManager.setFfpInstancing(Instancing.NONE); + GLSMPrograms.setFfpInstancing(Instancing.NONE); final String source = VertexShaderGenerator.generate(key); assertTrue(source.contains("a_InstRow0"), "instance matrix attribs declared"); @@ -235,8 +245,8 @@ class InstancedFFPDrawGLTest { void twoInstancesDrawWithDistinctTransformsAndColors() { prepareTwoInstances(0xFF0000FF, 0, 0xFF00FF00, 0); - GLStateManager.glClearColor(0f, 0f, 0f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0f, 0f, 0f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); drawInstances(); @@ -251,14 +261,14 @@ class InstancedFFPDrawGLTest { @Test void instancedAlphaTestDiscardsLowAlphaInstance() { prepareTwoInstances(0xFF0000FF, 0, 0x0D0000FF, 0); - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f); - GLStateManager.glClearColor(0f, 0f, 0f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0f, 0f, 0f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); drawInstances(); - GLStateManager.disableAlphaTest(); + GLSMDepthStencilAlpha.disableAlphaTest(); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); final int[] left = FfpFixture.readPixel(200, 300); @@ -269,35 +279,35 @@ class InstancedFFPDrawGLTest { @Test void equalDepthOverlayBlendsOnlyOverBase() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glViewport(0, 0, 800, 600); - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.disableCull(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMRasterizer.glViewport(0, 0, 800, 600); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMRasterizer.disableCull(); buildTemplate(); uploadInstances(0xFF0000FF, 0, 0xFF00FF00, 0); FfpFixture.activateFfp(); - GLStateManager.glClearColor(0f, 0f, 0f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMBlend.glClearColor(0f, 0f, 0f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); drawInstances(); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.glColor4f(1f, 1f, 1f, 1f); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMCurrentAttribs.glColor4f(1f, 1f, 1f, 1f); uploadInstances(0x800000FF, 0, 0x8000FF00, 0); drawInstances(); - GLStateManager.disableBlend(); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.disableDepthTest(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.disableDepthTest(); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); final int[] left = FfpFixture.readPixel(200, 300); @@ -310,12 +320,12 @@ class InstancedFFPDrawGLTest { void perInstanceOverlayMixesOnlyTintedInstances() { prepareTwoInstances(0xFFFFFFFF, 0, 0xFFFFFFFF, 0xFF0000FF); - GLStateManager.glClearColor(0f, 0f, 0f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0f, 0f, 0f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.setOverlayColor(0f, 1f, 0f, 1f); + GLSMCurrentAttribs.setOverlayColor(0f, 1f, 0f, 1f); drawInstances(); - GLStateManager.setOverlayColor(0f, 0f, 0f, 0f); + GLSMCurrentAttribs.setOverlayColor(0f, 0f, 0f, 0f); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "instanced overlay draw must not raise a GL error"); @@ -326,13 +336,13 @@ class InstancedFFPDrawGLTest { } private void prepareTwoInstances(int leftColor, int leftOverlay, int rightColor, int rightOverlay) { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glViewport(0, 0, 800, 600); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMRasterizer.glViewport(0, 0, 800, 600); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); buildTemplate(); uploadInstances(leftColor, leftOverlay, rightColor, rightOverlay); FfpFixture.activateFfp(); @@ -345,18 +355,18 @@ class InstancedFFPDrawGLTest { instances.flip(); final boolean first = instanceVbo == 0; - if (first) instanceVbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, instances, GL15.GL_STATIC_DRAW); + if (first) instanceVbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, instances, GL15.GL_STATIC_DRAW); if (first) { pointAndEnableInstanceAttribs(); } - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } private void buildTemplate() { - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); final ByteBuffer template = BufferUtils.createByteBuffer(3 * TEMPLATE_STRIDE); putVertex(template, -0.4f, -0.4f); @@ -364,15 +374,15 @@ class InstancedFFPDrawGLTest { putVertex(template, 0.0f, 0.4f); template.flip(); - templateVbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, templateVbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, template, GL15.GL_STATIC_DRAW); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, 0L); - GLStateManager.glEnableVertexAttribArray(1); - GLStateManager.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, TEMPLATE_STRIDE, 20L); - GLStateManager.glEnableVertexAttribArray(4); - GLStateManager.glVertexAttribPointer(4, 3, GL11.GL_BYTE, true, TEMPLATE_STRIDE, 24L); + templateVbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, templateVbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, template, GL15.GL_STATIC_DRAW); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, 0L); + GLSMVertexInput.glEnableVertexAttribArray(1); + GLSMVertexInput.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, TEMPLATE_STRIDE, 20L); + GLSMVertexInput.glEnableVertexAttribArray(4); + GLSMVertexInput.glVertexAttribPointer(4, 3, GL11.GL_BYTE, true, TEMPLATE_STRIDE, 24L); VAOManager.setCurrentVertexFlags(COLOR_BIT | NORMAL_BIT); } @@ -399,8 +409,8 @@ class InstancedFFPDrawGLTest { } private static void drawInstances() { - GLStateManager.setFfpInstancing(Instancing.TEMPLATE); - GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 2); - GLStateManager.setFfpInstancing(Instancing.NONE); + GLSMPrograms.setFfpInstancing(Instancing.TEMPLATE); + GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 2); + GLSMPrograms.setFfpInstancing(Instancing.NONE); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpGLTest.java index 9ec9a4981..a5716dfed 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpGLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpGLTest.java @@ -1,7 +1,10 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -18,21 +21,21 @@ class LogicOpGLTest { void setUp() { FfpFixture.resetFfpState(); FfpFixture.activateFfp(); - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); } @AfterEach void tearDown() { - GLStateManager.glDisable(GL11.GL_COLOR_LOGIC_OP); - GLStateManager.glLogicOp(GL11.GL_COPY); - GLStateManager.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_COLOR_LOGIC_OP); + GLSMBlend.glLogicOp(GL11.GL_COPY); + GLSMEnable.glDisable(GL11.GL_BLEND); LogicOpFixture.deleteResources(); FfpFixture.resetFfpState(); } @@ -50,8 +53,8 @@ class LogicOpGLTest { @Test void blendingIsIgnoredWhileLogicOpIsEnabled() { - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); final int[] src = LogicOpFixture.SOURCES[1]; LogicOpFixture.clearToDst(); LogicOpFixture.drawQuad(GL11.GL_XOR, src); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/ProgramUniformTrackingTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/ProgramUniformTrackingTest.java index b768eddc5..4af1b56ab 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/ProgramUniformTrackingTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/ProgramUniformTrackingTest.java @@ -1,6 +1,8 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.GLStateManager; import org.junit.jupiter.api.Test; import org.lwjgl.opengl.GL11; @@ -25,10 +27,10 @@ class ProgramUniformTrackingTest { final Program b = buildProgram(false); assertNotEquals(a.getProgramId(), b.getProgramId(), "distinct vertex keys must yield distinct programs"); try { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(1.0F, 2.0F, 3.0F); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(1.0F, 2.0F, 3.0F); GL20.glUseProgram(a.getProgramId()); uniforms.upload(GLStateManager.ctx()); @@ -40,14 +42,14 @@ class ProgramUniformTrackingTest { uniforms.upload(GLStateManager.ctx()); assertEquals(afterFirst, uniforms.blockWrites, "program switches with unchanged state write nothing"); - GLStateManager.glTranslatef(4.0F, 0.0F, 0.0F); + GLSMMatrices.glTranslatef(4.0F, 0.0F, 0.0F); uniforms.upload(GLStateManager.ctx()); assertEquals(afterFirst + 1, uniforms.blockWrites, "a gen bump writes exactly one block"); uniforms.upload(GLStateManager.ctx()); assertEquals(afterFirst + 1, uniforms.blockWrites, "clean draw writes nothing"); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } finally { GL20.glUseProgram(0); a.destroy(); @@ -61,26 +63,26 @@ class ProgramUniformTrackingTest { final Uniforms uniforms = new Uniforms(); final Program a = buildProgram(true); try { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); GL20.glUseProgram(a.getProgramId()); uniforms.upload(GLStateManager.ctx()); final int base = uniforms.blockWrites; - GLStateManager.glPushAttrib(GL11.GL_TRANSFORM_BIT); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_TRANSFORM_BIT); + GLSMAttribStack.glPopAttrib(); uniforms.upload(GLStateManager.ctx()); assertEquals(base, uniforms.blockWrites, "push/pop with no change inside writes nothing"); - GLStateManager.glPushAttrib(GL11.GL_TRANSFORM_BIT); - GLStateManager.glTranslatef(7.0F, 0.0F, 0.0F); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_TRANSFORM_BIT); + GLSMMatrices.glTranslatef(7.0F, 0.0F, 0.0F); + GLSMAttribStack.glPopAttrib(); uniforms.upload(GLStateManager.ctx()); assertEquals(base + 1, uniforms.blockWrites, "pop after change stages once"); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } finally { GL20.glUseProgram(0); a.destroy(); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/TextureSupersamplingGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/TextureSupersamplingGLTest.java index 820a1f196..9f055e951 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/TextureSupersamplingGLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/TextureSupersamplingGLTest.java @@ -1,7 +1,16 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTexEnvGen; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.RenderSystem; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -52,13 +61,13 @@ class TextureSupersamplingGLTest { } } pixels.flip(); - final int texture = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, atlasSize, atlasSize, 0, + final int texture = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, atlasSize, atlasSize, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); return texture; } @@ -97,33 +106,33 @@ class TextureSupersamplingGLTest { @BeforeEach void setup() { FfpFixture.resetFfpState(); - GLStateManager.setTextureSupersamplingSamples(1); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glDisable(GL11.GL_FOG); - GLStateManager.glColor4f(1, 1, 1, 1); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glOrtho(0, SIZE, SIZE, 0, -100, 100); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.setTextureSupersamplingSamples(1); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_FOG); + GLSMCurrentAttribs.glColor4f(1, 1, 1, 1); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMTexEnvGen.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glOrtho(0, SIZE, SIZE, 0, -100, 100); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); FfpFixture.activateFfp(); } @AfterEach void cleanup() { - GLStateManager.setTextureSupersamplingSamples(1); + GLSMTextures.setTextureSupersamplingSamples(1); FfpFixture.resetFfpState(); - if (texture != 0) GLStateManager.glDeleteTextures(texture); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - if (vbo != 0) GLStateManager.glDeleteBuffers(vbo); - if (vao != 0) GLStateManager.glDeleteVertexArrays(vao); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glViewport(0, 0, 800, 600); + if (texture != 0) GLSMTextures.glDeleteTextures(texture); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo); + if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMRasterizer.glViewport(0, 0, 800, 600); } @ParameterizedTest @@ -133,9 +142,9 @@ class TextureSupersamplingGLTest { final int[] nearest = drawTop(3); assertEquals(0, countDotRegions(nearest)); - final int previous = GLStateManager.setTextureSupersamplingSamples(samples); + final int previous = GLSMTextures.setTextureSupersamplingSamples(samples); assertEquals(12, countDotRegions(drawTop(3))); - GLStateManager.setTextureSupersamplingSamples(previous); + GLSMTextures.setTextureSupersamplingSamples(previous); assertArrayEquals(nearest, drawTop(3)); } @@ -143,11 +152,11 @@ class TextureSupersamplingGLTest { @ValueSource(ints = {4, 16}) void highResolutionCheckerboardsStaySmoothWithTheDefaultAtlasGutter(int samples) { createAtlas(256, 16, (x, y) -> ((x ^ y) & 1) == 0 ? 0xFFFFFFFF : 0x000000FF); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 4); - GLStateManager.glGenerateMipmap(GL11.GL_TEXTURE_2D); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 4); + GLSMTextures.glGenerateMipmap(GL11.GL_TEXTURE_2D); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_LINEAR); final int[] filtered = drawFlat(); - GLStateManager.setTextureSupersamplingSamples(samples); + GLSMTextures.setTextureSupersamplingSamples(samples); final int[] supersampled = drawFlat(); for (int y = 97; y <= 102; y++) { for (int x = 97; x <= 102; x++) { @@ -163,9 +172,9 @@ class TextureSupersamplingGLTest { @ValueSource(ints = {4, 16}) void transparentTexelsDoNotTintPartialCoverage(int samples) { createAtlas(16, (x, y) -> x < 8 ? 0xFF0000FF : 0x0000FF00); - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.setTextureSupersamplingSamples(samples); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMTextures.setTextureSupersamplingSamples(samples); final int[] pixels = drawTop(3); int partialPixels = 0; for (int pixel : pixels) { @@ -184,26 +193,26 @@ class TextureSupersamplingGLTest { createDotAtlas(); final int modelTexture = uploadTexture(16, 1, TextureSupersamplingGLTest::dotColor); try { - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); final int[] normal = drawTop(3); - GLStateManager.setTextureSupersamplingSamples(16); + GLSMTextures.setTextureSupersamplingSamples(16); assertArrayEquals(normal, drawTop(3)); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); assertFalse(Arrays.equals(normal, drawTop(3))); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, modelTexture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, modelTexture); assertArrayEquals(normal, drawTop(3)); } finally { - GLStateManager.glDeleteTextures(modelTexture); + GLSMTextures.glDeleteTextures(modelTexture); } } @Test void atlasFetchesIgnoreSamplerFilteringAndRepeatAcrossNegativeUvs() { createAtlas(16, 4, TextureSupersamplingGLTest::dotColor); - GLStateManager.setTextureSupersamplingSamples(16); + GLSMTextures.setTextureSupersamplingSamples(16); final int[] nearest = drawTop(3); final int sampler = RenderSystem.genSampler(); try { @@ -212,14 +221,14 @@ class TextureSupersamplingGLTest { RenderSystem.samplerParameteri(sampler, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); RenderSystem.samplerParameteri(sampler, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); RenderSystem.bindSamplerToUnit(0, sampler); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glTranslatef(-2, 3, 0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glTranslatef(-2, 3, 0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); assertArrayEquals(nearest, drawTop(3)); } finally { - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); RenderSystem.bindSamplerToUnit(0, 0); RenderSystem.destroySampler(sampler); } @@ -234,28 +243,28 @@ class TextureSupersamplingGLTest { final ByteBuffer pixels = BufferUtils.createByteBuffer(size * size * 4); for (int i = 0; i < size * size; i++) pixels.putInt(0xFFFF0000); pixels.flip(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, size, size, 0, + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); } - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 6); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 6); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST); final int[] mipFiltered = drawFlat(); assertFalse(Arrays.equals(baseLevel, mipFiltered)); - GLStateManager.setTextureSupersamplingSamples(16); + GLSMTextures.setTextureSupersamplingSamples(16); assertArrayEquals(baseLevel, drawFlat()); - GLStateManager.markTextureAsAtlas(texture, 1); + GLSMTextures.markTextureAsAtlas(texture, 1); assertArrayEquals(mipFiltered, drawFlat()); - GLStateManager.markTextureAsAtlas(texture, 4); + GLSMTextures.markTextureAsAtlas(texture, 4); assertArrayEquals(baseLevel, drawFlat()); } private int[] drawFlat() { FfpFixture.clear(); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(100.25f, 100.125f, 0); - GLStateManager.glScalef(11, 11, 1); - GLStateManager.glRotatef(90, 1, 0, 0); - GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, 4); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(100.25f, 100.125f, 0); + GLSMMatrices.glScalef(11, 11, 1); + GLSMMatrices.glRotatef(90, 1, 0, 0); + GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, 4); return FfpFixture.readRegion(SIZE); } @@ -269,7 +278,7 @@ class TextureSupersamplingGLTest { private void createAtlas(int spriteSize, int gutter, IntBinaryOperator color) { texture = uploadTexture(spriteSize, gutter, color); - GLStateManager.markTextureAsAtlas(texture, gutter); + GLSMTextures.markTextureAsAtlas(texture, gutter); final int atlasSize = Integer.highestOneBit(spriteSize + 2 * gutter) << 1; final float minUv = (gutter + 0.01f) / atlasSize; final float maxUv = (spriteSize + gutter - 0.01f) / atlasSize; @@ -279,11 +288,11 @@ class TextureSupersamplingGLTest { vertex(vertices, 0.5f, 0.5f, maxUv, maxUv); vertex(vertices, -0.5f, 0.5f, minUv, maxUv); vertices.flip(); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW); FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, 20, 0); FfpFixture.attrib(2, 2, GL11.GL_FLOAT, false, 20, 12); VAOManager.setCurrentVertexFlags(TEXTURE_BIT); @@ -291,12 +300,12 @@ class TextureSupersamplingGLTest { private int[] drawTop(int scale) { FfpFixture.clear(); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(100 + 8 * scale, 100 + 8 * scale, 0); - GLStateManager.glScalef(10 * scale, 10 * scale, -10 * scale); - GLStateManager.glRotatef(210, 1, 0, 0); - GLStateManager.glRotatef(45, 0, 1, 0); - GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, 4); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(100 + 8 * scale, 100 + 8 * scale, 0); + GLSMMatrices.glScalef(10 * scale, 10 * scale, -10 * scale); + GLSMMatrices.glRotatef(210, 1, 0, 0); + GLSMMatrices.glRotatef(45, 0, 1, 0); + GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, 4); return FfpFixture.readRegion(SIZE); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKeyTexMatrixMaskTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKeyTexMatrixMaskTest.java index 8981616dd..86e2c3173 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKeyTexMatrixMaskTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/VertexKeyTexMatrixMaskTest.java @@ -1,6 +1,10 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import org.junit.jupiter.api.Test; import org.lwjgl.opengl.GL11; @@ -19,88 +23,88 @@ class VertexKeyTexMatrixMaskTest { @Test void identityNonIdentityTransitionsPerUnit() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - final boolean texGenS = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_S); - final boolean texGenT = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_T); - final boolean texGenR = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_R); - final boolean texGenQ = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_Q); - if (texGenS) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_S); - if (texGenT) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_T); - if (texGenR) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_R); - if (texGenQ) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_Q); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + final boolean texGenS = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_S); + final boolean texGenT = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_T); + final boolean texGenR = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_R); + final boolean texGenQ = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_Q); + if (texGenS) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_S); + if (texGenT) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_T); + if (texGenR) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_R); + if (texGenQ) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_Q); try { for (int unit = 0; unit < VertexKey.MAX_UNITS; unit++) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); assertFalse(texMatEnabled(unit), "unit " + unit + " identity"); - GLStateManager.glTranslatef(1.0f, 2.0f, 3.0f); + GLSMMatrices.glTranslatef(1.0f, 2.0f, 3.0f); assertTrue(texMatEnabled(unit), "unit " + unit + " non-identity"); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); assertFalse(texMatEnabled(unit), "unit " + unit + " back to identity"); } } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - if (texGenS) GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_S); - if (texGenT) GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_T); - if (texGenR) GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_R); - if (texGenQ) GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_Q); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + if (texGenS) GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_S); + if (texGenT) GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_T); + if (texGenR) GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_R); + if (texGenQ) GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_Q); } } @Test void pushPopMatrixRestoresIdentity() { final int unit = 1; - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); assertFalse(texMatEnabled(unit)); - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(4.0f, 5.0f, 6.0f); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(4.0f, 5.0f, 6.0f); assertTrue(texMatEnabled(unit)); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); assertFalse(texMatEnabled(unit), "pop must restore identity and invalidate the cached mask"); } @Test void transformBitPopBumpsGeneration() { final int unit = 2; - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); assertFalse(texMatEnabled(unit)); - GLStateManager.glPushAttrib(GL11.GL_TRANSFORM_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_TRANSFORM_BIT); try { - GLStateManager.glTranslatef(7.0f, 8.0f, 9.0f); + GLSMMatrices.glTranslatef(7.0f, 8.0f, 9.0f); assertTrue(texMatEnabled(unit)); } finally { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } assertTrue(texMatEnabled(unit), "GL_TRANSFORM_BIT pop does not restore matrix content; the pop bump must still force a correct recompute"); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); assertFalse(texMatEnabled(unit)); } @Test void generationUnchangedSkipsRecompute() { final int unit = 3; - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); assertFalse(texMatEnabled(unit)); - final int genBefore = GLStateManager.getTexMatrixGeneration(); + final int genBefore = GLSMMatrices.getTexMatrixGeneration(); GLStateManager.ctx().textures.getTextureUnitMatrix(unit).translate(10.0f, 11.0f, 12.0f); - assertEquals(genBefore, GLStateManager.getTexMatrixGeneration(), "direct mutation of the matrix object must not bump the generation"); + assertEquals(genBefore, GLSMMatrices.getTexMatrixGeneration(), "direct mutation of the matrix object must not bump the generation"); assertFalse(texMatEnabled(unit), "cached mask must stay stale (identity) while the generation is unchanged"); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); assertFalse(texMatEnabled(unit)); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/WideLineClipGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/WideLineClipGLTest.java index 712db9fa7..0be22024c 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/WideLineClipGLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/ffp/WideLineClipGLTest.java @@ -1,7 +1,13 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -35,30 +41,30 @@ class WideLineClipGLTest { @BeforeEach void setUp() { - savedEmulation = GLStateManager.wideLineEmulationEnabled; - GLStateManager.wideLineEmulationEnabled = true; + savedEmulation = GLSMRasterizer.wideLineEmulationEnabled; + GLSMRasterizer.wideLineEmulationEnabled = true; FfpFixture.resetFfpState(); FfpFixture.activateFfp(); - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glFrustum(-NEAR, NEAR, -NEAR, NEAR, NEAR, 100.0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); - GLStateManager.glLineWidth(LINE_WIDTH); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glFrustum(-NEAR, NEAR, -NEAR, NEAR, NEAR, 100.0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); + GLSMRasterizer.glLineWidth(LINE_WIDTH); } @AfterEach void tearDown() { - GLStateManager.wideLineEmulationEnabled = savedEmulation; - GLStateManager.glLineWidth(1.0f); - if (vbo != 0) { GLStateManager.glDeleteBuffers(vbo); vbo = 0; } - if (vao != 0) { GLStateManager.glDeleteVertexArrays(vao); vao = 0; } - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMRasterizer.wideLineEmulationEnabled = savedEmulation; + GLSMRasterizer.glLineWidth(1.0f); + if (vbo != 0) { GLSMBuffers.glDeleteBuffers(vbo); vbo = 0; } + if (vao != 0) { GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; } + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); FfpFixture.resetFfpState(); } @@ -83,9 +89,9 @@ class WideLineClipGLTest { } private static void orthographic() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } private static float pixelCenter(int pixel) { @@ -102,8 +108,8 @@ class WideLineClipGLTest { private int[] drawLineOnce(float[] start, float[] end) { final int[] pixels = drawLine(start, end); - GLStateManager.glDeleteBuffers(vbo); - GLStateManager.glDeleteVertexArrays(vao); + GLSMBuffers.glDeleteBuffers(vbo); + GLSMVertexInput.glDeleteVertexArrays(vao); vbo = 0; vao = 0; return pixels; @@ -112,7 +118,7 @@ class WideLineClipGLTest { @Test void wideLineCoversItsFirstPixelButNotItsLast() { orthographic(); - GLStateManager.glLineWidth(2.0f); + GLSMRasterizer.glLineWidth(2.0f); final float y = pixelCenter(16); final int[] pixels = drawLineOnce(new float[] { pixelCenter(40), y, 0f }, new float[] { pixelCenter(20), y, 0f }); assertEquals(2, litInColumn(pixels, 40), "first pixel of a right-to-left line"); @@ -123,16 +129,16 @@ class WideLineClipGLTest { @Test void cullingKeepsWideLinesInBothDirections() { orthographic(); - GLStateManager.glLineWidth(2.0f); - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMRasterizer.glLineWidth(2.0f); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); try { final int[] rightward = drawLineOnce(new float[] { -0.8f, 0f, 0f }, new float[] { 0.8f, 0f, 0f }); final int[] leftward = drawLineOnce(new float[] { 0.8f, 0f, 0f }, new float[] { -0.8f, 0f, 0f }); assertEquals(2, litInColumn(rightward, SIZE / 2), "left-to-right line with culling on"); assertEquals(2, litInColumn(leftward, SIZE / 2), "right-to-left line with culling on"); - assertTrue(GLStateManager.getCullState().isEnabled(), "the game's cull state survives"); + assertTrue(GLSMRasterizer.getCullState().isEnabled(), "the game's cull state survives"); } finally { - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); } } @@ -149,21 +155,21 @@ class WideLineClipGLTest { } private int[] drawLine(float[] start, float[] end) { - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); final FloatBuffer positions = BufferUtils.createFloatBuffer(6); positions.put(start).put(end).flip(); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, positions, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, positions, GL15.GL_STATIC_DRAW); FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, 12, 0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); VAOManager.setCurrentVertexFlags(0); FfpFixture.clear(); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glDrawArrays(GL11.GL_LINES, 0, 2); - GLStateManager.glBindVertexArray(0); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMDraws.glDrawArrays(GL11.GL_LINES, 0, 2); + GLSMVertexInput.glBindVertexArray(0); return FfpFixture.readRegion(SIZE); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawBatchBuilderTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawBatchBuilderTest.java index 6e89cc32d..82ff6b230 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawBatchBuilderTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawBatchBuilderTest.java @@ -2,6 +2,9 @@ package com.gtnewhorizons.angelica.glsm.recording; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; import com.gtnewhorizons.angelica.glsm.DisplayListManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.ffp.VAOManager; import com.gtnewhorizons.angelica.glsm.recording.commands.BatchedIndexedDrawCmd; @@ -100,12 +103,12 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { final int vao = setupPosColorVao(vbo); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 6L); - GLStateManager.glBindVertexArray(0); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 6L); + GLSMVertexInput.glBindVertexArray(0); + GLSMDraws.glEndList(); assertEquals(1, allBatchedCmds(list).size()); @@ -148,8 +151,8 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { @Test void emptyRecorder_producesNoBatches() { final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glEndList(); assertTrue(batchesOf(list).isEmpty(), "recorder with no draws produces no batches"); assertTrue(allBatchedCmds(list).isEmpty(), "no placeholders either"); @@ -184,24 +187,24 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { data.putFloat(tb[i][0]); data.putFloat(tb[i][1]); data.putFloat(tb[i][2]); data.putFloat(tb[i][3]); } data.flip(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); MemoryUtilities.memFree(data); final int vao = newVao(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, STRIDE, 0); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, STRIDE, 8); - GLStateManager.glEnableVertexAttribArray(1); - GLStateManager.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, 16); - GLStateManager.glEnableVertexAttribArray(2); - GLStateManager.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, STRIDE, 20); - GLStateManager.glEnableVertexAttribArray(3); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, STRIDE, 0); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, STRIDE, 8); + GLSMVertexInput.glEnableVertexAttribArray(1); + GLSMVertexInput.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, STRIDE, 16); + GLSMVertexInput.glEnableVertexAttribArray(2); + GLSMVertexInput.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, STRIDE, 20); + GLSMVertexInput.glEnableVertexAttribArray(3); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); final int ebo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2, 2, 3, 0); final int list = recordSingleIndexedDraw(vao, ebo, GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_SHORT); @@ -242,7 +245,7 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { assertTrue(GL15.glIsBuffer(sharedEBO), "shared EBO live"); assertTrue(GL30.glIsVertexArray(sharedVAO), "shared VAO live"); - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); untrackList(list); assertFalse(GL15.glIsBuffer(sharedVBO), "shared VBO freed"); @@ -263,12 +266,12 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { final int oldVBO = first.getSharedVBO(); final int oldEBO = first.getSharedEBO(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); - GLStateManager.glBindVertexArray(0); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMVertexInput.glBindVertexArray(0); + GLSMDraws.glEndList(); assertFalse(GL15.glIsBuffer(oldVBO), "old shared VBO freed on re-record"); assertFalse(GL15.glIsBuffer(oldEBO), "old shared EBO freed on re-record"); @@ -292,8 +295,8 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { clientData.flip(); final int vao = newVao(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); final ByteBuffer colorSlice = clientData.duplicate().order(ByteOrder.nativeOrder()); colorSlice.position(8); final VAOManager vaos = GLStateManager.ctx().vaos; @@ -301,7 +304,7 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { vaos.enableAttribute(0); vaos.setAttribute(1, 4, GL11.GL_UNSIGNED_BYTE, true, POS_COLOR_STRIDE, colorSlice); vaos.enableAttribute(1); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); final int ebo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2); final int list = recordSingleIndexedDraw(vao, ebo, GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT); @@ -328,14 +331,14 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { final int vao = setupPosColorVao(vbo); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboA); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboB); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); - GLStateManager.glBindVertexArray(0); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboA); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboB); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMVertexInput.glBindVertexArray(0); + GLSMDraws.glEndList(); final List cmds = allBatchedCmds(list); assertEquals(2, cmds.size(), "two indexed draws → two batched commands"); @@ -366,14 +369,14 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { final int vaoA = setupPosColorVao(vbo); final int vaoB = newVao(); - GLStateManager.glBindVertexArray(vaoB); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, POS_COLOR_STRIDE, 0); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, POS_COLOR_STRIDE, 8); - GLStateManager.glEnableVertexAttribArray(2); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(vaoB); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, POS_COLOR_STRIDE, 0); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, POS_COLOR_STRIDE, 8); + GLSMVertexInput.glEnableVertexAttribArray(2); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); final int ebo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2); @@ -399,18 +402,18 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { bData.putFloat(DEFAULT_QUAD_POSITIONS[i * 2 + 1]); } bData.flip(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboB); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboB); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, bData, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); MemoryUtilities.memFree(bData); final int vaoB = newVao(); - GLStateManager.glBindVertexArray(vaoB); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboB); - GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 8, 0); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(vaoB); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboB); + GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 8, 0); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); final int ebo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2); @@ -441,32 +444,32 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { arguments("byte indices", GL11.GL_COMPILE, (Runnable) () -> { final ByteBuffer idx = BufferUtils.createByteBuffer(3); idx.put(new byte[]{0, 1, 2}).flip(); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, idx); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, idx); }, GL11.GL_TRIANGLES, 3, new int[]{0, 1, 2}), arguments("short indices", GL11.GL_COMPILE, (Runnable) () -> { final ShortBuffer idx = BufferUtils.createShortBuffer(3); idx.put(new short[]{0, 1, 2}).flip(); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, idx); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, idx); }, GL11.GL_TRIANGLES, 3, new int[]{0, 1, 2}), arguments("int indices", GL11.GL_COMPILE, (Runnable) () -> { final IntBuffer idx = BufferUtils.createIntBuffer(3); idx.put(new int[]{0, 1, 2}).flip(); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, idx); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, idx); }, GL11.GL_TRIANGLES, 3, new int[]{0, 1, 2}), arguments("explicit count+type", GL11.GL_COMPILE, (Runnable) () -> { final ByteBuffer idx = BufferUtils.createByteBuffer(3 * 2).order(ByteOrder.nativeOrder()); idx.putShort((short) 0).putShort((short) 1).putShort((short) 2).flip(); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, idx); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, idx); }, GL11.GL_TRIANGLES, 3, new int[]{0, 1, 2}), arguments("quads triangulate at record", GL11.GL_COMPILE, (Runnable) () -> { final IntBuffer idx = BufferUtils.createIntBuffer(4); idx.put(new int[]{0, 1, 2, 3}).flip(); - GLStateManager.glDrawElements(GL11.GL_QUADS, idx); + GLSMDraws.glDrawElements(GL11.GL_QUADS, idx); }, GL11.GL_TRIANGLES, 6, new int[]{0, 1, 3, 1, 2, 3}), arguments("compile-and-execute fires live and bakes", GL11.GL_COMPILE_AND_EXECUTE, (Runnable) () -> { final IntBuffer idx = BufferUtils.createIntBuffer(3); idx.put(new int[]{0, 1, 2}).flip(); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, idx); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, idx); }, GL11.GL_TRIANGLES, 3, new int[]{0, 1, 2}) ); } @@ -501,16 +504,16 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { final int vao = newVao(); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); final VAOManager vaos = GLStateManager.ctx().vaos; vaos.setAttribute(0, 3, GL11.GL_FLOAT, false, 0, clientVerts); vaos.enableAttribute(0); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, indices); - GLStateManager.glBindVertexArray(0); - GLStateManager.glEndList(); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, indices); + GLSMVertexInput.glBindVertexArray(0); + GLSMDraws.glEndList(); final BatchedIndexedDrawCmd cmd = firstBatchedCmd(list); assertNotNull(cmd); @@ -534,15 +537,15 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { final int triEbo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, quadEbo); - GLStateManager.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMDraws.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, quadEbo); + GLSMDraws.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L); assertTrue(DisplayListManager.isRecording(), "recording must resume after a GL_QUADS offset draw"); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, triEbo); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); - GLStateManager.glBindVertexArray(0); - GLStateManager.glEndList(); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, triEbo); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMVertexInput.glBindVertexArray(0); + GLSMDraws.glEndList(); assertEquals(2, allBatchedCmds(list).size(), "both the QUADS draw and the following triangle draw must be recorded"); } @@ -553,26 +556,26 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { @EnumSource(MalformedClientDraw.class) void malformedClientDraw_skippedAndRecordingSurvives(MalformedClientDraw scenario) { final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); switch (scenario) { case OVERSIZED_COUNT -> { - GLStateManager.glBindVertexArray(setupPosColorVao(defaultQuadVbo())); + GLSMVertexInput.glBindVertexArray(setupPosColorVao(defaultQuadVbo())); final ByteBuffer idx = BufferUtils.createByteBuffer(3 * 2).order(ByteOrder.nativeOrder()); idx.putShort((short) 0).putShort((short) 1).putShort((short) 2).flip(); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 100, GL11.GL_UNSIGNED_SHORT, idx); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 100, GL11.GL_UNSIGNED_SHORT, idx); } case INDEX_PAST_VERTEX_BUFFER -> { final int vbo = uploadPosColorVbo(new float[]{0f, 0f, 1f, 0f}, new byte[][]{{1, 1, 1, 1}, {2, 2, 2, 2}}); - GLStateManager.glBindVertexArray(setupPosColorVao(vbo)); + GLSMVertexInput.glBindVertexArray(setupPosColorVao(vbo)); final IntBuffer idx = BufferUtils.createIntBuffer(4); idx.put(new int[]{0, 1, 2, 3}).flip(); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, idx); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, idx); } } assertTrue(DisplayListManager.isRecording(), "recording survives a skipped malformed draw"); - GLStateManager.glBindVertexArray(0); - GLStateManager.glEndList(); + GLSMVertexInput.glBindVertexArray(0); + GLSMDraws.glEndList(); assertNull(firstBatchedCmd(list), "malformed draw must be skipped, not captured or over-read"); } @@ -580,12 +583,12 @@ class IndexedDrawBatchBuilderTest extends DisplayListTestFixture { private int recordClientIndexDraw(int listMode, Runnable draw) { final int vao = setupPosColorVao(defaultQuadVbo()); final int list = newList(); - GLStateManager.glNewList(list, listMode); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GLSMDraws.glNewList(list, listMode); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); draw.run(); - GLStateManager.glBindVertexArray(0); - GLStateManager.glEndList(); + GLSMVertexInput.glBindVertexArray(0); + GLSMDraws.glEndList(); return list; } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawDeleteSafetyTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawDeleteSafetyTest.java index 453c94b76..290dc9662 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawDeleteSafetyTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawDeleteSafetyTest.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.glsm.recording; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.recording.commands.IndexedDrawBatch; import com.gtnewhorizons.angelica.glsm.recording.support.DisplayListTestFixture; @@ -29,22 +32,22 @@ class IndexedDrawDeleteSafetyTest extends DisplayListTestFixture { final int sharedEbo = batch.getSharedEBO(); final int foreignVao = newVao(); - GLStateManager.glBindVertexArray(foreignVao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEbo); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(foreignVao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, sharedEbo); + GLSMVertexInput.glBindVertexArray(0); - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); untrackList(list); - GLStateManager.glBindVertexArray(foreignVao); - assertEquals(0, GLStateManager.getBoundEBO(), "vaoEboMap still references the freed sharedEBO - non-gen crash imminent"); + GLSMVertexInput.glBindVertexArray(foreignVao); + assertEquals(0, GLSMVertexInput.getBoundEBO(), "vaoEboMap still references the freed sharedEBO - non-gen crash imminent"); drainErrors(); - final int prevEbo = GLStateManager.getBoundEBO(); + final int prevEbo = GLSMVertexInput.getBoundEBO(); GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, prevEbo); final int err = GL11.glGetError(); assertEquals(GL11.GL_NO_ERROR, err, () -> "bindBuffer(prevEbo=" + prevEbo + ") hit GL 0x" + Integer.toHexString(err) + " - cache carried a freed id through a VAO rebind"); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } @Test @@ -55,19 +58,19 @@ class IndexedDrawDeleteSafetyTest extends DisplayListTestFixture { final int vaoA = newVao(); final int vaoB = newVao(); - GLStateManager.glBindVertexArray(vaoA); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glBindVertexArray(vaoB); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(vaoA); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMVertexInput.glBindVertexArray(vaoB); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMVertexInput.glBindVertexArray(0); - GLStateManager.glDeleteBuffers(ebo); + GLSMBuffers.glDeleteBuffers(ebo); - GLStateManager.glBindVertexArray(vaoA); - assertEquals(0, GLStateManager.getBoundEBO(), "vaoA still references freed EBO"); - GLStateManager.glBindVertexArray(vaoB); - assertEquals(0, GLStateManager.getBoundEBO(), "vaoB still references freed EBO"); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(vaoA); + assertEquals(0, GLSMVertexInput.getBoundEBO(), "vaoA still references freed EBO"); + GLSMVertexInput.glBindVertexArray(vaoB); + assertEquals(0, GLSMVertexInput.getBoundEBO(), "vaoB still references freed EBO"); + GLSMVertexInput.glBindVertexArray(0); } @Test @@ -75,15 +78,15 @@ class IndexedDrawDeleteSafetyTest extends DisplayListTestFixture { final int prog = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS); drainErrors(); - GLStateManager.glUseProgram(prog); - assertEquals(prog, GLStateManager.getActiveProgram()); + GLSMPrograms.glUseProgram(prog); + assertEquals(prog, GLSMPrograms.getActiveProgram()); - GLStateManager.glDeleteProgram(0); + GLSMPrograms.glDeleteProgram(0); - assertEquals(prog, GLStateManager.getActiveProgram(), "glDeleteProgram(0) must be a silent no-op"); + assertEquals(prog, GLSMPrograms.getActiveProgram(), "glDeleteProgram(0) must be a silent no-op"); - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(prog); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(prog); drainErrors(); } @@ -92,15 +95,15 @@ class IndexedDrawDeleteSafetyTest extends DisplayListTestFixture { final int prog = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS); drainErrors(); - GLStateManager.glUseProgram(prog); - assertEquals(prog, GLStateManager.getActiveProgram()); + GLSMPrograms.glUseProgram(prog); + assertEquals(prog, GLSMPrograms.getActiveProgram()); - GLStateManager.glDeleteProgram(prog); + GLSMPrograms.glDeleteProgram(prog); - assertEquals(prog, GLStateManager.getActiveProgram(), "activeProgram must remain set after delete (GL spec: deletion deferred until unbind)"); + assertEquals(prog, GLSMPrograms.getActiveProgram(), "activeProgram must remain set after delete (GL spec: deletion deferred until unbind)"); - GLStateManager.glUseProgram(0); - assertEquals(0, GLStateManager.getActiveProgram(), "activeProgram clears once the deleted program is unbound"); + GLSMPrograms.glUseProgram(0); + assertEquals(0, GLSMPrograms.getActiveProgram(), "activeProgram clears once the deleted program is unbound"); drainErrors(); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawReplayTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawReplayTest.java index 1a30d42ed..1178c729c 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawReplayTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/IndexedDrawReplayTest.java @@ -1,7 +1,9 @@ package com.gtnewhorizons.angelica.glsm.recording; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.recording.commands.AttribLayoutKey; import com.gtnewhorizons.angelica.glsm.recording.commands.BatchedIndexedDrawCmd; import com.gtnewhorizons.angelica.glsm.recording.commands.IndexedDrawBatch; @@ -46,12 +48,12 @@ class IndexedDrawReplayTest extends DisplayListTestFixture { GL15.glBeginQuery(GL15.GL_SAMPLES_PASSED, query); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_SHORT, 0L); - GLStateManager.glBindVertexArray(0); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMVertexInput.glBindVertexArray(0); + GLSMDraws.glEndList(); GL15.glEndQuery(GL15.GL_SAMPLES_PASSED); final int samples = GL15.glGetQueryObjecti(query, GL15.GL_QUERY_RESULT); @@ -76,11 +78,11 @@ class IndexedDrawReplayTest extends DisplayListTestFixture { final IndexedDrawBatch batch = firstBatch(list); replay(list); - GLStateManager.glBindVertexArray(vaoOf(batch)); - assertEquals(batch.getSharedEBO(), GLStateManager.getBoundEBO(), + GLSMVertexInput.glBindVertexArray(vaoOf(batch)); + assertEquals(batch.getSharedEBO(), GLSMVertexInput.getBoundEBO(), "batched VAO's EBO binding corrupted"); assertEquals(batch.getSharedEBO(), GL11.glGetInteger(GL15.GL_ELEMENT_ARRAY_BUFFER_BINDING)); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } @Test @@ -95,8 +97,8 @@ class IndexedDrawReplayTest extends DisplayListTestFixture { // Bind unrelated state so the baked command has to restore its own bindings. final int distractorVao = newVao(); - GLStateManager.glBindVertexArray(distractorVao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(distractorVao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); drainErrors(); @@ -106,7 +108,7 @@ class IndexedDrawReplayTest extends DisplayListTestFixture { assertEquals(GL11.GL_NO_ERROR, err, () -> "replay produced GL error 0x" + Integer.toHexString(err)); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } @Test @@ -116,18 +118,18 @@ class IndexedDrawReplayTest extends DisplayListTestFixture { final int vao = setupPosColorVao(vbo); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L); - GLStateManager.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMDraws.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMDraws.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMDraws.glEndList(); final List cmds = allBatchedCmds(list); assertEquals(2, cmds.size()); final int distractor = newVao(); - GLStateManager.glBindVertexArray(distractor); + GLSMVertexInput.glBindVertexArray(distractor); drainErrors(); compiledOf(list).render(); @@ -135,8 +137,8 @@ class IndexedDrawReplayTest extends DisplayListTestFixture { assertSame(batchOf(cmds.getFirst()), batchOf(cmds.get(1))); final int sharedVAO = vaoOf(batchOf(cmds.getFirst())); assertNotEquals(0, sharedVAO); - assertEquals(sharedVAO, GLStateManager.getBoundVAO()); - GLStateManager.glBindVertexArray(0); + assertEquals(sharedVAO, GLSMVertexInput.getBoundVAO()); + GLSMVertexInput.glBindVertexArray(0); } @Test @@ -144,8 +146,8 @@ class IndexedDrawReplayTest extends DisplayListTestFixture { final int vbo = defaultQuadVbo(); final int ebo = uploadEbo(GL11.GL_UNSIGNED_SHORT, 0, 1, 2, 3); final int vao = setupPosColorVao(vbo); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); final IndexedDrawCapture good = IndexedDrawCapture.create(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L, ebo); assertNotNull(good); @@ -172,7 +174,7 @@ class IndexedDrawReplayTest extends DisplayListTestFixture { MemoryUtilities.memFree(tinyVtx); MemoryUtilities.memFree(tinyIdx); good.freeBuffers(); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } } @@ -201,11 +203,11 @@ class IndexedDrawReplayTest extends DisplayListTestFixture { final int vao = setupPosColorVao(vbo); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMDraws.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMDraws.glEndList(); drainErrors(); @@ -216,6 +218,6 @@ class IndexedDrawReplayTest extends DisplayListTestFixture { assertEquals(GL11.GL_NO_ERROR, err, () -> "double replay produced GL error 0x" + Integer.toHexString(err)); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java index fc2757ec1..2c4875d67 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/RecordingDataStructuresTest.java @@ -4,7 +4,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.DirectTessellator; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizons.angelica.glsm.GLCompatTest; import com.gtnewhorizons.angelica.glsm.GLCompatTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.lwjgl.opengl.GL11; @@ -26,7 +26,7 @@ class RecordingDataStructuresTest { @AfterEach void cleanup() { if (testList > 0) { - GLStateManager.glDeleteLists(testList, 1); + GLSMDraws.glDeleteLists(testList, 1); testList = -1; } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/support/DisplayListTestFixture.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/support/DisplayListTestFixture.java index 6160baa27..25481a26c 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/support/DisplayListTestFixture.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/recording/support/DisplayListTestFixture.java @@ -3,7 +3,9 @@ package com.gtnewhorizons.angelica.glsm.recording.support; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; import com.gtnewhorizons.angelica.glsm.DisplayListManager; import com.gtnewhorizons.angelica.glsm.GLCompatTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLTypes; import com.gtnewhorizons.angelica.glsm.recording.CompiledDisplayList; import com.gtnewhorizons.angelica.glsm.recording.commands.BatchedIndexedDrawCmd; @@ -37,12 +39,12 @@ public abstract class DisplayListTestFixture { @AfterEach void cleanupFixtureResources() { - for (int list : listsToCleanup) GLStateManager.glDeleteLists(list, 1); + for (int list : listsToCleanup) GLSMDraws.glDeleteLists(list, 1); for (int buf : buffersToCleanup) { if (GL15.glIsBuffer(buf)) GL15.glDeleteBuffers(buf); } for (int vao : vaosToCleanup) { - if (GL30.glIsVertexArray(vao)) GLStateManager.glDeleteVertexArrays(vao); + if (GL30.glIsVertexArray(vao)) GLSMVertexInput.glDeleteVertexArrays(vao); } listsToCleanup.clear(); buffersToCleanup.clear(); @@ -88,9 +90,9 @@ public abstract class DisplayListTestFixture { data.put(colors[i][3]); } data.flip(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); GL15.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); MemoryUtilities.memFree(data); return vbo; } @@ -112,9 +114,9 @@ public abstract class DisplayListTestFixture { } } data.flip(); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); MemoryUtilities.memFree(data); return ebo; } @@ -122,14 +124,14 @@ public abstract class DisplayListTestFixture { /** VAO with loc0 = 2*FLOAT pos, loc1 = 4*UNSIGNED_BYTE norm color, stride 12. */ protected final int setupPosColorVao(int vbo) { final int vao = newVao(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, POS_COLOR_STRIDE, 0); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, POS_COLOR_STRIDE, 8); - GLStateManager.glEnableVertexAttribArray(1); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, POS_COLOR_STRIDE, 0); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, POS_COLOR_STRIDE, 8); + GLSMVertexInput.glEnableVertexAttribArray(1); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); return vao; } @@ -139,25 +141,25 @@ public abstract class DisplayListTestFixture { */ protected final int recordSingleIndexedDraw(int vao, int ebo, int drawMode, int indexCount, int indexType) { final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glDrawElements(drawMode, indexCount, indexType, 0L); - GLStateManager.glBindVertexArray(0); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMDraws.glDrawElements(drawMode, indexCount, indexType, 0L); + GLSMVertexInput.glBindVertexArray(0); + GLSMDraws.glEndList(); return list; } protected final int recordTwoVaoDraws(int firstVao, int secondVao, int ebo) { final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); for (int vao : new int[] { firstVao, secondVao }) { - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 3, GL11.GL_UNSIGNED_SHORT, 0L); } - GLStateManager.glBindVertexArray(0); - GLStateManager.glEndList(); + GLSMVertexInput.glBindVertexArray(0); + GLSMDraws.glEndList(); return list; } @@ -192,7 +194,7 @@ public abstract class DisplayListTestFixture { protected static void replay(int listId) { compiledOf(listId).render(); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } protected static IndexedDrawBatch batchOf(BatchedIndexedDrawCmd cmd) { @@ -205,23 +207,23 @@ public abstract class DisplayListTestFixture { protected static ByteBuffer readBufferBytes(int target, int bufferId, int size) { final int prev; - if (target == GL15.GL_ARRAY_BUFFER) prev = GLStateManager.getBoundVBO(); - else if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) prev = GLStateManager.getBoundEBO(); + if (target == GL15.GL_ARRAY_BUFFER) prev = GLSMBuffers.getBoundVBO(); + else if (target == GL15.GL_ELEMENT_ARRAY_BUFFER) prev = GLSMVertexInput.getBoundEBO(); else prev = 0; - GLStateManager.glBindBuffer(target, bufferId); + GLSMBuffers.glBindBuffer(target, bufferId); final ByteBuffer buf = MemoryUtilities.memAlloc(size).order(ByteOrder.nativeOrder()); GL15.glGetBufferSubData(target, 0, buf); - GLStateManager.glBindBuffer(target, prev); + GLSMBuffers.glBindBuffer(target, prev); return buf; } protected static void overwriteBufferWithGarbage(int target, int bufferId, int size) { final ByteBuffer garbage = MemoryUtilities.memAlloc(size); for (int i = 0; i < garbage.capacity(); i++) garbage.put(i, (byte) 0xAA); - GLStateManager.glBindBuffer(target, bufferId); + GLSMBuffers.glBindBuffer(target, bufferId); GL15.glBufferData(target, garbage, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(target, 0); + GLSMBuffers.glBindBuffer(target, 0); MemoryUtilities.memFree(garbage); } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirectorTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirectorTest.java index 337f929a3..3468fdec2 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirectorTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/redirect/GLSMRedirectorTest.java @@ -2,6 +2,7 @@ package com.gtnewhorizons.angelica.glsm.redirect; import com.gtnewhorizons.angelica.config.SystemProperties; import com.gtnewhorizons.angelica.config.SystemProperties.UnmappedGLMode; +import com.gtnewhorizons.angelica.glsm.testutil.GlsmClasses; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -13,6 +14,7 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.InsnNode; import org.objectweb.asm.tree.InvokeDynamicInsnNode; import org.objectweb.asm.tree.MethodInsnNode; @@ -21,7 +23,12 @@ import org.objectweb.asm.tree.MethodNode; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.TreeMap; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -31,7 +38,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; class GLSMRedirectorTest { - private static final String GLSM = GLSMRedirector.getTargetClassName(); + private static final String GLSM = "com/gtnewhorizons/angelica/glsm/GLStateManager"; private static Set unmappedSeen() { return Reflect.getStatic(GLSMRedirector.class, "UNMAPPED_SEEN"); } private static Set debugSeen() { return Reflect.getStatic(GLSMRedirector.class, "DEBUG_SEEN"); } @@ -115,7 +122,7 @@ class GLSMRedirectorTest { assertTrue(changed); final Handle result = getResultHandle(cn); - assertEquals(GLSM, result.getOwner()); + assertEquals(GLSMRedirector.getTargetOwner(expectedName), result.getOwner()); assertEquals(expectedName, result.getName()); assertEquals(desc, result.getDesc()); assertEquals(Opcodes.H_INVOKESTATIC, result.getTag()); @@ -211,14 +218,104 @@ class GLSMRedirectorTest { final ClassNode cn = makeClassWithMethodCall(owner, name, desc); final boolean changed = new GLSMRedirector().transformClassNode("com.example.TestClass", cn); assertTrue(changed, owner + "." + name + " should redirect"); - assertEquals(GLSM, firstCall(cn).owner); + assertEquals(GLSMRedirector.getTargetOwner(expectedName), firstCall(cn).owner); assertEquals(expectedName, firstCall(cn).name); assertTrue(unmappedSeen().isEmpty(), owner + "." + name + " should not be recorded"); return firstCall(cn); } + @Test + void ownerIndexAndSearchStrings() { + assertFalse(GLSMRedirector.getNamedClassMethodRedirects().containsKey(GLSM)); + assertTrue(Arrays.asList(new GLSMRedirector().getConstantPoolSearchStrings()).contains(GLSM)); + assertEquals("com/gtnewhorizons/angelica/glsm/GLSMMatrices", GLSMRedirector.getTargetOwner("glPushMatrix")); + } + + @Test + void ownerTableMatchesGlsmClasses() { + final Map> methods = new TreeMap<>(); + final Map> fields = new TreeMap<>(); + for (String type : GlsmClasses.packageClasses()) { + if (type.equals(GLSM)) continue; + final ClassNode node = GlsmClasses.load(type); + final List m = node.methods.stream().filter(x -> isPublicStatic(x.access)).map(x -> x.name).distinct().sorted().toList(); + final List f = node.fields.stream().filter(x -> isPublicStatic(x.access)).map(x -> x.name).sorted().toList(); + if (!m.isEmpty()) methods.put(type, m); + if (!f.isEmpty()) fields.put(type, f); + } + final String expected = renderTable("METHODS", methods) + "\n" + renderTable("FIELDS", fields); + final String actual = renderTable("METHODS", rows(GLSMOwners.METHODS)) + "\n" + renderTable("FIELDS", rows(GLSMOwners.FIELDS)); + assertEquals(expected, actual, "GLSMOwners is out of date. Replace its tables with:\n" + expected); + } + + @Test + void everyRedirectTargetResolves() { + final List missing = new ArrayList<>(); + for (String target : GLSMRedirector.redirectTargets()) { + final String owner = GLSMRedirector.getTargetOwner(target); + if (GlsmClasses.load(owner).methods.stream().noneMatch(m -> m.name.equals(target) && isPublicStatic(m.access))) missing.add(owner + "." + target); + } + assertTrue(missing.isEmpty(), "Redirect targets not declared: " + missing); + for (String name : GLSMRedirector.CORE_REWRITE_TARGETS) { + assertEquals(GLSM, GLSMRedirector.getTargetOwner(name), name); + } + } + + private static boolean isPublicStatic(int access) { + return (access & Opcodes.ACC_PUBLIC) != 0 && (access & Opcodes.ACC_STATIC) != 0 && (access & Opcodes.ACC_SYNTHETIC) == 0; + } + + private static Map> rows(String[][] table) { + final Map> rows = new LinkedHashMap<>(); + for (String[] row : table) rows.put(row[0], Arrays.asList(row).subList(1, row.length)); + return rows; + } + + private static String renderTable(String name, Map> rows) { + if (rows.isEmpty()) return " static final String[][] " + name + " = {};\n"; + final StringBuilder out = new StringBuilder(" static final String[][] " + name + " = {\n"); + for (Map.Entry> row : rows.entrySet()) { + out.append(" {\"").append(row.getKey()).append("\",\n"); + StringBuilder line = new StringBuilder(" "); + final List names = row.getValue(); + for (int i = 0; i < names.size(); i++) { + final String token = "\"" + names.get(i) + "\"" + (i == names.size() - 1 ? "}," : ","); + if (line.length() > 12 && line.length() + 1 + token.length() > 120) { + out.append(line).append('\n'); + line = new StringBuilder(" "); + } + if (line.length() > 12) line.append(' '); + line.append(token); + } + out.append(line).append('\n'); + } + return out.append(" };\n").toString(); + } + + @Test + void legacyOwnerIsRewrittenToItsGroup() { + final String fogStateDesc = "()Lcom/gtnewhorizons/angelica/glsm/stacks/FogStateStack;"; + final ClassNode moved = makeClassWithMethodCall(GLSM, "getFogState", fogStateDesc); + assertTrue(new GLSMRedirector().transformClassNode("com.example.TestClass", moved)); + assertEquals("com/gtnewhorizons/angelica/glsm/GLSMFog", firstCall(moved).owner); + + final ClassNode core = makeClassWithMethodCall(GLSM, "ctx", "()Lcom/gtnewhorizons/angelica/glsm/GLContextState;"); + assertFalse(new GLSMRedirector().transformClassNode("com.example.TestClass", core)); + assertEquals(GLSM, firstCall(core).owner); + + final ClassNode field = makeClassWithMethodCall("java/lang/Object", "hashCode", "()I"); + final FieldInsnNode read = new FieldInsnNode(Opcodes.GETSTATIC, GLSM, "DEFAULT_DRAW_BUFFER", "I"); + field.methods.get(0).instructions.insert(read); + assertTrue(new GLSMRedirector().transformClassNode("com.example.TestClass", field)); + assertEquals("com/gtnewhorizons/angelica/glsm/GLSMFramebuffer", read.owner); + + final ClassNode handle = makeClassWithInvokeDynamic(new Handle(Opcodes.H_INVOKESTATIC, GLSM, "getFogState", fogStateDesc, false)); + assertTrue(new GLSMRedirector().transformClassNode("com.example.TestClass", handle)); + assertEquals("com/gtnewhorizons/angelica/glsm/GLSMFog", getResultHandle(handle).getOwner()); + } + private static boolean glsmDeclares(String name, String desc) throws ClassNotFoundException { - final Class glsm = Class.forName(GLSM.replace('/', '.'), false, GLSMRedirectorTest.class.getClassLoader()); + final Class glsm = Class.forName(GLSMRedirector.getTargetOwner(name).replace('/', '.'), false, GLSMRedirectorTest.class.getClassLoader()); for (Method m : glsm.getDeclaredMethods()) { final int mods = m.getModifiers(); if (!Modifier.isPublic(mods) || !Modifier.isStatic(mods) || !m.getName().equals(name)) continue; @@ -270,7 +367,7 @@ class GLSMRedirectorTest { }) void aliasIsRedirected(String owner, String name, String desc, String expectedName) throws ClassNotFoundException { assertEquals(desc, assertRedirected(owner, name, desc, expectedName).desc); - assertTrue(glsmDeclares(expectedName, desc), () -> "GLStateManager lacks " + expectedName + desc); + assertTrue(glsmDeclares(expectedName, desc), () -> GLSMRedirector.getTargetOwner(expectedName) + " lacks " + expectedName + desc); assertTrue(debugSeen().isEmpty()); } @@ -336,6 +433,11 @@ class GLSMRedirectorTest { "org/lwjgl/opengl/EXTDirectStateAccess | glNamedFramebufferTextureFaceEXT | (IIIII)V", "org/lwjgl/opengl/EXTDirectStateAccess | glBindMultiTextureEXT | (III)V", "org/lwjgl/opengl/ARBShaderImageLoadStore | glBindImageTexture | (IIIZIII)V", + "org/lwjgl/opengl/GL30 | glEnablei | (II)V", + "org/lwjgl/opengl/GL30 | glDisablei | (II)V", + "org/lwjgl/opengl/GL33C | glEnablei | (II)V", + "org/lwjgl/opengl/GL33C | glDisablei | (II)V", + "org/lwjgl/opengl/GL43 | glCopyImageSubData | (IIIIIIIIIIIIIII)V", }) void redirectsToADeclaredGlsmTarget(String owner, String name, String desc) throws ClassNotFoundException { for (boolean aware : new boolean[]{false, true}) { @@ -343,10 +445,10 @@ class GLSMRedirectorTest { final ClassNode cn = makeClassWithMethodCall(owner, name, desc); assertTrue(new GLSMRedirector().transformClassNode("com.example.TestClass", cn, aware), call); final MethodInsnNode target = firstCall(cn); - assertEquals(GLSM, target.owner, call); + assertEquals(GLSMRedirector.getTargetOwner(name), target.owner, call); assertEquals(name, target.name, call); assertEquals(desc, target.desc, call); - assertTrue(glsmDeclares(target.name, target.desc), () -> "GLStateManager lacks the target of " + call); + assertTrue(glsmDeclares(target.name, target.desc), () -> target.owner + " lacks the target of " + call); } assertTrue(unmappedSeen().isEmpty(), () -> "unexpected reports: " + unmappedSeen()); } @@ -380,7 +482,7 @@ class GLSMRedirectorTest { assertTrue(new GLSMRedirector().transformClassNode("com.example.TestClass", cn, true)); - assertEquals(AWARE_SHIM, firstCall(cn).owner, "GLStateManager cannot carry an org.lwjgl-typed descriptor for an aware caller"); + assertEquals(AWARE_SHIM, firstCall(cn).owner, "GLSM cannot carry an org.lwjgl-typed descriptor for an aware caller"); assertEquals(name, firstCall(cn).name); } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBindingCacheGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBindingCacheGLTest.java index 626edd872..fb7f25348 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBindingCacheGLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingBindingCacheGLTest.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.glsm.streaming; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs; @@ -46,39 +47,39 @@ class StreamingBindingCacheGLTest { @ParameterizedTest @EnumSource(UploadStrategy.class) void orphanUploadLeavesTheArrayBufferCacheMatchingTheDriver(UploadStrategy strategy) { - final int other = GLStateManager.glGenBuffers(); + final int other = GLSMBuffers.glGenBuffers(); final OrphanStreamingBuffer buf = new OrphanStreamingBuffer(); final ByteBuffer data = filled(64); try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, other); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, other); buf.upload(strategy, data); - assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLStateManager.getBoundVBO(), "first upload respecifies the buffer"); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, other); + assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLSMBuffers.getBoundVBO(), "first upload respecifies the buffer"); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, other); buf.upload(strategy, data); - assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLStateManager.getBoundVBO(), "second upload takes the in-capacity path"); + assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLSMBuffers.getBoundVBO(), "second upload takes the in-capacity path"); } finally { memFree(data); buf.destroy(); - GLStateManager.glDeleteBuffers(other); + GLSMBuffers.glDeleteBuffers(other); } } @Test void uniformRingOrphanPathLeavesTheUniformBufferCacheMatchingTheDriver() { - final int other = GLStateManager.glGenBuffers(); + final int other = GLSMBuffers.glGenBuffers(); final ByteBuffer src = filled(64); UniformRingBuffer ring = null; try { - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, other); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, other); ring = new UniformRingBuffer(1024, 64, true); assertFalse(ring.isPersistent()); assertEquals(GL11.glGetInteger(GL31.GL_UNIFORM_BUFFER_BINDING), glsmUniformBufferBinding(), "constructor allocation"); - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, other); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, other); ring.writeBlock(src); assertEquals(GL11.glGetInteger(GL31.GL_UNIFORM_BUFFER_BINDING), glsmUniformBufferBinding(), "writeBlock"); } finally { if (ring != null) ring.destroy(); - GLStateManager.glDeleteBuffers(other); + GLSMBuffers.glDeleteBuffers(other); memFree(src); } } @@ -86,19 +87,19 @@ class StreamingBindingCacheGLTest { @Test void persistentRingMarksItsOwnBufferAndLeavesTheCacheMatchingTheDriver() { assumeTrue(RenderSystem.supportsBufferStorage(), "GL4.4+ required"); - final int other = GLStateManager.glGenBuffers(); + final int other = GLSMBuffers.glGenBuffers(); PersistentStreamingBuffer ring = null; try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, other); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, other); ring = PersistentStreamingBuffer.createOrNull(4096, false); assertNotNull(ring); final IntSet persistent = Reflect.getStatic(FfpExtendedAttribs.class, "persistentSources"); assertTrue(persistent.contains(ring.getBufferId()), "the ring buffer is the persistent source"); assertFalse(persistent.contains(other), "the previously bound buffer is not persistent"); - assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLStateManager.getBoundVBO()); + assertEquals(GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLSMBuffers.getBoundVBO()); } finally { if (ring != null) ring.destroy(); - GLStateManager.glDeleteBuffers(other); + GLSMBuffers.glDeleteBuffers(other); } } } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingDrawVAOBindingTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingDrawVAOBindingTest.java index cb32f0134..36a7393b8 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingDrawVAOBindingTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/StreamingDrawVAOBindingTest.java @@ -3,7 +3,7 @@ package com.gtnewhorizons.angelica.glsm.streaming; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; import com.gtnewhorizons.angelica.glsm.GLCompatTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import net.minecraft.client.renderer.Tessellator; import org.junit.jupiter.api.Test; import org.lwjgl.opengl.GL11; @@ -35,12 +35,12 @@ public class StreamingDrawVAOBindingTest { final ByteBuffer data = triangle(); try { TessellatorStreamingDrawer.drawPacked(data, GL11.GL_TRIANGLES, FLAGS, 3); - final int afterFirst = GLStateManager.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING); + final int afterFirst = GLSMQueries.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING); assertNotEquals(0, afterFirst, "a streaming draw must leave its own VAO bound, not VAO 0"); data.position(0).limit(data.capacity()); TessellatorStreamingDrawer.drawPacked(data, GL11.GL_TRIANGLES, FLAGS, 3); - final int afterSecond = GLStateManager.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING); + final int afterSecond = GLSMQueries.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING); assertEquals(afterFirst, afterSecond, "the same format must reuse the same VAO across draws"); assertEquals(afterSecond, GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING), "GLSM's cached binding must match the driver's"); diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsGLTest.java b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsGLTest.java index ed7c46a51..82f7b48f3 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsGLTest.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsGLTest.java @@ -2,7 +2,12 @@ package com.gtnewhorizons.angelica.glsm.streaming; import com.gtnewhorizons.angelica.glsm.EntityIdsOnlyHandler; import com.gtnewhorizons.angelica.glsm.GLCompatTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.ffp.FfpFixture; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; @@ -29,20 +34,20 @@ class TessellatorEntityIdsGLTest { void setUp() { previousHandler = EntityIdsOnlyHandler.install(); program = GlTestSupport.program(TessellatorEntityIdsFixture.VERTEX, TessellatorEntityIdsFixture.FRAGMENT); - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); - GLStateManager.glViewport(0, 0, 8, 8); - GLStateManager.glUseProgram(program); - GLStateManager.glClearColor(0, 0, 0, 1); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); + GLSMRasterizer.glViewport(0, 0, 8, 8); + GLSMPrograms.glUseProgram(program); + GLSMBlend.glClearColor(0, 0, 0, 1); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); } @AfterEach void tearDown() { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(program); - GLStateManager.glPopAttrib(); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(program); + GLSMAttribStack.glPopAttrib(); GLSMHooks.immediateExtendedHandler = previousHandler; } diff --git a/glsm/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java b/glsm/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java index e1137c5da..07c7790e4 100644 --- a/glsm/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java +++ b/glsm/src/test/java/com/gtnewhorizons/angelica/util/GLSMUtil.java @@ -1,6 +1,17 @@ package com.gtnewhorizons.angelica.util; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; @@ -109,12 +120,12 @@ public class GLSMUtil { if (isFFPOnly(glCap)) { assertAll(message, () -> assertFalse(driverBoolean(glCap, true), "GL State Mismatch - cache-only cap reached the driver"), - () -> assertEquals(expected, GLStateManager.glIsEnabled(glCap), "GLSM State Mismatch") + () -> assertEquals(expected, GLSMEnable.glIsEnabled(glCap), "GLSM State Mismatch") ); } else { assertAll(message, () -> assertEquals(expected, GL11.glIsEnabled(glCap), "GL State Mismatch"), - () -> assertEquals(expected, GLStateManager.glIsEnabled(glCap), "GLSM State Mismatch") + () -> assertEquals(expected, GLSMEnable.glIsEnabled(glCap), "GLSM State Mismatch") ); } } @@ -127,12 +138,12 @@ public class GLSMUtil { if (isFFPOnly(glCap)) { assertAll(message, () -> assertFalse(driverBoolean(glCap, false), "GL State Mismatch - cache-only cap reached the driver"), - () -> assertEquals(expected, GLStateManager.glGetBoolean(glCap), "GLSM State Mismatch") + () -> assertEquals(expected, GLSMQueries.glGetBoolean(glCap), "GLSM State Mismatch") ); } else { assertAll(message, () -> assertEquals(expected, GL11.glGetBoolean(glCap), "GL State Mismatch"), - () -> assertEquals(expected, GLStateManager.glGetBoolean(glCap), "GLSM State Mismatch") + () -> assertEquals(expected, GLSMQueries.glGetBoolean(glCap), "GLSM State Mismatch") ); } } @@ -142,22 +153,22 @@ public class GLSMUtil { } public static void verifyState(int glCap, int expected, String message) { if (isFFPOnly(glCap)) { - assertEquals(expected, GLStateManager.glGetInteger(glCap), message + " - GLSM State Mismatch"); + assertEquals(expected, GLSMQueries.glGetInteger(glCap), message + " - GLSM State Mismatch"); } else { assertAll(message, () -> assertEquals(expected, GL11.glGetInteger(glCap), "GL State Mismatch"), - () -> assertEquals(expected, GLStateManager.glGetInteger(glCap), "GLSM State Mismatch") + () -> assertEquals(expected, GLSMQueries.glGetInteger(glCap), "GLSM State Mismatch") ); } } public static void verifyState(int glCap, short expected, String message) { if (isFFPOnly(glCap)) { - assertEquals(expected, (short) GLStateManager.glGetInteger(glCap), message + " - GLSM State Mismatch"); + assertEquals(expected, (short) GLSMQueries.glGetInteger(glCap), message + " - GLSM State Mismatch"); } else { assertAll(message, () -> assertEquals(expected, (short) GL11.glGetInteger(glCap), "GL State Mismatch"), - () -> assertEquals(expected, (short) GLStateManager.glGetInteger(glCap), "GLSM State Mismatch") + () -> assertEquals(expected, (short) GLSMQueries.glGetInteger(glCap), "GLSM State Mismatch") ); } } @@ -167,11 +178,11 @@ public class GLSMUtil { } public static void verifyState(int glCap, float expected, String message) { if (isFFPOnly(glCap)) { - assertEquals(expected, GLStateManager.glGetFloat(glCap), 0.0001f, message + " - GLSM State Mismatch"); + assertEquals(expected, GLSMQueries.glGetFloat(glCap), 0.0001f, message + " - GLSM State Mismatch"); } else { assertAll(message, () -> assertEquals(expected, GL11.glGetFloat(glCap), 0.0001f, "GL State Mismatch"), - () -> assertEquals(expected, GLStateManager.glGetFloat(glCap), 0.0001f, "GLSM State Mismatch") + () -> assertEquals(expected, GLSMQueries.glGetFloat(glCap), 0.0001f, "GLSM State Mismatch") ); } } @@ -184,13 +195,13 @@ public class GLSMUtil { public static void verifyState(int glCap, int[] expected, String message) { if (isFFPOnly(glCap)) { - GLStateManager.glGetInteger(glCap, (IntBuffer) glsmIntBuffer.clear()); + GLSMQueries.glGetInteger(glCap, (IntBuffer) glsmIntBuffer.clear()); IntStream.range(0, expected.length).forEach(i -> assertEquals(expected[i], glsmIntBuffer.get(i), message + " - GLSM State Mismatch: " + i) ); } else { GL11.glGetInteger(glCap, (IntBuffer) glIntBuffer.clear()); - GLStateManager.glGetInteger(glCap, (IntBuffer) glsmIntBuffer.clear()); + GLSMQueries.glGetInteger(glCap, (IntBuffer) glsmIntBuffer.clear()); IntStream.range(0, expected.length).forEach(i -> assertAll(message, () -> assertEquals(expected[i], glIntBuffer.get(i), "GL State Mismatch: " + i), () -> assertEquals(expected[i], glsmIntBuffer.get(i), "GLSM State Mismatch: " + i) @@ -208,13 +219,13 @@ public class GLSMUtil { public static void verifyState(int glCap, float[] expected, String message) { if (isFFPOnly(glCap)) { - GLStateManager.glGetFloat(glCap, (FloatBuffer) glsmFloatBuffer.clear()); + GLSMQueries.glGetFloat(glCap, (FloatBuffer) glsmFloatBuffer.clear()); IntStream.range(0, expected.length).forEach(i -> assertEquals(expected[i], glsmFloatBuffer.get(i), 0.0001f, message + " - GLSM State Mismatch: " + i) ); } else { GL11.glGetFloat(glCap, (FloatBuffer) glFloatBuffer.clear()); - GLStateManager.glGetFloat(glCap, (FloatBuffer) glsmFloatBuffer.clear()); + GLSMQueries.glGetFloat(glCap, (FloatBuffer) glsmFloatBuffer.clear()); IntStream.range(0, expected.length).forEach(i -> assertAll(message, () -> assertEquals(expected[i], glFloatBuffer.get(i), 0.0001f, "GL State Mismatch: " + i), () -> assertEquals(expected[i], glsmFloatBuffer.get(i), 0.0001f, "GLSM State Mismatch: " + i) @@ -231,13 +242,13 @@ public class GLSMUtil { public static void verifyState(int glCap, boolean[] expected, String message) { if (isFFPOnly(glCap)) { - GLStateManager.glGetBoolean(glCap, (ByteBuffer) glsmByteBuffer.clear()); + GLSMQueries.glGetBoolean(glCap, (ByteBuffer) glsmByteBuffer.clear()); IntStream.range(0, expected.length).forEach(i -> assertEquals(expected[i] ? GL11.GL_TRUE : GL11.GL_FALSE, glsmByteBuffer.get(i), message + " - GLSM State Mismatch: " + i) ); } else { GL11.glGetBoolean(glCap, (ByteBuffer) glByteBuffer.clear()); - GLStateManager.glGetBoolean(glCap, (ByteBuffer) glsmByteBuffer.clear()); + GLSMQueries.glGetBoolean(glCap, (ByteBuffer) glsmByteBuffer.clear()); IntStream.range(0, expected.length).forEach(i -> assertAll(message, () -> assertEquals(expected[i] ? GL11.GL_TRUE : GL11.GL_FALSE, glByteBuffer.get(i), "GL State Mismatch: " + i), () -> assertEquals(expected[i] ? GL11.GL_TRUE : GL11.GL_FALSE, glsmByteBuffer.get(i), "GLSM State Mismatch: " + i) @@ -248,7 +259,7 @@ public class GLSMUtil { /** Light params are FFP-only — verify GLSM cache only. */ public static void verifyLightState(int glLight, int pname, float[] expected, String message) { - GLStateManager.glGetLight(glLight, pname, (FloatBuffer) glsmFloatBuffer.clear()); + GLSMLighting.glGetLight(glLight, pname, (FloatBuffer) glsmFloatBuffer.clear()); IntStream.range (0, expected.length).forEach(i -> assertEquals(expected[i], glsmFloatBuffer.get(i), 0.0001f, message + " - GLSM State Mismatch: " + i) ); @@ -256,7 +267,7 @@ public class GLSMUtil { /** Material params are FFP-only — verify GLSM cache only. */ public static void verifyMaterialState(int face, int pname, float[] expected, String message) { - GLStateManager.glGetMaterial(face, pname, (FloatBuffer) glsmFloatBuffer.clear()); + GLSMLighting.glGetMaterial(face, pname, (FloatBuffer) glsmFloatBuffer.clear()); IntStream.range (0, expected.length).forEach(i -> assertEquals(expected[i], glsmFloatBuffer.get(i), 0.0001f, message + " - GLSM State Mismatch: " + i) ); @@ -268,122 +279,122 @@ public class GLSMUtil { */ public static void resetGLState() { // Disable all enable/disable states (except those with non-false defaults) - GLStateManager.disableAlphaTest(); - GLStateManager.glDisable(GL11.GL_AUTO_NORMAL); - GLStateManager.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMEnable.glDisable(GL11.GL_AUTO_NORMAL); + GLSMBlend.disableBlend(); // Disable all clip planes (using cached MAX_CLIP_PLANES) for(int i = 0; i < CompatLimits.MAX_CLIP_PLANES; i++) { - GLStateManager.glDisable(GL11.GL_CLIP_PLANE0 + i); + GLSMEnable.glDisable(GL11.GL_CLIP_PLANE0 + i); } - GLStateManager.disableColorMaterial(); - GLStateManager.glDisable(GL11.GL_COLOR_LOGIC_OP); - GLStateManager.disableCull(); - GLStateManager.disableDepthTest(); + GLSMLighting.disableColorMaterial(); + GLSMEnable.glDisable(GL11.GL_COLOR_LOGIC_OP); + GLSMRasterizer.disableCull(); + GLSMDepthStencilAlpha.disableDepthTest(); // GL_DITHER defaults to true - GLStateManager.glEnable(GL11.GL_DITHER); - GLStateManager.disableFog(); - GLStateManager.glDisable(GL11.GL_INDEX_LOGIC_OP); - GLStateManager.disableLighting(); + GLSMEnable.glEnable(GL11.GL_DITHER); + GLSMFog.disableFog(); + GLSMEnable.glDisable(GL11.GL_INDEX_LOGIC_OP); + GLSMLighting.disableLighting(); // Disable all lights (using cached MAX_LIGHTS) for(int i = 0; i < CompatLimits.MAX_LIGHTS; i++) { - GLStateManager.disableLight(i); + GLSMLighting.disableLight(i); } - GLStateManager.glDisable(GL11.GL_LINE_SMOOTH); - GLStateManager.glDisable(GL11.GL_LINE_STIPPLE); + GLSMEnable.glDisable(GL11.GL_LINE_SMOOTH); + GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE); // Disable all MAP1 evaluators (DRY loop) for(int state : MAP1_STATES) { - GLStateManager.glDisable(state); + GLSMEnable.glDisable(state); } // Disable all MAP2 evaluators (DRY loop) for(int state : MAP2_STATES) { - GLStateManager.glDisable(state); + GLSMEnable.glDisable(state); } // GL_MULTISAMPLE defaults to true (but may vary by driver) // We'll query the actual default rather than assume if(GL11.glIsEnabled(GL13.GL_MULTISAMPLE)) { - GLStateManager.glEnable(GL13.GL_MULTISAMPLE); + GLSMEnable.glEnable(GL13.GL_MULTISAMPLE); } else { - GLStateManager.glDisable(GL13.GL_MULTISAMPLE); + GLSMEnable.glDisable(GL13.GL_MULTISAMPLE); } - GLStateManager.glDisable(GL11.GL_NORMALIZE); - GLStateManager.glDisable(GL11.GL_POINT_SMOOTH); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_POINT); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_LINE); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glDisable(GL11.GL_POLYGON_SMOOTH); - GLStateManager.glDisable(GL11.GL_POLYGON_STIPPLE); - GLStateManager.disableRescaleNormal(); - GLStateManager.glDisable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE); - GLStateManager.glDisable(GL13.GL_SAMPLE_ALPHA_TO_ONE); - GLStateManager.glDisable(GL13.GL_SAMPLE_COVERAGE); - GLStateManager.disableScissorTest(); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); + GLSMEnable.glDisable(GL11.GL_NORMALIZE); + GLSMEnable.glDisable(GL11.GL_POINT_SMOOTH); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_POINT); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_LINE); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMEnable.glDisable(GL11.GL_POLYGON_SMOOTH); + GLSMEnable.glDisable(GL11.GL_POLYGON_STIPPLE); + GLSMLighting.disableRescaleNormal(); + GLSMEnable.glDisable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE); + GLSMEnable.glDisable(GL13.GL_SAMPLE_ALPHA_TO_ONE); + GLSMEnable.glDisable(GL13.GL_SAMPLE_COVERAGE); + GLSMRasterizer.disableScissorTest(); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); // Reset texture state for all units (using cached MAX_TEXTURE_UNITS) for(int i = 0; i < CompatLimits.MAX_TEXTURE_UNITS; i++) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i); - GLStateManager.glDisable(GL11.GL_TEXTURE_1D); - GLStateManager.disableTexture(); // GL_TEXTURE_2D - GLStateManager.glDisable(GL12.GL_TEXTURE_3D); - GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_S); - GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_T); - GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_R); - GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_Q); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i); + GLSMEnable.glDisable(GL11.GL_TEXTURE_1D); + GLSMTextures.disableTexture(); // GL_TEXTURE_2D + GLSMEnable.glDisable(GL12.GL_TEXTURE_3D); + GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_S); + GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_T); + GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_R); + GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_Q); } // Reset to texture unit 0 - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); // Reset matrix mode to default - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); // Reset color to white - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset material colors to defaults (fixes GL_COLOR_MATERIAL side effects) FloatBuffer materialBuffer = BufferUtils.createFloatBuffer(4); materialBuffer.put(0.2F).put(0.2F).put(0.2F).put(1.0F).flip(); - GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT, materialBuffer); + GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT, materialBuffer); materialBuffer.clear(); materialBuffer.put(0.8F).put(0.8F).put(0.8F).put(1.0F).flip(); - GLStateManager.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_DIFFUSE, materialBuffer); + GLSMLighting.glMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_DIFFUSE, materialBuffer); // Reset draw buffer - GLStateManager.glDrawBuffer(GLStateManager.DEFAULT_DRAW_BUFFER); + GLSMFramebuffer.glDrawBuffer(GLSMFramebuffer.DEFAULT_DRAW_BUFFER); // Reset line state - GLStateManager.glLineWidth(1.0f); + GLSMRasterizer.glLineWidth(1.0f); // Reset point state - GLStateManager.glPointSize(1.0f); + GLSMRasterizer.glPointSize(1.0f); // Reset polygon state - GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); - GLStateManager.glPolygonOffset(0.0f, 0.0f); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.glFrontFace(GL11.GL_CCW); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); + GLSMRasterizer.glPolygonOffset(0.0f, 0.0f); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMRasterizer.glFrontFace(GL11.GL_CCW); // Reset stencil state - GLStateManager.glStencilFunc(GL11.GL_ALWAYS, 0, 0xFFFFFFFF); - GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); - GLStateManager.glStencilMask(0xFFFFFFFF); - GLStateManager.glClearStencil(0); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_ALWAYS, 0, 0xFFFFFFFF); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); + GLSMDepthStencilAlpha.glStencilMask(0xFFFFFFFF); + GLSMDepthStencilAlpha.glClearStencil(0); } public static void setClientState(int glCap, boolean state) { if (state) { - GLStateManager.glEnableClientState(glCap); + GLSMVertexInput.glEnableClientState(glCap); } else { - GLStateManager.glDisableClientState(glCap); + GLSMVertexInput.glDisableClientState(glCap); } } } diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/EntityIdsOnlyHandler.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/EntityIdsOnlyHandler.java index 042637f7f..763f317af 100644 --- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/EntityIdsOnlyHandler.java +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/EntityIdsOnlyHandler.java @@ -14,7 +14,7 @@ public final class EntityIdsOnlyHandler implements ImmediateExtendedAttribHandle @Override public boolean wantsExtended() { return false; } @Override public boolean wantsTangent() { return false; } - @Override public boolean wantsEntityIds() { return GLStateManager.getActiveProgram() != 0; } + @Override public boolean wantsEntityIds() { return GLSMPrograms.getActiveProgram() != 0; } @Override public boolean wantsExtendedCapture() { return false; } @Override public boolean wantsFaceNormals() { return false; } @Override public void writeFaceNormals(int[] rawBuffer, int vertexCount) {} diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java index 29e3710d8..4c75ca694 100644 --- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GLSMExtension.java @@ -149,7 +149,7 @@ public class GLSMExtension implements BeforeAllCallback, BeforeEachCallback, Aft // Force-sync VAO binding. Tests may unbind via raw GL, desynchronizing GLSM's cache. // Invalidate the cache so glBindVertexArray(0) actually issues the GL call. GLStateManager.ctx().boundVAO = -1; - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); GL11.glMatrixMode(GL11.GL_MODELVIEW); while (GL11.glGetInteger(GL11.GL_MODELVIEW_STACK_DEPTH) > EXPECTED_MODELVIEW_STACK_DEPTH) { diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GlTestSupport.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GlTestSupport.java index a4247160b..dace7e8ec 100644 --- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GlTestSupport.java +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/GlTestSupport.java @@ -23,24 +23,24 @@ public final class GlTestSupport { } public static int compile(int type, String source) { - final int shader = GLStateManager.glCreateShader(type); - GLStateManager.glShaderSource(shader, source); - GLStateManager.glCompileShader(shader); - if (GLStateManager.glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == 0) { - fail("test shader failed to compile:\n" + GLStateManager.glGetShaderInfoLog(shader, 4096) + "\n\n" + source); + final int shader = GLSMPrograms.glCreateShader(type); + GLSMPrograms.glShaderSource(shader, source); + GLSMPrograms.glCompileShader(shader); + if (GLSMPrograms.glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == 0) { + fail("test shader failed to compile:\n" + GLSMPrograms.glGetShaderInfoLog(shader, 4096) + "\n\n" + source); } return shader; } /** Links and deletes the two shaders. */ public static int link(int vs, int fs) { - final int p = GLStateManager.glCreateProgram(); - GLStateManager.glAttachShader(p, vs); - GLStateManager.glAttachShader(p, fs); - GLStateManager.glLinkProgram(p); - assertNotEquals(0, GLStateManager.glGetProgrami(p, GL20.GL_LINK_STATUS), () -> "test program must link: " + GLStateManager.glGetProgramInfoLog(p, 4096)); - GLStateManager.glDeleteShader(vs); - GLStateManager.glDeleteShader(fs); + final int p = GLSMPrograms.glCreateProgram(); + GLSMPrograms.glAttachShader(p, vs); + GLSMPrograms.glAttachShader(p, fs); + GLSMPrograms.glLinkProgram(p); + assertNotEquals(0, GLSMPrograms.glGetProgrami(p, GL20.GL_LINK_STATUS), () -> "test program must link: " + GLSMPrograms.glGetProgramInfoLog(p, 4096)); + GLSMPrograms.glDeleteShader(vs); + GLSMPrograms.glDeleteShader(fs); return p; } @@ -66,7 +66,7 @@ public final class GlTestSupport { /** GLSM's answer for a 16-float matrix pname. */ public static FloatBuffer matrix(int pname) { final FloatBuffer buf = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(pname, buf); + GLSMQueries.glGetFloat(pname, buf); return buf; } diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/LegacyQueryFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/LegacyQueryFixture.java index aadf94655..1e0544433 100644 --- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/LegacyQueryFixture.java +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/LegacyQueryFixture.java @@ -43,21 +43,21 @@ public final class LegacyQueryFixture { public static void setEnabled(int cap, boolean on) { if (on) { - GLStateManager.glEnable(cap); + GLSMEnable.glEnable(cap); } else { - GLStateManager.glDisable(cap); + GLSMEnable.glDisable(cap); } } public static void popAttribTo(int base) { - while (GLStateManager.getAttribDepth() > base) { - GLStateManager.glPopAttrib(); + while (GLSMAttribStack.getAttribDepth() > base) { + GLSMAttribStack.glPopAttrib(); } } public static void drainClientAttribStack() { - while (GLStateManager.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH) > 0) { - GLStateManager.glPopClientAttrib(); + while (GLSMQueries.glGetInteger(GL11.GL_CLIENT_ATTRIB_STACK_DEPTH) > 0) { + GLSMAttribStack.glPopClientAttrib(); } } @@ -65,20 +65,20 @@ public final class LegacyQueryFixture { public static void assertEnableRoundTrip(int cap, boolean clientState) { final String name = hex(cap); if (clientState) { - GLStateManager.glEnableClientState(cap); + GLSMVertexInput.glEnableClientState(cap); } else { - GLStateManager.glEnable(cap); + GLSMEnable.glEnable(cap); } - assertTrue(GLStateManager.glIsEnabled(cap), "enabled isEnabled " + name); - assertTrue(GLStateManager.glGetBoolean(cap), "enabled getBoolean " + name); - assertEquals(1, GLStateManager.glGetInteger(cap), "enabled getInteger " + name); + assertTrue(GLSMEnable.glIsEnabled(cap), "enabled isEnabled " + name); + assertTrue(GLSMQueries.glGetBoolean(cap), "enabled getBoolean " + name); + assertEquals(1, GLSMQueries.glGetInteger(cap), "enabled getInteger " + name); if (clientState) { - GLStateManager.glDisableClientState(cap); + GLSMVertexInput.glDisableClientState(cap); } else { - GLStateManager.glDisable(cap); + GLSMEnable.glDisable(cap); } - assertFalse(GLStateManager.glIsEnabled(cap), "disabled isEnabled " + name); - assertFalse(GLStateManager.glGetBoolean(cap), "disabled getBoolean " + name); - assertEquals(0, GLStateManager.glGetInteger(cap), "disabled getInteger " + name); + assertFalse(GLSMEnable.glIsEnabled(cap), "disabled isEnabled " + name); + assertFalse(GLSMQueries.glGetBoolean(cap), "disabled getBoolean " + name); + assertEquals(0, GLSMQueries.glGetInteger(cap), "disabled getInteger " + name); } } diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ReadbackFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ReadbackFixture.java index 646848da7..d0431ba6e 100644 --- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ReadbackFixture.java +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ReadbackFixture.java @@ -24,58 +24,58 @@ public final class ReadbackFixture { } public static int colorFbo(int internalFormat, int format, int type, ByteBuffer data) { - final int tex = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, format, type, data); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - final int fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); - GLStateManager.glViewport(0, 0, SIZE, SIZE); + final int tex = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, format, type, data); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); return fbo; } public static int depthStencilFbo() { final int fbo = colorFbo(GL11.GL_RGBA8, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE); - final int rb = GLStateManager.glGenRenderbuffers(); - GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, rb); - GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE); - GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, rb); + final int rb = GLSMFramebuffer.glGenRenderbuffers(); + GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, rb); + GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE); + GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, rb); return fbo; } public static void release(int fbo) { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(fbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(fbo); resetPack(); } public static void clearColor(float r, float g, float b, float a) { - GLStateManager.glClearColor(r, g, b, a); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(r, g, b, a); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); } public static void clearTopHalf(float r, float g, float b, float a) { - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, SIZE / 2, SIZE, SIZE / 2); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, SIZE / 2, SIZE, SIZE / 2); clearColor(r, g, b, a); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); } public static void resetPack() { - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); - GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0); - GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_PIXELS, 0); - GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 0); - GLStateManager.glPixelStorei(GL11.GL_PACK_SWAP_BYTES, GL11.GL_FALSE); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 0); + GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_PIXELS, 0); + GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 0); + GLSMTextures.glPixelStorei(GL11.GL_PACK_SWAP_BYTES, GL11.GL_FALSE); } public static ByteBuffer read(int format, int type, int bytes) { final ByteBuffer out = BufferUtils.createByteBuffer(bytes); for (int i = 0; i < bytes; i++) out.put(i, (byte) 0x7E); - GLStateManager.glReadPixels(0, 0, SIZE, SIZE, format, type, out); + GLSMFramebuffer.glReadPixels(0, 0, SIZE, SIZE, format, type, out); return out.order(ByteOrder.nativeOrder()); } @@ -138,14 +138,14 @@ public final class ReadbackFixture { clearColor(51 / 255f, 102 / 255f, 153 / 255f, 204 / 255f); clearTopHalf(1f, 0f, 0f, 1f); - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 1); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 1); final ByteBuffer rgb = read(GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, SIZE * SIZE * 3); assertBytes(rgb, (SIZE - 1) * SIZE * 3, new int[] { 255, 0, 0 }, "PACK_ALIGNMENT 1 tightly packs RGB rows"); - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); - GLStateManager.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 6); - GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_PIXELS, 1); - GLStateManager.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 2); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 4); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ROW_LENGTH, 6); + GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_PIXELS, 1); + GLSMTextures.glPixelStorei(GL11.GL_PACK_SKIP_ROWS, 2); final int rowBytes = 6 * 4; final ByteBuffer skipped = read(GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, rowBytes * (SIZE + 2)); assertBytes(skipped, 0, new int[] { 0x7E, 0x7E, 0x7E, 0x7E }, "skipped rows untouched"); @@ -155,7 +155,7 @@ public final class ReadbackFixture { assertBytes(skipped, 2 * rowBytes + 4 + SIZE * 4, new int[] { 0x7E, 0x7E, 0x7E, 0x7E }, "row padding untouched"); resetPack(); - GLStateManager.glPixelStorei(GL11.GL_PACK_SWAP_BYTES, GL11.GL_TRUE); + GLSMTextures.glPixelStorei(GL11.GL_PACK_SWAP_BYTES, GL11.GL_TRUE); final ByteBuffer swapped = read(GL11.GL_RGBA, GL30.GL_HALF_FLOAT, SIZE * SIZE * 8); assertBytes(swapped, 0, new int[] { 0x32, 0x66 }, "SWAP_BYTES on HALF_FLOAT"); resetPack(); @@ -166,16 +166,16 @@ public final class ReadbackFixture { public static void pixelPackBuffer() { final int fbo = colorFbo(GL11.GL_RGBA8, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE); clearColor(51 / 255f, 102 / 255f, 153 / 255f, 204 / 255f); - final int pbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, pbo); - GLStateManager.glBufferData(GL21.GL_PIXEL_PACK_BUFFER, 16 + SIZE * SIZE * 4, GL15.GL_STREAM_READ); - GLStateManager.glReadPixels(0, 0, SIZE, SIZE, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, 16L); - final ByteBuffer mapped = GLStateManager.glMapBuffer(GL21.GL_PIXEL_PACK_BUFFER, GL15.GL_READ_ONLY); + final int pbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, pbo); + GLSMBuffers.glBufferData(GL21.GL_PIXEL_PACK_BUFFER, 16 + SIZE * SIZE * 4, GL15.GL_STREAM_READ); + GLSMFramebuffer.glReadPixels(0, 0, SIZE, SIZE, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, 16L); + final ByteBuffer mapped = GLSMBuffers.glMapBuffer(GL21.GL_PIXEL_PACK_BUFFER, GL15.GL_READ_ONLY); assertTrue(mapped != null, "PBO map"); assertBytes(mapped, 16, new int[] { 51, 102, 153, 204 }, "PBO readPixels at offset 16"); - GLStateManager.glUnmapBuffer(GL21.GL_PIXEL_PACK_BUFFER); - GLStateManager.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); - GLStateManager.glDeleteBuffers(pbo); + GLSMBuffers.glUnmapBuffer(GL21.GL_PIXEL_PACK_BUFFER); + GLSMBuffers.glBindBuffer(GL21.GL_PIXEL_PACK_BUFFER, 0); + GLSMBuffers.glDeleteBuffers(pbo); release(fbo); } @@ -237,19 +237,19 @@ public final class ReadbackFixture { public static void depthStencil() { final int fbo = depthStencilFbo(); - GLStateManager.glDepthMask(true); - GLStateManager.glStencilMask(0xFF); - GLStateManager.glClearDepth(0.25); - GLStateManager.glClearStencil(0xC3); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, SIZE / 2, SIZE, SIZE / 2); - GLStateManager.glClearDepth(0.75); - GLStateManager.glClearStencil(0x5A); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); - GLStateManager.glClearDepth(1.0); - GLStateManager.glClearStencil(0); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glStencilMask(0xFF); + GLSMDepthStencilAlpha.glClearDepth(0.25); + GLSMDepthStencilAlpha.glClearStencil(0xC3); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, SIZE / 2, SIZE, SIZE / 2); + GLSMDepthStencilAlpha.glClearDepth(0.75); + GLSMDepthStencilAlpha.glClearStencil(0x5A); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); + GLSMDepthStencilAlpha.glClearDepth(1.0); + GLSMDepthStencilAlpha.glClearStencil(0); final ByteBuffer depth = read(GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, SIZE * SIZE * 4); assertEquals(0.25f, depth.getFloat(0), 1e-6f, "depth bottom row as FLOAT"); diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/CubeParityFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/CubeParityFixture.java index d4e64bbea..fd4c94119 100644 --- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/CubeParityFixture.java +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/CubeParityFixture.java @@ -1,7 +1,16 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; @@ -53,66 +62,66 @@ public final class CubeParityFixture { private static void setupCamera(boolean conformal) { modelView = conformal ? MODELVIEW_CONFORMAL : MODELVIEW; - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); final FloatBuffer mv = BufferUtils.createFloatBuffer(16); mv.put(modelView).flip(); - GLStateManager.glLoadMatrix(mv); + GLSMMatrices.glLoadMatrix(mv); } public static void setupScene(boolean lightmap, boolean lit) { - GLStateManager.glDisable(GL11.GL_FOG); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); - GLStateManager.glEnable(GL11.GL_DEPTH_TEST); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); - GLStateManager.glEnable(GL11.GL_CULL_FACE); - GLStateManager.glCullFace(GL11.GL_BACK); + GLSMEnable.glDisable(GL11.GL_FOG); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); + GLSMEnable.glEnable(GL11.GL_DEPTH_TEST); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); + GLSMRasterizer.glCullFace(GL11.GL_BACK); setupCamera(lit); if (lit) { enableDirectionalLight(); } else { - GLStateManager.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_LIGHTING); } netTexture = createNetTexture(); if (lightmap) { lightmapTexture = createNetTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glScalef(0.00390625f, 0.00390625f, 0.00390625f); - GLStateManager.glTranslatef(8.0f, 8.0f, 8.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, netTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glScalef(0.00390625f, 0.00390625f, 0.00390625f); + GLSMMatrices.glTranslatef(8.0f, 8.0f, 8.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, netTexture); } } private static void enableDirectionalLight() { final FloatBuffer buf = BufferUtils.createFloatBuffer(4); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glEnable(GL11.GL_NORMALIZE); - GLStateManager.glEnable(GL11.GL_LIGHT0); - GLStateManager.glDisable(GL11.GL_LIGHT1); - GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, fill(buf, 0.2f, 0.2f, 0.2f, 1.0f)); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, fill(buf, 0.375f, 0.75f, 0.5f, 0.0f)); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, fill(buf, 1.0f, 1.0f, 1.0f, 1.0f)); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, fill(buf, 0.0f, 0.0f, 0.0f, 1.0f)); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, fill(buf, 0.0f, 0.0f, 0.0f, 1.0f)); - GLStateManager.glEnable(GL11.GL_COLOR_MATERIAL); - GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_NORMALIZE); + GLSMEnable.glEnable(GL11.GL_LIGHT0); + GLSMEnable.glDisable(GL11.GL_LIGHT1); + GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, fill(buf, 0.2f, 0.2f, 0.2f, 1.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, fill(buf, 0.375f, 0.75f, 0.5f, 0.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, fill(buf, 1.0f, 1.0f, 1.0f, 1.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, fill(buf, 0.0f, 0.0f, 0.0f, 1.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, fill(buf, 0.0f, 0.0f, 0.0f, 1.0f)); + GLSMEnable.glEnable(GL11.GL_COLOR_MATERIAL); + GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); } public static void disableDirectionalLight() { - GLStateManager.glDisable(GL11.GL_COLOR_MATERIAL); - GLStateManager.glDisable(GL11.GL_LIGHT0); - GLStateManager.glDisable(GL11.GL_NORMALIZE); - GLStateManager.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_COLOR_MATERIAL); + GLSMEnable.glDisable(GL11.GL_LIGHT0); + GLSMEnable.glDisable(GL11.GL_NORMALIZE); + GLSMEnable.glDisable(GL11.GL_LIGHTING); } private static FloatBuffer fill(FloatBuffer buf, float x, float y, float z, float w) { @@ -122,11 +131,11 @@ public final class CubeParityFixture { } private static int createNetTexture() { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); final ByteBuffer texels = BufferUtils.createByteBuffer(TEX_WIDTH * TEX_HEIGHT * 4); for (int y = 0; y < TEX_HEIGHT; y++) { for (int x = 0; x < TEX_WIDTH; x++) { @@ -137,8 +146,8 @@ public final class CubeParityFixture { } } texels.flip(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_WIDTH, TEX_HEIGHT, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_WIDTH, TEX_HEIGHT, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); return id; } @@ -179,30 +188,30 @@ public final class CubeParityFixture { private static int uploadQuads(int vbo, Spec[] specs, boolean lightmap) { final ByteBuffer data = buildQuadData(specs); - if (vbo == 0) vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); + if (vbo == 0) vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, REF_STRIDE, 0); FfpFixture.attrib(1, 4, GL11.GL_UNSIGNED_BYTE, true, REF_STRIDE, 12); FfpFixture.attrib(2, 2, GL11.GL_FLOAT, false, REF_STRIDE, 16); if (lightmap) { FfpFixture.attrib(3, 2, GL11.GL_FLOAT, false, REF_STRIDE, 24); } else { - GLStateManager.glDisableVertexAttribArray(3); + GLSMVertexInput.glDisableVertexAttribArray(3); } FfpFixture.attrib(4, 3, GL11.GL_FLOAT, false, REF_STRIDE, 32); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); return vbo; } public static void drawReference(Spec[] specs, boolean lightmap) { - if (referenceVao == 0) referenceVao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(referenceVao); + if (referenceVao == 0) referenceVao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(referenceVao); referenceVbo = uploadQuads(referenceVbo, specs, lightmap); VAOManager.setCurrentVertexFlags(UnitCubeMesh.VERTEX_FLAGS | (lightmap ? VertexFlags.BRIGHTNESS_BIT : 0)); - GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, specs.length * 24); - GLStateManager.glBindVertexArray(0); + GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, specs.length * 24); + GLSMVertexInput.glBindVertexArray(0); } private static float[] corners(Spec spec) { @@ -264,18 +273,18 @@ public final class CubeParityFixture { } records.position(0).limit(specs.length * CubeInstancedAttribs.STRIDE); - GLStateManager.glBindVertexArray(UnitCubeMesh.vao()); + GLSMVertexInput.glBindVertexArray(UnitCubeMesh.vao()); VAOManager.setCurrentVertexFlags(UnitCubeMesh.VERTEX_FLAGS); - if (instanceVbo == 0) instanceVbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, records, GL15.GL_STREAM_DRAW); + if (instanceVbo == 0) instanceVbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, records, GL15.GL_STREAM_DRAW); CubeInstancedAttribs.pointInstanceAttribs(0L); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.setFfpInstancing(Instancing.CUBE); - GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, specs.length); - GLStateManager.setFfpInstancing(Instancing.NONE); - GLStateManager.glBindVertexArray(0); + GLSMPrograms.setFfpInstancing(Instancing.CUBE); + GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, specs.length); + GLSMPrograms.setFfpInstancing(Instancing.NONE); + GLSMVertexInput.glBindVertexArray(0); } public static void assertPixelParity(int[] reference, int[] instanced, int size, int background, IntFunction describe) { @@ -284,23 +293,23 @@ public final class CubeParityFixture { public static void deleteResources() { if (instanceVbo != 0) { - GLStateManager.glDeleteBuffers(instanceVbo); + GLSMBuffers.glDeleteBuffers(instanceVbo); instanceVbo = 0; } if (referenceVbo != 0) { - GLStateManager.glDeleteBuffers(referenceVbo); + GLSMBuffers.glDeleteBuffers(referenceVbo); referenceVbo = 0; } if (referenceVao != 0) { - GLStateManager.glDeleteVertexArrays(referenceVao); + GLSMVertexInput.glDeleteVertexArrays(referenceVao); referenceVao = 0; } if (netTexture != 0) { - GLStateManager.glDeleteTextures(netTexture); + GLSMTextures.glDeleteTextures(netTexture); netTexture = 0; } if (lightmapTexture != 0) { - GLStateManager.glDeleteTextures(lightmapTexture); + GLSMTextures.glDeleteTextures(lightmapTexture); lightmapTexture = 0; } UnitCubeMesh.delete(); diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/FfpFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/FfpFixture.java index 18728a196..d19e06fb8 100644 --- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/FfpFixture.java +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/FfpFixture.java @@ -1,6 +1,15 @@ package com.gtnewhorizons.angelica.glsm.ffp; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; @@ -61,29 +70,29 @@ public final class FfpFixture { public static void build(float spacing) { program = buildProgram(); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); buildTemplate(); buildInstances(new float[] { -spacing, 0.0f, spacing }, new int[] { -1, 7, 50020 }); } public static void draw() { - GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, 4, INSTANCES); + GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, 4, INSTANCES); } public static void delete() { - GLStateManager.glUseProgram(0); - if (program != 0) { GLStateManager.glDeleteProgram(program); program = 0; } - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - if (templateVbo != 0) { GLStateManager.glDeleteBuffers(templateVbo); templateVbo = 0; } - if (instanceVbo != 0) { GLStateManager.glDeleteBuffers(instanceVbo); instanceVbo = 0; } - GLStateManager.glBindVertexArray(0); - if (vao != 0) { GLStateManager.glDeleteVertexArrays(vao); vao = 0; } + GLSMPrograms.glUseProgram(0); + if (program != 0) { GLSMPrograms.glDeleteProgram(program); program = 0; } + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + if (templateVbo != 0) { GLSMBuffers.glDeleteBuffers(templateVbo); templateVbo = 0; } + if (instanceVbo != 0) { GLSMBuffers.glDeleteBuffers(instanceVbo); instanceVbo = 0; } + GLSMVertexInput.glBindVertexArray(0); + if (vao != 0) { GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; } } private static void buildTemplate() { - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); final ByteBuffer quad = BufferUtils.createByteBuffer(4 * 12); putVertex(quad, -0.15f, -0.8f); @@ -92,12 +101,12 @@ public final class FfpFixture { putVertex(quad, -0.15f, 0.8f); quad.flip(); - templateVbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, templateVbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, quad, GL15.GL_STATIC_DRAW); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0L); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + templateVbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, templateVbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, quad, GL15.GL_STATIC_DRAW); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0L); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } private static void putVertex(ByteBuffer buf, float x, float y) { @@ -115,12 +124,12 @@ public final class FfpFixture { } instances.position(0).limit(entities.length * InstancedAttribs.STRIDE); - instanceVbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, instances, GL15.GL_STATIC_DRAW); + instanceVbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, instances, GL15.GL_STATIC_DRAW); InstancedAttribs.enableHeadArrays(); InstancedAttribs.pointTemplate(0L); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } private static int buildProgram() { @@ -129,18 +138,18 @@ public final class FfpFixture { } public static void attrib(int loc, int size, int type, boolean normalized, int stride, int offset) { - GLStateManager.glEnableVertexAttribArray(loc); - GLStateManager.glVertexAttribPointer(loc, size, type, normalized, stride, offset); + GLSMVertexInput.glEnableVertexAttribArray(loc); + GLSMVertexInput.glVertexAttribPointer(loc, size, type, normalized, stride, offset); } public static void clear() { - GLStateManager.glClearColor(0f, 0f, 0f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMBlend.glClearColor(0f, 0f, 0f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); } public static int[] readRegion(int size) { final ByteBuffer pixels = BufferUtils.createByteBuffer(size * size * 4); - GLStateManager.glReadPixels(0, 0, size, size, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + GLSMFramebuffer.glReadPixels(0, 0, size, size, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); final int[] out = new int[size * size]; for (int i = 0; i < out.length; i++) { out[i] = pixels.getInt(i * 4); @@ -150,22 +159,22 @@ public final class FfpFixture { public static int[] readPixel(int x, int y) { final ByteBuffer pixel = BufferUtils.createByteBuffer(4); - GLStateManager.glReadPixels(x, y, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixel); + GLSMFramebuffer.glReadPixels(x, y, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixel); return new int[] { pixel.get(0) & 0xFF, pixel.get(1) & 0xFF, pixel.get(2) & 0xFF, pixel.get(3) & 0xFF }; } public static int solidTexture(int r, int g, int b, int a) { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); final ByteBuffer texels = BufferUtils.createByteBuffer(2 * 2 * 4); for (int i = 0; i < 4; i++) { texels.put((byte) r).put((byte) g).put((byte) b).put((byte) a); } texels.flip(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); return id; } @@ -234,28 +243,28 @@ public final class FfpFixture { } public static void resetFfpState() { - GLStateManager.setFfpInstancing(Instancing.NONE); + GLSMPrograms.setFfpInstancing(Instancing.NONE); final ShaderManager sm = ShaderManager.getInstance(); if (sm.isActive()) sm.deactivate(); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDepthMask(true); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); - GLStateManager.glDisable(GL11.GL_CULL_FACE); - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); } } diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpFixture.java index f6e3152d5..bd55a1228 100644 --- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpFixture.java +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/LogicOpFixture.java @@ -1,6 +1,12 @@ package com.gtnewhorizons.angelica.glsm.ffp; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; @@ -56,41 +62,41 @@ public final class LogicOpFixture { } public static void clearToDst() { - GLStateManager.glClearColor(DST_R / 255f, DST_G / 255f, DST_B / 255f, DST_A / 255f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMBlend.glClearColor(DST_R / 255f, DST_G / 255f, DST_B / 255f, DST_A / 255f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); } public static void drawQuad(int op, int[] src) { - GLStateManager.glEnable(GL11.GL_COLOR_LOGIC_OP); - GLStateManager.glLogicOp(op); + GLSMEnable.glEnable(GL11.GL_COLOR_LOGIC_OP); + GLSMBlend.glLogicOp(op); quad(src); - GLStateManager.glDisable(GL11.GL_COLOR_LOGIC_OP); - GLStateManager.glLogicOp(GL11.GL_COPY); + GLSMEnable.glDisable(GL11.GL_COLOR_LOGIC_OP); + GLSMBlend.glLogicOp(GL11.GL_COPY); } public static void quad(int[] src) { if (vao == 0) { - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); final FloatBuffer positions = BufferUtils.createFloatBuffer(12); positions.put(new float[] { -1f, -1f, 0f, 1f, -1f, 0f, 1f, 1f, 0f, -1f, 1f, 0f }).flip(); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, positions, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, positions, GL15.GL_STATIC_DRAW); FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, 12, 0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } - GLStateManager.glBindVertexArray(vao); + GLSMVertexInput.glBindVertexArray(vao); VAOManager.setCurrentVertexFlags(0); - GLStateManager.glColor4f(src[0] / 255f, src[1] / 255f, src[2] / 255f, src[3] / 255f); - GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, 4); - GLStateManager.glBindVertexArray(0); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(src[0] / 255f, src[1] / 255f, src[2] / 255f, src[3] / 255f); + GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, 4); + GLSMVertexInput.glBindVertexArray(0); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } public static void deleteResources() { - if (vbo != 0) { GLStateManager.glDeleteBuffers(vbo); vbo = 0; } - if (vao != 0) { GLStateManager.glDeleteVertexArrays(vao); vao = 0; } + if (vbo != 0) { GLSMBuffers.glDeleteBuffers(vbo); vbo = 0; } + if (vao != 0) { GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; } } public static String label(int op, int[] src) { diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleParityFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleParityFixture.java index 3b0b38a43..31c495d83 100644 --- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleParityFixture.java +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/ffp/ParticleParityFixture.java @@ -1,7 +1,13 @@ package com.gtnewhorizons.angelica.glsm.ffp; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; @@ -76,19 +82,19 @@ public final class ParticleParityFixture { } private static int createCheckerTexture() { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); final ByteBuffer texels = BufferUtils.createByteBuffer(2 * 2 * 4); putTexel(texels, 255, 32, 32); putTexel(texels, 32, 255, 32); putTexel(texels, 32, 32, 255); putTexel(texels, 255, 255, 32); texels.flip(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); return id; } @@ -97,28 +103,28 @@ public final class ParticleParityFixture { } public static void setupScene(boolean textureMatrix) { - GLStateManager.glDisable(GL11.GL_FOG); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); - GLStateManager.glDisable(GL11.GL_CULL_FACE); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMEnable.glDisable(GL11.GL_FOG); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); checkerTexture = createCheckerTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, checkerTexture); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, checkerTexture); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); if (textureMatrix) { - GLStateManager.glTranslatef(0.1f, 0.1f, 0.0f); - GLStateManager.glScalef(0.8f, 0.8f, 1.0f); + GLSMMatrices.glTranslatef(0.1f, 0.1f, 0.0f); + GLSMMatrices.glScalef(0.8f, 0.8f, 1.0f); } - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } private static ByteBuffer buildReferenceData(Particle[] particles, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { @@ -149,19 +155,19 @@ public final class ParticleParityFixture { public static void drawReference(Particle[] particles, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { final ByteBuffer data = buildReferenceData(particles, rotX, rotXZ, rotZ, rotYZ, rotXY); - if (referenceVao == 0) referenceVao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(referenceVao); - if (referenceVbo == 0) referenceVbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, referenceVbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); + if (referenceVao == 0) referenceVao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(referenceVao); + if (referenceVbo == 0) referenceVbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, referenceVbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); FfpFixture.attrib(0, 3, GL11.GL_FLOAT, false, REF_STRIDE, 0); FfpFixture.attrib(1, 4, GL11.GL_UNSIGNED_BYTE, true, REF_STRIDE, 12); FfpFixture.attrib(2, 2, GL11.GL_FLOAT, false, REF_STRIDE, 16); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); VAOManager.setCurrentVertexFlags(VertexFlags.COLOR_BIT | VertexFlags.TEXTURE_BIT); - GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, particles.length * 4); - GLStateManager.glBindVertexArray(0); + GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, particles.length * 4); + GLSMVertexInput.glBindVertexArray(0); } public static void drawInstanced(Particle[] particles, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { @@ -176,18 +182,18 @@ public final class ParticleParityFixture { } records.position(0).limit(particles.length * ParticleInstancedAttribs.STRIDE); - GLStateManager.glBindVertexArray(ParticleQuadMesh.vao()); + GLSMVertexInput.glBindVertexArray(ParticleQuadMesh.vao()); VAOManager.setCurrentVertexFlags(ParticleQuadMesh.VERTEX_FLAGS); - if (instanceVbo == 0) instanceVbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, records, GL15.GL_STREAM_DRAW); + if (instanceVbo == 0) instanceVbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceVbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, records, GL15.GL_STREAM_DRAW); ParticleInstancedAttribs.pointInstanceAttribs(0L); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.setFfpInstancing(Instancing.PARTICLE); - GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, ParticleQuadMesh.VERTEX_COUNT, particles.length); - GLStateManager.setFfpInstancing(Instancing.NONE); - GLStateManager.glBindVertexArray(0); + GLSMPrograms.setFfpInstancing(Instancing.PARTICLE); + GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, ParticleQuadMesh.VERTEX_COUNT, particles.length); + GLSMPrograms.setFfpInstancing(Instancing.NONE); + GLSMVertexInput.glBindVertexArray(0); } public static void assertPixelParity(int[] reference, int[] instanced, int size, int background, IntFunction describe) { @@ -196,19 +202,19 @@ public final class ParticleParityFixture { public static void deleteResources() { if (instanceVbo != 0) { - GLStateManager.glDeleteBuffers(instanceVbo); + GLSMBuffers.glDeleteBuffers(instanceVbo); instanceVbo = 0; } if (referenceVbo != 0) { - GLStateManager.glDeleteBuffers(referenceVbo); + GLSMBuffers.glDeleteBuffers(referenceVbo); referenceVbo = 0; } if (referenceVao != 0) { - GLStateManager.glDeleteVertexArrays(referenceVao); + GLSMVertexInput.glDeleteVertexArrays(referenceVao); referenceVao = 0; } if (checkerTexture != 0) { - GLStateManager.glDeleteTextures(checkerTexture); + GLSMTextures.glDeleteTextures(checkerTexture); checkerTexture = 0; } ParticleQuadMesh.delete(); diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsFixture.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsFixture.java index de8c2e5c4..60afc2eb9 100644 --- a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsFixture.java +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/streaming/TessellatorEntityIdsFixture.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.glsm.streaming; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; import net.minecraft.client.renderer.Tessellator; import org.lwjgl.opengl.GL11; @@ -30,21 +30,21 @@ public final class TessellatorEntityIdsFixture { public static void drawIdsChangedMidBatch() { draw(() -> { - GLStateManager.setEntityIds(-1, 0, 7); + GLSMCurrentAttribs.setEntityIds(-1, 0, 7); startQuads(); addQuad(-1.0f, 0.0f); - GLStateManager.setEntityIds(-1, 0, 50020); + GLSMCurrentAttribs.setEntityIds(-1, 0, 50020); addQuad(0.0f, 1.0f); - GLStateManager.setEntityIds(-1, 0, -1); + GLSMCurrentAttribs.setEntityIds(-1, 0, -1); }); } public static void drawIdsChangedAfterTheLastVertex() { draw(() -> { - GLStateManager.setEntityIds(-1, 0, 7); + GLSMCurrentAttribs.setEntityIds(-1, 0, 7); startQuads(); addQuad(-1.0f, 1.0f); - GLStateManager.setEntityIds(-1, 0, 50020); + GLSMCurrentAttribs.setEntityIds(-1, 0, 50020); }); } @@ -65,7 +65,7 @@ public final class TessellatorEntityIdsFixture { TessellatorStreamingDrawer.draw(tess); } finally { TessellatorEntityIds.onReset(tess); - GLStateManager.setEntityIds(-1, 0, -1); + GLSMCurrentAttribs.setEntityIds(-1, 0, -1); tess.rawBuffer = savedRawBuffer; tess.rawBufferSize = savedRawBufferSize; tess.rawBufferIndex = savedRawBufferIndex; diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/DefiningClassLoader.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/DefiningClassLoader.java new file mode 100644 index 000000000..a4f4d64af --- /dev/null +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/DefiningClassLoader.java @@ -0,0 +1,31 @@ +package com.gtnewhorizons.angelica.glsm.testutil; + +/** Child-first for the defined name, so a same-named class on the test classpath cannot shadow it. */ +public final class DefiningClassLoader extends ClassLoader { + + private final String dottedName; + private final byte[] bytes; + + private DefiningClassLoader(String dottedName, byte[] bytes) { + super(DefiningClassLoader.class.getClassLoader()); + this.dottedName = dottedName; + this.bytes = bytes; + } + + public static Class define(String dottedName, byte[] bytes) { + try { + return Class.forName(dottedName, true, new DefiningClassLoader(dottedName, bytes)); + } catch (ClassNotFoundException e) { + throw new AssertionError(e); + } + } + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + if (!name.equals(dottedName)) return super.loadClass(name, resolve); + synchronized (getClassLoadingLock(name)) { + final Class loaded = findLoadedClass(name); + return loaded != null ? loaded : defineClass(name, bytes, 0, bytes.length); + } + } +} diff --git a/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/GlsmClasses.java b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/GlsmClasses.java new file mode 100644 index 000000000..3d09c47fc --- /dev/null +++ b/glsm/src/testFixtures/java/com/gtnewhorizons/angelica/glsm/testutil/GlsmClasses.java @@ -0,0 +1,96 @@ +package com.gtnewhorizons.angelica.glsm.testutil; + +import com.gtnewhorizons.angelica.glsm.redirect.GLSMRedirector; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.MethodNode; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.net.JarURLConnection; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.ConcurrentHashMap; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.stream.Stream; + +public final class GlsmClasses { + + private static final String PACKAGE = "com/gtnewhorizons/angelica/glsm/"; + private static final Map CLASSES = new ConcurrentHashMap<>(); + + private GlsmClasses() {} + + public static ClassNode load(String internalName) { + return CLASSES.computeIfAbsent(internalName, name -> { + try (InputStream in = GlsmClasses.class.getClassLoader().getResourceAsStream(name + ".class")) { + if (in == null) throw new IllegalStateException("Missing class file for " + name); + final ClassNode node = new ClassNode(); + new ClassReader(in).accept(node, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); + return node; + } catch (IOException e) { + throw new UncheckedIOException(e); + } + }); + } + + public static List classes() { + return GLSMRedirector.glsmClasses(); + } + + public static Set packageClasses() { + final URL resource = GlsmClasses.class.getClassLoader().getResource(PACKAGE + "GLStateManager.class"); + if (resource == null) throw new IllegalStateException("GLStateManager.class not on the classpath"); + final List fileNames = new ArrayList<>(); + try { + if (resource.getProtocol().equals("jar")) { + final JarURLConnection connection = (JarURLConnection) resource.openConnection(); + connection.setUseCaches(false); + try (JarFile jar = connection.getJarFile()) { + jar.stream().map(JarEntry::getName).filter(n -> n.startsWith(PACKAGE) && n.indexOf('/', PACKAGE.length()) < 0) + .forEach(n -> fileNames.add(n.substring(PACKAGE.length()))); + } + } else { + try (Stream files = Files.list(Path.of(resource.toURI()).getParent())) { + files.forEach(p -> fileNames.add(p.getFileName().toString())); + } + } + } catch (IOException e) { + throw new UncheckedIOException(e); + } catch (URISyntaxException e) { + throw new IllegalStateException(e); + } + final Set classes = new TreeSet<>(); + for (String file : fileNames) { + if (file.equals("GLStateManager.class") || file.matches("GLSM[A-Z][A-Za-z]*\\.class")) { + classes.add(PACKAGE + file.substring(0, file.length() - ".class".length())); + } + } + return classes; + } + + public record Resolved(String owner, MethodNode method) {} + + public static Resolved resolve(String owner, String name, String desc) { + for (String type = owner; type != null && type.startsWith(PACKAGE); ) { + final ClassNode node = load(type); + for (MethodNode method : node.methods) { + if (method.name.equals(name) && method.desc.equals(desc)) { + if (method.instructions.size() == 0) return null; + return new Resolved(type, method); + } + } + type = node.superName; + } + return null; + } +} diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPULWJGLService.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPULWJGLService.java index f7a45f1f4..15bdd2c89 100644 --- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPULWJGLService.java +++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPULWJGLService.java @@ -1,7 +1,18 @@ package com.gtnewhorizons.angelica.sdlgpu; import com.gtnewhorizons.angelica.config.SystemProperties; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.sdlgpu.device.MemoryStackWrapper; import com.gtnewhorizons.angelica.sdlgpu.util.MemoryAccess; @@ -75,141 +86,141 @@ public final class SDLGPULWJGLService implements LWJGLService { @Override public int getPointerSize() { return 8; } // 64-bit - @Override public int glGenBuffers() { return GLStateManager.glGenBuffers(); } - @Override public void glDeleteBuffers(int buffer) { GLStateManager.glDeleteBuffers(buffer); } - @Override public void glBindBuffer(int target, int buffer) { GLStateManager.glBindBuffer(target, buffer); } + @Override public int glGenBuffers() { return GLSMBuffers.glGenBuffers(); } + @Override public void glDeleteBuffers(int buffer) { GLSMBuffers.glDeleteBuffers(buffer); } + @Override public void glBindBuffer(int target, int buffer) { GLSMBuffers.glBindBuffer(target, buffer); } @Override public void glBufferData(int target, long size, int usage) { - GLStateManager.glBufferData(target, size, usage); + GLSMBuffers.glBufferData(target, size, usage); } @Override public void glBufferData(int target, ByteBuffer data, int usage) { - GLStateManager.glBufferData(target, data, usage); + GLSMBuffers.glBufferData(target, data, usage); } @Override public void glBufferData(int target, long size, long data, int usage) { if (data != 0) { - GLStateManager.nglBufferData(target, size, data, usage); + GLSMBuffers.nglBufferData(target, size, data, usage); } else { - GLStateManager.glBufferData(target, size, usage); + GLSMBuffers.glBufferData(target, size, usage); } } @Override public void glBufferStorage(int target, long size, int flags) { - GLStateManager.glBufferStorage(target, size, flags); + GLSMBuffers.glBufferStorage(target, size, flags); } @Override public void glBlitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) { - GLStateManager.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + GLSMFramebuffer.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } @Override public void glDrawArrays(int mode, int first, int count) { - GLStateManager.glDrawArrays(mode, first, count); + GLSMDraws.glDrawArrays(mode, first, count); } @Override public void glDrawBuffers(int[] buffers) { try (var stack = MemoryStack.stackPush()) { - GLStateManager.glDrawBuffers(stack.ints(buffers)); + GLSMFramebuffer.glDrawBuffers(stack.ints(buffers)); } } @Override public void glTexImage2D(int target, int level, int internalFormat, int width, int height, int border, int format, int type, ByteBuffer pixels) { - GLStateManager.glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels); + GLSMTextures.glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels); } - @Override public void glTexParameteri(int target, int pname, int param) { GLStateManager.glTexParameteri(target, pname, param); } + @Override public void glTexParameteri(int target, int pname, int param) { GLSMTextures.glTexParameteri(target, pname, param); } @Override public ByteBuffer glMapBufferRange(int target, long offset, long length, int flags) { - return GLStateManager.glMapBufferRange(target, offset, length, flags); + return GLSMBuffers.glMapBufferRange(target, offset, length, flags); } @Override public long nglMapBuffer(int target, int access) { return 0; } @Override public ByteBuffer glMapBuffer(int target, int access) { - return GLStateManager.glMapBuffer(target, access); + return GLSMBuffers.glMapBuffer(target, access); } - @Override public void glUnmapBuffer(int target) { GLStateManager.glUnmapBuffer(target); } + @Override public void glUnmapBuffer(int target) { GLSMBuffers.glUnmapBuffer(target); } @Override public void glFlushMappedBufferRange(int target, long offset, long length) { - GLStateManager.glFlushMappedBufferRange(target, offset, length); + GLSMBuffers.glFlushMappedBufferRange(target, offset, length); } @Override public void glCopyBufferSubData(int readTarget, int writeTarget, long readOffset, long writeOffset, long size) { - GLStateManager.glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); + GLSMBuffers.glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); } @Override public void glBindBufferBase(int target, int index, int buffer) { - GLStateManager.glBindBufferBase(target, index, buffer); + GLSMBuffers.glBindBufferBase(target, index, buffer); } - @Override public int glGenVertexArrays() { return GLStateManager.glGenVertexArrays(); } - @Override public void glDeleteVertexArrays(int array) { GLStateManager.glDeleteVertexArrays(array); } - @Override public void glBindVertexArray(int array) { GLStateManager.glBindVertexArray(array); } - @Override public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long pointer) { GLStateManager.glVertexAttribPointer(index, size, type, normalized, stride, pointer); } - @Override public void glVertexAttribIPointer(int index, int size, int type, int stride, long pointer) { GLStateManager.glVertexAttribIPointer(index, size, type, stride, pointer); } - @Override public void glEnableVertexAttribArray(int index) { GLStateManager.glEnableVertexAttribArray(index); } - @Override public void glVertexAttribDivisor(int index, int divisor) { GLStateManager.glVertexAttribDivisor(index, divisor); } + @Override public int glGenVertexArrays() { return GLSMVertexInput.glGenVertexArrays(); } + @Override public void glDeleteVertexArrays(int array) { GLSMVertexInput.glDeleteVertexArrays(array); } + @Override public void glBindVertexArray(int array) { GLSMVertexInput.glBindVertexArray(array); } + @Override public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long pointer) { GLSMVertexInput.glVertexAttribPointer(index, size, type, normalized, stride, pointer); } + @Override public void glVertexAttribIPointer(int index, int size, int type, int stride, long pointer) { GLSMVertexInput.glVertexAttribIPointer(index, size, type, stride, pointer); } + @Override public void glEnableVertexAttribArray(int index) { GLSMVertexInput.glEnableVertexAttribArray(index); } + @Override public void glVertexAttribDivisor(int index, int divisor) { GLSMVertexInput.glVertexAttribDivisor(index, divisor); } - @Override public int glCreateShader(int type) { return GLStateManager.glCreateShader(type); } + @Override public int glCreateShader(int type) { return GLSMPrograms.glCreateShader(type); } @Override public void glShaderSource(int shader, CharSequence source) { - GLStateManager.glShaderSource(shader, source); + GLSMPrograms.glShaderSource(shader, source); } @Override public void glShaderSourceSafe(int shader, CharSequence source) { - GLStateManager.glShaderSource(shader, source); + GLSMPrograms.glShaderSource(shader, source); } - @Override public void glCompileShader(int shader) { GLStateManager.glCompileShader(shader); } + @Override public void glCompileShader(int shader) { GLSMPrograms.glCompileShader(shader); } @Override public String glGetShaderInfoLog(int shader, int maxLength) { - return GLStateManager.glGetShaderInfoLog(shader, maxLength); + return GLSMPrograms.glGetShaderInfoLog(shader, maxLength); } - @Override public int glGetShaderi(int shader, int pname) { return GLStateManager.glGetShaderi(shader, pname); } - @Override public void glDeleteShader(int shader) { GLStateManager.glDeleteShader(shader); } + @Override public int glGetShaderi(int shader, int pname) { return GLSMPrograms.glGetShaderi(shader, pname); } + @Override public void glDeleteShader(int shader) { GLSMPrograms.glDeleteShader(shader); } - @Override public int glCreateProgram() { return GLStateManager.glCreateProgram(); } - @Override public void glAttachShader(int program, int shader) { GLStateManager.glAttachShader(program, shader); } - @Override public void glLinkProgram(int program) { GLStateManager.glLinkProgram(program); } + @Override public int glCreateProgram() { return GLSMPrograms.glCreateProgram(); } + @Override public void glAttachShader(int program, int shader) { GLSMPrograms.glAttachShader(program, shader); } + @Override public void glLinkProgram(int program) { GLSMPrograms.glLinkProgram(program); } @Override public String glGetProgramInfoLog(int program, int maxLength) { - return GLStateManager.glGetProgramInfoLog(program, maxLength); + return GLSMPrograms.glGetProgramInfoLog(program, maxLength); } - @Override public int glGetProgrami(int program, int pname) { return GLStateManager.glGetProgrami(program, pname); } - @Override public void glUseProgram(int program) { GLStateManager.glUseProgram(program); } - @Override public void glDeleteProgram(int program) { GLStateManager.glDeleteProgram(program); } + @Override public int glGetProgrami(int program, int pname) { return GLSMPrograms.glGetProgrami(program, pname); } + @Override public void glUseProgram(int program) { GLSMPrograms.glUseProgram(program); } + @Override public void glDeleteProgram(int program) { GLSMPrograms.glDeleteProgram(program); } @Override public void glBindAttribLocation(int program, int index, CharSequence name) { - GLStateManager.glBindAttribLocation(program, index, name); + GLSMPrograms.glBindAttribLocation(program, index, name); } @Override public void glBindFragDataLocation(int program, int colorNumber, CharSequence name) {} @Override public int glGetUniformLocation(int program, CharSequence name) { - return GLStateManager.glGetUniformLocation(program, name); + return GLSMPrograms.glGetUniformLocation(program, name); } @Override public int glGetUniformBlockIndex(int program, CharSequence name) { return -1; /* TODO */ } @Override public void glUniformBlockBinding(int program, int blockIndex, int blockBinding) { /* TODO */ } - @Override public void glUniform1f(int location, float v0) { GLStateManager.glUniform1f(location, v0); } - @Override public void glUniform1i(int location, int v0) { GLStateManager.glUniform1i(location, v0); } - @Override public void glUniform1fv(int location, FloatBuffer value) { GLStateManager.glUniform1(location, value); } - @Override public void glUniform2i(int location, int v0, int v1) { GLStateManager.glUniform2i(location, v0, v1); } + @Override public void glUniform1f(int location, float v0) { GLSMPrograms.glUniform1f(location, v0); } + @Override public void glUniform1i(int location, int v0) { GLSMPrograms.glUniform1i(location, v0); } + @Override public void glUniform1fv(int location, FloatBuffer value) { GLSMPrograms.glUniform1(location, value); } + @Override public void glUniform2i(int location, int v0, int v1) { GLSMPrograms.glUniform2i(location, v0, v1); } @Override public void glUniform3f(int location, float v0, float v1, float v2) { - GLStateManager.glUniform3f(location, v0, v1, v2); + GLSMPrograms.glUniform3f(location, v0, v1, v2); } - @Override public void glUniform3fv(int location, FloatBuffer value) { GLStateManager.glUniform3(location, value); } - @Override public void glUniform3fv(int location, float[] value) { GLStateManager.glUniform3(location, value); } - @Override public void glUniform4fv(int location, FloatBuffer value) { GLStateManager.glUniform4(location, value); } - @Override public void glUniform4fv(int location, float[] value) { GLStateManager.glUniform4(location, value); } + @Override public void glUniform3fv(int location, FloatBuffer value) { GLSMPrograms.glUniform3(location, value); } + @Override public void glUniform3fv(int location, float[] value) { GLSMPrograms.glUniform3(location, value); } + @Override public void glUniform4fv(int location, FloatBuffer value) { GLSMPrograms.glUniform4(location, value); } + @Override public void glUniform4fv(int location, float[] value) { GLSMPrograms.glUniform4(location, value); } @Override public void glUniformMatrix3fv(int location, boolean transpose, FloatBuffer value) { - GLStateManager.glUniformMatrix3(location, transpose, value); + GLSMPrograms.glUniformMatrix3(location, transpose, value); } @Override public void glUniformMatrix4fv(int location, boolean transpose, FloatBuffer value) { - GLStateManager.glUniformMatrix4(location, transpose, value); + GLSMPrograms.glUniformMatrix4(location, transpose, value); } @Override public void glDrawElementsBaseVertex(int mode, int count, int type, long indices, int basevertex) { - GLStateManager.glDrawElementsBaseVertex(mode, count, type, indices, basevertex); + GLSMDraws.glDrawElementsBaseVertex(mode, count, type, indices, basevertex); } @Override public void glMultiDrawElementsBaseVertex(int mode, long pCount, int type, long pIndices, int drawcount, long pBaseVertex) { - GLStateManager.glMultiDrawElementsBaseVertex(mode, pCount, type, pIndices, drawcount, pBaseVertex); + GLSMDraws.glMultiDrawElementsBaseVertex(mode, pCount, type, pIndices, drawcount, pBaseVertex); } @Override public void glMultiDrawElementsIndirect(int mode, int type, long indirect, int drawcount, int stride) { - GLStateManager.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); + GLSMDraws.glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); } - @Override public long glFenceSync(int condition, int flags) { return GLStateManager.glFenceSync(condition, flags); } + @Override public long glFenceSync(int condition, int flags) { return GLSMBuffers.glFenceSync(condition, flags); } @Override public int glClientWaitSync(long sync, int flags, long timeout) { - return GLStateManager.glClientWaitSync(sync, flags, timeout); + return GLSMBuffers.glClientWaitSync(sync, flags, timeout); } @Override public int glGetSynci(long sync, int pname, IntBuffer length) { if (length != null && length.remaining() > 0) length.put(0, 1); return ((SDLGPURenderBackend) BackendManager.RENDER_BACKEND).getSyncStatus(sync); } @Override public void glWaitSync(long sync, int flags, long timeout) { - GLStateManager.glWaitSync(sync, flags, timeout); + GLSMBuffers.glWaitSync(sync, flags, timeout); } - @Override public void glDeleteSync(long sync) { GLStateManager.glDeleteSync(sync); } + @Override public void glDeleteSync(long sync) { GLSMBuffers.glDeleteSync(sync); } private long[] queryElapsed = new long[64]; private int activeQueryId = -1; @@ -221,7 +232,7 @@ public final class SDLGPULWJGLService implements LWJGLService { } } - @Override public int glGenQueries() { return GLStateManager.glGenQueries(); } + @Override public int glGenQueries() { return GLSMQueries.glGenQueries(); } @Override public void glDeleteQueries(int query) { } @Override public void glBeginQuery(int target, int id) { ensureQueryCapacity(id); @@ -241,65 +252,65 @@ public final class SDLGPULWJGLService implements LWJGLService { @Override public int setupDebugCallback(DebugMessageHandler handler) { return 0; } @Override public void disableDebugCallback() { } @Override public void glObjectLabel(int identifier, int name, CharSequence label) { - GLStateManager.glObjectLabel(identifier, name, label); + GLSMDraws.glObjectLabel(identifier, name, label); } @Override public void glPushDebugGroup(int source, int id, CharSequence message) { - GLStateManager.glPushDebugGroup(source, id, message); + GLSMDraws.glPushDebugGroup(source, id, message); } - @Override public void glPopDebugGroup() { GLStateManager.glPopDebugGroup(); } + @Override public void glPopDebugGroup() { GLSMDraws.glPopDebugGroup(); } - @Override public int glGenTextures() { return GLStateManager.glGenTextures(); } + @Override public int glGenTextures() { return GLSMTextures.glGenTextures(); } @Override public void glGenTextures(int[] textures) { - for (int i = 0; i < textures.length; i++) textures[i] = GLStateManager.glGenTextures(); + for (int i = 0; i < textures.length; i++) textures[i] = GLSMTextures.glGenTextures(); } - @Override public void glDeleteTextures(int texture) { GLStateManager.glDeleteTextures(texture); } + @Override public void glDeleteTextures(int texture) { GLSMTextures.glDeleteTextures(texture); } @Override public void glDeleteTextures(int[] textures) { - for (int t : textures) GLStateManager.glDeleteTextures(t); + for (int t : textures) GLSMTextures.glDeleteTextures(t); } - @Override public void glBindTexture(int target, int texture) { GLStateManager.glBindTexture(target, texture); } - @Override public void glActiveTexture(int texture) { GLStateManager.glActiveTexture(texture); } + @Override public void glBindTexture(int target, int texture) { GLSMTextures.glBindTexture(target, texture); } + @Override public void glActiveTexture(int texture) { GLSMTextures.glActiveTexture(texture); } @Override public int glGetTexLevelParameteri(int target, int level, int pname) { - return GLStateManager.glGetTexLevelParameteri(target, level, pname); + return GLSMTextures.glGetTexLevelParameteri(target, level, pname); } @Override public void glCopyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) { - GLStateManager.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); + GLSMTextures.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); } - @Override public void glPixelStorei(int pname, int param) { GLStateManager.glPixelStorei(pname, param); } + @Override public void glPixelStorei(int pname, int param) { GLSMTextures.glPixelStorei(pname, param); } - @Override public int glGenFramebuffers() { return GLStateManager.glGenFramebuffers(); } - @Override public void glDeleteFramebuffers(int framebuffer) { GLStateManager.glDeleteFramebuffers(framebuffer); } - @Override public void glBindFramebuffer(int target, int framebuffer) { GLStateManager.glBindFramebuffer(target, framebuffer); } + @Override public int glGenFramebuffers() { return GLSMFramebuffer.glGenFramebuffers(); } + @Override public void glDeleteFramebuffers(int framebuffer) { GLSMFramebuffer.glDeleteFramebuffers(framebuffer); } + @Override public void glBindFramebuffer(int target, int framebuffer) { GLSMFramebuffer.glBindFramebuffer(target, framebuffer); } @Override public int glCheckFramebufferStatus(int target) { - return GLStateManager.glCheckFramebufferStatus(target); + return GLSMFramebuffer.glCheckFramebufferStatus(target); } @Override public void glFramebufferTexture2D(int target, int attachment, int textarget, int texture, int level) { - GLStateManager.glFramebufferTexture2D(target, attachment, textarget, texture, level); + GLSMFramebuffer.glFramebufferTexture2D(target, attachment, textarget, texture, level); } - @Override public void glEnable(int cap) { GLStateManager.glEnable(cap); } - @Override public void glDisable(int cap) { GLStateManager.glDisable(cap); } - @Override public void glBlendFunc(int sfactor, int dfactor) { GLStateManager.glBlendFunc(sfactor, dfactor); } - @Override public void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { GLStateManager.tryBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); } - @Override public void glDepthFunc(int func) { GLStateManager.glDepthFunc(func); } - @Override public void glDepthMask(boolean flag) { GLStateManager.glDepthMask(flag); } - @Override public void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) { GLStateManager.glColorMask(red, green, blue, alpha); } - @Override public void glViewport(int x, int y, int width, int height) { GLStateManager.glViewport(x, y, width, height); } - @Override public void glClear(int mask) { GLStateManager.glClear(mask); } + @Override public void glEnable(int cap) { GLSMEnable.glEnable(cap); } + @Override public void glDisable(int cap) { GLSMEnable.glDisable(cap); } + @Override public void glBlendFunc(int sfactor, int dfactor) { GLSMBlend.glBlendFunc(sfactor, dfactor); } + @Override public void glBlendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) { GLSMBlend.tryBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); } + @Override public void glDepthFunc(int func) { GLSMDepthStencilAlpha.glDepthFunc(func); } + @Override public void glDepthMask(boolean flag) { GLSMDepthStencilAlpha.glDepthMask(flag); } + @Override public void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) { GLSMBlend.glColorMask(red, green, blue, alpha); } + @Override public void glViewport(int x, int y, int width, int height) { GLSMRasterizer.glViewport(x, y, width, height); } + @Override public void glClear(int mask) { GLSMFramebuffer.glClear(mask); } @Override public void glClearColor(float red, float green, float blue, float alpha) { - GLStateManager.glClearColor(red, green, blue, alpha); + GLSMBlend.glClearColor(red, green, blue, alpha); } - @Override public int glGetError() { return GLStateManager.glGetError(); } + @Override public int glGetError() { return GLSMQueries.glGetError(); } - @Override public void glMatrixMode(int mode) { GLStateManager.glMatrixMode(mode); } - @Override public void glLoadMatrixf(FloatBuffer m) { GLStateManager.glLoadMatrix(m); } + @Override public void glMatrixMode(int mode) { GLSMMatrices.glMatrixMode(mode); } + @Override public void glLoadMatrixf(FloatBuffer m) { GLSMMatrices.glLoadMatrix(m); } - @Override public int glGetInteger(int pname) { return GLStateManager.glGetInteger(pname); } - @Override public void glGetIntegerv(int pname, int[] params) { GLStateManager.glGetInteger(pname, params); } - @Override public boolean glGetBoolean(int pname) { return GLStateManager.glGetBoolean(pname); } - @Override public String glGetString(int pname) { return GLStateManager.glGetString(pname); } + @Override public int glGetInteger(int pname) { return GLSMQueries.glGetInteger(pname); } + @Override public void glGetIntegerv(int pname, int[] params) { GLSMQueries.glGetInteger(pname, params); } + @Override public boolean glGetBoolean(int pname) { return GLSMQueries.glGetBoolean(pname); } + @Override public String glGetString(int pname) { return GLSMQueries.glGetString(pname); } @Override public int glGetAttribLocation(int program, CharSequence name) { - return GLStateManager.glGetAttribLocation(program, name); + return GLSMPrograms.glGetAttribLocation(program, name); } @Override public MemoryStack stackPush() { diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPURenderBackend.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPURenderBackend.java index 277d486a4..059e38460 100644 --- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPURenderBackend.java +++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/SDLGPURenderBackend.java @@ -6,6 +6,8 @@ import com.gtnewhorizons.angelica.sdlgpu.compute.VoxelizationDispatcher; import com.gtnewhorizons.angelica.config.SystemProperties; import com.gtnewhorizons.angelica.glsm.CaptureGate; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.glsm.backend.BackendOptions; @@ -620,7 +622,7 @@ public class SDLGPURenderBackend extends RenderBackend { beginSplashFrame(); } else if (st.needsSeed) { st.needsSeed = false; - GLStateManager.replayStateToBackend(); + GLSMAttribStack.replayStateToBackend(); } } @@ -693,7 +695,7 @@ public class SDLGPURenderBackend extends RenderBackend { final ContextState st = s(); if (st.needsSeed) { st.needsSeed = false; - GLStateManager.replayStateToBackend(); + GLSMAttribStack.replayStateToBackend(); } ResourceManager.setSingleThreadedReads(GLStateManager.isSplashComplete()); st.pendingColorTextures.clear(); @@ -4557,7 +4559,7 @@ public class SDLGPURenderBackend extends RenderBackend { @Override public void voxelizeRegion(long pass, boolean rebindVertexBuffer, float x, float y, float z, int rangeBase, int rangeCount, int vertexTotal) { final ContextState st = s(); - if (voxLocRegionOffset >= 0) GLStateManager.glUniform3f(voxLocRegionOffset, x, y, z); + if (voxLocRegionOffset >= 0) GLSMPrograms.glUniform3f(voxLocRegionOffset, x, y, z); if (rebindVertexBuffer) voxelizationDispatcher.rebindVertexBuffer(st, pass); voxelizationDispatcher.dispatchRegion(pass, voxLocRangeBase, voxLocRangeCount, voxLocVertexTotal, voxLocInvocationBase, rangeBase, rangeCount, vertexTotal, st); } diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compat/AwareGLDebugShim.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compat/AwareGLDebugShim.java index 0216a65af..36457a573 100644 --- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compat/AwareGLDebugShim.java +++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compat/AwareGLDebugShim.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.compat; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -18,7 +18,7 @@ public final class AwareGLDebugShim { private AwareGLDebugShim() {} public static void glDebugMessageCallback(GLDebugMessageCallbackI callback, long userParam) { - GLStateManager.registerDebugMessageListener(callback == null ? null : callback::invoke, userParam); + GLSMDraws.registerDebugMessageListener(callback == null ? null : callback::invoke, userParam); } public static Callback setupDebugMessageCallback() { @@ -31,7 +31,7 @@ public final class AwareGLDebugShim { return null; } final GLDebugMessageCallback proc = GLDebugMessageCallback.create((source, type, id, severity, length, message, userParam) -> stream.println("[Angelica] GL debug message: " + GLDebugMessageCallback.getMessage(length, message))); - GLStateManager.registerDebugMessageListener(proc::invoke, 0L); + GLSMDraws.registerDebugMessageListener(proc::invoke, 0L); return proc; } } diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compute/VoxelizationDispatcher.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compute/VoxelizationDispatcher.java index 057077567..7a3179162 100644 --- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compute/VoxelizationDispatcher.java +++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/compute/VoxelizationDispatcher.java @@ -1,10 +1,10 @@ package com.gtnewhorizons.angelica.sdlgpu.compute; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.sdlgpu.frame.ContextState; public final class VoxelizationDispatcher { - private static final InvocationDispatch.IntUniformWriter UNIFORM_1I = (st, location, value) -> GLStateManager.glUniform1i(location, value); + private static final InvocationDispatch.IntUniformWriter UNIFORM_1I = (st, location, value) -> GLSMPrograms.glUniform1i(location, value); private final ComputeDispatchSink computeBinder; @@ -21,9 +21,9 @@ public final class VoxelizationDispatcher { } public void dispatchRegion(long pass, int locBase, int locCount, int locTotal, int locInvBase, int rangeBase, int rangeCount, int vertexTotal, ContextState st) { - if (locBase >= 0) GLStateManager.glUniform1i(locBase, rangeBase); - if (locCount >= 0) GLStateManager.glUniform1i(locCount, rangeCount); - if (locTotal >= 0) GLStateManager.glUniform1i(locTotal, vertexTotal); + if (locBase >= 0) GLSMPrograms.glUniform1i(locBase, rangeBase); + if (locCount >= 0) GLSMPrograms.glUniform1i(locCount, rangeCount); + if (locTotal >= 0) GLSMPrograms.glUniform1i(locTotal, vertexTotal); InvocationDispatch.dispatch(computeBinder, st, pass, vertexTotal, locInvBase, UNIFORM_1I); } diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/FFPTrace.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/FFPTrace.java index c8f4c8b71..bb4733c05 100644 --- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/FFPTrace.java +++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/FFPTrace.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.pipeline; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.ffp.FFPUniformBlock; import com.gtnewhorizons.angelica.sdlgpu.frame.ContextState; import com.gtnewhorizons.angelica.sdlgpu.frame.FrameManager; @@ -155,7 +155,7 @@ public final class FFPTrace { .append(" glFormat=0x").append(Integer.toHexString(meta.glFormat())); } } - sb.append(" ffpEnabled=").append(GLStateManager.getTextures().getTextureUnitStates(unit).isEnabled()); + sb.append(" ffpEnabled=").append(GLSMTextures.getTextures().getTextureUnitStates(unit).isEnabled()); } private void appendFfpUniforms(ContextState st, ShaderManager.ProgramObject prog) { diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/PipelineApplier.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/PipelineApplier.java index c3535ecfd..e83653fee 100644 --- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/PipelineApplier.java +++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/pipeline/PipelineApplier.java @@ -9,6 +9,9 @@ import org.lwjgl.sdl.SDL_GPUDepthStencilTargetInfo; import org.lwjgl.sdl.SDL_GPUViewport; import org.lwjgl.sdl.SDL_Rect; import com.gtnewhorizons.angelica.config.SystemProperties; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.sdlgpu.frame.ContextState; @@ -420,10 +423,10 @@ public final class PipelineApplier { if (Tracy.ENABLED) frameManager.noteStateApply(); if (SystemProperties.SDL_VERIFY_STATE_SYNC && Thread.currentThread() == GLStateManager.getMainThread()) { StateSyncVerifier.verify( - GLStateManager.getBoundVAO(), st.boundVAO, - GLStateManager.getDrawFramebuffer(), st.boundFboId, - GLStateManager.getReadFramebuffer(), st.boundReadFboId, - GLStateManager.getActiveTextureUnit(), st.activeTextureUnit); + GLSMVertexInput.getBoundVAO(), st.boundVAO, + GLSMFramebuffer.getDrawFramebuffer(), st.boundFboId, + GLSMFramebuffer.getReadFramebuffer(), st.boundReadFboId, + GLSMTextures.getActiveTextureUnit(), st.activeTextureUnit); } final long rp = f.renderPass; final long rpGeneration = f.renderPassGeneration; diff --git a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/resource/Image3DClear.java b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/resource/Image3DClear.java index 6dbed69ee..0faf082f3 100644 --- a/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/resource/Image3DClear.java +++ b/sdl-gpu/src/main/java/com/gtnewhorizons/angelica/sdlgpu/resource/Image3DClear.java @@ -1,6 +1,8 @@ package com.gtnewhorizons.angelica.sdlgpu.resource; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.states.ImageUnitBinding; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -25,30 +27,30 @@ public final class Image3DClear { if (failed) return false; failed = true; - final int shader = GLStateManager.glCreateShader(GL43.GL_COMPUTE_SHADER); + final int shader = GLSMPrograms.glCreateShader(GL43.GL_COMPUTE_SHADER); if (shader == 0) return false; try { - GLStateManager.glShaderSource(shader, ShaderLoader.getShaderSource(SOURCE)); - GLStateManager.glCompileShader(shader); + GLSMPrograms.glShaderSource(shader, ShaderLoader.getShaderSource(SOURCE)); + GLSMPrograms.glCompileShader(shader); - final int created = GLStateManager.glCreateProgram(); + final int created = GLSMPrograms.glCreateProgram(); if (created == 0) return false; - GLStateManager.glAttachShader(created, shader); - GLStateManager.glLinkProgram(created); - if (GLStateManager.glGetProgrami(created, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) { - LOG.error("3D image clear program failed to link: {}", GLStateManager.glGetProgramInfoLog(created, 4096)); - GLStateManager.glDeleteProgram(created); + GLSMPrograms.glAttachShader(created, shader); + GLSMPrograms.glLinkProgram(created); + if (GLSMPrograms.glGetProgrami(created, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) { + LOG.error("3D image clear program failed to link: {}", GLSMPrograms.glGetProgramInfoLog(created, 4096)); + GLSMPrograms.glDeleteProgram(created); return false; } program = created; - extentLocation = GLStateManager.glGetUniformLocation(created, "u_extent"); + extentLocation = GLSMPrograms.glGetUniformLocation(created, "u_extent"); failed = false; return true; } catch (RuntimeException e) { LOG.error("3D image clear program could not be built; 3D images will not be cleared", e); return false; } finally { - GLStateManager.glDeleteShader(shader); + GLSMPrograms.glDeleteShader(shader); } } @@ -56,21 +58,21 @@ public final class Image3DClear { if (width <= 0 || height <= 0 || depth <= 0) return true; if (!ensureProgram()) return false; - final int previousProgram = GLStateManager.glGetInteger(GL20.GL_CURRENT_PROGRAM); - final ImageUnitBinding previousImage = GLStateManager.getImageUnitBinding(0); + final int previousProgram = GLSMQueries.glGetInteger(GL20.GL_CURRENT_PROGRAM); + final ImageUnitBinding previousImage = GLSMTextures.getImageUnitBinding(0); final ImageUnitBinding savedImage = previousImage == null ? null : previousImage.copy(); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); try { - GLStateManager.glBindImageTexture(0, glTexture, 0, true, 0, GL15.GL_WRITE_ONLY, 0); - if (extentLocation >= 0) GLStateManager.glUniform3i(extentLocation, width, height, depth); - GLStateManager.glDispatchCompute(groups(width), groups(height), groups(depth)); + GLSMTextures.glBindImageTexture(0, glTexture, 0, true, 0, GL15.GL_WRITE_ONLY, 0); + if (extentLocation >= 0) GLSMPrograms.glUniform3i(extentLocation, width, height, depth); + GLSMPrograms.glDispatchCompute(groups(width), groups(height), groups(depth)); } finally { if (savedImage == null) { - GLStateManager.glBindImageTexture(0, 0, 0, true, 0, GL15.GL_WRITE_ONLY, 0); + GLSMTextures.glBindImageTexture(0, 0, 0, true, 0, GL15.GL_WRITE_ONLY, 0); } else { - GLStateManager.glBindImageTexture(0, savedImage.getTexture(), savedImage.getLevel(), savedImage.isLayered(), savedImage.getLayer(), savedImage.getAccess(), savedImage.getFormat()); + GLSMTextures.glBindImageTexture(0, savedImage.getTexture(), savedImage.getLevel(), savedImage.isLayered(), savedImage.getLayer(), savedImage.getAccess(), savedImage.getFormat()); } - GLStateManager.glUseProgram(previousProgram); + GLSMPrograms.glUseProgram(previousProgram); } return true; } @@ -81,7 +83,7 @@ public final class Image3DClear { public void delete() { if (program != 0) { - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glDeleteProgram(program); program = 0; } extentLocation = -1; diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttachmentClearTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttachmentClearTest.java index 47dd29f6b..2c7fe7187 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttachmentClearTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttachmentClearTest.java @@ -1,7 +1,14 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; import com.gtnewhorizons.angelica.config.SystemProperties; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.sdlgpu.frame.FrameManager; import com.gtnewhorizons.angelica.sdlgpu.resource.ResourceManager; @@ -40,33 +47,33 @@ class GlsmSdlAttachmentClearTest { /** Clears colour to black and depth to 0.9, then draws a quad so a render pass is open. */ private static void primeTarget(float r, float g, float b) { GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glDepthMask(true); - GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClearDepth(0.9); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLSMDepthStencilAlpha.glClearDepth(0.9); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); GlsmSdlHeadlessRig.solidQuad(r, g, b); } private static void primeTargetWithStencil(int stencil) { GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glDepthMask(true); - GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClearDepth(1.0); - GLStateManager.glClearStencil(stencil); - GLStateManager.glStencilMask(0xFF); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLSMDepthStencilAlpha.glClearDepth(1.0); + GLSMDepthStencilAlpha.glClearStencil(stencil); + GLSMDepthStencilAlpha.glStencilMask(0xFF); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); GlsmSdlHeadlessRig.solidQuad(0.1f, 0.1f, 0.1f); } private static void drawFullQuadAtZ(float z, float r, float g, float b) { - GLStateManager.glColor4f(r, g, b, 1.0f); - GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f); - GLStateManager.glBegin(GL11.GL_QUADS); - GLStateManager.glVertex3f(-1.0f, -1.0f, z); - GLStateManager.glVertex3f(1.0f, -1.0f, z); - GLStateManager.glVertex3f(1.0f, 1.0f, z); - GLStateManager.glVertex3f(-1.0f, 1.0f, z); - GLStateManager.glEnd(); + GLSMCurrentAttribs.glColor4f(r, g, b, 1.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f); + GLSMDraws.glBegin(GL11.GL_QUADS); + GLSMDraws.glVertex3f(-1.0f, -1.0f, z); + GLSMDraws.glVertex3f(1.0f, -1.0f, z); + GLSMDraws.glVertex3f(1.0f, 1.0f, z); + GLSMDraws.glVertex3f(-1.0f, 1.0f, z); + GLSMDraws.glEnd(); } private static boolean isRed(int argb) { @@ -82,11 +89,11 @@ class GlsmSdlAttachmentClearTest { } private static boolean depthEquals(float depthValue) { - GLStateManager.glEnable(GL11.GL_DEPTH_TEST); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); - GLStateManager.glDepthMask(false); + GLSMEnable.glEnable(GL11.GL_DEPTH_TEST); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); + GLSMDepthStencilAlpha.glDepthMask(false); drawFullQuadAtZ(depthValue * 2.0f - 1.0f, 1.0f, 0.0f, 0.0f); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); return isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2, SIZE / 2)); } @@ -101,10 +108,10 @@ class GlsmSdlAttachmentClearTest { final int inPassBefore = f.inPassClearsThisFrame; final int passEndClearBefore = f.passEndCauseCountsThisFrame[FrameManager.PASS_END_CLEAR]; - GLStateManager.glDepthMask(false); - GLStateManager.glClearDepth(0.0); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMDepthStencilAlpha.glClearDepth(0.0); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMDepthStencilAlpha.glDepthMask(true); assertEquals(passBefore, f.renderPass, "a masked clear must not break the active render pass"); assertEquals(inPassBefore, f.inPassClearsThisFrame, "a masked clear must not take the in-pass path"); @@ -121,9 +128,9 @@ class GlsmSdlAttachmentClearTest { assertTrue(passBefore != 0, "expected an active render pass before the clear"); final int inPassBefore = f.inPassClearsThisFrame; - GLStateManager.glDepthMask(true); - GLStateManager.glClearDepth(0.25); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glClearDepth(0.25); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); assertEquals(passBefore, f.renderPass, "the in-pass clear must not break the active render pass"); assertEquals(inPassBefore + 1, f.inPassClearsThisFrame, "the in-pass clear must be taken exactly once"); @@ -140,9 +147,9 @@ class GlsmSdlAttachmentClearTest { setDisableInPassClear(true); try { - GLStateManager.glDepthMask(true); - GLStateManager.glClearDepth(0.6); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glClearDepth(0.6); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); assertEquals(inPassBefore, f.inPassClearsThisFrame, "angelica.sdlgpu.disableInPassClear must force the legacy path, never the in-pass path"); } finally { setDisableInPassClear(false); @@ -164,9 +171,9 @@ class GlsmSdlAttachmentClearTest { GlsmSdlHeadlessRig.resetState(); primeTarget(0.1f, 0.1f, 0.1f); - GLStateManager.glDepthMask(true); - GLStateManager.glClearDepth(depthValue); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glClearDepth(depthValue); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); return depthEquals(depthValue); } finally { @@ -178,24 +185,24 @@ class GlsmSdlAttachmentClearTest { void scissoredClearOnlyAffectsTheScissorRect() { primeTarget(0.1f, 0.1f, 0.1f); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, SIZE / 2, SIZE); - GLStateManager.glDepthMask(true); - GLStateManager.glClearDepth(0.0); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glClearDepth(0.0); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); - GLStateManager.glEnable(GL11.GL_DEPTH_TEST); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); - GLStateManager.glDepthMask(false); + GLSMEnable.glEnable(GL11.GL_DEPTH_TEST); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); + GLSMDepthStencilAlpha.glDepthMask(false); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, SIZE / 2, SIZE); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE); drawFullQuadAtZ(-1.0f, 1.0f, 0.0f, 0.0f); - GLStateManager.glScissor(SIZE / 2, 0, SIZE - SIZE / 2, SIZE); + GLSMRasterizer.glScissor(SIZE / 2, 0, SIZE - SIZE / 2, SIZE); drawFullQuadAtZ(0.9f * 2.0f - 1.0f, 1.0f, 0.0f, 0.0f); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); assertTrue(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 4, SIZE / 2)), "inside the scissor rect the depth must have been cleared to 0"); @@ -210,10 +217,10 @@ class GlsmSdlAttachmentClearTest { final long passBefore = f.renderPass; final int inPassBefore = f.inPassClearsThisFrame; - GLStateManager.glClearStencil(0x3F); - GLStateManager.glStencilMask(0x0F); - GLStateManager.glClear(GL11.GL_STENCIL_BUFFER_BIT); - GLStateManager.glStencilMask(0xFF); + GLSMDepthStencilAlpha.glClearStencil(0x3F); + GLSMDepthStencilAlpha.glStencilMask(0x0F); + GLSMFramebuffer.glClear(GL11.GL_STENCIL_BUFFER_BIT); + GLSMDepthStencilAlpha.glStencilMask(0xFF); assertEquals(passBefore, f.renderPass, "the stencil-only clear must not break the active render pass"); assertEquals(inPassBefore + 1, f.inPassClearsThisFrame, "the stencil clear must take the in-pass path"); @@ -284,14 +291,14 @@ class GlsmSdlAttachmentClearTest { private static void probeStrip(int index, int regionW, int strips, int func, int ref, int mask) { final int x = index * regionW; final int w = (index == strips - 1) ? SIZE - x : regionW; - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(x, 0, w, SIZE); - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.glStencilFunc(func, ref, mask); - GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(x, 0, w, SIZE); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.glStencilFunc(func, ref, mask); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); drawFullQuadAtZ(0.0f, 1.0f, 0.0f, 0.0f); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); } private static int stripCenter(int index, int regionW, int strips) { @@ -303,19 +310,19 @@ class GlsmSdlAttachmentClearTest { @Test void colorIsUntouchedByADepthStencilOnlyClear() { GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glDepthMask(true); - GLStateManager.glClearColor(0.2f, 0.4f, 0.6f, 1.0f); - GLStateManager.glClearDepth(0.9); - GLStateManager.glClearStencil(0x55); - GLStateManager.glStencilMask(0xFF); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glClearColor(0.2f, 0.4f, 0.6f, 1.0f); + GLSMDepthStencilAlpha.glClearDepth(0.9); + GLSMDepthStencilAlpha.glClearStencil(0x55); + GLSMDepthStencilAlpha.glStencilMask(0xFF); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); GlsmSdlHeadlessRig.solidQuad(0.2f, 0.4f, 0.6f); - GLStateManager.glDepthMask(true); - GLStateManager.glClearDepth(0.1); - GLStateManager.glClearStencil(0x77); - GLStateManager.glStencilMask(0xFF); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glClearDepth(0.1); + GLSMDepthStencilAlpha.glClearStencil(0x77); + GLSMDepthStencilAlpha.glStencilMask(0xFF); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); final int argb = GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2, SIZE / 2); @@ -336,12 +343,12 @@ class GlsmSdlAttachmentClearTest { assertTrue(passBefore != 0, "expected an active render pass before the scissored clear"); final int inPassBefore = f.inPassClearsThisFrame; - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, SIZE / 2, SIZE); - GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClearDepth(0.0); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE); + GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + GLSMDepthStencilAlpha.glClearDepth(0.0); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); assertEquals(passBefore, f.renderPass, "the scissored clear must not break the active render pass"); assertEquals(inPassBefore + 1, f.inPassClearsThisFrame, "the scissored clear must take the in-pass path"); @@ -350,17 +357,17 @@ class GlsmSdlAttachmentClearTest { final int leftProbeX = SIZE / 2 - probeSize * 2; final int rightProbeX = SIZE / 2 + probeSize; - GLStateManager.glEnable(GL11.GL_DEPTH_TEST); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); - GLStateManager.glDepthMask(false); + GLSMEnable.glEnable(GL11.GL_DEPTH_TEST); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); + GLSMDepthStencilAlpha.glDepthMask(false); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(leftProbeX, 0, probeSize, SIZE); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(leftProbeX, 0, probeSize, SIZE); drawFullQuadAtZ(0.0f * 2.0f - 1.0f, 0.0f, 1.0f, 0.0f); - GLStateManager.glScissor(rightProbeX, 0, probeSize, SIZE); + GLSMRasterizer.glScissor(rightProbeX, 0, probeSize, SIZE); drawFullQuadAtZ(0.9f * 2.0f - 1.0f, 0.0f, 1.0f, 0.0f); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); assertTrue(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 8, SIZE / 2)), "inside the scissor rect must be the clear color"); @@ -372,18 +379,18 @@ class GlsmSdlAttachmentClearTest { @Test void scissoredClearAfterPendingFullClear() { GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, SIZE / 2, SIZE); - GLStateManager.glClearColor(0.0f, 1.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE); + GLSMBlend.glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glScissor(0, 0, 0, SIZE); - GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, 0, SIZE); + GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); assertTrue(isGreen(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 4, SIZE / 2)), "the scissored clear must have painted the left half green"); @@ -395,10 +402,10 @@ class GlsmSdlAttachmentClearTest { GlsmSdlHeadlessRig.bindTarget(); GlsmSdlHeadlessRig.solidQuad(0.2f, 0.4f, 0.6f); - GLStateManager.glColorMask(true, false, false, true); - GLStateManager.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glColorMask(true, true, true, true); + GLSMBlend.glColorMask(true, false, false, true); + GLSMBlend.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glColorMask(true, true, true, true); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); final int argb = GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2, SIZE / 2); @@ -415,54 +422,54 @@ class GlsmSdlAttachmentClearTest { final int texA = createColorTexture(); final int texB = createColorTexture(); - final int mrtFbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, mrtFbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texA, 0); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, texB, 0); - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glDrawBuffers(IntBuffer.wrap(new int[]{ GL30.GL_COLOR_ATTACHMENT0, GL30.GL_COLOR_ATTACHMENT1 })); + final int mrtFbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, mrtFbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texA, 0); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, texB, 0); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMFramebuffer.glDrawBuffers(IntBuffer.wrap(new int[]{ GL30.GL_COLOR_ATTACHMENT0, GL30.GL_COLOR_ATTACHMENT1 })); - GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, SIZE / 2, SIZE); - GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE); + GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); - final int readFbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, readFbo); + final int readFbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, readFbo); assertLeftHalfRed(texA, "texture A"); assertLeftHalfRed(texB, "texture B"); - GLStateManager.glDeleteFramebuffers(readFbo); - GLStateManager.glDeleteFramebuffers(mrtFbo); - GLStateManager.glDeleteTextures(texA); - GLStateManager.glDeleteTextures(texB); + GLSMFramebuffer.glDeleteFramebuffers(readFbo); + GLSMFramebuffer.glDeleteFramebuffers(mrtFbo); + GLSMTextures.glDeleteTextures(texA); + GLSMTextures.glDeleteTextures(texB); GlsmSdlHeadlessRig.bindTarget(); } @Test void clearReachesARenderbufferRespecifiedWhileAttached() { - final int rb = GLStateManager.glGenRenderbuffers(); - GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, rb); - GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_RGBA8, SIZE / 4, SIZE / 4); - final int fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_RENDERBUFFER, rb); + final int rb = GLSMFramebuffer.glGenRenderbuffers(); + GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, rb); + GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_RGBA8, SIZE / 4, SIZE / 4); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL30.GL_RENDERBUFFER, rb); - GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_RGBA8, SIZE, SIZE); - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL11.GL_RGBA8, SIZE, SIZE); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(), RED, "respecified renderbuffer must stay attached"); - GLStateManager.glDeleteFramebuffers(fbo); - GLStateManager.glDeleteRenderbuffers(rb); + GLSMFramebuffer.glDeleteFramebuffers(fbo); + GLSMFramebuffer.glDeleteRenderbuffers(rb); GlsmSdlHeadlessRig.bindTarget(); } @@ -471,16 +478,16 @@ class GlsmSdlAttachmentClearTest { } private static int createColorTexture(int internalFormat, int format) { - final int tex = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, format, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + final int tex = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, format, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); return tex; } private static void assertLeftHalfRed(int texture, String label) { - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 0); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 0); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); assertTrue(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 4, SIZE / 2)), label + " left half must be cleared red"); assertFalse(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2 + SIZE / 4, SIZE / 2)), label + " right half must keep the base clear"); @@ -491,11 +498,11 @@ class GlsmSdlAttachmentClearTest { GlsmSdlHeadlessRig.bindTarget(); GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f); - GLStateManager.glEnable(GL30.GL_RASTERIZER_DISCARD); - GLStateManager.glClearColor(0.0f, 1.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glEnable(GL30.GL_RASTERIZER_DISCARD); + GLSMBlend.glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); GlsmSdlHeadlessRig.solidQuad(0.0f, 0.0f, 1.0f); - GLStateManager.glDisable(GL30.GL_RASTERIZER_DISCARD); + GLSMEnable.glDisable(GL30.GL_RASTERIZER_DISCARD); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); assertTrue(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2, SIZE / 2)), "rasterizer discard must skip both the clear and the draw"); @@ -507,11 +514,11 @@ class GlsmSdlAttachmentClearTest { GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f); final FloatBuffer feedbackBuffer = BufferUtils.createFloatBuffer(16); - GLStateManager.glFeedbackBuffer(GL11.GL_3D, feedbackBuffer); - GLStateManager.glRenderMode(GL11.GL_FEEDBACK); - GLStateManager.glClearColor(0.0f, 1.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glRenderMode(GL11.GL_RENDER); + GLSMDraws.glFeedbackBuffer(GL11.GL_3D, feedbackBuffer); + GLSMDraws.glRenderMode(GL11.GL_FEEDBACK); + GLSMBlend.glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMDraws.glRenderMode(GL11.GL_RENDER); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); assertTrue(isRed(GlsmSdlHeadlessRig.pixelAt(pixels, SIZE, SIZE / 2, SIZE / 2)), "a clear issued outside GL_RENDER mode must be ignored"); @@ -520,27 +527,27 @@ class GlsmSdlAttachmentClearTest { @Test void colorMaskCoveringEveryPresentChannelIsAFullClear() { final int tex = createColorTexture(GL30.GL_R8, GL11.GL_RED); - final int fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); - GLStateManager.glViewport(0, 0, SIZE, SIZE); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glClearColor(0.2f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0.2f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); GlsmSdlHeadlessRig.solidQuad(0.4f, 0.0f, 0.0f); final FrameManager.FrameState f = frame(); final int inPassBefore = f.inPassClearsThisFrame; - GLStateManager.glColorMask(true, false, false, false); - GLStateManager.glClearColor(0.6f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glColorMask(true, true, true, true); + GLSMBlend.glColorMask(true, false, false, false); + GLSMBlend.glClearColor(0.6f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glColorMask(true, true, true, true); assertEquals(inPassBefore, f.inPassClearsThisFrame, "masking every present channel on a single-red-channel target must take the load-op path, not in-pass"); - GLStateManager.glDeleteFramebuffers(fbo); - GLStateManager.glDeleteTextures(tex); + GLSMFramebuffer.glDeleteFramebuffers(fbo); + GLSMTextures.glDeleteTextures(tex); GlsmSdlHeadlessRig.bindTarget(); } @@ -561,8 +568,8 @@ class GlsmSdlAttachmentClearTest { @Test void aSingleAspectClearLeavesTheTextureUndefined() { final int fbo = GlsmSdlHeadlessRig.createDepthStencilFbo(); - GLStateManager.glDepthMask(true); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); final ResourceManager resourceManager = GlsmSdlHeadlessRig.resourceManager(); final long depthTexture = resourceManager.getFbo(fbo).depthTexture; diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttribBindingTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttribBindingTest.java index 09f8078a4..62aaff5ed 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttribBindingTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlAttribBindingTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.ffp.CubeInstancedAttribs; import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs; @@ -36,10 +36,10 @@ class GlsmSdlAttribBindingTest { void instancedEntityIdsStayAtTheInstanceSlot() { final int program = linkWithIrisBindings(INSTANCED_VERTEX); try { - assertEquals(InstancedAttribs.LOC_ENTITY, GLStateManager.glGetAttribLocation(program, "iris_InstEntity")); - assertEquals(CubeInstancedAttribs.LOC_CUBE_TEX, GLStateManager.glGetAttribLocation(program, "iris_CubeTex")); + assertEquals(InstancedAttribs.LOC_ENTITY, GLSMPrograms.glGetAttribLocation(program, "iris_InstEntity")); + assertEquals(CubeInstancedAttribs.LOC_CUBE_TEX, GLSMPrograms.glGetAttribLocation(program, "iris_CubeTex")); } finally { - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glDeleteProgram(program); } } @@ -47,20 +47,20 @@ class GlsmSdlAttribBindingTest { void immediateEntityIdsDoNotMoveOntoMcEntity() { final int program = linkWithIrisBindings(IMMEDIATE_VERTEX); try { - assertEquals(ImmediateExtendedAttribHandler.LOC_MC_ENTITY, GLStateManager.glGetAttribLocation(program, "mc_Entity")); - assertEquals(ImmediateExtendedAttribHandler.LOC_ENTITY_IDS, GLStateManager.glGetAttribLocation(program, "iris_Entity")); + assertEquals(ImmediateExtendedAttribHandler.LOC_MC_ENTITY, GLSMPrograms.glGetAttribLocation(program, "mc_Entity")); + assertEquals(ImmediateExtendedAttribHandler.LOC_ENTITY_IDS, GLSMPrograms.glGetAttribLocation(program, "iris_Entity")); } finally { - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glDeleteProgram(program); } } private static int linkWithIrisBindings(String vertexSource) { - final int program = GLStateManager.glCreateProgram(); - GLStateManager.glAttachShader(program, GlTestSupport.compile(GL20.GL_VERTEX_SHADER, vertexSource)); - GLStateManager.glAttachShader(program, GlTestSupport.compile(GL20.GL_FRAGMENT_SHADER, GlTestSupport.TRIVIAL_FS)); - GLStateManager.glBindAttribLocation(program, InstancedAttribs.LOC_ENTITY, "iris_InstEntity"); - GLStateManager.glBindAttribLocation(program, ImmediateExtendedAttribHandler.LOC_MC_ENTITY, "mc_Entity"); - GLStateManager.glLinkProgram(program); + final int program = GLSMPrograms.glCreateProgram(); + GLSMPrograms.glAttachShader(program, GlTestSupport.compile(GL20.GL_VERTEX_SHADER, vertexSource)); + GLSMPrograms.glAttachShader(program, GlTestSupport.compile(GL20.GL_FRAGMENT_SHADER, GlTestSupport.TRIVIAL_FS)); + GLSMPrograms.glBindAttribLocation(program, InstancedAttribs.LOC_ENTITY, "iris_InstEntity"); + GLSMPrograms.glBindAttribLocation(program, ImmediateExtendedAttribHandler.LOC_MC_ENTITY, "mc_Entity"); + GLSMPrograms.glLinkProgram(program); return program; } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBlendConstantsTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBlendConstantsTest.java index 75d4c507b..5446535b2 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBlendConstantsTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBlendConstantsTest.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import com.gtnewhorizons.angelica.sdlgpu.frame.FrameManager; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Tag; @@ -19,9 +20,9 @@ class GlsmSdlBlendConstantsTest { @AfterEach void restoreBlend() { - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glBlendColor(0.0f, 0.0f, 0.0f, 0.0f); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.glBlendColor(0.0f, 0.0f, 0.0f, 0.0f); } /** With blending never enabled before, the pending constants must survive a draw that does not use them. */ @@ -29,21 +30,21 @@ class GlsmSdlBlendConstantsTest { @ValueSource(booleans = {false, true}) void constantsSetWhileBlendingIsDisabledReachTheNextBlendedDraw(boolean previouslyEnabled) { GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glBlendFunc(GL14.GL_CONSTANT_COLOR, GL11.GL_ZERO); + GLSMBlend.glBlendFunc(GL14.GL_CONSTANT_COLOR, GL11.GL_ZERO); if (previouslyEnabled) { - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glBlendColor(1.0f, 0.0f, 0.0f, 1.0f); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMBlend.glBlendColor(1.0f, 0.0f, 0.0f, 1.0f); GlsmSdlHeadlessRig.solidQuad(1.0f, 1.0f, 1.0f); } - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glBlendColor(0.0f, 1.0f, 0.0f, 1.0f); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMBlend.glBlendColor(0.0f, 1.0f, 0.0f, 1.0f); GlsmSdlHeadlessRig.solidQuad(1.0f, 1.0f, 1.0f); final FrameManager.FrameState frame = GlsmSdlHeadlessRig.frameManager().frame(); final long pass = frame.renderPass; final long generation = frame.renderPassGeneration; assertNotEquals(0, pass); - GLStateManager.glEnable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_BLEND); GlsmSdlHeadlessRig.solidQuad(1.0f, 1.0f, 1.0f); assertEquals(pass, frame.renderPass); assertEquals(generation, frame.renderPassGeneration); diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBufferMappingLifetimeTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBufferMappingLifetimeTest.java index 4bfbe42dd..955050610 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBufferMappingLifetimeTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlBufferMappingLifetimeTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -47,154 +47,154 @@ class GlsmSdlBufferMappingLifetimeTest { private static ByteBuffer readBack(int target, int size) { final ByteBuffer out = MemoryUtil.memAlloc(size); - GLStateManager.glGetBufferSubData(target, 0, out); + GLSMBuffers.glGetBufferSubData(target, 0, out); return out; } private static ByteBuffer mapPersistent(int target, int id) { - GLStateManager.glBindBuffer(target, id); - GLStateManager.glBufferStorage(target, SIZE, PERSISTENT_STORAGE); - return GLStateManager.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP); + GLSMBuffers.glBindBuffer(target, id); + GLSMBuffers.glBufferStorage(target, SIZE, PERSISTENT_STORAGE); + return GLSMBuffers.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP); } @Test void bufferDataOnPersistentlyMappedBufferIsRefusedAndMappingSurvives() { final int target = GL15.GL_ARRAY_BUFFER; - final int id = GLStateManager.glGenBuffers(); + final int id = GLSMBuffers.glGenBuffers(); ByteBuffer out = null; try { final ByteBuffer mapped = mapPersistent(target, id); assertNotNull(mapped); - GLStateManager.glBufferData(target, SIZE * 2L, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBufferData(target, SIZE * 2L, GL15.GL_STATIC_DRAW); fill(mapped, 1); - GLStateManager.glFlushMappedBufferRange(target, 0, SIZE); + GLSMBuffers.glFlushMappedBufferRange(target, 0, SIZE); out = readBack(target, SIZE); assertPattern(out, 1); } finally { if (out != null) MemoryUtil.memFree(out); - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } } @Test void persistentMapWithoutPersistentStorageReturnsNull() { final int target = GL15.GL_ARRAY_BUFFER; - final int id = GLStateManager.glGenBuffers(); + final int id = GLSMBuffers.glGenBuffers(); try { - GLStateManager.glBindBuffer(target, id); - GLStateManager.glBufferData(target, (long) SIZE, GL15.GL_STATIC_DRAW); - assertNull(GLStateManager.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP)); + GLSMBuffers.glBindBuffer(target, id); + GLSMBuffers.glBufferData(target, (long) SIZE, GL15.GL_STATIC_DRAW); + assertNull(GLSMBuffers.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP)); } finally { - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } } @Test void secondPersistentMapReturnsNullAndFirstStillRoundTrips() { final int target = GL15.GL_ARRAY_BUFFER; - final int id = GLStateManager.glGenBuffers(); + final int id = GLSMBuffers.glGenBuffers(); ByteBuffer out = null; try { final ByteBuffer first = mapPersistent(target, id); assertNotNull(first); - assertNull(GLStateManager.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP)); + assertNull(GLSMBuffers.glMapBufferRange(target, 0, SIZE, PERSISTENT_MAP)); fill(first, 2); - GLStateManager.glFlushMappedBufferRange(target, 0, SIZE); + GLSMBuffers.glFlushMappedBufferRange(target, 0, SIZE); out = readBack(target, SIZE); assertPattern(out, 2); } finally { if (out != null) MemoryUtil.memFree(out); - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } } @Test void twoBuffersMappedNonPersistentlyKeepTheirOwnData() { final int target = GL15.GL_ARRAY_BUFFER; - final int a = GLStateManager.glGenBuffers(); - final int b = GLStateManager.glGenBuffers(); + final int a = GLSMBuffers.glGenBuffers(); + final int b = GLSMBuffers.glGenBuffers(); ByteBuffer outA = null; ByteBuffer outB = null; try { - GLStateManager.glBindBuffer(target, a); - GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); - GLStateManager.glBindBuffer(target, b); - GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBindBuffer(target, a); + GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBindBuffer(target, b); + GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); - GLStateManager.glBindBuffer(target, a); - final ByteBuffer mapA = GLStateManager.glMapBufferRange(target, 0, SIZE, PLAIN_MAP); + GLSMBuffers.glBindBuffer(target, a); + final ByteBuffer mapA = GLSMBuffers.glMapBufferRange(target, 0, SIZE, PLAIN_MAP); assertNotNull(mapA); - GLStateManager.glBindBuffer(target, b); - final ByteBuffer mapB = GLStateManager.glMapBufferRange(target, 0, SIZE, PLAIN_MAP); + GLSMBuffers.glBindBuffer(target, b); + final ByteBuffer mapB = GLSMBuffers.glMapBufferRange(target, 0, SIZE, PLAIN_MAP); assertNotNull(mapB); fill(mapA, 3); fill(mapB, 4); - GLStateManager.glBindBuffer(target, a); - assertTrue(GLStateManager.glUnmapBuffer(target)); - GLStateManager.glBindBuffer(target, b); - assertTrue(GLStateManager.glUnmapBuffer(target)); + GLSMBuffers.glBindBuffer(target, a); + assertTrue(GLSMBuffers.glUnmapBuffer(target)); + GLSMBuffers.glBindBuffer(target, b); + assertTrue(GLSMBuffers.glUnmapBuffer(target)); - GLStateManager.glBindBuffer(target, a); + GLSMBuffers.glBindBuffer(target, a); outA = readBack(target, SIZE); assertPattern(outA, 3); - GLStateManager.glBindBuffer(target, b); + GLSMBuffers.glBindBuffer(target, b); outB = readBack(target, SIZE); assertPattern(outB, 4); } finally { if (outA != null) MemoryUtil.memFree(outA); if (outB != null) MemoryUtil.memFree(outB); - GLStateManager.glDeleteBuffers(a); - GLStateManager.glDeleteBuffers(b); + GLSMBuffers.glDeleteBuffers(a); + GLSMBuffers.glDeleteBuffers(b); } } @Test void unmapOfUnmappedBufferReturnsFalseAndLeavesOtherMappingIntact() { final int target = GL15.GL_ARRAY_BUFFER; - final int mappedId = GLStateManager.glGenBuffers(); - final int idle = GLStateManager.glGenBuffers(); + final int mappedId = GLSMBuffers.glGenBuffers(); + final int idle = GLSMBuffers.glGenBuffers(); ByteBuffer out = null; try { - GLStateManager.glBindBuffer(target, mappedId); - GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); - final ByteBuffer map = GLStateManager.glMapBufferRange(target, 0, SIZE, PLAIN_MAP); + GLSMBuffers.glBindBuffer(target, mappedId); + GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); + final ByteBuffer map = GLSMBuffers.glMapBufferRange(target, 0, SIZE, PLAIN_MAP); assertNotNull(map); fill(map, 5); - GLStateManager.glBindBuffer(target, idle); - GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); - assertFalse(GLStateManager.glUnmapBuffer(target)); + GLSMBuffers.glBindBuffer(target, idle); + GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); + assertFalse(GLSMBuffers.glUnmapBuffer(target)); - GLStateManager.glBindBuffer(target, mappedId); - assertTrue(GLStateManager.glUnmapBuffer(target)); + GLSMBuffers.glBindBuffer(target, mappedId); + assertTrue(GLSMBuffers.glUnmapBuffer(target)); out = readBack(target, SIZE); assertPattern(out, 5); } finally { if (out != null) MemoryUtil.memFree(out); - GLStateManager.glDeleteBuffers(mappedId); - GLStateManager.glDeleteBuffers(idle); + GLSMBuffers.glDeleteBuffers(mappedId); + GLSMBuffers.glDeleteBuffers(idle); } } @Test void outOfRangeUniformSubDataIsIgnored() { - final int ubo = GLStateManager.glGenBuffers(); + final int ubo = GLSMBuffers.glGenBuffers(); final ByteBuffer data = MemoryUtil.memAlloc(256); final ByteBuffer big = MemoryUtil.memAlloc(64); ByteBuffer out = null; try { fill(data, 6); fill(big, 7); - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo); - GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, data, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo); + GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, data, GL15.GL_DYNAMIC_DRAW); assertDoesNotThrow(() -> { big.clear(); - GLStateManager.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 1024, big); + GLSMBuffers.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 1024, big); big.clear(); - GLStateManager.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 224, big); + GLSMBuffers.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 224, big); big.clear(); - GLStateManager.glBufferSubData(GL31.GL_UNIFORM_BUFFER, -8, big); + GLSMBuffers.glBufferSubData(GL31.GL_UNIFORM_BUFFER, -8, big); }); out = readBack(GL31.GL_UNIFORM_BUFFER, 256); assertPattern(out, 6); @@ -202,33 +202,33 @@ class GlsmSdlBufferMappingLifetimeTest { if (out != null) MemoryUtil.memFree(out); MemoryUtil.memFree(data); MemoryUtil.memFree(big); - GLStateManager.glDeleteBuffers(ubo); + GLSMBuffers.glDeleteBuffers(ubo); } } @Test void uniformBufferMapForReadSeesItsContents() { - final int ubo = GLStateManager.glGenBuffers(); + final int ubo = GLSMBuffers.glGenBuffers(); final ByteBuffer data = MemoryUtil.memAlloc(256); try { fill(data, 7); - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo); - GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, data, GL15.GL_DYNAMIC_DRAW); - final ByteBuffer mapped = GLStateManager.glMapBufferRange(GL31.GL_UNIFORM_BUFFER, 0, 256, GL30.GL_MAP_READ_BIT); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo); + GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, data, GL15.GL_DYNAMIC_DRAW); + final ByteBuffer mapped = GLSMBuffers.glMapBufferRange(GL31.GL_UNIFORM_BUFFER, 0, 256, GL30.GL_MAP_READ_BIT); assertNotNull(mapped); assertPattern(mapped, 7); - assertTrue(GLStateManager.glUnmapBuffer(GL31.GL_UNIFORM_BUFFER)); + assertTrue(GLSMBuffers.glUnmapBuffer(GL31.GL_UNIFORM_BUFFER)); } finally { MemoryUtil.memFree(data); - GLStateManager.glDeleteBuffers(ubo); + GLSMBuffers.glDeleteBuffers(ubo); } } @Test void copyBufferSubDataMovesBytesIntoAndOutOfAUniformBuffer() { - final int src = GLStateManager.glGenBuffers(); - final int ubo = GLStateManager.glGenBuffers(); - final int dst = GLStateManager.glGenBuffers(); + final int src = GLSMBuffers.glGenBuffers(); + final int ubo = GLSMBuffers.glGenBuffers(); + final int dst = GLSMBuffers.glGenBuffers(); final ByteBuffer srcData = MemoryUtil.memAlloc(256); final ByteBuffer uboData = MemoryUtil.memAlloc(256); ByteBuffer outUbo = null; @@ -236,20 +236,20 @@ class GlsmSdlBufferMappingLifetimeTest { try { fill(srcData, 5); fill(uboData, 6); - GLStateManager.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src); - GLStateManager.glBufferData(GL31.GL_COPY_READ_BUFFER, srcData, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo); - GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, uboData, GL15.GL_DYNAMIC_DRAW); - GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_UNIFORM_BUFFER, 64, 64, 64); + GLSMBuffers.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src); + GLSMBuffers.glBufferData(GL31.GL_COPY_READ_BUFFER, srcData, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo); + GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, uboData, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_UNIFORM_BUFFER, 64, 64, 64); outUbo = readBack(GL31.GL_UNIFORM_BUFFER, 256); for (int i = 0; i < 256; i++) { final boolean copied = i >= 64 && i < 128; assertEquals(copied ? srcData.get(i) : uboData.get(i), outUbo.get(i), (copied ? "copied" : "untouched") + " byte " + i); } - GLStateManager.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst); - GLStateManager.glBufferData(GL31.GL_COPY_WRITE_BUFFER, 64L, GL15.GL_STATIC_DRAW); - GLStateManager.glCopyBufferSubData(GL31.GL_UNIFORM_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0, 0, 64); + GLSMBuffers.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst); + GLSMBuffers.glBufferData(GL31.GL_COPY_WRITE_BUFFER, 64L, GL15.GL_STATIC_DRAW); + GLSMBuffers.glCopyBufferSubData(GL31.GL_UNIFORM_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0, 0, 64); outDst = readBack(GL31.GL_COPY_WRITE_BUFFER, 64); assertPattern(outDst, 6); } finally { @@ -257,35 +257,35 @@ class GlsmSdlBufferMappingLifetimeTest { if (outDst != null) MemoryUtil.memFree(outDst); MemoryUtil.memFree(srcData); MemoryUtil.memFree(uboData); - GLStateManager.glDeleteBuffers(src); - GLStateManager.glDeleteBuffers(ubo); - GLStateManager.glDeleteBuffers(dst); + GLSMBuffers.glDeleteBuffers(src); + GLSMBuffers.glDeleteBuffers(ubo); + GLSMBuffers.glDeleteBuffers(dst); } } @Test void outOfRangeCopyBufferSubDataIsIgnored() { - final int src = GLStateManager.glGenBuffers(); - final int dst = GLStateManager.glGenBuffers(); + final int src = GLSMBuffers.glGenBuffers(); + final int dst = GLSMBuffers.glGenBuffers(); final ByteBuffer data = MemoryUtil.memAlloc(256); ByteBuffer outDst = null; try { fill(data, 6); - GLStateManager.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src); - GLStateManager.glBufferData(GL31.GL_COPY_READ_BUFFER, data, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst); + GLSMBuffers.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src); + GLSMBuffers.glBufferData(GL31.GL_COPY_READ_BUFFER, data, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst); data.clear(); - GLStateManager.glBufferData(GL31.GL_COPY_WRITE_BUFFER, data, GL15.GL_STATIC_DRAW); - GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 200, 0, 128); - GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0, 200, 128); - GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, -4, 0, 16); + GLSMBuffers.glBufferData(GL31.GL_COPY_WRITE_BUFFER, data, GL15.GL_STATIC_DRAW); + GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 200, 0, 128); + GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0, 200, 128); + GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, -4, 0, 16); outDst = readBack(GL31.GL_COPY_WRITE_BUFFER, 256); assertPattern(outDst, 6); } finally { if (outDst != null) MemoryUtil.memFree(outDst); MemoryUtil.memFree(data); - GLStateManager.glDeleteBuffers(src); - GLStateManager.glDeleteBuffers(dst); + GLSMBuffers.glDeleteBuffers(src); + GLSMBuffers.glDeleteBuffers(dst); } } @@ -294,17 +294,17 @@ class GlsmSdlBufferMappingLifetimeTest { void outOfRangeClearBufferSubDataIsIgnored(int target) { final int clearStart = 64; final int clearEnd = 96; - final int buffer = GLStateManager.glGenBuffers(); + final int buffer = GLSMBuffers.glGenBuffers(); final ByteBuffer data = MemoryUtil.memAlloc(256); ByteBuffer out = null; try { fill(data, 8); - GLStateManager.glBindBuffer(target, buffer); - GLStateManager.glBufferData(target, data, GL15.GL_DYNAMIC_DRAW); - GLStateManager.glClearBufferSubData(target, GL30.GL_R8, clearStart, clearEnd - clearStart, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null); - GLStateManager.glClearBufferSubData(target, GL30.GL_R8, 200, 128, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null); - GLStateManager.glClearBufferSubData(target, GL30.GL_R8, -4, 16, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null); - GLStateManager.glClearBufferSubData(target, GL30.GL_R8, 1024, 16, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null); + GLSMBuffers.glBindBuffer(target, buffer); + GLSMBuffers.glBufferData(target, data, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glClearBufferSubData(target, GL30.GL_R8, clearStart, clearEnd - clearStart, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null); + GLSMBuffers.glClearBufferSubData(target, GL30.GL_R8, 200, 128, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null); + GLSMBuffers.glClearBufferSubData(target, GL30.GL_R8, -4, 16, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null); + GLSMBuffers.glClearBufferSubData(target, GL30.GL_R8, 1024, 16, GL11.GL_RED, GL11.GL_UNSIGNED_BYTE, null); GlsmSdlHeadlessRig.endFrame(); GlsmSdlHeadlessRig.beginFrame(); out = readBack(target, 256); @@ -315,49 +315,49 @@ class GlsmSdlBufferMappingLifetimeTest { } finally { if (out != null) MemoryUtil.memFree(out); MemoryUtil.memFree(data); - GLStateManager.glDeleteBuffers(buffer); + GLSMBuffers.glDeleteBuffers(buffer); } } @Test void secondBufferStorageIsRefused() { final int target = GL15.GL_ARRAY_BUFFER; - final int id = GLStateManager.glGenBuffers(); + final int id = GLSMBuffers.glGenBuffers(); try { - GLStateManager.glBindBuffer(target, id); - GLStateManager.glBufferStorage(target, SIZE, PERSISTENT_STORAGE); - GLStateManager.glBufferStorage(target, SIZE * 2L, PERSISTENT_STORAGE); - assertEquals(GL11.GL_TRUE, GLStateManager.glGetBufferParameteri(target, GL44.GL_BUFFER_IMMUTABLE_STORAGE)); - assertEquals(SIZE, GLStateManager.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE)); + GLSMBuffers.glBindBuffer(target, id); + GLSMBuffers.glBufferStorage(target, SIZE, PERSISTENT_STORAGE); + GLSMBuffers.glBufferStorage(target, SIZE * 2L, PERSISTENT_STORAGE); + assertEquals(GL11.GL_TRUE, GLSMBuffers.glGetBufferParameteri(target, GL44.GL_BUFFER_IMMUTABLE_STORAGE)); + assertEquals(SIZE, GLSMBuffers.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE)); } finally { - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } } @Test void namedBufferDataOnImmutableStorageIsRefused() { final int target = GL15.GL_ARRAY_BUFFER; - final int id = GLStateManager.glGenBuffers(); + final int id = GLSMBuffers.glGenBuffers(); try { - GLStateManager.glBindBuffer(target, id); - GLStateManager.glBufferStorage(target, SIZE, PERSISTENT_STORAGE); - GLStateManager.glNamedBufferData(id, SIZE * 2L, GL15.GL_STATIC_DRAW); - assertEquals(SIZE, GLStateManager.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE)); + GLSMBuffers.glBindBuffer(target, id); + GLSMBuffers.glBufferStorage(target, SIZE, PERSISTENT_STORAGE); + GLSMBuffers.glNamedBufferData(id, SIZE * 2L, GL15.GL_STATIC_DRAW); + assertEquals(SIZE, GLSMBuffers.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE)); } finally { - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } } @Test void bufferStorageWithNullDataMarksBufferImmutable() { final int target = GL15.GL_ARRAY_BUFFER; - final int id = GLStateManager.glGenBuffers(); + final int id = GLSMBuffers.glGenBuffers(); try { - GLStateManager.glBindBuffer(target, id); - GLStateManager.glBufferStorage(target, (ByteBuffer) null, PERSISTENT_STORAGE); - assertEquals(GL11.GL_TRUE, GLStateManager.glGetBufferParameteri(target, GL44.GL_BUFFER_IMMUTABLE_STORAGE)); + GLSMBuffers.glBindBuffer(target, id); + GLSMBuffers.glBufferStorage(target, (ByteBuffer) null, PERSISTENT_STORAGE); + assertEquals(GL11.GL_TRUE, GLSMBuffers.glGetBufferParameteri(target, GL44.GL_BUFFER_IMMUTABLE_STORAGE)); } finally { - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } } @@ -370,74 +370,74 @@ class GlsmSdlBufferMappingLifetimeTest { @ParameterizedTest(name = "{0}") @MethodSource("plainMapTargets") void bufferDataOnMappedBufferUnmapsIt(String name, int target) { - final int id = GLStateManager.glGenBuffers(); + final int id = GLSMBuffers.glGenBuffers(); try { - GLStateManager.glBindBuffer(target, id); - GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); - assertNotNull(GLStateManager.glMapBufferRange(target, 0, SIZE, PLAIN_MAP)); - GLStateManager.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); - assertNotNull(GLStateManager.glMapBufferRange(target, 0, SIZE, PLAIN_MAP)); - assertTrue(GLStateManager.glUnmapBuffer(target)); + GLSMBuffers.glBindBuffer(target, id); + GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); + assertNotNull(GLSMBuffers.glMapBufferRange(target, 0, SIZE, PLAIN_MAP)); + GLSMBuffers.glBufferData(target, SIZE, GL15.GL_DYNAMIC_DRAW); + assertNotNull(GLSMBuffers.glMapBufferRange(target, 0, SIZE, PLAIN_MAP)); + assertTrue(GLSMBuffers.glUnmapBuffer(target)); } finally { - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } } @Test void outOfRangeFlushOfPersistentMappingIsIgnored() { final int target = GL15.GL_ARRAY_BUFFER; - final int id = GLStateManager.glGenBuffers(); + final int id = GLSMBuffers.glGenBuffers(); ByteBuffer out = null; try { final ByteBuffer mapped = mapPersistent(target, id); assertNotNull(mapped); - GLStateManager.glFlushMappedBufferRange(target, SIZE, 64); - GLStateManager.glFlushMappedBufferRange(target, SIZE - 16, 64); - GLStateManager.glFlushMappedBufferRange(target, -8, 16); + GLSMBuffers.glFlushMappedBufferRange(target, SIZE, 64); + GLSMBuffers.glFlushMappedBufferRange(target, SIZE - 16, 64); + GLSMBuffers.glFlushMappedBufferRange(target, -8, 16); fill(mapped, 9); - GLStateManager.glFlushMappedBufferRange(target, 0, SIZE); + GLSMBuffers.glFlushMappedBufferRange(target, 0, SIZE); out = readBack(target, SIZE); assertPattern(out, 9); } finally { if (out != null) MemoryUtil.memFree(out); - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } } @Test void persistentMappingAtNonZeroOffsetRoundTrips() { final int target = GL15.GL_ARRAY_BUFFER; - final int id = GLStateManager.glGenBuffers(); + final int id = GLSMBuffers.glGenBuffers(); final ByteBuffer out = MemoryUtil.memAlloc(SIZE); try { - GLStateManager.glBindBuffer(target, id); - GLStateManager.glBufferStorage(target, SIZE * 2L, PERSISTENT_STORAGE); - final ByteBuffer mapped = GLStateManager.glMapBufferRange(target, SIZE, SIZE, PERSISTENT_MAP); + GLSMBuffers.glBindBuffer(target, id); + GLSMBuffers.glBufferStorage(target, SIZE * 2L, PERSISTENT_STORAGE); + final ByteBuffer mapped = GLSMBuffers.glMapBufferRange(target, SIZE, SIZE, PERSISTENT_MAP); assertNotNull(mapped); fill(mapped, 10); - GLStateManager.glFlushMappedBufferRange(target, 0, SIZE); - GLStateManager.glGetBufferSubData(target, SIZE, out); + GLSMBuffers.glFlushMappedBufferRange(target, 0, SIZE); + GLSMBuffers.glGetBufferSubData(target, SIZE, out); assertPattern(out, 10); } finally { MemoryUtil.memFree(out); - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } } @Test void copyFromPersistentMappingShorterThanBufferReadsGpuContents() { - final int src = GLStateManager.glGenBuffers(); - final int dst = GLStateManager.glGenBuffers(); + final int src = GLSMBuffers.glGenBuffers(); + final int dst = GLSMBuffers.glGenBuffers(); final ByteBuffer data = MemoryUtil.memAlloc(SIZE * 2); ByteBuffer out = null; try { fill(data, 11); - GLStateManager.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src); - GLStateManager.glBufferStorage(GL31.GL_COPY_READ_BUFFER, data, PERSISTENT_STORAGE); - assertNotNull(GLStateManager.glMapBufferRange(GL31.GL_COPY_READ_BUFFER, 0, SIZE, PERSISTENT_MAP)); - GLStateManager.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst); - GLStateManager.glBufferData(GL31.GL_COPY_WRITE_BUFFER, SIZE, GL15.GL_STATIC_DRAW); - GLStateManager.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, SIZE, 0, 256); + GLSMBuffers.glBindBuffer(GL31.GL_COPY_READ_BUFFER, src); + GLSMBuffers.glBufferStorage(GL31.GL_COPY_READ_BUFFER, data, PERSISTENT_STORAGE); + assertNotNull(GLSMBuffers.glMapBufferRange(GL31.GL_COPY_READ_BUFFER, 0, SIZE, PERSISTENT_MAP)); + GLSMBuffers.glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, dst); + GLSMBuffers.glBufferData(GL31.GL_COPY_WRITE_BUFFER, SIZE, GL15.GL_STATIC_DRAW); + GLSMBuffers.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, SIZE, 0, 256); out = readBack(GL31.GL_COPY_WRITE_BUFFER, 256); for (int i = 0; i < 256; i++) { assertEquals(data.get(SIZE + i), out.get(i), "byte " + i); @@ -445,8 +445,8 @@ class GlsmSdlBufferMappingLifetimeTest { } finally { if (out != null) MemoryUtil.memFree(out); MemoryUtil.memFree(data); - GLStateManager.glDeleteBuffers(src); - GLStateManager.glDeleteBuffers(dst); + GLSMBuffers.glDeleteBuffers(src); + GLSMBuffers.glDeleteBuffers(dst); } } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlCopyBlitTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlCopyBlitTest.java index 4580b4518..4e3a9b7e5 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlCopyBlitTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlCopyBlitTest.java @@ -1,6 +1,10 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Tag; @@ -55,10 +59,10 @@ class GlsmSdlCopyBlitTest { GlsmSdlHeadlessRig.bindTarget(); GlsmSdlHeadlessRig.clearTo(0.0f, 0.0f, 1.0f, 1.0f); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, SIZE, SCISSOR_ROWS); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, SIZE, SCISSOR_ROWS); GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); assertRow(pixels, 0, RED, "inside the scissor"); @@ -68,15 +72,15 @@ class GlsmSdlCopyBlitTest { } private static int createTwoLevelTexture(int level0Argb, int level1Argb) { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 1); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MIN_LOD, 0.0f); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LOD, 1.0f); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0f); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 1); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MIN_LOD, 0.0f); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LOD, 1.0f); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0f); GlsmSdlHeadlessRig.uploadSolidLevel(0, SIZE, level0Argb); GlsmSdlHeadlessRig.uploadSolidLevel(1, SIZE / 2, level1Argb); return id; @@ -88,7 +92,7 @@ class GlsmSdlCopyBlitTest { GlsmSdlHeadlessRig.solidQuad(0.0f, 1.0f, 0.0f); final int texture = createTwoLevelTexture(RED, BLUE); - GLStateManager.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 1, 0, 0, 0, 0, SIZE / 2, SIZE / 2); + GLSMTextures.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 1, 0, 0, 0, 0, SIZE / 2, SIZE / 2); return texture; } @@ -136,17 +140,17 @@ class GlsmSdlCopyBlitTest { GlsmSdlHeadlessRig.solidQuad(0.0f, 1.0f, 0.0f); final int destination = GlsmSdlHeadlessRig.createDepthStencilFbo(); - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); GlsmSdlHeadlessRig.solidQuad(0.0f, 0.0f, 1.0f); GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, destination); - GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, destination); + GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT, GL11.GL_NEAREST); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, destination); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, destination); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); GlsmSdlHeadlessRig.assertPixel(pixels, SIZE, SIZE / 2, SIZE / 2, GREEN, "color aspect of a color+depth blit"); GlsmSdlHeadlessRig.assertPixel(pixels, SIZE, 4, SIZE - 5, GREEN, "color aspect of a color+depth blit"); @@ -160,45 +164,45 @@ class GlsmSdlCopyBlitTest { final int drawFbo = GlsmSdlHeadlessRig.fboWithColor(destination, dstLevel); final int dstExtent = Math.max(1, dstSize >> dstLevel); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo); - GLStateManager.glBlitFramebuffer(0, 0, SIZE / 2, SIZE / 2, 0, 0, dstExtent, dstExtent, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo); + GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE / 2, SIZE / 2, 0, 0, dstExtent, dstExtent, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(destination, dstLevel), GREEN, "destination level " + dstLevel + " after blitting source level 1"); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(source, 0), RED, "source level 0 is not the blit source"); if (dstLevel != 0) GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(destination, 0), BLUE, "destination level 0 is not the blit target"); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(readFbo); - GLStateManager.glDeleteFramebuffers(drawFbo); - GLStateManager.glDeleteTextures(source); - GLStateManager.glDeleteTextures(destination); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(readFbo); + GLSMFramebuffer.glDeleteFramebuffers(drawFbo); + GLSMTextures.glDeleteTextures(source); + GLSMTextures.glDeleteTextures(destination); } @Test void attachingToTheReadFramebufferLeavesTheDrawFramebufferAlone() { final int source = GlsmSdlHeadlessRig.createSolidTexture(GREEN); final int drawColor = GlsmSdlHeadlessRig.createSolidTexture(BLUE); - final int readFbo = GLStateManager.glGenFramebuffers(); + final int readFbo = GLSMFramebuffer.glGenFramebuffers(); final int drawFbo = GlsmSdlHeadlessRig.fboWithColor(drawColor, 0); try { - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, source, 0); - GLStateManager.glBlitFramebuffer(0, 0, 2, 2, 0, 0, 2, 2, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_READ_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, source, 0); + GLSMFramebuffer.glBlitFramebuffer(0, 0, 2, 2, 0, 0, 2, 2, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(drawColor, 0), GREEN, "the blit reads the read framebuffer's attachment"); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo); - GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo); + GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(drawColor, 0), RED, "the draw framebuffer kept its own attachment"); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(source, 0), GREEN, "the read attachment never became a draw target"); } finally { - GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(readFbo); - GLStateManager.glDeleteFramebuffers(drawFbo); - GLStateManager.glDeleteTextures(source); - GLStateManager.glDeleteTextures(drawColor); + GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(readFbo); + GLSMFramebuffer.glDeleteFramebuffers(drawFbo); + GLSMTextures.glDeleteTextures(source); + GLSMTextures.glDeleteTextures(drawColor); } } @@ -221,17 +225,17 @@ class GlsmSdlCopyBlitTest { GlsmSdlHeadlessRig.clearTo(0.0f, 1.0f, 0.0f, 1.0f); GlsmSdlHeadlessRig.solidQuad(0.0f, 1.0f, 0.0f); - GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, 0); - GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, 0); + GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, 4, 4); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, 4, 4); GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); GlsmSdlHeadlessRig.assertPixel(pixels, SIZE, SIZE / 2, SIZE / 2, GREEN, "blit into fbo0 survived the first fbo0 pass"); @@ -243,16 +247,16 @@ class GlsmSdlCopyBlitTest { GlsmSdlHeadlessRig.clearTo(0.0f, 0.0f, 0.0f, 1.0f); GlsmSdlHeadlessRig.solidQuad(0.0f, 0.0f, 0.0f); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); GlsmSdlHeadlessRig.halfQuad(-1.0f, 0.0f, 0.0f, 1.0f, 0.0f); GlsmSdlHeadlessRig.halfQuad(0.0f, 1.0f, 1.0f, 0.0f, 0.0f); GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0); - GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0); + GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); GlsmSdlHeadlessRig.bindTarget(); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); @@ -268,14 +272,14 @@ class GlsmSdlCopyBlitTest { GlsmSdlHeadlessRig.writeStencilOneInBottomHalf(); final int destination = GlsmSdlHeadlessRig.createDepthStencilFbo(); - GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, destination); - GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT, GL11.GL_NEAREST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, destination); + GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT, GL11.GL_NEAREST); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, destination); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, destination); GlsmSdlHeadlessRig.drawRedWhereStencilIsOne(); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); @@ -292,7 +296,7 @@ class GlsmSdlCopyBlitTest { private static int createPatternTexture() { final int id = GlsmSdlHeadlessRig.newNearestTexture(); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0); final ByteBuffer texels = MemoryUtil.memAlloc(SIZE * SIZE * 4); try { for (int y = 0; y < SIZE; y++) { @@ -300,7 +304,7 @@ class GlsmSdlCopyBlitTest { GlsmSdlHeadlessRig.putArgb(texels, y * SIZE + x, pattern(x, y)); } } - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); } finally { MemoryUtil.memFree(texels); } @@ -312,15 +316,15 @@ class GlsmSdlCopyBlitTest { final int destination = GlsmSdlHeadlessRig.createSolidMipTexture(SIZE, 0, UNTOUCHED); final int readFbo = GlsmSdlHeadlessRig.fboWithColor(source, 0); final int drawFbo = GlsmSdlHeadlessRig.fboWithColor(destination, 0); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo); - GLStateManager.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo); + GLSMFramebuffer.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); final int[] pixels = GlsmSdlHeadlessRig.readTextureLevel(destination, 0); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(readFbo); - GLStateManager.glDeleteFramebuffers(drawFbo); - GLStateManager.glDeleteTextures(source); - GLStateManager.glDeleteTextures(destination); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(readFbo); + GLSMFramebuffer.glDeleteFramebuffers(drawFbo); + GLSMTextures.glDeleteTextures(source); + GLSMTextures.glDeleteTextures(destination); return pixels; } @@ -372,19 +376,19 @@ class GlsmSdlCopyBlitTest { final int third = GlsmSdlHeadlessRig.createSolidMipTexture(SIZE, 0, UNTOUCHED); final int readFbo = GlsmSdlHeadlessRig.fboWithColor(source, 0); final int drawFbo = GlsmSdlHeadlessRig.fboWithColor(first, 0); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, skipped, 0); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT2, GL11.GL_TEXTURE_2D, third, 0); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, skipped, 0); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT2, GL11.GL_TEXTURE_2D, third, 0); final IntBuffer bufs = MemoryUtil.memAllocInt(3); try { bufs.put(0, GL30.GL_COLOR_ATTACHMENT0).put(1, GL11.GL_NONE).put(2, GL30.GL_COLOR_ATTACHMENT2); - GLStateManager.glDrawBuffers(bufs); + GLSMFramebuffer.glDrawBuffers(bufs); } finally { MemoryUtil.memFree(bufs); } - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo); - GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo); + GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); final int[] firstPixels = GlsmSdlHeadlessRig.readTextureLevel(first, 0); final int[] thirdPixels = GlsmSdlHeadlessRig.readTextureLevel(third, 0); @@ -396,12 +400,12 @@ class GlsmSdlCopyBlitTest { } GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTextureLevel(skipped, 0), UNTOUCHED, "attachment 1 behind a GL_NONE draw buffer"); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(readFbo); - GLStateManager.glDeleteFramebuffers(drawFbo); - GLStateManager.glDeleteTextures(source); - GLStateManager.glDeleteTextures(first); - GLStateManager.glDeleteTextures(skipped); - GLStateManager.glDeleteTextures(third); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(readFbo); + GLSMFramebuffer.glDeleteFramebuffers(drawFbo); + GLSMTextures.glDeleteTextures(source); + GLSMTextures.glDeleteTextures(first); + GLSMTextures.glDeleteTextures(skipped); + GLSMTextures.glDeleteTextures(third); } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlDegenerateDrawTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlDegenerateDrawTest.java index a5691742c..1ba677066 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlDegenerateDrawTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlDegenerateDrawTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; @@ -16,7 +16,7 @@ class GlsmSdlDegenerateDrawTest { @ParameterizedTest(name = "count {0}") @ValueSource(ints = {0, -3}) void degenerateCountDrawArraysLeavesTheFollowingDrawIntact(int count) { - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, count); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, count); GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(), RED, "after a drawArrays with count " + count); } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlEmptyBufferTransferTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlEmptyBufferTransferTest.java index 1a88e70f2..5fc891983 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlEmptyBufferTransferTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlEmptyBufferTransferTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -24,7 +24,7 @@ class GlsmSdlEmptyBufferTransferTest { @BeforeEach void setUp() { - id = GLStateManager.glGenBuffers(); + id = GLSMBuffers.glGenBuffers(); empty = MemoryUtil.memAlloc(16); empty.limit(0); } @@ -32,35 +32,35 @@ class GlsmSdlEmptyBufferTransferTest { @AfterEach void tearDown() { MemoryUtil.memFree(empty); - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } @Test void emptyBufferDataReplacesTheStoreWithoutACopy() { final int target = GL40.GL_DRAW_INDIRECT_BUFFER; - GLStateManager.glBindBuffer(target, id); - GLStateManager.glBufferData(target, 256L, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(target, id); + GLSMBuffers.glBufferData(target, 256L, GL15.GL_STATIC_DRAW); GlsmSdlHeadlessRig.resourceManager().flushUploadArena(); - GLStateManager.glBufferData(target, empty, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBufferData(target, empty, GL15.GL_STATIC_DRAW); assertEquals(0L, GlsmSdlHeadlessRig.frameManager().frame().arenaCopyPass); - assertEquals(0, GLStateManager.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE)); + assertEquals(0, GLSMBuffers.glGetBufferParameteri(target, GL15.GL_BUFFER_SIZE)); } @Test void emptyStorageBufferSubDataIssuesNoCopy() { final int target = GL43.GL_SHADER_STORAGE_BUFFER; - GLStateManager.glBindBuffer(target, id); - GLStateManager.glBufferData(target, 256L, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBindBuffer(target, id); + GLSMBuffers.glBufferData(target, 256L, GL15.GL_DYNAMIC_DRAW); final int before = GlsmSdlHeadlessRig.frameManager().frame().pendingUploadCommands; - GLStateManager.glBufferSubData(target, 0, empty); + GLSMBuffers.glBufferSubData(target, 0, empty); assertEquals(before, GlsmSdlHeadlessRig.frameManager().frame().pendingUploadCommands); } @Test void emptyGetBufferSubDataDoesNotReachTheDevice() { final int target = GL43.GL_SHADER_STORAGE_BUFFER; - GLStateManager.glBindBuffer(target, id); - GLStateManager.glBufferData(target, 256L, GL15.GL_DYNAMIC_DRAW); - GLStateManager.glGetBufferSubData(target, 0, empty); + GLSMBuffers.glBindBuffer(target, id); + GLSMBuffers.glBufferData(target, 256L, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glGetBufferSubData(target, 0, empty); } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlExternalUboPushTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlExternalUboPushTest.java index 48f8b1c57..5bcaca5ff 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlExternalUboPushTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlExternalUboPushTest.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.ffp.LogicOpFixture; import org.junit.jupiter.api.AfterEach; @@ -49,28 +50,28 @@ class GlsmSdlExternalUboPushTest { @AfterEach void cleanup() { - GLStateManager.glUseProgram(0); - GLStateManager.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, BINDING, 0); - if (ubo != 0) GLStateManager.glDeleteBuffers(ubo); - if (program != 0) GLStateManager.glDeleteProgram(program); + GLSMPrograms.glUseProgram(0); + GLSMBuffers.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, BINDING, 0); + if (ubo != 0) GLSMBuffers.glDeleteBuffers(ubo); + if (program != 0) GLSMPrograms.glDeleteProgram(program); LogicOpFixture.deleteResources(); } @Test void subDataBetweenDrawsReachesTheSecondDraw() { program = GlTestSupport.program(VERT, FRAG); - GLStateManager.glUniformBlockBinding(program, GLStateManager.glGetUniformBlockIndex(program, "Tint"), BINDING); + GLSMPrograms.glUniformBlockBinding(program, GLSMPrograms.glGetUniformBlockIndex(program, "Tint"), BINDING); - ubo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo); - GLStateManager.glBufferData(GL31.GL_UNIFORM_BUFFER, color(1f, 0f, 0f), GL15.GL_DYNAMIC_DRAW); - GLStateManager.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, BINDING, ubo); + ubo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo); + GLSMBuffers.glBufferData(GL31.GL_UNIFORM_BUFFER, color(1f, 0f, 0f), GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBindBufferBase(GL31.GL_UNIFORM_BUFFER, BINDING, ubo); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); LogicOpFixture.quad(UNUSED_COLOR); - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo); - GLStateManager.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 0, color(0f, 1f, 0f)); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, ubo); + GLSMBuffers.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 0, color(0f, 1f, 0f)); LogicOpFixture.quad(UNUSED_COLOR); final int got = pixelAt(GlsmSdlHeadlessRig.readTarget(), SIZE, SIZE / 2, SIZE / 2); diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFbo0ViewportTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFbo0ViewportTest.java index 3853fb078..72dc0580c 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFbo0ViewportTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFbo0ViewportTest.java @@ -1,6 +1,10 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.sdlgpu.resource.ResourceManager; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -42,27 +46,27 @@ class GlsmSdlFbo0ViewportTest { } private static void bindFbo0WithSmallViewport() { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glViewport(0, 0, VIEW, VIEW); - GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMRasterizer.glViewport(0, 0, VIEW, VIEW); + GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); } private static void bindFbo0WithFullViewport() { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glViewport(0, 0, FBO0_W, FBO0_H); - GLStateManager.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMRasterizer.glViewport(0, 0, FBO0_W, FBO0_H); + GLSMBlend.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); } private static int createCopyTarget() { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, VIEW, VIEW, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, VIEW, VIEW, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); return id; } @@ -84,11 +88,11 @@ class GlsmSdlFbo0ViewportTest { @Test void scissoredClearFlipsYOnFbo0() { bindFbo0WithFullViewport(); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, FBO0_W, VIEW); - GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, FBO0_W, VIEW); + GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(0, 0, FBO0_W, VIEW), RED, "GL scissor y=0 is the bottom rows of the FBO0 texture"); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(0, FBO0_H - VIEW, FBO0_W, VIEW), BLUE, "the top rows must stay untouched by the flipped scissor"); @@ -97,27 +101,27 @@ class GlsmSdlFbo0ViewportTest { @Test void scissorLargerThanFbo0StillCoversTheWholeTarget() { bindFbo0WithFullViewport(); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); try { - GLStateManager.glScissor(0, 0, FBO0_W + 16, FBO0_H + 16); + GLSMRasterizer.glScissor(0, 0, FBO0_W + 16, FBO0_H + 16); GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(0, 0, FBO0_W, FBO0_H), RED, "inside an oversize scissor"); } finally { - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); } } @Test void scissorRunningPastTheRightEdgeClipsToTheTarget() { bindFbo0WithFullViewport(); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); try { - GLStateManager.glScissor(FBO0_W - 8, 0, 32, FBO0_H); + GLSMRasterizer.glScissor(FBO0_W - 8, 0, 32, FBO0_H); GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(FBO0_W - 8, 0, 8, FBO0_H), RED, "inside the clipped scissor"); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(0, 0, FBO0_W - 8, FBO0_H), BLUE, "left of the scissor"); } finally { - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); } } @@ -128,7 +132,7 @@ class GlsmSdlFbo0ViewportTest { GlsmSdlHeadlessRig.halfQuad(0.0f, 1.0f, 1.0f, 0.0f, 0.0f); final int copy = createCopyTarget(); - GLStateManager.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, VIEW, VIEW); + GLSMTextures.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, VIEW, VIEW); drawTextureOverTarget(copy); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); @@ -141,15 +145,15 @@ class GlsmSdlFbo0ViewportTest { bindFbo0WithSmallViewport(); GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f); - final int copy = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, copy); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0); + final int copy = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, copy); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0); assertNull(GlsmSdlHeadlessRig.resourceManager().getTextureMeta(copy), "destination was allocated before the copy"); - GLStateManager.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 0, 0, VIEW, VIEW, 0); + GLSMTextures.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 0, 0, VIEW, VIEW, 0); final ResourceManager.TextureMeta meta = GlsmSdlHeadlessRig.resourceManager().getTextureMeta(copy); assertNotNull(meta, "copyTexImage2D did not allocate the destination"); @@ -159,7 +163,7 @@ class GlsmSdlFbo0ViewportTest { GlsmSdlHeadlessRig.endFrame(); final ByteBuffer out = MemoryUtil.memAlloc(VIEW * VIEW * 4); try { - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out); + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out); for (int i = 0; i < VIEW * VIEW; i++) { final int idx = i; assertEquals((byte) 0xFF, out.get(i * 4), () -> "R at texel " + idx); diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFfpTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFfpTest.java index 430f676ca..37cfb04c9 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFfpTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlFfpTest.java @@ -1,6 +1,11 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.ffp.CubeParityFixture; import com.gtnewhorizons.angelica.glsm.ffp.FfpFixture; import com.gtnewhorizons.angelica.glsm.ffp.Instancing; @@ -43,7 +48,7 @@ class GlsmSdlFfpTest { @AfterEach void cleanupInstancing() { - GLStateManager.setFfpInstancing(Instancing.NONE); + GLSMPrograms.setFfpInstancing(Instancing.NONE); CubeParityFixture.deleteResources(); ParticleParityFixture.deleteResources(); FfpFixture.EntityIdInstances.delete(); @@ -58,12 +63,12 @@ class GlsmSdlFfpTest { } private static void quadUnit0Only() { - GLStateManager.glBegin(GL11.GL_QUADS); + GLSMDraws.glBegin(GL11.GL_QUADS); GlsmSdlHeadlessRig.emitVertex(-1.0f, -1.0f, 0.0f, 0.0f, false, (short) 0); GlsmSdlHeadlessRig.emitVertex(1.0f, -1.0f, 1.0f, 0.0f, false, (short) 0); GlsmSdlHeadlessRig.emitVertex(1.0f, 1.0f, 1.0f, 1.0f, false, (short) 0); GlsmSdlHeadlessRig.emitVertex(-1.0f, 1.0f, 0.0f, 1.0f, false, (short) 0); - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } private static void quadTwoUnits(boolean vanillaBrightness) { @@ -102,15 +107,15 @@ class GlsmSdlFfpTest { enableLightmapUnit(true); GlsmSdlHeadlessRig.terrainRenderState(); - final int list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(0.0f, 0.0f, 0.0f); + final int list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(0.0f, 0.0f, 0.0f); quadTwoUnits(true); - GLStateManager.glPopMatrix(); - GLStateManager.glEndList(); + GLSMMatrices.glPopMatrix(); + GLSMDraws.glEndList(); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertTexelEverywhere("two units, glCallList"); GlsmSdlHeadlessRig.beginFrameAndClear(); @@ -118,7 +123,7 @@ class GlsmSdlFfpTest { final IntBuffer lists = BufferUtils.createIntBuffer(1); lists.put(0, list); lists.position(0); - GLStateManager.glCallLists(lists); + GLSMDraws.glCallLists(lists); assertTexelEverywhere("two units, glCallLists"); } @@ -126,7 +131,7 @@ class GlsmSdlFfpTest { void litTexturedQuadIsShaded() { bindBaseTexture(); enableGuiStandardItemLighting(); - GLStateManager.glEnable(GL12.GL_RESCALE_NORMAL); + GLSMEnable.glEnable(GL12.GL_RESCALE_NORMAL); quadUnit0Only(); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); @@ -186,30 +191,30 @@ class GlsmSdlFfpTest { } private static void enableGuiStandardItemLighting() { - GLStateManager.glPushMatrix(); - GLStateManager.glRotatef(-30.0f, 0.0f, 1.0f, 0.0f); - GLStateManager.glRotatef(165.0f, 1.0f, 0.0f, 0.0f); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glRotatef(-30.0f, 0.0f, 1.0f, 0.0f); + GLSMMatrices.glRotatef(165.0f, 1.0f, 0.0f, 0.0f); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glEnable(GL11.GL_LIGHT0); - GLStateManager.glEnable(GL11.GL_LIGHT1); - GLStateManager.glEnable(GL11.GL_COLOR_MATERIAL); - GLStateManager.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_LIGHT0); + GLSMEnable.glEnable(GL11.GL_LIGHT1); + GLSMEnable.glEnable(GL11.GL_COLOR_MATERIAL); + GLSMLighting.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE); final float[] first = normalize(0.2f, 1.0f, -0.7f); final float[] second = normalize(-0.2f, 1.0f, 0.7f); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(first[0], first[1], first[2], 0.0f)); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f)); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f)); - GLStateManager.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f)); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, floats(second[0], second[1], second[2], 0.0f)); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f)); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f)); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f)); - GLStateManager.glShadeModel(GL11.GL_FLAT); - GLStateManager.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.4f, 0.4f, 0.4f, 1.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, floats(first[0], first[1], first[2], 0.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, floats(second[0], second[1], second[2], 0.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, floats(0.6f, 0.6f, 0.6f, 1.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, floats(0.0f, 0.0f, 0.0f, 1.0f)); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_SPECULAR, floats(0.0f, 0.0f, 0.0f, 1.0f)); + GLSMRasterizer.glShadeModel(GL11.GL_FLAT); + GLSMLighting.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, floats(0.4f, 0.4f, 0.4f, 1.0f)); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } private static float[] normalize(float x, float y, float z) { diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlHeadlessRig.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlHeadlessRig.java index 35c88276d..62143d089 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlHeadlessRig.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlHeadlessRig.java @@ -1,5 +1,15 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.GlsmRedirectAgent; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; @@ -81,21 +91,21 @@ public final class GlsmSdlHeadlessRig { private static void createTarget() { beginFrame(); - colorTexture = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, colorTexture); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + colorTexture = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, colorTexture); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - depthRenderbuffer = GLStateManager.glGenRenderbuffers(); - GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthRenderbuffer); - GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE); + depthRenderbuffer = GLSMFramebuffer.glGenRenderbuffers(); + GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthRenderbuffer); + GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE); - fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, colorTexture, 0); - GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depthRenderbuffer); - GLStateManager.glViewport(0, 0, SIZE, SIZE); + fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, colorTexture, 0); + GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depthRenderbuffer); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); PipelineCache.setSwapchainFormats(new int[]{ colorTargetSdlFormat() }); endFrame(); @@ -149,51 +159,51 @@ public final class GlsmSdlHeadlessRig { } public static void bindTarget() { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glViewport(0, 0, SIZE, SIZE); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); } public static int createDepthStencilFbo() { - final int color = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, color); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + final int color = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, color); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, SIZE, SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - final int depth = GLStateManager.glGenRenderbuffers(); - GLStateManager.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depth); - GLStateManager.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE); + final int depth = GLSMFramebuffer.glGenRenderbuffers(); + GLSMFramebuffer.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depth); + GLSMFramebuffer.glRenderbufferStorage(GL30.GL_RENDERBUFFER, GL30.GL_DEPTH24_STENCIL8, SIZE, SIZE); - final int fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, color, 0); - GLStateManager.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depth); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, color, 0); + GLSMFramebuffer.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT, GL30.GL_RENDERBUFFER, depth); return fbo; } public static void writeStencilOneInBottomHalf() { - GLStateManager.glClearStencil(0); - GLStateManager.glStencilMask(0xFF); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.glStencilFunc(GL11.GL_ALWAYS, 1, 0xFF); - GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE); + GLSMDepthStencilAlpha.glClearStencil(0); + GLSMDepthStencilAlpha.glStencilMask(0xFF); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_ALWAYS, 1, 0xFF); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE); halfQuad(-1.0f, 0.0f, 0.0f, 1.0f, 0.0f); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); } public static void drawRedWhereStencilIsOne() { - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF); - GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); solidQuad(1.0f, 0.0f, 0.0f); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); } public static void clearTo(float r, float g, float b, float a) { - GLStateManager.glClearColor(r, g, b, a); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMBlend.glClearColor(r, g, b, a); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); } public static void beginFrameAndClear() { @@ -210,59 +220,59 @@ public final class GlsmSdlHeadlessRig { } public static void resetState() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); - GLStateManager.glDisable(GL11.GL_FOG); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glDisable(GL11.GL_LIGHT0); - GLStateManager.glDisable(GL11.GL_LIGHT1); - GLStateManager.glDisable(GL11.GL_COLOR_MATERIAL); - GLStateManager.glDisable(GL12.GL_RESCALE_NORMAL); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDisable(GL11.GL_CULL_FACE); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.glShadeModel(GL11.GL_SMOOTH); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); + GLSMEnable.glDisable(GL11.GL_FOG); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_LIGHT0); + GLSMEnable.glDisable(GL11.GL_LIGHT1); + GLSMEnable.glDisable(GL11.GL_COLOR_MATERIAL); + GLSMEnable.glDisable(GL12.GL_RESCALE_NORMAL); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); } public static void terrainRenderState() { - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f); - GLStateManager.glEnable(GL11.GL_FOG); - GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); - GLStateManager.glFogf(GL11.GL_FOG_START, 1.0e6f); - GLStateManager.glFogf(GL11.GL_FOG_END, 1.0e7f); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f); + GLSMEnable.glEnable(GL11.GL_FOG); + GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); + GLSMFog.glFogf(GL11.GL_FOG_START, 1.0e6f); + GLSMFog.glFogf(GL11.GL_FOG_END, 1.0e7f); } public static int newNearestTexture() { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); return id; } public static int fboWithColor(int texture, int level) { - final int fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, level); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, level); return fbo; } @@ -278,7 +288,7 @@ public final class GlsmSdlHeadlessRig { final ByteBuffer texels = MemoryUtil.memAlloc(size * size * 4); try { for (int i = 0; i < size * size; i++) putArgb(texels, i, argb); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); } finally { MemoryUtil.memFree(texels); } @@ -291,12 +301,12 @@ public final class GlsmSdlHeadlessRig { } public static int createLightmapTexture(boolean brightCornersOnly) { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, LIGHTMAP_SIZE, LIGHTMAP_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, LIGHTMAP_SIZE, LIGHTMAP_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); final ByteBuffer texels = MemoryUtil.memAlloc(LIGHTMAP_SIZE * LIGHTMAP_SIZE * 4); try { final int last = LIGHTMAP_SIZE - 1; @@ -306,74 +316,74 @@ public final class GlsmSdlHeadlessRig { putArgb(texels, y * LIGHTMAP_SIZE + x, bright ? 0xFFFFFFFF : GREEN); } } - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, LIGHTMAP_SIZE, LIGHTMAP_SIZE, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, LIGHTMAP_SIZE, LIGHTMAP_SIZE, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); } finally { MemoryUtil.memFree(texels); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); return id; } public static void bindBaseTexture(int texture) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); } public static void quadTwoUnits(short brightness) { - GLStateManager.glBegin(GL11.GL_QUADS); + GLSMDraws.glBegin(GL11.GL_QUADS); emitVertex(-1.0f, -1.0f, 0.0f, 0.0f, true, brightness); emitVertex(1.0f, -1.0f, 1.0f, 0.0f, true, brightness); emitVertex(1.0f, 1.0f, 1.0f, 1.0f, true, brightness); emitVertex(-1.0f, 1.0f, 0.0f, 1.0f, true, brightness); - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } public static void enableLightmapUnit(int lightmapTexture, boolean vanillaTextureMatrix) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); if (vanillaTextureMatrix) { final float scale = 0.00390625f; - GLStateManager.glScalef(scale, scale, scale); - GLStateManager.glTranslatef(8.0f, 8.0f, 8.0f); + GLSMMatrices.glScalef(scale, scale, scale); + GLSMMatrices.glTranslatef(8.0f, 8.0f, 8.0f); } - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } public static void emitVertex(float x, float y, float u, float v, boolean lightmap, short brightness) { - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f); - GLStateManager.glTexCoord2f(u, v); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f); + GLSMCurrentAttribs.glTexCoord2f(u, v); if (lightmap) { - GLStateManager.glMultiTexCoord2s(GL13.GL_TEXTURE1, brightness, brightness); + GLSMCurrentAttribs.glMultiTexCoord2s(GL13.GL_TEXTURE1, brightness, brightness); } - GLStateManager.glVertex3f(x, y, 0.0f); + GLSMDraws.glVertex3f(x, y, 0.0f); } private static void vertex(float x, float y, float r, float g, float b) { - GLStateManager.glColor4f(r, g, b, 1.0f); - GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f); - GLStateManager.glVertex3f(x, y, 0.0f); + GLSMCurrentAttribs.glColor4f(r, g, b, 1.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f); + GLSMDraws.glVertex3f(x, y, 0.0f); } private static void texVertex(float x, float y, float u, float v) { - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glNormal3f(0.0f, 0.0f, 1.0f); - GLStateManager.glTexCoord2f(u, v); - GLStateManager.glVertex3f(x, y, 0.0f); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glNormal3f(0.0f, 0.0f, 1.0f); + GLSMCurrentAttribs.glTexCoord2f(u, v); + GLSMDraws.glVertex3f(x, y, 0.0f); } public static void halfQuad(float y0, float y1, float r, float g, float b) { - GLStateManager.glBegin(GL11.GL_QUADS); + GLSMDraws.glBegin(GL11.GL_QUADS); vertex(-1.0f, y0, r, g, b); vertex(1.0f, y0, r, g, b); vertex(1.0f, y1, r, g, b); vertex(-1.0f, y1, r, g, b); - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } public static void solidQuad(float r, float g, float b) { @@ -381,16 +391,16 @@ public final class GlsmSdlHeadlessRig { } public static void texturedQuad(int texture, float extent) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glBegin(GL11.GL_QUADS); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMDraws.glBegin(GL11.GL_QUADS); texVertex(-extent, -extent, 0.0f, 0.0f); texVertex(extent, -extent, 1.0f, 0.0f); texVertex(extent, extent, 1.0f, 1.0f); texVertex(-extent, extent, 0.0f, 1.0f); - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } public static int[] readTarget() { @@ -406,7 +416,7 @@ public final class GlsmSdlHeadlessRig { final ByteBuffer pixels = MemoryUtil.memAlloc(w * h * 4); try { for (int i = 0; i < w * h * 4; i++) pixels.put(i, fill); - GLStateManager.glReadPixels(x, y, w, h, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + GLSMFramebuffer.glReadPixels(x, y, w, h, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); return toArgb(pixels, w * h); } finally { MemoryUtil.memFree(pixels); @@ -414,12 +424,12 @@ public final class GlsmSdlHeadlessRig { } public static int createSolidMipTexture(int size, int maxLevel, int argb) { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, maxLevel); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, maxLevel); for (int level = 0; level <= maxLevel; level++) { uploadSolidLevel(level, Math.max(1, size >> level), argb); } @@ -427,13 +437,13 @@ public final class GlsmSdlHeadlessRig { } public static int[] readTextureLevel(int texture, int level) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - final int w = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_WIDTH); - final int h = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + final int w = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_WIDTH); + final int h = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT); final ByteBuffer pixels = MemoryUtil.memAlloc(w * h * 4); try { - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); return toArgb(pixels, w * h); } finally { MemoryUtil.memFree(pixels); diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlIndexedBlendRestoreTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlIndexedBlendRestoreTest.java index 4426d2f59..ae26e73aa 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlIndexedBlendRestoreTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlIndexedBlendRestoreTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.sdlgpu.SdlAsserts; import com.gtnewhorizons.angelica.sdlgpu.SdlTestRig; @@ -25,7 +25,7 @@ class GlsmSdlIndexedBlendRestoreTest { } private static void vanillaBlendFunc() { - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); } @Test @@ -43,9 +43,9 @@ class GlsmSdlIndexedBlendRestoreTest { for (int i = 0; i < ContextState.MAX_COLOR_ATTACHMENTS; i++) { SdlAsserts.assertBlendFactors(p, i, SDL_GPU_BLENDFACTOR_SRC_ALPHA, SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, SDL_GPU_BLENDFACTOR_ONE, SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, "restore"); } - assertFalse(GLStateManager.getBlendState().isFuncUnknown(), "restore forward must clear the unknown flag"); + assertFalse(GLSMBlend.getBlendState().isFuncUnknown(), "restore forward must clear the unknown flag"); } finally { - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); } } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlInstancedConstantTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlInstancedConstantTest.java index d36fdca9e..1714083b1 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlInstancedConstantTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlInstancedConstantTest.java @@ -1,6 +1,10 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.sdlgpu.SDLGPUGate; @@ -53,22 +57,22 @@ class GlsmSdlInstancedConstantTest { Reflect.set(device, "driverName", "metal"); final int program = GlTestSupport.program(VERT, FRAG); - final int vao = GLStateManager.glGenVertexArrays(); - final int vbo = GLStateManager.glGenBuffers(); + final int vao = GLSMVertexInput.glGenVertexArrays(); + final int vbo = GLSMBuffers.glGenBuffers(); final FloatBuffer quad = MemoryUtil.memAllocFloat(12); try { quad.put(new float[] { 0, -1, 1, -1, 1, 1, 0, -1, 1, 1, 0, 1 }).flip(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, quad, GL15.GL_STATIC_DRAW); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 8, 0L); - GLStateManager.glDisableVertexAttribArray(TINT_LOCATION); - GLStateManager.glVertexAttrib4f(TINT_LOCATION, 0.2f, 0.4f, 0.6f, 1.0f); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, quad, GL15.GL_STATIC_DRAW); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 8, 0L); + GLSMVertexInput.glDisableVertexAttribArray(TINT_LOCATION); + GLSMCurrentAttribs.glVertexAttrib4f(TINT_LOCATION, 0.2f, 0.4f, 0.6f, 1.0f); - GLStateManager.glUseProgram(program); - GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 6, INSTANCES); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(program); + GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 6, INSTANCES); + GLSMPrograms.glUseProgram(0); final int[] row = GlsmSdlHeadlessRig.readTarget(0, GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE, 1); final int expected = 0xFF000000 | (51 << 16) | (102 << 8) | 153; @@ -80,11 +84,11 @@ class GlsmSdlInstancedConstantTest { } finally { Reflect.set(device, "driverName", driver); MemoryUtil.memFree(quad); - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDeleteBuffers(vbo); - GLStateManager.glDeleteVertexArrays(vao); - GLStateManager.glDeleteProgram(program); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glDeleteBuffers(vbo); + GLSMVertexInput.glDeleteVertexArrays(vao); + GLSMPrograms.glDeleteProgram(program); } } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLWJGLServiceRoutingTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLWJGLServiceRoutingTest.java index 85ce7ecc4..4220a1a8d 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLWJGLServiceRoutingTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLWJGLServiceRoutingTest.java @@ -1,5 +1,8 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.states.PixelStoreState; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; @@ -43,11 +46,11 @@ class GlsmSdlLWJGLServiceRoutingTest { final int buffer = svc.glGenBuffers(); svc.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); svc.glBufferData(GL15.GL_ARRAY_BUFFER, 64L, GL15.GL_STATIC_DRAW); - assertEquals(buffer, GLStateManager.getBoundVBO()); + assertEquals(buffer, GLSMBuffers.getBoundVBO()); svc.glDeleteBuffers(buffer); - assertEquals(0, GLStateManager.getBoundVBO()); + assertEquals(0, GLSMBuffers.getBoundVBO()); } @Test @@ -71,9 +74,9 @@ class GlsmSdlLWJGLServiceRoutingTest { void clearColorUpdatesTheGlsmCache() { svc.glClearColor(0.25f, 0.5f, 0.75f, 1.0f); - assertEquals(0.25f, GLStateManager.getClearColor().getRed()); - assertEquals(0.5f, GLStateManager.getClearColor().getGreen()); - assertEquals(0.75f, GLStateManager.getClearColor().getBlue()); + assertEquals(0.25f, GLSMBlend.getClearColor().getRed()); + assertEquals(0.5f, GLSMBlend.getClearColor().getGreen()); + assertEquals(0.75f, GLSMBlend.getClearColor().getBlue()); } @Test @@ -93,11 +96,11 @@ class GlsmSdlLWJGLServiceRoutingTest { final int framebuffer = svc.glGenFramebuffers(); try { svc.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer); - assertEquals(framebuffer, GLStateManager.getDrawFramebuffer()); + assertEquals(framebuffer, GLSMFramebuffer.getDrawFramebuffer()); svc.glDeleteFramebuffers(framebuffer); - assertEquals(0, GLStateManager.getDrawFramebuffer()); + assertEquals(0, GLSMFramebuffer.getDrawFramebuffer()); } finally { GlsmSdlHeadlessRig.bindTarget(); } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLegacyQueryTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLegacyQueryTest.java index 58be05eb8..14e4a7c77 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLegacyQueryTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLegacyQueryTest.java @@ -1,5 +1,12 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.LegacyQueryFixture; import org.junit.jupiter.api.Tag; @@ -38,7 +45,7 @@ class GlsmSdlLegacyQueryTest { // fails the non-zero expectations below. @Test void legacyQueriesAreAnsweredWithoutTheBackend() { - final int base = GLStateManager.getAttribDepth(); + final int base = GLSMAttribStack.getAttribDepth(); final IntBuffer ints = BufferUtils.createIntBuffer(16); final FloatBuffer floats = BufferUtils.createFloatBuffer(16); final DoubleBuffer doubles = BufferUtils.createDoubleBuffer(16); @@ -46,91 +53,91 @@ class GlsmSdlLegacyQueryTest { final FloatBuffer positions = BufferUtils.createFloatBuffer(12); final FloatBuffer other = BufferUtils.createFloatBuffer(12); final FloatBuffer savedColor = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor); - final boolean savedLighting = GLStateManager.glIsEnabled(GL11.GL_LIGHTING); - final boolean savedEdge = GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG); + GLSMQueries.glGetFloat(GL11.GL_CURRENT_COLOR, savedColor); + final boolean savedLighting = GLSMEnable.glIsEnabled(GL11.GL_LIGHTING); + final boolean savedEdge = GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG); final int[] savedHints = new int[HINT_TARGETS.length]; for (int i = 0; i < HINT_TARGETS.length; i++) { - savedHints[i] = GLStateManager.glGetInteger(HINT_TARGETS[i]); + savedHints[i] = GLSMQueries.glGetInteger(HINT_TARGETS[i]); } try { - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); - assertEquals(GL13.GL_TEXTURE1, GLStateManager.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); - GLStateManager.glClientActiveTexture(0); - assertEquals(1, GLStateManager.getClientActiveTextureUnit(), "an invalid unit is rejected"); - assertEquals(GLStateManager.MAX_TEXTURE_COORDS, GLStateManager.glGetInteger(GL20.GL_MAX_TEXTURE_COORDS)); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); + assertEquals(GL13.GL_TEXTURE1, GLSMQueries.glGetInteger(GL13.GL_CLIENT_ACTIVE_TEXTURE)); + GLSMTextures.glClientActiveTexture(0); + assertEquals(1, GLSMTextures.getClientActiveTextureUnit(), "an invalid unit is rejected"); + assertEquals(GLStateManager.MAX_TEXTURE_COORDS, GLSMQueries.glGetInteger(GL20.GL_MAX_TEXTURE_COORDS)); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); for (final int cap : CLIENT_ARRAY_CAPS) { - final boolean was = GLStateManager.glIsEnabled(cap); + final boolean was = GLSMEnable.glIsEnabled(cap); assertEnableRoundTrip(cap, true); - if (was) GLStateManager.glEnableClientState(cap); + if (was) GLSMVertexInput.glEnableClientState(cap); } for (final int cap : CACHE_ONLY_CAPS) { - final boolean was = GLStateManager.glIsEnabled(cap); + final boolean was = GLSMEnable.glIsEnabled(cap); assertEnableRoundTrip(cap, false); setEnabled(cap, was); } - GLStateManager.glEdgeFlag(false); - assertFalse(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG)); - GLStateManager.glEdgeFlag(true); - assertTrue(GLStateManager.glGetBoolean(GL11.GL_EDGE_FLAG)); + GLSMCurrentAttribs.glEdgeFlag(false); + assertFalse(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG)); + GLSMCurrentAttribs.glEdgeFlag(true); + assertTrue(GLSMQueries.glGetBoolean(GL11.GL_EDGE_FLAG)); for (final int target : HINT_TARGETS) { final String name = hex(target); - GLStateManager.glHint(target, GL11.GL_NICEST); - assertEquals(GL11.GL_NICEST, GLStateManager.glGetInteger(target), "set " + name); - assertEquals((float) GL11.GL_NICEST, GLStateManager.glGetFloat(target), "float " + name); - GLStateManager.glPushAttrib(GL11.GL_HINT_BIT); - GLStateManager.glHint(target, GL11.GL_FASTEST); - assertEquals(GL11.GL_FASTEST, GLStateManager.glGetInteger(target), "inside push " + name); - GLStateManager.glPopAttrib(); - assertEquals(GL11.GL_NICEST, GLStateManager.glGetInteger(target), "after pop " + name); + GLSMRasterizer.glHint(target, GL11.GL_NICEST); + assertEquals(GL11.GL_NICEST, GLSMQueries.glGetInteger(target), "set " + name); + assertEquals((float) GL11.GL_NICEST, GLSMQueries.glGetFloat(target), "float " + name); + GLSMAttribStack.glPushAttrib(GL11.GL_HINT_BIT); + GLSMRasterizer.glHint(target, GL11.GL_FASTEST); + assertEquals(GL11.GL_FASTEST, GLSMQueries.glGetInteger(target), "inside push " + name); + GLSMAttribStack.glPopAttrib(); + assertEquals(GL11.GL_NICEST, GLSMQueries.glGetInteger(target), "after pop " + name); } - GLStateManager.glVertexPointer(3, 12, positions); - GLStateManager.glFogCoordPointer(4, positions); - assertEquals(3, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE)); - assertEquals(GL11.GL_FLOAT, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_TYPE)); - assertEquals(12, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE)); - assertEquals(0, GLStateManager.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING)); - assertEquals(4, GLStateManager.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE)); - assertEquals(3, GLStateManager.glGetInteger(GL14.GL_SECONDARY_COLOR_ARRAY_SIZE)); - GLStateManager.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); - GLStateManager.glVertexPointer(2, 8, other); - GLStateManager.glFogCoordPointer(8, other); - GLStateManager.glEnableClientState(GL14.GL_FOG_COORDINATE_ARRAY); - assertEquals(2, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE)); - GLStateManager.glPopClientAttrib(); - assertEquals(3, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE), "client attrib pop restores the pointer"); - assertEquals(12, GLStateManager.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE)); - assertEquals(4, GLStateManager.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE)); - assertFalse(GLStateManager.glIsEnabled(GL14.GL_FOG_COORDINATE_ARRAY)); + GLSMVertexInput.glVertexPointer(3, 12, positions); + GLSMVertexInput.glFogCoordPointer(4, positions); + assertEquals(3, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE)); + assertEquals(GL11.GL_FLOAT, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_TYPE)); + assertEquals(12, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE)); + assertEquals(0, GLSMQueries.glGetInteger(GL15.GL_VERTEX_ARRAY_BUFFER_BINDING)); + assertEquals(4, GLSMQueries.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE)); + assertEquals(3, GLSMQueries.glGetInteger(GL14.GL_SECONDARY_COLOR_ARRAY_SIZE)); + GLSMAttribStack.glPushClientAttrib(GL11.GL_CLIENT_VERTEX_ARRAY_BIT); + GLSMVertexInput.glVertexPointer(2, 8, other); + GLSMVertexInput.glFogCoordPointer(8, other); + GLSMVertexInput.glEnableClientState(GL14.GL_FOG_COORDINATE_ARRAY); + assertEquals(2, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE)); + GLSMAttribStack.glPopClientAttrib(); + assertEquals(3, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_SIZE), "client attrib pop restores the pointer"); + assertEquals(12, GLSMQueries.glGetInteger(GL11.GL_VERTEX_ARRAY_STRIDE)); + assertEquals(4, GLSMQueries.glGetInteger(GL14.GL_FOG_COORDINATE_ARRAY_STRIDE)); + assertFalse(GLSMEnable.glIsEnabled(GL14.GL_FOG_COORDINATE_ARRAY)); - GLStateManager.glColor4f(1.0f, 0.5f, 0.0f, 1.0f); - GLStateManager.glGetInteger(GL11.GL_CURRENT_COLOR, ints); + GLSMCurrentAttribs.glColor4f(1.0f, 0.5f, 0.0f, 1.0f); + GLSMQueries.glGetInteger(GL11.GL_CURRENT_COLOR, ints); assertEquals(2147483647, ints.get(0)); assertEquals(1073741823, ints.get(1)); assertEquals(0, ints.get(2)); - GLStateManager.glEnable(GL11.GL_LIGHTING); - assertEquals(1, GLStateManager.glGetInteger(GL11.GL_LIGHTING)); - assertEquals(1.0f, GLStateManager.glGetFloat(GL11.GL_LIGHTING)); - assertEquals((float) GLStateManager.glGetInteger(GL11.GL_FOG_MODE), GLStateManager.glGetFloat(GL11.GL_FOG_MODE)); - assertEquals(GL11.GL_RENDER, GLStateManager.glGetInteger(GL11.GL_RENDER_MODE)); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + assertEquals(1, GLSMQueries.glGetInteger(GL11.GL_LIGHTING)); + assertEquals(1.0f, GLSMQueries.glGetFloat(GL11.GL_LIGHTING)); + assertEquals((float) GLSMQueries.glGetInteger(GL11.GL_FOG_MODE), GLSMQueries.glGetFloat(GL11.GL_FOG_MODE)); + assertEquals(GL11.GL_RENDER, GLSMQueries.glGetInteger(GL11.GL_RENDER_MODE)); for (final int pname : LegacyQueryFixture.legacyPnames()) { final String name = hex(pname); - final int scalar = GLStateManager.glGetInteger(pname); - final float scalarFloat = GLStateManager.glGetFloat(pname); - final boolean scalarBool = GLStateManager.glGetBoolean(pname); + final int scalar = GLSMQueries.glGetInteger(pname); + final float scalarFloat = GLSMQueries.glGetFloat(pname); + final boolean scalarBool = GLSMQueries.glGetBoolean(pname); ints.clear(); - GLStateManager.glGetInteger(pname, ints); + GLSMQueries.glGetInteger(pname, ints); floats.clear(); - GLStateManager.glGetFloat(pname, floats); + GLSMQueries.glGetFloat(pname, floats); doubles.clear(); - GLStateManager.glGetDouble(pname, doubles); + GLSMQueries.glGetDouble(pname, doubles); bytes.clear(); - GLStateManager.glGetBoolean(pname, bytes); + GLSMQueries.glGetBoolean(pname, bytes); assertEquals(scalar, ints.get(0), "IntBuffer overload for " + name); assertEquals(scalarFloat, floats.get(0), "FloatBuffer overload for " + name); assertEquals((double) scalarFloat, doubles.get(0), "DoubleBuffer overload for " + name); @@ -139,13 +146,13 @@ class GlsmSdlLegacyQueryTest { } finally { drainClientAttribStack(); popAttribTo(base); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDisableClientState(GL14.GL_FOG_COORDINATE_ARRAY); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glDisableClientState(GL14.GL_FOG_COORDINATE_ARRAY); for (int i = 0; i < HINT_TARGETS.length; i++) { - GLStateManager.glHint(HINT_TARGETS[i], savedHints[i]); + GLSMRasterizer.glHint(HINT_TARGETS[i], savedHints[i]); } - GLStateManager.glEdgeFlag(savedEdge); - GLStateManager.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3)); + GLSMCurrentAttribs.glEdgeFlag(savedEdge); + GLSMCurrentAttribs.glColor4f(savedColor.get(0), savedColor.get(1), savedColor.get(2), savedColor.get(3)); setEnabled(GL11.GL_LIGHTING, savedLighting); } } @@ -153,33 +160,33 @@ class GlsmSdlLegacyQueryTest { @Test void pointParametersRoundTrip() { final FloatBuffer attenuation = BufferUtils.createFloatBuffer(16); - final float savedMin = GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN); - final float savedMax = GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX); - final float savedThreshold = GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE); - final int savedOrigin = GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN); - final int base = GLStateManager.getAttribDepth(); + final float savedMin = GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN); + final float savedMax = GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX); + final float savedThreshold = GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE); + final int savedOrigin = GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN); + final int base = GLSMAttribStack.getAttribDepth(); try { assertEquals(1.0f, savedMax); - GLStateManager.glPushAttrib(GL11.GL_POINT_BIT); - GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 2.0f); - GLStateManager.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 8.0f); - GLStateManager.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 3.0f); - GLStateManager.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_LOWER_LEFT); + GLSMAttribStack.glPushAttrib(GL11.GL_POINT_BIT); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MIN, 2.0f); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_SIZE_MAX, 8.0f); + GLSMRasterizer.glPointParameterf(GL14.GL_POINT_FADE_THRESHOLD_SIZE, 3.0f); + GLSMRasterizer.glPointParameteri(GL20.GL_POINT_SPRITE_COORD_ORIGIN, GL20.GL_LOWER_LEFT); attenuation.clear(); attenuation.put(0, 0.5f).put(1, 0.25f).put(2, 0.125f); - GLStateManager.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); - assertEquals(2.0f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN)); - assertEquals(8.0f, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX)); - assertEquals(3.0f, GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE)); - assertEquals(GL20.GL_LOWER_LEFT, GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); + GLSMRasterizer.glPointParameter(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); + assertEquals(2.0f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN)); + assertEquals(8.0f, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX)); + assertEquals(3.0f, GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE)); + assertEquals(GL20.GL_LOWER_LEFT, GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); attenuation.clear(); - GLStateManager.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); + GLSMQueries.glGetFloat(GL14.GL_POINT_DISTANCE_ATTENUATION, attenuation); assertEquals(0.25f, attenuation.get(1)); - GLStateManager.glPopAttrib(); - assertEquals(savedMin, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MIN)); - assertEquals(savedMax, GLStateManager.glGetFloat(GL14.GL_POINT_SIZE_MAX)); - assertEquals(savedThreshold, GLStateManager.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE)); - assertEquals(savedOrigin, GLStateManager.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); + GLSMAttribStack.glPopAttrib(); + assertEquals(savedMin, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MIN)); + assertEquals(savedMax, GLSMQueries.glGetFloat(GL14.GL_POINT_SIZE_MAX)); + assertEquals(savedThreshold, GLSMQueries.glGetFloat(GL14.GL_POINT_FADE_THRESHOLD_SIZE)); + assertEquals(savedOrigin, GLSMQueries.glGetInteger(GL20.GL_POINT_SPRITE_COORD_ORIGIN)); } finally { popAttribTo(base); } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLogicOpTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLogicOpTest.java index a8eb04cb7..e634f737d 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLogicOpTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlLogicOpTest.java @@ -1,6 +1,11 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.ffp.LogicOpFixture; import org.junit.jupiter.api.AfterEach; @@ -58,10 +63,10 @@ class GlsmSdlLogicOpTest { @AfterEach void cleanup() { - GLStateManager.glDisable(GL11.GL_COLOR_LOGIC_OP); - GLStateManager.glLogicOp(GL11.GL_COPY); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glUseProgram(0); + GLSMEnable.glDisable(GL11.GL_COLOR_LOGIC_OP); + GLSMBlend.glLogicOp(GL11.GL_COPY); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMPrograms.glUseProgram(0); LogicOpFixture.deleteResources(); } @@ -80,8 +85,8 @@ class GlsmSdlLogicOpTest { @Test void blendingIsIgnoredWhileLogicOpIsEnabled() { - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); final int[] src = LogicOpFixture.SOURCES[1]; LogicOpFixture.clearToDst(); LogicOpFixture.drawQuad(GL11.GL_XOR, src); @@ -93,8 +98,8 @@ class GlsmSdlLogicOpTest { final int[] src = LogicOpFixture.SOURCES[1]; LogicOpFixture.clearToDst(); LogicOpFixture.drawQuad(GL11.GL_XOR, src); - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); LogicOpFixture.quad(src); final int got = centerPixel(); @@ -112,9 +117,9 @@ class GlsmSdlLogicOpTest { GlsmSdlHeadlessRig.beginFrame(); GlsmSdlHeadlessRig.bindTarget(); LogicOpFixture.clearToDst(); - GLStateManager.glUseProgram(singleProgram); + GLSMPrograms.glUseProgram(singleProgram); LogicOpFixture.drawQuad(op, PROGRAM_SRC); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); assertCenter(op, PROGRAM_SRC, "user program " + LogicOpFixture.label(op, PROGRAM_SRC)); } } @@ -124,54 +129,54 @@ class GlsmSdlLogicOpTest { mrtProgram = buildProgram(mrtProgram, FRAG_MRT); final int unorm = colorTexture(GL11.GL_RGBA8, GL11.GL_UNSIGNED_BYTE); final int half = colorTexture(GL30.GL_RGBA16F, GL11.GL_FLOAT); - final int fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, unorm, 0); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, half, 0); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, unorm, 0); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT1, GL11.GL_TEXTURE_2D, half, 0); final IntBuffer bufs = BufferUtils.createIntBuffer(2); bufs.put(GL30.GL_COLOR_ATTACHMENT0).put(GL30.GL_COLOR_ATTACHMENT1).flip(); - GLStateManager.glDrawBuffers(bufs); - GLStateManager.glViewport(0, 0, SIZE, SIZE); + GLSMFramebuffer.glDrawBuffers(bufs); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); LogicOpFixture.clearToDst(); - GLStateManager.glUseProgram(mrtProgram); + GLSMPrograms.glUseProgram(mrtProgram); LogicOpFixture.drawQuad(GL11.GL_OR_REVERSE, PROGRAM_SRC); - GLStateManager.glUseProgram(0); - GLStateManager.glDisable(GL11.GL_BLEND); + GLSMPrograms.glUseProgram(0); + GLSMEnable.glDisable(GL11.GL_BLEND); GlsmSdlHeadlessRig.endFrame(); - GLStateManager.glReadBuffer(GL30.GL_COLOR_ATTACHMENT0); + GLSMFramebuffer.glReadBuffer(GL30.GL_COLOR_ATTACHMENT0); final ByteBuffer px = BufferUtils.createByteBuffer(4); - GLStateManager.glReadPixels(SIZE / 2, SIZE / 2, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, px); + GLSMFramebuffer.glReadPixels(SIZE / 2, SIZE / 2, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, px); assertEquals(LogicOpFixture.expected(GL11.GL_OR_REVERSE, PROGRAM_SRC[0], LogicOpFixture.DST_R), px.get(0) & 0xFF, "unorm red"); assertEquals(LogicOpFixture.expected(GL11.GL_OR_REVERSE, PROGRAM_SRC[1], LogicOpFixture.DST_G), px.get(1) & 0xFF, "unorm green"); assertEquals(LogicOpFixture.expected(GL11.GL_OR_REVERSE, PROGRAM_SRC[2], LogicOpFixture.DST_B), px.get(2) & 0xFF, "unorm blue"); assertEquals(LogicOpFixture.expected(GL11.GL_OR_REVERSE, PROGRAM_SRC[3], LogicOpFixture.DST_A), px.get(3) & 0xFF, "unorm alpha"); - GLStateManager.glReadBuffer(GL30.GL_COLOR_ATTACHMENT1); + GLSMFramebuffer.glReadBuffer(GL30.GL_COLOR_ATTACHMENT1); final ByteBuffer fpx = BufferUtils.createByteBuffer(16).order(ByteOrder.nativeOrder()); - GLStateManager.glReadPixels(SIZE / 2, SIZE / 2, 1, 1, GL11.GL_RGBA, GL11.GL_FLOAT, fpx); + GLSMFramebuffer.glReadPixels(SIZE / 2, SIZE / 2, 1, 1, GL11.GL_RGBA, GL11.GL_FLOAT, fpx); assertEquals(0.2f, fpx.getFloat(0), 1e-3f, "float red passes through unblended"); assertEquals(0.4f, fpx.getFloat(4), 1e-3f, "float green passes through unblended"); assertEquals(0.8f, fpx.getFloat(8), 1e-3f, "float blue passes through unblended"); assertEquals(1.0f, fpx.getFloat(12), 1e-3f, "float alpha passes through unblended"); - GLStateManager.glReadBuffer(GL30.GL_COLOR_ATTACHMENT0); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glReadBuffer(GL30.GL_COLOR_ATTACHMENT0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(fbo); - GLStateManager.glDeleteTextures(unorm); - GLStateManager.glDeleteTextures(half); + GLSMFramebuffer.glDeleteFramebuffers(fbo); + GLSMTextures.glDeleteTextures(unorm); + GLSMTextures.glDeleteTextures(half); } private static int colorTexture(int internalFormat, int type) { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, GL11.GL_RGBA, type, (ByteBuffer) null); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, SIZE, SIZE, 0, GL11.GL_RGBA, type, (ByteBuffer) null); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); return id; } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlMipAttachmentTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlMipAttachmentTest.java index 4ea292917..df08f00fa 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlMipAttachmentTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlMipAttachmentTest.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -25,7 +28,7 @@ class GlsmSdlMipAttachmentTest { private static final int BASE = 0xFF10C030; private static void setClearColor(int argb) { - GLStateManager.glClearColor(((argb >> 16) & 0xFF) / 255.0f, ((argb >> 8) & 0xFF) / 255.0f, (argb & 0xFF) / 255.0f, ((argb >>> 24) & 0xFF) / 255.0f); + GLSMBlend.glClearColor(((argb >> 16) & 0xFF) / 255.0f, ((argb >> 8) & 0xFF) / 255.0f, (argb & 0xFF) / 255.0f, ((argb >>> 24) & 0xFF) / 255.0f); } private static int levelColor(int level) { @@ -39,10 +42,10 @@ class GlsmSdlMipAttachmentTest { for (int level = 1; level <= MAX_LEVEL; level++) { final int extent = Math.max(1, TEX_SIZE >> level); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, level); - GLStateManager.glViewport(0, 0, extent, extent); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, level); + GLSMRasterizer.glViewport(0, 0, extent, extent); setClearColor(levelColor(level)); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); } for (int level = 1; level <= MAX_LEVEL; level++) { @@ -50,36 +53,36 @@ class GlsmSdlMipAttachmentTest { } assertUniform(readTextureLevel(texture, 0), BASE, "level 0 untouched by clearing the mip levels"); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 1); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 1); final int w = Math.max(1, TEX_SIZE >> 1); final ByteBuffer pixels = MemoryUtil.memAlloc(w * w * 4); try { - GLStateManager.glReadPixels(0, 0, w, w, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); + GLSMFramebuffer.glReadPixels(0, 0, w, w, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); assertUniform(GlsmSdlHeadlessRig.toArgb(pixels, w * w), levelColor(1), "readPixels of the level 1 attachment"); } finally { MemoryUtil.memFree(pixels); } - GLStateManager.glDeleteFramebuffers(fbo); - GLStateManager.glDeleteTextures(texture); + GLSMFramebuffer.glDeleteFramebuffers(fbo); + GLSMTextures.glDeleteTextures(texture); } @Test void pendingLevelZeroClearIsNotAppliedToALevelOnePass() { final int texture = createSolidMipTexture(TEX_SIZE, MAX_LEVEL, BASE); final int fbo = GlsmSdlHeadlessRig.fboWithColor(texture, 0); - GLStateManager.glViewport(0, 0, TEX_SIZE, TEX_SIZE); + GLSMRasterizer.glViewport(0, 0, TEX_SIZE, TEX_SIZE); setClearColor(CLEAR); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 1); - GLStateManager.glViewport(0, 0, TEX_SIZE / 2, TEX_SIZE / 2); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 1); + GLSMRasterizer.glViewport(0, 0, TEX_SIZE / 2, TEX_SIZE / 2); GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f); assertUniform(readTextureLevel(texture, 1), RED, "level 1 after drawing into it"); assertUniform(readTextureLevel(texture, 0), CLEAR, "level 0 keeps its own pending clear"); - GLStateManager.glDeleteFramebuffers(fbo); - GLStateManager.glDeleteTextures(texture); + GLSMFramebuffer.glDeleteFramebuffers(fbo); + GLSMTextures.glDeleteTextures(texture); } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOffContextCreationTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOffContextCreationTest.java index 671b19e72..efea4b7c2 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOffContextCreationTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOffContextCreationTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.testutil.TestThreads; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -14,6 +14,6 @@ class GlsmSdlOffContextCreationTest { @Test void creationWithoutContextThrows() throws InterruptedException { - TestThreads.run("sdl-no-context", () -> assertThrows(IllegalStateException.class, GLStateManager::glGenTextures)); + TestThreads.run("sdl-no-context", () -> assertThrows(IllegalStateException.class, GLSMTextures::glGenTextures)); } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOutOfFrameReadbackTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOutOfFrameReadbackTest.java index 76a46fbf3..ef37303b5 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOutOfFrameReadbackTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlOutOfFrameReadbackTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -24,9 +24,9 @@ class GlsmSdlOutOfFrameReadbackTest { void outOfFrameTexImageReadback() { final ByteBuffer pattern = pattern(TEX_SIZE, TEX_SIZE, 1); final int tex = GlsmSdlHeadlessRig.newNearestTexture(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pattern); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pattern); assertReadback(tex, TEX_SIZE, TEX_SIZE, pattern); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); } @ParameterizedTest(name = "in frame: {0}") @@ -39,13 +39,13 @@ class GlsmSdlOutOfFrameReadbackTest { private static void copyAndReadBack(int seed) { final ByteBuffer pattern = pattern(TEX_SIZE, TEX_SIZE, seed); final int src = GlsmSdlHeadlessRig.newNearestTexture(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pattern); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pattern); final int dst = GlsmSdlHeadlessRig.newNearestTexture(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - GLStateManager.glCopyImageSubData(src, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, dst, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, TEX_SIZE, TEX_SIZE, 1); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glCopyImageSubData(src, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, dst, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, TEX_SIZE, TEX_SIZE, 1); assertReadback(dst, TEX_SIZE, TEX_SIZE, pattern); - GLStateManager.glDeleteTextures(src); - GLStateManager.glDeleteTextures(dst); + GLSMTextures.glDeleteTextures(src); + GLSMTextures.glDeleteTextures(dst); } private static ByteBuffer pattern(int w, int h, int seed) { @@ -60,11 +60,11 @@ class GlsmSdlOutOfFrameReadbackTest { } private static void assertReadback(int tex, int w, int h, ByteBuffer expected) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); final ByteBuffer got = BufferUtils.createByteBuffer(w * h * 4); for (int i = 0; i < got.capacity(); i++) got.put(i, (byte) 0xCD); - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, got); + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, got); final int n = w * h * 4; int mismatches = 0; diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlProxyTextureProbeTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlProxyTextureProbeTest.java index ddafcd59a..0890b0224 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlProxyTextureProbeTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlProxyTextureProbeTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.sdlgpu.resource.ResourceManager; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Tag; @@ -41,8 +41,8 @@ class GlsmSdlProxyTextureProbeTest { @Test void vanillaMaximumTextureSizeProbeLeavesTheBoundLightmapIntact() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); final ResourceManager rm = GlsmSdlHeadlessRig.resourceManager(); final long handleBefore = rm.getTextureHandle(lightmapTexture); @@ -54,15 +54,15 @@ class GlsmSdlProxyTextureProbeTest { assertEquals(LIGHTMAP_SIZE, meta.width(), "lightmap width after probe"); assertEquals(LIGHTMAP_SIZE, meta.height(), "lightmap height after probe"); assertEquals(handleBefore, rm.getTextureHandle(lightmapTexture), "lightmap handle after probe"); - assertEquals(LIGHTMAP_SIZE, GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH)); + assertEquals(LIGHTMAP_SIZE, GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH)); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } @Test void proxyTargetCallsLeaveTheBoundTextureIntact() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); final ResourceManager rm = GlsmSdlHeadlessRig.resourceManager(); final long handleBefore = rm.getTextureHandle(lightmapTexture); @@ -71,12 +71,12 @@ class GlsmSdlProxyTextureProbeTest { for (int target : PROXY_TARGETS) { final String where = "0x" + Integer.toHexString(target); - GLStateManager.glTexParameteri(target, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameterf(target, GL12.GL_TEXTURE_MIN_LOD, 4.0f); - GLStateManager.glTexSubImage2D(target, 0, 0, 0, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - GLStateManager.glCopyTexSubImage2D(target, 0, 0, 0, 0, 0, 1, 1); - GLStateManager.glCopyTexImage2D(target, 0, GL11.GL_RGBA, 0, 0, 4, 4, 0); - GLStateManager.glGenerateMipmap(target); + GLSMTextures.glTexParameteri(target, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameterf(target, GL12.GL_TEXTURE_MIN_LOD, 4.0f); + GLSMTextures.glTexSubImage2D(target, 0, 0, 0, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glCopyTexSubImage2D(target, 0, 0, 0, 0, 0, 1, 1); + GLSMTextures.glCopyTexImage2D(target, 0, GL11.GL_RGBA, 0, 0, 4, 4, 0); + GLSMTextures.glGenerateMipmap(target); final ResourceManager.TextureMeta after = rm.getTextureMeta(lightmapTexture); assertNotNull(after, where); @@ -87,7 +87,7 @@ class GlsmSdlProxyTextureProbeTest { assertEquals(handleBefore, rm.getTextureHandle(lightmapTexture), where); } - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } @Test @@ -95,9 +95,9 @@ class GlsmSdlProxyTextureProbeTest { GlsmSdlHeadlessRig.bindBaseTexture(baseTexture); GlsmSdlHeadlessRig.enableLightmapUnit(lightmapTexture, true); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); assertEquals(16384, vanillaGetGLMaximumTextureSize()); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); GlsmSdlHeadlessRig.terrainRenderState(); GlsmSdlHeadlessRig.quadTwoUnits((short) 240); @@ -111,8 +111,8 @@ class GlsmSdlProxyTextureProbeTest { private static int vanillaGetGLMaximumTextureSize() { for (int i = 16384; i > 0; i >>= 1) { - GLStateManager.glTexImage2D(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_RGBA, i, i, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - final int j = GLStateManager.glGetTexLevelParameteri(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); + GLSMTextures.glTexImage2D(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_RGBA, i, i, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + final int j = GLSMTextures.glGetTexLevelParameteri(GL11.GL_PROXY_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); if (j != 0) { return i; } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackMatrixTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackMatrixTest.java index df061ea33..c737d8b50 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackMatrixTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackMatrixTest.java @@ -1,6 +1,10 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.ReadbackFixture; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; @@ -41,7 +45,7 @@ class GlsmSdlReadbackMatrixTest { @AfterEach void resetPack() { ReadbackFixture.resetPack(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); } static Stream fixtureCases() { @@ -67,18 +71,18 @@ class GlsmSdlReadbackMatrixTest { @Test void fbo0FloatReadIsBottomUp() { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glViewport(0, 0, FBO0_W, FBO0_H); - GLStateManager.glClearColor(0f, 0f, 1f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, FBO0_W, 1); - GLStateManager.glClearColor(1f, 0f, 0f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMRasterizer.glViewport(0, 0, FBO0_W, FBO0_H); + GLSMBlend.glClearColor(0f, 0f, 1f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, FBO0_W, 1); + GLSMBlend.glClearColor(1f, 0f, 0f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); final ByteBuffer out = BufferUtils.createByteBuffer(FBO0_W * FBO0_H * 16).order(ByteOrder.nativeOrder()); - GLStateManager.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_RGBA, GL11.GL_FLOAT, out); + GLSMFramebuffer.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_RGBA, GL11.GL_FLOAT, out); assertEquals(1f, out.getFloat(0), "GL row 0 is the scissored bottom row (red)"); assertEquals(0f, out.getFloat(8), "GL row 0 blue"); final int top = (FBO0_H - 1) * FBO0_W * 16; @@ -88,13 +92,13 @@ class GlsmSdlReadbackMatrixTest { @Test void fbo0ReadAfterBareClearSeesTheClear() { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glViewport(0, 0, FBO0_W, FBO0_H); - GLStateManager.glClearColor(0.2f, 0.4f, 0.6f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMRasterizer.glViewport(0, 0, FBO0_W, FBO0_H); + GLSMBlend.glClearColor(0.2f, 0.4f, 0.6f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); final ByteBuffer out = BufferUtils.createByteBuffer(FBO0_W * FBO0_H * 4); - GLStateManager.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out); + GLSMFramebuffer.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out); assertEquals(51, out.get(0) & 0xFF, "red after bare clear"); assertEquals(102, out.get(1) & 0xFF, "green after bare clear"); assertEquals(153, out.get(2) & 0xFF, "blue after bare clear"); @@ -102,29 +106,29 @@ class GlsmSdlReadbackMatrixTest { @Test void fbo0DepthAndStencilAreBottomUp() { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glViewport(0, 0, FBO0_W, FBO0_H); - GLStateManager.glDepthMask(true); - GLStateManager.glStencilMask(0xFF); - GLStateManager.glClearDepth(0.75); - GLStateManager.glClearStencil(0x11); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, FBO0_W, 1); - GLStateManager.glClearDepth(0.25); - GLStateManager.glClearStencil(0x22); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); - GLStateManager.glClearDepth(1.0); - GLStateManager.glClearStencil(0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMRasterizer.glViewport(0, 0, FBO0_W, FBO0_H); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glStencilMask(0xFF); + GLSMDepthStencilAlpha.glClearDepth(0.75); + GLSMDepthStencilAlpha.glClearStencil(0x11); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, FBO0_W, 1); + GLSMDepthStencilAlpha.glClearDepth(0.25); + GLSMDepthStencilAlpha.glClearStencil(0x22); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); + GLSMDepthStencilAlpha.glClearDepth(1.0); + GLSMDepthStencilAlpha.glClearStencil(0); final ByteBuffer depth = BufferUtils.createByteBuffer(FBO0_W * FBO0_H * 4).order(ByteOrder.nativeOrder()); - GLStateManager.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, depth); + GLSMFramebuffer.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, depth); assertEquals(0.25f, depth.getFloat(0), 1e-6f, "fbo0 depth bottom row"); assertEquals(0.75f, depth.getFloat((FBO0_H - 1) * FBO0_W * 4), 1e-6f, "fbo0 depth top row"); final ByteBuffer stencil = BufferUtils.createByteBuffer(FBO0_W * FBO0_H); - GLStateManager.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_STENCIL_INDEX, GL11.GL_UNSIGNED_BYTE, stencil); + GLSMFramebuffer.glReadPixels(0, 0, FBO0_W, FBO0_H, GL11.GL_STENCIL_INDEX, GL11.GL_UNSIGNED_BYTE, stencil); assertEquals(0x22, stencil.get(0) & 0xFF, "fbo0 stencil bottom row"); assertEquals(0x11, stencil.get((FBO0_H - 1) * FBO0_W) & 0xFF, "fbo0 stencil top row"); } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackTest.java index bf9b279f6..12db726a7 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlReadbackTest.java @@ -1,6 +1,8 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -26,26 +28,26 @@ class GlsmSdlReadbackTest { @Test void getTexImageSeesDeferredTextureUpload() { - final int texture = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); + final int texture = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); final ByteBuffer src = solidTexture(TEX_SIZE, TEX_SIZE); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, TEX_SIZE, TEX_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, src); final ByteBuffer dst = BufferUtils.createByteBuffer(TEX_SIZE * TEX_SIZE * 4); - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, dst); + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, dst); assertPixels(dst, TEX_SIZE * TEX_SIZE); - GLStateManager.glDeleteTextures(texture); + GLSMTextures.glDeleteTextures(texture); } @Test void getBufferSubDataSeesSameFrameStorageBufferWrite() { final int size = 64; - final int ssbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo); + final int ssbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo); final ByteBuffer initial = BufferUtils.createByteBuffer(size); final ByteBuffer update = BufferUtils.createByteBuffer(size); @@ -53,16 +55,16 @@ class GlsmSdlReadbackTest { initial.put(i, (byte) 0x11); update.put(i, (byte) (i + 1)); } - GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, initial, GL15.GL_DYNAMIC_DRAW); - GLStateManager.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0, update); + GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, initial, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0, update); final ByteBuffer dst = BufferUtils.createByteBuffer(size); - GLStateManager.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0, dst); + GLSMBuffers.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0, dst); for (int i = 0; i < size; i++) { assertEquals((byte) (i + 1), dst.get(i), "byte " + i + " should hold the same-frame sub-data write"); } - GLStateManager.glDeleteBuffers(ssbo); + GLSMBuffers.glDeleteBuffers(ssbo); } @Test @@ -72,7 +74,7 @@ class GlsmSdlReadbackTest { GlsmSdlHeadlessRig.solidQuad(1.0f, 0.0f, 0.0f); final ByteBuffer pixel = BufferUtils.createByteBuffer(4); - GLStateManager.glReadPixels( + GLSMFramebuffer.glReadPixels( GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE / 2, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixel); diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerBindingTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerBindingTest.java index 518521846..1f7da20ea 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerBindingTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerBindingTest.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.sdlgpu.SdlTestRig; @@ -23,15 +26,15 @@ class GlsmSdlSamplerBindingTest { @Test void glsmDeleteClearsBothCaches() { final ContextState st = SdlTestRig.contextState(); - final int sampler = GLStateManager.glGenSamplers(); - GLStateManager.glBindSampler(UNIT, sampler); + final int sampler = GLSMTextures.glGenSamplers(); + GLSMTextures.glBindSampler(UNIT, sampler); assertEquals(sampler, st.boundSamplerObjects[UNIT], "SDL unit binding"); - assertEquals(sampler, GLStateManager.getSamplerBinding(UNIT), "GLSM unit binding"); + assertEquals(sampler, GLSMTextures.getSamplerBinding(UNIT), "GLSM unit binding"); - GLStateManager.glDeleteSamplers(sampler); + GLSMTextures.glDeleteSamplers(sampler); assertEquals(0, st.boundSamplerObjects[UNIT], "SDL must drop the deleted sampler"); - assertEquals(0, GLStateManager.getSamplerBinding(UNIT), "GLSM must drop the deleted sampler"); + assertEquals(0, GLSMTextures.getSamplerBinding(UNIT), "GLSM must drop the deleted sampler"); } @Test @@ -41,7 +44,7 @@ class GlsmSdlSamplerBindingTest { final int sampler = RenderSystem.genSampler(); try { RenderSystem.bindSamplerToUnit(UNIT, sampler); - GLStateManager.glBindSampler(UNIT, 0); + GLSMTextures.glBindSampler(UNIT, 0); assertEquals(0, st.boundSamplerObjects[UNIT], "setup: GLSM unbind must reach SDL"); RenderSystem.bindSamplerToUnit(UNIT, sampler); @@ -62,40 +65,40 @@ class GlsmSdlSamplerBindingTest { """); final int red = GlsmSdlHeadlessRig.createSolidTexture(0xFFFF0000); final int green = GlsmSdlHeadlessRig.createSolidTexture(0xFF00FF00); - final int vao = GLStateManager.glGenVertexArrays(); + final int vao = GLSMVertexInput.glGenVertexArrays(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, red); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, green); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glUseProgram(program); - final int location = GLStateManager.glGetUniformLocation(program, "s"); - GLStateManager.glUniform1i(location, 0); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); - GLStateManager.glUniform1i(location, 1); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); - GLStateManager.glUseProgram(0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, red); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, green); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glBindVertexArray(vao); + GLSMPrograms.glUseProgram(program); + final int location = GLSMPrograms.glGetUniformLocation(program, "s"); + GLSMPrograms.glUniform1i(location, 0); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMPrograms.glUniform1i(location, 1); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMPrograms.glUseProgram(0); final int center = GlsmSdlHeadlessRig.readTarget(GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE / 2, 1, 1)[0]; assertEquals(Integer.toHexString(GlsmSdlHeadlessRig.GREEN), Integer.toHexString(center), "the second draw must sample unit 1"); } finally { - GLStateManager.glBindVertexArray(0); - GLStateManager.glDeleteVertexArrays(vao); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(red); - GLStateManager.glDeleteTextures(green); - GLStateManager.glDeleteProgram(program); + GLSMVertexInput.glBindVertexArray(0); + GLSMVertexInput.glDeleteVertexArrays(vao); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(red); + GLSMTextures.glDeleteTextures(green); + GLSMPrograms.glDeleteProgram(program); } } @Test void unitCountMatchesTheSdlSamplerArray() { - GLStateManager.glBindSampler(0, 0); - assertEquals(SdlTestRig.contextState().boundSamplerObjects.length, GLStateManager.getSamplerUnitCount()); + GLSMTextures.glBindSampler(0, 0); + assertEquals(SdlTestRig.contextState().boundSamplerObjects.length, GLSMTextures.getSamplerUnitCount()); } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerOverflowTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerOverflowTest.java index d945e7e6f..69e0d3832 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerOverflowTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSamplerOverflowTest.java @@ -1,6 +1,15 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextureLifetime; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; @@ -47,7 +56,7 @@ class GlsmSdlSamplerOverflowTest { private static final int FETCH_GREEN = 17; private static final int FILTERED_BLUE = 15; private static final int EXPECTED = 0xFF4080C0; - private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLStateManager.class, "RELEASE_DELAY_FRAMES"); + private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLSMTextureLifetime.class, "RELEASE_DELAY_FRAMES"); private final int[] textures = new int[SAMPLERS]; private int program; @@ -99,31 +108,31 @@ class GlsmSdlSamplerOverflowTest { assertEquals(2, po.fragmentResources.numStorageTextures(), "fetch-only samplers moved to texture slots"); for (int i = 0; i < SAMPLERS; i++) textures[i] = i == FETCH_RED ? redTexture.getAsInt() : GlsmSdlHeadlessRig.createSolidTexture(colorFor(i)); for (int i = 0; i < SAMPLERS; i++) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[i]); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[i]); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[i]); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[i]); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - vao = GLStateManager.glGenVertexArrays(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + vao = GLSMVertexInput.glGenVertexArrays(); } private int drawCenter(String redName, int[] units) { bindDrawState(redName, units); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); - GLStateManager.glUseProgram(0); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMPrograms.glUseProgram(0); assertMovedSamplersReadCopiesOnVulkan(); return GlsmSdlHeadlessRig.readTarget(GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE / 2, 1, 1)[0]; } private void bindDrawState(String redName, int[] units) { GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glUseProgram(program); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "redLod"), redLod); + GLSMPrograms.glUseProgram(program); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "redLod"), redLod); for (int i = 0; i < SAMPLERS; i++) { - final int location = GLStateManager.glGetUniformLocation(program, name(i, redName)); + final int location = GLSMPrograms.glGetUniformLocation(program, name(i, redName)); assertTrue(location >= 0, name(i, redName) + " has no location"); - GLStateManager.glUniform1i(location, units[i]); + GLSMPrograms.glUniform1i(location, units[i]); } - GLStateManager.glBindVertexArray(vao); + GLSMVertexInput.glBindVertexArray(vao); } private void assertMovedSamplersReadCopiesOnVulkan() { @@ -147,21 +156,21 @@ class GlsmSdlSamplerOverflowTest { @AfterEach void cleanUp() { copyProbe.close(); - GLStateManager.glDisable(GL11.GL_COLOR_LOGIC_OP); - GLStateManager.glLogicOp(GL11.GL_COPY); - GLStateManager.glBindImageTexture(0, 0, 0, false, 0, GL15.GL_WRITE_ONLY, GL11.GL_RGBA8); - GLStateManager.glBindVertexArray(0); - if (vao != 0) GLStateManager.glDeleteVertexArrays(vao); + GLSMEnable.glDisable(GL11.GL_COLOR_LOGIC_OP); + GLSMBlend.glLogicOp(GL11.GL_COPY); + GLSMTextures.glBindImageTexture(0, 0, 0, false, 0, GL15.GL_WRITE_ONLY, GL11.GL_RGBA8); + GLSMVertexInput.glBindVertexArray(0); + if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao); for (int unit = 0; unit < SAMPLERS; unit++) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); for (int i = 0; i < SAMPLERS; i++) { - if (textures[i] != 0) GLStateManager.glDeleteTextures(textures[i]); + if (textures[i] != 0) GLSMTextures.glDeleteTextures(textures[i]); textures[i] = 0; } - if (program != 0) GLStateManager.glDeleteProgram(program); + if (program != 0) GLSMPrograms.glDeleteProgram(program); program = 0; vao = 0; } @@ -178,9 +187,9 @@ class GlsmSdlSamplerOverflowTest { void unboundMovedSamplerReadsTheFloat2DFallback() { final int[] units = shuffledUnits(); setUp("t" + FETCH_RED, units); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); assertEquals(0xFF0080C0, drawCenter("t" + FETCH_RED, units)); } @@ -190,19 +199,19 @@ class GlsmSdlSamplerOverflowTest { final int[] units = shuffledUnits(); setUp("t" + FETCH_RED, units); bindDrawState("t" + FETCH_RED, units); - for (int i = 0; i < 3; i++) GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + for (int i = 0; i < 3; i++) GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); if (change.equals("uniform")) { - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "t" + FETCH_RED), units[0]); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "t" + FETCH_RED), units[0]); } else { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[0]); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[0]); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } final int refreshes = copyProbe.refreshCalls(); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); if (SDLGPUGate.device().isVulkan()) assertEquals(refreshes + 1, copyProbe.refreshCalls(), "a changed moved sampler must invalidate preparation"); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); assertEquals(0xFF0080C0, GlsmSdlHeadlessRig.readTarget(32, 32, 1, 1)[0], "the new unit supplies black instead of red"); } @@ -212,14 +221,14 @@ class GlsmSdlSamplerOverflowTest { setUp("t" + FETCH_RED, units); final int fbo = GlsmSdlHeadlessRig.fboWithColor(textures[FETCH_RED], 0); try { - GLStateManager.glViewport(0, 0, 2, 2); - GLStateManager.glClearColor(0x60 / 255.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMRasterizer.glViewport(0, 0, 2, 2); + GLSMBlend.glClearColor(0x60 / 255.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); assertEquals(Integer.toHexString(0xFF6080C0), Integer.toHexString(drawCenter("t" + FETCH_RED, units)), "the moved sampler must read the cleared texture, not its uploaded texels"); } finally { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(fbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(fbo); } } @@ -231,7 +240,7 @@ class GlsmSdlSamplerOverflowTest { final ByteBuffer texels = MemoryUtil.memAlloc(2 * 2 * 4); try { for (int i = 0; i < 4; i++) GlsmSdlHeadlessRig.putArgb(texels, i, colorFor(FETCH_RED)); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL21.GL_SRGB8_ALPHA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL21.GL_SRGB8_ALPHA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); } finally { MemoryUtil.memFree(texels); } @@ -253,15 +262,15 @@ class GlsmSdlSamplerOverflowTest { final int[] units = shuffledUnits(); setUp("t" + FETCH_RED, units, () -> { final int texture = GlsmSdlHeadlessRig.newNearestTexture(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH_COMPONENT32F, 2, 2, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH_COMPONENT32F, 2, 2, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null); final int fbo = GlsmSdlHeadlessRig.fboWithColor(GlsmSdlHeadlessRig.createSolidTexture(0xFF000000), 0); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, texture, 0); - GLStateManager.glViewport(0, 0, 2, 2); - GLStateManager.glDepthMask(true); - GLStateManager.glClearDepth(0.25); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, texture, 0); + GLSMRasterizer.glViewport(0, 0, 2, 2); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glClearDepth(0.25); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(fbo); return texture; }); assertChannels(drawCenter("t" + FETCH_RED, units), 64, 0x80, 0xC0, "red is the cleared depth 0.25"); @@ -281,11 +290,11 @@ class GlsmSdlSamplerOverflowTest { drawCenter("t" + FETCH_RED, units); final int beforeDelete = liveTextureCount(); - GLStateManager.glDeleteTextures(textures[FETCH_RED]); + GLSMTextures.glDeleteTextures(textures[FETCH_RED]); textures[FETCH_RED] = 0; for (int i = 0; i < RELEASE_DELAY_FRAMES; i++) { GlsmSdlHeadlessRig.beginFrame(); - GLStateManager.onFrameEnd(); + GLSMTextureLifetime.onFrameEnd(); GlsmSdlHeadlessRig.endFrame(); } assertEquals(beforeDelete - 2, liveTextureCount(), "the deleted texture and its copy are released after the delay"); @@ -299,7 +308,7 @@ class GlsmSdlSamplerOverflowTest { drawCenter("t" + FETCH_RED, units); final int beforeExpiry = liveTextureCount(); - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glDeleteProgram(program); program = 0; for (int frame = 0; frame < 12; frame++) { GlsmSdlHeadlessRig.beginFrame(); @@ -330,22 +339,22 @@ class GlsmSdlSamplerOverflowTest { final int[] units = shuffledUnits(); setUp("t" + FETCH_RED, units); bindDrawState("t" + FETCH_RED, units); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); final long copy = watchCopy("t" + FETCH_RED); final int writes = copyProbe.writesTo(copy); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); final int refreshes = copyProbe.refreshCalls(); assertTrue(refreshes > 0, "the probe must observe preparation before the cache can skip it"); final var frame = GlsmSdlHeadlessRig.frameManager().frame(); final long pass = frame.renderPassGeneration; final int bindGen = SdlTestRig.contextState().samplerBindGen; final long writeGen = GlsmSdlHeadlessRig.resourceManager().textureWriteGeneration(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[0]); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[0]); for (int i = 0; i < 4; i++) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[(i + 1) % 2]); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[(i + 1) % 2]); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); assertEquals(pass, frame.renderPassGeneration, "the draws keep the same render pass"); assertNotEquals(bindGen, SdlTestRig.contextState().samplerBindGen, "the entity texture changes reached the backend"); assertEquals(writeGen, GlsmSdlHeadlessRig.resourceManager().textureWriteGeneration(), "observing copies must not change write tracking"); @@ -353,10 +362,10 @@ class GlsmSdlSamplerOverflowTest { assertEquals(writes, copyProbe.writesTo(copy), "repeated draws must not copy unchanged content"); GlsmSdlHeadlessRig.frameManager().endRenderPassIfActive(); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); assertEquals(refreshes + 1, copyProbe.refreshCalls(), "a new pass must recheck its snapshots"); assertEquals(writes, copyProbe.writesTo(copy), "a new pass must reuse unchanged content"); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); GlsmSdlHeadlessRig.endFrame(); GlsmSdlHeadlessRig.beginFrame(); assertEquals(EXPECTED, drawCenter("t" + FETCH_RED, units)); @@ -379,7 +388,7 @@ class GlsmSdlSamplerOverflowTest { } else { setUp("t" + FETCH_RED, units); } - if (write.equals("compute")) GLStateManager.glBindImageTexture(0, textures[FETCH_RED], 0, false, 0, GL15.GL_WRITE_ONLY, GL11.GL_RGBA8); + if (write.equals("compute")) GLSMTextures.glBindImageTexture(0, textures[FETCH_RED], 0, false, 0, GL15.GL_WRITE_ONLY, GL11.GL_RGBA8); final int fbo = GlsmSdlHeadlessRig.fboWithColor(textures[FETCH_RED], 0); try { assertEquals(EXPECTED, drawCenter("t" + FETCH_RED, units)); @@ -390,14 +399,14 @@ class GlsmSdlSamplerOverflowTest { GlsmSdlHeadlessRig.beginFrame(); switch (write) { case "upload" -> { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]); final ByteBuffer texels = MemoryUtil.memAlloc(16); try { for (int i = 0; i < 4; i++) GlsmSdlHeadlessRig.putArgb(texels, i, 0xFF000000); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); } finally { MemoryUtil.memFree(texels); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } } case "copy" -> BackendManager.RENDER_BACKEND.copyImageSubData(textures[0], GL11.GL_TEXTURE_2D, 0, 0, 0, 0, @@ -405,28 +414,28 @@ class GlsmSdlSamplerOverflowTest { case "blit" -> { final int srcFbo = GlsmSdlHeadlessRig.fboWithColor(textures[0], 0); try { - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, srcFbo); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, fbo); - GLStateManager.glBlitFramebuffer(0, 0, 2, 2, 0, 0, 2, 2, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, srcFbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, fbo); + GLSMFramebuffer.glBlitFramebuffer(0, 0, 2, 2, 0, 0, 2, 2, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); } finally { - GLStateManager.glDeleteFramebuffers(srcFbo); + GLSMFramebuffer.glDeleteFramebuffers(srcFbo); } } case "clear" -> { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glClearColor(0, 0, 0, 1); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMBlend.glClearColor(0, 0, 0, 1); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); } case "mipmap" -> BackendManager.RENDER_BACKEND.generateTextureMipmap(textures[FETCH_RED]); case "compute" -> computeBlack(); case "copyTexSubImage" -> { final int srcFbo = GlsmSdlHeadlessRig.fboWithColor(textures[0], 0); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]); - GLStateManager.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, 2, 2); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + units[FETCH_RED]); + GLSMTextures.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, 2, 2); } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDeleteFramebuffers(srcFbo); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMFramebuffer.glDeleteFramebuffers(srcFbo); } } default -> throw new AssertionError(write); @@ -435,8 +444,8 @@ class GlsmSdlSamplerOverflowTest { assertEquals(redWrites + 1, copyProbe.writesTo(redCopy), "changed source copied once"); assertEquals(greenWrites, copyProbe.writesTo(greenCopy), "unchanged source not copied again"); } finally { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(fbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(fbo); } } @@ -447,17 +456,17 @@ class GlsmSdlSamplerOverflowTest { layout(rgba8, binding = 0) uniform writeonly image2D target; void main() { imageStore(target, ivec2(gl_GlobalInvocationID.xy), vec4(0.0, 0.0, 0.0, 1.0)); } """); - final int compute = GLStateManager.glCreateProgram(); + final int compute = GLSMPrograms.glCreateProgram(); try { - GLStateManager.glAttachShader(compute, shader); - GLStateManager.glLinkProgram(compute); - assertEquals(1, GLStateManager.glGetProgrami(compute, GL20.GL_LINK_STATUS), GLStateManager.glGetProgramInfoLog(compute, 4096)); - GLStateManager.glUseProgram(compute); - GLStateManager.glDispatchCompute(2, 2, 1); + GLSMPrograms.glAttachShader(compute, shader); + GLSMPrograms.glLinkProgram(compute); + assertEquals(1, GLSMPrograms.glGetProgrami(compute, GL20.GL_LINK_STATUS), GLSMPrograms.glGetProgramInfoLog(compute, 4096)); + GLSMPrograms.glUseProgram(compute); + GLSMPrograms.glDispatchCompute(2, 2, 1); } finally { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(compute); - GLStateManager.glDeleteShader(shader); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(compute); + GLSMPrograms.glDeleteShader(shader); } } @@ -469,14 +478,14 @@ class GlsmSdlSamplerOverflowTest { bindDrawState("t" + FETCH_RED, units); final var frame = GlsmSdlHeadlessRig.frameManager().frame(); final long before = frame.renderPassGeneration; - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, 1, 1); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, 1, 1); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); assertEquals(before + 1, frame.renderPassGeneration, "only the clear's render pass is opened"); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); assertNotEquals(0L, boundCopy("t" + FETCH_RED), "the first draw prepares the copy"); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); assertEquals(EXPECTED, GlsmSdlHeadlessRig.readTarget(32, 32, 1, 1)[0]); } @@ -488,16 +497,16 @@ class GlsmSdlSamplerOverflowTest { + "fragColor = c + vec4(texelFetch(fetched, " + coord + "(0), 0)); }\n"; final int vs = GlTestSupport.compile(GL20.GL_VERTEX_SHADER, GlsmSdlHeadlessRig.FULLSCREEN_VERTEX); final int fs = GlTestSupport.compile(GL20.GL_FRAGMENT_SHADER, source); - program = GLStateManager.glCreateProgram(); + program = GLSMPrograms.glCreateProgram(); try { - GLStateManager.glAttachShader(program, vs); - GLStateManager.glAttachShader(program, fs); - GLStateManager.glLinkProgram(program); - assertEquals(0, GLStateManager.glGetProgrami(program, GL20.GL_LINK_STATUS)); - assertTrue(GLStateManager.glGetProgramInfoLog(program, 4096).contains("Too many fragment shader texture samplers")); + GLSMPrograms.glAttachShader(program, vs); + GLSMPrograms.glAttachShader(program, fs); + GLSMPrograms.glLinkProgram(program); + assertEquals(0, GLSMPrograms.glGetProgrami(program, GL20.GL_LINK_STATUS)); + assertTrue(GLSMPrograms.glGetProgramInfoLog(program, 4096).contains("Too many fragment shader texture samplers")); } finally { - GLStateManager.glDeleteShader(vs); - GLStateManager.glDeleteShader(fs); + GLSMPrograms.glDeleteShader(vs); + GLSMPrograms.glDeleteShader(fs); } } @@ -579,7 +588,7 @@ class GlsmSdlSamplerOverflowTest { program = GlTestSupport.program(GlsmSdlHeadlessRig.FULLSCREEN_VERTEX, sb.toString()); assertEquals(1, shaderManager().getProgram(program).fragmentResources.numStorageTextures(), "only 'fetched' moves"); - assertTrue(GLStateManager.glGetUniformLocation(program, "realTex") >= 0, "the uniform keeps the name the macro expands to"); + assertTrue(GLSMPrograms.glGetUniformLocation(program, "realTex") >= 0, "the uniform keeps the name the macro expands to"); } @ParameterizedTest @@ -603,22 +612,22 @@ class GlsmSdlSamplerOverflowTest { """); final ShaderManager.ProgramObject po = shaderManager().getProgram(program); assertEquals(1, (fragment ? po.fragmentResources : po.vertexResources).numStorageTextures(), "shadowtex0 moved"); - assertEquals(-1, GLStateManager.glGetUniformLocation(program, "shadowtex0"), "an unread sampler must report -1, or Iris treats shadows as used"); - assertTrue(GLStateManager.glGetUniformLocation(program, "f0") >= 0, "read samplers keep their location"); + assertEquals(-1, GLSMPrograms.glGetUniformLocation(program, "shadowtex0"), "an unread sampler must report -1, or Iris treats shadows as used"); + assertTrue(GLSMPrograms.glGetUniformLocation(program, "f0") >= 0, "read samplers keep their location"); textures[0] = GlsmSdlHeadlessRig.createSolidTexture(GlsmSdlHeadlessRig.RED); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glUseProgram(program); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + GLSMPrograms.glUseProgram(program); GlsmSdlHeadlessRig.bindTarget(); final var rm = GlsmSdlHeadlessRig.resourceManager(); final long fallback = rm.getOrCreateFallbackStorageTexture2D(); final long before = rm.textureWriteGeneration(); - for (int i = 0; i < 3; i++) GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + for (int i = 0; i < 3; i++) GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); final ContextState st = SdlTestRig.contextState(); assertEquals(fallback, (fragment ? st.lastFragStorageTex : st.lastVertStorageTex)[0], "the unread slot uses the 2D fallback"); assertEquals(before, rm.textureWriteGeneration(), "the unread sampler must not start tracking or copying unit 0"); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); assertEquals(GlsmSdlHeadlessRig.GREEN, GlsmSdlHeadlessRig.readTarget(32, 32, 1, 1)[0]); } @@ -635,32 +644,32 @@ class GlsmSdlSamplerOverflowTest { for (int i = 0; i < 16; i++) textures[i] = GlsmSdlHeadlessRig.createSolidTexture(0xFF000000); textures[16] = GlsmSdlHeadlessRig.createSolidTexture(0xFF00FF00); for (int i = 0; i <= 16; i++) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[i]); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[i]); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - vao = GLStateManager.glGenVertexArrays(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + vao = GLSMVertexInput.glGenVertexArrays(); final int fbo = GlsmSdlHeadlessRig.fboWithColor(textures[16], 0); try { - GLStateManager.glUseProgram(program); - for (int i = 0; i < 16; i++) GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "f" + i), i); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "written"), 16); - GLStateManager.glBindVertexArray(vao); + GLSMPrograms.glUseProgram(program); + for (int i = 0; i < 16; i++) GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "f" + i), i); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "written"), 16); + GLSMVertexInput.glBindVertexArray(vao); - GLStateManager.glViewport(0, 0, 2, 2); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "readWritten"), 0); - for (int i = 0; i < 3; i++) GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMRasterizer.glViewport(0, 0, 2, 2); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "readWritten"), 0); + for (int i = 0; i < 3; i++) GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "readWritten"), 1); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "readWritten"), 1); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMPrograms.glUseProgram(0); assertChannels(GlsmSdlHeadlessRig.readTarget(GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE / 2, 1, 1)[0], 0x40, 0, 0, "the second draw must see what the first draw wrote, not the texture's earlier green"); } finally { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(fbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(fbo); } } @@ -668,18 +677,18 @@ class GlsmSdlSamplerOverflowTest { void tooManyFilteredSamplersFailLinkInsteadOfDraw() { final int vs = GlTestSupport.compile(GL20.GL_VERTEX_SHADER, GlsmSdlHeadlessRig.FULLSCREEN_VERTEX); final int fs = GlTestSupport.compile(GL20.GL_FRAGMENT_SHADER, fragment("t" + FETCH_RED, false)); - final int failed = GLStateManager.glCreateProgram(); + final int failed = GLSMPrograms.glCreateProgram(); try { - GLStateManager.glAttachShader(failed, vs); - GLStateManager.glAttachShader(failed, fs); - GLStateManager.glLinkProgram(failed); - assertEquals(0, GLStateManager.glGetProgrami(failed, GL20.GL_LINK_STATUS), "18 filtered samplers cannot fit 16 slots"); - final String log = GLStateManager.glGetProgramInfoLog(failed, 4096); + GLSMPrograms.glAttachShader(failed, vs); + GLSMPrograms.glAttachShader(failed, fs); + GLSMPrograms.glLinkProgram(failed); + assertEquals(0, GLSMPrograms.glGetProgrami(failed, GL20.GL_LINK_STATUS), "18 filtered samplers cannot fit 16 slots"); + final String log = GLSMPrograms.glGetProgramInfoLog(failed, 4096); assertTrue(log.contains("Too many fragment shader texture samplers (18, maximum 16)"), () -> "info log should name the count: " + log); } finally { - GLStateManager.glDeleteShader(vs); - GLStateManager.glDeleteShader(fs); - GLStateManager.glDeleteProgram(failed); + GLSMPrograms.glDeleteShader(vs); + GLSMPrograms.glDeleteShader(fs); + GLSMPrograms.glDeleteProgram(failed); } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSplashTargetTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSplashTargetTest.java index 723a5c7ca..332be3e8e 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSplashTargetTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlSplashTargetTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.glsm.testutil.TestThreads; @@ -24,7 +24,7 @@ class GlsmSdlSplashTargetTest { final OffscreenTarget target = createSplashTarget(backend); Reflect.set(backend, "splashTarget", target); try { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); TestThreads.run("SplashTarget-Seed-Thread", () -> { Reflect.invoke(backend, "enterContext", new Class[]{boolean.class}, true); GlsmSdlHeadlessRig.solidQuad(0f, 1f, 0f); @@ -32,7 +32,7 @@ class GlsmSdlSplashTargetTest { backend.onRenderThreadReleased(Thread.currentThread()); }); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target.fboId()); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target.fboId()); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(), GlsmSdlHeadlessRig.GREEN, "splash target"); } finally { releaseSplashTarget(backend, target); @@ -50,14 +50,14 @@ class GlsmSdlSplashTargetTest { TestThreads.run("SplashTarget-BindZero-Thread", () -> { Reflect.invoke(backend, "enterContext", new Class[]{boolean.class}, true); GlsmSdlHeadlessRig.bindTarget(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); GlsmSdlHeadlessRig.clearTo(1f, 0f, 0f, 1f); GlsmSdlHeadlessRig.solidQuad(0f, 1f, 0f); backend.handleSwapBuffers(); backend.onRenderThreadReleased(Thread.currentThread()); }); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target.fboId()); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target.fboId()); GlsmSdlHeadlessRig.assertUniform(GlsmSdlHeadlessRig.readTarget(), GlsmSdlHeadlessRig.GREEN, "splash target"); GlsmSdlHeadlessRig.bindTarget(); diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlStreamingRingTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlStreamingRingTest.java index 31da226a4..9dbc9c5ec 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlStreamingRingTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlStreamingRingTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs; import com.gtnewhorizons.angelica.glsm.streaming.PersistentStreamingBuffer; @@ -24,19 +24,19 @@ class GlsmSdlStreamingRingTest { @Test void ringCreationLeavesTheGlsmArrayBufferCacheMatchingSdl() { assertTrue(RenderSystem.supportsBufferStorage(), "SDL-GPU must advertise buffer storage"); - final int other = GLStateManager.glGenBuffers(); + final int other = GLSMBuffers.glGenBuffers(); PersistentStreamingBuffer ring = null; try { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, other); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, other); ring = PersistentStreamingBuffer.createOrNull(4096); assertNotNull(ring); final IntSet persistent = Reflect.getStatic(FfpExtendedAttribs.class, "persistentSources"); assertTrue(persistent.contains(ring.getBufferId()), "the ring buffer is the persistent source"); assertFalse(persistent.contains(other), "the previously bound buffer is not persistent"); - assertEquals(RENDER_BACKEND.getInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLStateManager.getBoundVBO(), "SDL ContextState.boundArrayBuffer must equal the GLSM cache after ring creation"); + assertEquals(RENDER_BACKEND.getInteger(GL15.GL_ARRAY_BUFFER_BINDING), GLSMBuffers.getBoundVBO(), "SDL ContextState.boundArrayBuffer must equal the GLSM cache after ring creation"); } finally { if (ring != null) ring.destroy(); - GLStateManager.glDeleteBuffers(other); + GLSMBuffers.glDeleteBuffers(other); } } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTessellatorEntityIdsTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTessellatorEntityIdsTest.java index 42de37f3e..fcb3387d9 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTessellatorEntityIdsTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTessellatorEntityIdsTest.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; import com.gtnewhorizons.angelica.glsm.EntityIdsOnlyHandler; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; @@ -31,15 +31,15 @@ class GlsmSdlTessellatorEntityIdsTest { @AfterEach void tearDown() { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(program); GLSMHooks.immediateExtendedHandler = previousHandler; } @Test void idsChangedMidBatchApplyToTheVerticesAddedAfterTheChange() { GlsmSdlHeadlessRig.beginFrameAndClear(); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); TessellatorEntityIdsFixture.drawIdsChangedMidBatch(); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); @@ -50,7 +50,7 @@ class GlsmSdlTessellatorEntityIdsTest { @Test void idsChangedAfterTheLastVertexLeaveTheBatchAlone() { GlsmSdlHeadlessRig.beginFrameAndClear(); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); TessellatorEntityIdsFixture.drawIdsChangedAfterTheLastVertex(); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureBindingQueryTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureBindingQueryTest.java index d40fea556..4b30c7956 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureBindingQueryTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureBindingQueryTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -20,10 +20,10 @@ class GlsmSdlTextureBindingQueryTest { @Test void everyBindingQueryReadsThePerUnitSlot() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE3); - final int tex = GLStateManager.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3); + final int tex = GLSMTextures.glGenTextures(); try { - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, tex); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, tex); assertEquals(tex, RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_2D), "GL_TEXTURE_BINDING_2D"); assertEquals(tex, RENDER_BACKEND.getInteger(GL11.GL_TEXTURE_BINDING_1D), "GL_TEXTURE_BINDING_1D"); assertEquals(tex, RENDER_BACKEND.getInteger(GL12.GL_TEXTURE_BINDING_3D), "GL_TEXTURE_BINDING_3D"); @@ -33,9 +33,9 @@ class GlsmSdlTextureBindingQueryTest { assertEquals(tex, RENDER_BACKEND.getInteger(GL31.GL_TEXTURE_BINDING_RECTANGLE), "GL_TEXTURE_BINDING_RECTANGLE"); assertEquals(tex, RENDER_BACKEND.getInteger(GL40.GL_TEXTURE_BINDING_CUBE_MAP_ARRAY), "GL_TEXTURE_BINDING_CUBE_MAP_ARRAY"); } finally { - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glDeleteTextures(tex); } } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureStagingTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureStagingTest.java index 2546b4103..98388f7cc 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureStagingTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlTextureStagingTest.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.glsm.texture.TextureStaging; @@ -95,7 +96,7 @@ class GlsmSdlTextureStagingTest { fail("level " + level + ": " + mismatches + " texels differ; first (" + fx + "," + fy + ") expected " + GlsmSdlHeadlessRig.describe(stagedColor(level, fx, fy)) + " got " + GlsmSdlHeadlessRig.describe(got[first])); } } - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); } @ParameterizedTest @@ -103,15 +104,15 @@ class GlsmSdlTextureStagingTest { void directUploadLandsAfterEarlierBatchedUpload(boolean inFrame, boolean fboAttached) { if (inFrame) GlsmSdlHeadlessRig.beginFrame(); final int tex = GlsmSdlHeadlessRig.newNearestTexture(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, BIG_TEX, BIG_TEX, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, BIG_TEX, BIG_TEX, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); int fbo = 0; if (fboAttached) { - fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); + fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, tex, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); } final ByteBuffer small = solidRgba(SMALL, SMALL, COLOR_A); @@ -119,11 +120,11 @@ class GlsmSdlTextureStagingTest { final ByteBuffer out = MemoryUtil.memAlloc(BIG_TEX * BIG_TEX * 4); try { assertTrue(big.remaining() > ResourceManager.BATCH_SEGMENT_CAPACITY, "second upload must take the direct path"); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SMALL, SMALL, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, small); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, BIG_W, BIG_H, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, big); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, SMALL, SMALL, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, small); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, BIG_W, BIG_H, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, big); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, out); final int[] got = GlsmSdlHeadlessRig.toArgb(out, BIG_TEX * BIG_TEX); int mismatches = 0; for (int y = 0; y < BIG_H; y++) { @@ -138,14 +139,14 @@ class GlsmSdlTextureStagingTest { MemoryUtil.memFree(big); MemoryUtil.memFree(out); } - if (fbo != 0) GLStateManager.glDeleteFramebuffers(fbo); - GLStateManager.glDeleteTextures(tex); + if (fbo != 0) GLSMFramebuffer.glDeleteFramebuffers(fbo); + GLSMTextures.glDeleteTextures(tex); } private static void stageBand(int tex, int level, int y0, int w, int h) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - final TextureStaging staging = GLStateManager.beginTextureStaging(level, 0, y0, w, h); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + final TextureStaging staging = GLSMTextures.beginTextureStaging(level, 0, y0, w, h); assertNotNull(staging, "beginTextureStaging level " + level + " y " + y0); final ByteBuffer buf = staging.buffer(); assertEquals(w * h * 4, buf.remaining(), "staging capacity"); @@ -162,7 +163,7 @@ class GlsmSdlTextureStagingTest { buf.put(i + 3, (byte) (c >>> 24)); } } - assertTrue(GLStateManager.commitTextureStaging(staging), "commitTextureStaging level " + level + " y " + y0); + assertTrue(GLSMTextures.commitTextureStaging(staging), "commitTextureStaging level " + level + " y " + y0); } private static int stagedColor(int level, int x, int y) { diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlUnalignedAttribTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlUnalignedAttribTest.java index 665999cd3..7f0dba3bd 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlUnalignedAttribTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlUnalignedAttribTest.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -50,11 +53,11 @@ class GlsmSdlUnalignedAttribTest { private static int redChannelForFactorAt(int factorOffset, int decoyOffset) { final int p = buildProgram(); - final int vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); + final int vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); - final int vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + final int vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); final ByteBuffer data = MemoryUtil.memAlloc(3 * STRIDE); try { for (int i = 0; i < 3 * STRIDE; i++) data.put(i, (byte) 0); @@ -68,26 +71,26 @@ class GlsmSdlUnalignedAttribTest { data.put(base + factorOffset, (byte) FACTOR); } data.position(0).limit(3 * STRIDE); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); } finally { MemoryUtil.memFree(data); } - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, STRIDE, 0L); - GLStateManager.glEnableVertexAttribArray(5); - GLStateManager.glVertexAttribPointer(5, 1, GL11.GL_UNSIGNED_BYTE, true, STRIDE, factorOffset); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, STRIDE, 0L); + GLSMVertexInput.glEnableVertexAttribArray(5); + GLSMVertexInput.glVertexAttribPointer(5, 1, GL11.GL_UNSIGNED_BYTE, true, STRIDE, factorOffset); - GLStateManager.glUseProgram(p); + GLSMPrograms.glUseProgram(p); try { - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); } finally { - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); } final int[] pixels = GlsmSdlHeadlessRig.readTarget(GlsmSdlHeadlessRig.SIZE / 2, GlsmSdlHeadlessRig.SIZE / 2, 1, 1); - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); return (pixels[0] >> 16) & 0xFF; } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVanillaTextureTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVanillaTextureTest.java index 03fa20c9b..fc52e9564 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVanillaTextureTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVanillaTextureTest.java @@ -1,6 +1,13 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextureLifetime; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.sdlgpu.resource.ResourceManager; @@ -42,7 +49,7 @@ class GlsmSdlVanillaTextureTest { }; private static final int LIGHTMAP_SIZE = 16; - private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLStateManager.class, "RELEASE_DELAY_FRAMES"); + private static final int RELEASE_DELAY_FRAMES = Reflect.getStatic(GLSMTextureLifetime.class, "RELEASE_DELAY_FRAMES"); private static final int CLEAR_COLOR = 0xFF000000; private static int atlasTexture; @@ -57,8 +64,8 @@ class GlsmSdlVanillaTextureTest { } private static int createMipmappedAtlas() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - final int id = GLStateManager.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + final int id = GLSMTextures.glGenTextures(); allocateTextureImpl(id, ATLAS_MIPMAP_LEVELS, ATLAS_SIZE, ATLAS_SIZE, 1.0f); for (int level = 0; level <= ATLAS_MIPMAP_LEVELS; level++) { uploadTextureSub(level, LEVEL_COLORS[level], ATLAS_SIZE >> level, ATLAS_SIZE >> level, true); @@ -67,81 +74,81 @@ class GlsmSdlVanillaTextureTest { } private static int allocateDynamicLightmap() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - final int id = GLStateManager.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + final int id = GLSMTextures.glGenTextures(); allocateTextureImpl(id, 0, LIGHTMAP_SIZE, LIGHTMAP_SIZE, 1.0f); return id; } private static void allocateTextureImpl(int id, int maxLevel, int width, int height, float aniso) { - GLStateManager.glDeleteTextures(id); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glDeleteTextures(id); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, aniso); if (maxLevel > 0) { - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, maxLevel); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MIN_LOD, 0.0f); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LOD, (float) maxLevel); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0f); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, maxLevel); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MIN_LOD, 0.0f); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LOD, (float) maxLevel); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0f); } for (int level = 0; level <= maxLevel; level++) { - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA, width >> level, height >> level, 0, + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA, width >> level, height >> level, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, (IntBuffer) null); } } private static void uploadTextureSub(int level, int argb, int width, int height, boolean mipmapped) { - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, mipmapped ? GL11.GL_NEAREST_MIPMAP_LINEAR : GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); final IntBuffer data = BufferUtils.createIntBuffer(width * height); for (int i = 0; i < width * height; i++) { data.put(i, argb); } data.position(0); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, level, 0, 0, width, height, + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, level, 0, 0, width, height, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, data); } private static void uploadLightmapFrame(int argb) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); uploadTextureSub(0, argb, LIGHTMAP_SIZE, LIGHTMAP_SIZE, false); } private static void bindAtlasUnit0() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, atlasTexture); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, atlasTexture); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); } private static void enableLightmap() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); final float scale = 0.00390625f; - GLStateManager.glScalef(scale, scale, scale); - GLStateManager.glTranslatef(8.0f, 8.0f, 8.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glScalef(scale, scale, scale); + GLSMMatrices.glTranslatef(8.0f, 8.0f, 8.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private static void quad(float extent, boolean lightmap, boolean counterClockwise) { - GLStateManager.glBegin(GL11.GL_QUADS); + GLSMDraws.glBegin(GL11.GL_QUADS); if (counterClockwise) { GlsmSdlHeadlessRig.emitVertex(-extent, -extent, 0.0f, 0.0f, lightmap, (short) 240); GlsmSdlHeadlessRig.emitVertex(extent, -extent, 1.0f, 0.0f, lightmap, (short) 240); @@ -153,7 +160,7 @@ class GlsmSdlVanillaTextureTest { GlsmSdlHeadlessRig.emitVertex(extent, -extent, 1.0f, 0.0f, lightmap, (short) 240); GlsmSdlHeadlessRig.emitVertex(-extent, -extent, 0.0f, 0.0f, lightmap, (short) 240); } - GLStateManager.glEnd(); + GLSMDraws.glEnd(); } private static int center() { @@ -224,11 +231,11 @@ class GlsmSdlVanillaTextureTest { enableLightmap(); GlsmSdlHeadlessRig.terrainRenderState(); - GLStateManager.glEnable(GL11.GL_CULL_FACE); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); quad(1.0f, true, frontFacing); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); return center(); } @@ -246,20 +253,20 @@ class GlsmSdlVanillaTextureTest { @Test void displayListWithBindingsOutsideShowsTheModulatedTexel() { - final int list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + final int list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); quad(1.0f, true, true); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); uploadLightmapFrame(0xFFFF8040); bindAtlasUnit0(); enableLightmap(); GlsmSdlHeadlessRig.terrainRenderState(); - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(0.0f, 0.0f, 0.0f); - GLStateManager.glCallList(list); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(0.0f, 0.0f, 0.0f); + GLSMDraws.glCallList(list); + GLSMMatrices.glPopMatrix(); final int expected = modulate(LEVEL_COLORS[0], 0xFFFF8040); final int actual = center(); @@ -267,14 +274,14 @@ class GlsmSdlVanillaTextureTest { } private static void texImageEmpty(int level) { - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, 0, 0, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA8, 0, 0, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); } @Test void zeroSizedLevelZeroDropsStorageAndRespecifyRecreatesIt() { final ResourceManager rm = GlsmSdlHeadlessRig.resourceManager(); final int tex = GlsmSdlHeadlessRig.newNearestTexture(); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2); GlsmSdlHeadlessRig.uploadSolidLevel(0, 4, LEVEL_COLORS[0]); assertEquals(3, rm.getTextureMeta(tex).levels(), "MAX_LEVEL 2 allocates the 4x4 chain"); final long handle = rm.getTextureHandle(tex); @@ -292,21 +299,21 @@ class GlsmSdlVanillaTextureTest { assertNotEquals(0L, rm.getTextureHandle(tex), "respecified level 0 must recreate storage"); assertEquals(4, rm.getTextureMeta(tex).width(), "recreated width"); assertEquals(3, rm.getTextureMeta(tex).levels(), "MAX_LEVEL survives the release"); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); } @Test void rescuedTextureAllocatesOneLevelUntilAHigherLevelIsUploaded() { final ResourceManager rm = GlsmSdlHeadlessRig.resourceManager(); final int tex = GlsmSdlHeadlessRig.newNearestTexture(); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2); - GLStateManager.glDeleteTextures(tex); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 2); + GLSMTextures.glDeleteTextures(tex); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); GlsmSdlHeadlessRig.uploadSolidLevel(0, 4, LEVEL_COLORS[0]); assertEquals(1, rm.getTextureMeta(tex).levels(), "level-0 upload"); GlsmSdlHeadlessRig.uploadSolidLevel(1, 2, LEVEL_COLORS[1]); assertEquals(3, rm.getTextureMeta(tex).levels(), "level-1 upload grows to the full chain"); - GLStateManager.glDeleteTextures(tex); + GLSMTextures.glDeleteTextures(tex); } @Test @@ -314,17 +321,17 @@ class GlsmSdlVanillaTextureTest { final ResourceManager rm = GlsmSdlHeadlessRig.resourceManager(); final int deleted = GlsmSdlHeadlessRig.newNearestTexture(); GlsmSdlHeadlessRig.uploadSolidLevel(0, 4, LEVEL_COLORS[0]); - final int volume = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, volume); + final int volume = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, volume); - GLStateManager.glDeleteTextures(deleted); + GLSMTextures.glDeleteTextures(deleted); assertEquals(volume, BackendManager.RENDER_BACKEND.getInteger(GL12.GL_TEXTURE_BINDING_3D), "after the delete"); - for (int i = 0; i < RELEASE_DELAY_FRAMES; i++) GLStateManager.onFrameEnd(); + for (int i = 0; i < RELEASE_DELAY_FRAMES; i++) GLSMTextureLifetime.onFrameEnd(); assertEquals(0L, rm.getTextureHandle(deleted), "the frame-end release must have run"); assertEquals(volume, BackendManager.RENDER_BACKEND.getInteger(GL12.GL_TEXTURE_BINDING_3D), "after the release"); - GLStateManager.glBindTexture(GL12.GL_TEXTURE_3D, 0); - GLStateManager.glDeleteTextures(volume); + GLSMTextures.glBindTexture(GL12.GL_TEXTURE_3D, 0); + GLSMTextures.glDeleteTextures(volume); } } diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVoxelRegionBindTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVoxelRegionBindTest.java index 6d330a7ac..5d8543116 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVoxelRegionBindTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlVoxelRegionBindTest.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.sdlgpu.SdlTestRig; import com.gtnewhorizons.angelica.sdlgpu.frame.ContextState; import org.junit.jupiter.api.Tag; @@ -21,30 +21,30 @@ class GlsmSdlVoxelRegionBindTest { } private static void unbind(int slot) { - GLStateManager.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, slot, 0); + GLSMBuffers.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, slot, 0); } @Test void glsmBindBufferBaseReachesBothCaches() { final ContextState st = SdlTestRig.contextState(); - final int buf = GLStateManager.glGenBuffers(); + final int buf = GLSMBuffers.glGenBuffers(); try { - GLStateManager.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, BOUND_SLOT, buf); + GLSMBuffers.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, BOUND_SLOT, buf); assertEquals(buf, st.boundSsboByIndex[BOUND_SLOT], "SDL indexed SSBO slot"); assertEquals(buf, glsmGenericSsbo(), "GLSM generic SSBO binding"); } finally { unbind(BOUND_SLOT); - GLStateManager.glDeleteBuffers(buf); + GLSMBuffers.glDeleteBuffers(buf); } } @Test void deletingTheRegionBufferClearsTheGlsmGenericBinding() { - final int buf = GLStateManager.glGenBuffers(); + final int buf = GLSMBuffers.glGenBuffers(); try { - GLStateManager.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, BOUND_SLOT, buf); + GLSMBuffers.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, BOUND_SLOT, buf); assertEquals(buf, glsmGenericSsbo()); - GLStateManager.glDeleteBuffers(buf); + GLSMBuffers.glDeleteBuffers(buf); assertEquals(0, glsmGenericSsbo(), "delete must see the tracked SSBO binding"); } finally { unbind(BOUND_SLOT); diff --git a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlWideLineTest.java b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlWideLineTest.java index c0c1adfc7..6425fcde0 100644 --- a/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlWideLineTest.java +++ b/sdl-gpu/src/test/java/com/gtnewhorizons/angelica/sdlgpu/glsm/GlsmSdlWideLineTest.java @@ -1,6 +1,10 @@ package com.gtnewhorizons.angelica.sdlgpu.glsm; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -23,19 +27,19 @@ class GlsmSdlWideLineTest { @AfterEach void resetLineState() { - GLStateManager.glLineWidth(1.0f); - GLStateManager.glDisable(GL11.GL_LINE_STIPPLE); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMRasterizer.glLineWidth(1.0f); + GLSMEnable.glDisable(GL11.GL_LINE_STIPPLE); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } private static void line(float[] start, float[] end) { - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glBegin(GL11.GL_LINES); - GLStateManager.glVertex3f(start[0], start[1], start[2]); - GLStateManager.glVertex3f(end[0], end[1], end[2]); - GLStateManager.glEnd(); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMDraws.glBegin(GL11.GL_LINES); + GLSMDraws.glVertex3f(start[0], start[1], start[2]); + GLSMDraws.glVertex3f(end[0], end[1], end[2]); + GLSMDraws.glEnd(); } private static int litInRow(int[] pixels, int y) { @@ -48,9 +52,9 @@ class GlsmSdlWideLineTest { @Test void stippledWideLineKeepsOnePhaseAcrossItsWidth() { - GLStateManager.glLineWidth(3.0f); - GLStateManager.glEnable(GL11.GL_LINE_STIPPLE); - GLStateManager.glLineStipple(2, (short) 0x0F0F); + GLSMRasterizer.glLineWidth(3.0f); + GLSMEnable.glEnable(GL11.GL_LINE_STIPPLE); + GLSMRasterizer.glLineStipple(2, (short) 0x0F0F); final float y = pixelCenter(32); line(new float[] { pixelCenter(8), y, 0f }, new float[] { pixelCenter(56), y, 0f }); @@ -70,11 +74,11 @@ class GlsmSdlWideLineTest { private static final float[] BEHIND = { 0f, 0.8f, 2f }; private static void nearPlaneScene() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glFrustum(-0.05, 0.05, -0.05, 0.05, 0.05, 100.0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLineWidth(3.0f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glFrustum(-0.05, 0.05, -0.05, 0.05, 0.05, 100.0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMRasterizer.glLineWidth(3.0f); } private static void assertWidthAcrossTheNearPlane(float[] start, float[] end) { @@ -124,15 +128,15 @@ class GlsmSdlWideLineTest { } private static void horizontalLines(float width, float lowerY, float upperY) { - GLStateManager.glEnable(GL11.GL_CULL_FACE); - GLStateManager.glLineWidth(width); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glBegin(GL11.GL_LINES); - GLStateManager.glVertex3f(-0.8f, lowerY, 0.0f); - GLStateManager.glVertex3f(0.8f, lowerY, 0.0f); - GLStateManager.glVertex3f(0.8f, upperY, 0.0f); - GLStateManager.glVertex3f(-0.8f, upperY, 0.0f); - GLStateManager.glEnd(); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); + GLSMRasterizer.glLineWidth(width); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMDraws.glBegin(GL11.GL_LINES); + GLSMDraws.glVertex3f(-0.8f, lowerY, 0.0f); + GLSMDraws.glVertex3f(0.8f, lowerY, 0.0f); + GLSMDraws.glVertex3f(0.8f, upperY, 0.0f); + GLSMDraws.glVertex3f(-0.8f, upperY, 0.0f); + GLSMDraws.glEnd(); } @Test @@ -154,7 +158,7 @@ class GlsmSdlWideLineTest { @Test void wideLineCoversItsFirstPixelButNotItsLast() { final float y = pixelCenter(16); - GLStateManager.glLineWidth(2.0f); + GLSMRasterizer.glLineWidth(2.0f); line(new float[] { pixelCenter(40), y, 0.0f }, new float[] { pixelCenter(20), y, 0.0f }); final int[] pixels = GlsmSdlHeadlessRig.readTarget(); diff --git a/src/main/java/com/gtnewhorizons/angelica/api/GLRedirects.java b/src/main/java/com/gtnewhorizons/angelica/api/GLRedirects.java index a134454e2..da5b1958b 100644 --- a/src/main/java/com/gtnewhorizons/angelica/api/GLRedirects.java +++ b/src/main/java/com/gtnewhorizons/angelica/api/GLRedirects.java @@ -5,53 +5,43 @@ import com.gtnewhorizons.angelica.glsm.redirect.GLSMRedirector; import java.util.HashMap; import java.util.Map; import java.util.TreeSet; +import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Public API for querying Angelica's GL call redirections. *

* Angelica's bytecode transformer redirects GL calls (e.g., {@code GL11.glPushMatrix()}) to - * {@link com.gtnewhorizons.angelica.glsm.GLStateManager GLStateManager} for state tracking and - * core profile compatibility. This works for normal Java bytecode loaded through the Forge classloader, + * the GLSM classes for state tracking and core profile compatibility. This works for normal Java bytecode loaded through the Forge classloader, * but callers that bypass class transformation (e.g., Nashorn/script engines, reflection, MethodHandles) * need to perform their own redirection. *

- * This class provides the redirect mapping data and a precompiled regex pattern for transforming + * This class provides the redirect mapping data and {@link #redirectScript} for transforming * script source text before evaluation. * *

Example: transforming a Nashorn script before eval

- * Given a script that uses {@code importPackage(Packages.org.lwjgl.opengl)} and calls - * {@code GL11.glPushMatrix()}, the text transformation rewrites those calls before evaluation: *
{@code
- * // Make GLStateManager available to the script -- either via importPackage:
- * script = "importPackage(Packages.com.gtnewhorizons.angelica.glsm);\n" + script;
- * // ... or via Java.type for an explicit binding:
- * // script = "var GLStateManager = Java.type('" + GLRedirects.TARGET_CLASS + "');\n" + script;
- *
- * // Rewrite: GL11.glPushMatrix() -> GLStateManager.glPushMatrix()
- * script = GLRedirects.getMethodRedirectPattern().matcher(script).replaceAll(mr -> {
- *     String target = GLRedirects.getTargetMethodName(mr.group(0));
- *     return target != null ? "GLStateManager." + target : mr.group(0);
- * });
- *
+ * script = GLRedirects.redirectScript(script);
  * engine.eval(script);
  * }
+ * {@link #getMethodRedirectPattern} and {@link #getTargetReference} remain for callers that rewrite text themselves. */ public final class GLRedirects { - /** Fully qualified name of the GLStateManager class that all methods redirect to. */ - @SuppressWarnings("unused") - public static final String TARGET_CLASS = "com.gtnewhorizons.angelica.glsm.GLStateManager"; - private static final String SHORT_GL_PREFIX; private static final Map> NAMED_CLASS_SHORT_NAME_MAP; private static final Map GL_PREFIX_METHOD_REDIRECTS; private static final Pattern METHOD_REDIRECT_PATTERN; + private static final Pattern UNQUALIFIED_METHOD_REDIRECT_PATTERN; + private static final String GLSM_INTERNAL_NAME = "com/gtnewhorizons/angelica/glsm/GLStateManager"; + private static final String GLSM_IMPORT = "importPackage(Packages.com.gtnewhorizons.angelica.glsm)"; + private static final Pattern GLSM_MEMBER_PATTERN = Pattern.compile("\\bGLStateManager\\.(\\w+)"); static { SHORT_GL_PREFIX = buildShortGLPrefix(); NAMED_CLASS_SHORT_NAME_MAP = buildNamedClassShortNameMap(); GL_PREFIX_METHOD_REDIRECTS = GLSMRedirector.getGLPrefixMethodRedirects(); - METHOD_REDIRECT_PATTERN = buildMethodRedirectPattern(); + METHOD_REDIRECT_PATTERN = buildMethodRedirectPattern("\\b"); + UNQUALIFIED_METHOD_REDIRECT_PATTERN = buildMethodRedirectPattern("(? { + final String cls = mr.group(1); + if (cls.equals("GLStateManager") || cls.startsWith("GLSM")) return Matcher.quoteReplacement(mr.group()); + final String ref = getTargetReference(mr.group()); + return Matcher.quoteReplacement(ref != null ? ref : mr.group()); + }); + result = GLSM_MEMBER_PATTERN.matcher(result).replaceAll(mr -> { + final String owner = GLSMRedirector.getTargetOwner(mr.group(1)); + if (owner == null || owner.equals(GLSM_INTERNAL_NAME)) return Matcher.quoteReplacement(mr.group()); + return Matcher.quoteReplacement(qualify(owner, mr.group(1))); + }); + if (result.equals(script)) return script; + return result.contains(GLSM_IMPORT) ? result : GLSM_IMPORT + ";\n" + result; + } + private static String buildShortGLPrefix() { final String glPrefix = GLSMRedirector.getGLPrefix(); return glPrefix.substring(glPrefix.lastIndexOf('/') + 1); @@ -106,13 +135,13 @@ public final class GLRedirects { return named; } - private static Pattern buildMethodRedirectPattern() { + private static Pattern buildMethodRedirectPattern(String lead) { final TreeSet alternatives = new TreeSet<>(); alternatives.add(Pattern.quote(SHORT_GL_PREFIX) + "\\w+"); for (final String shortName : NAMED_CLASS_SHORT_NAME_MAP.keySet()) { alternatives.add(Pattern.quote(shortName)); } final String classAlt = String.join("|", alternatives); - return Pattern.compile("\\b(" + classAlt + ")\\.\\w+\\b"); + return Pattern.compile(lead + "(" + classAlt + ")\\.\\w+\\b"); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/api/glstate/GLState.java b/src/main/java/com/gtnewhorizons/angelica/api/glstate/GLState.java new file mode 100644 index 000000000..7ed198093 --- /dev/null +++ b/src/main/java/com/gtnewhorizons/angelica/api/glstate/GLState.java @@ -0,0 +1,73 @@ +package com.gtnewhorizons.angelica.api.glstate; + +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.stacks.FogStateStack; +import org.joml.Matrix4f; +import org.joml.Vector3d; +import org.joml.Vector4f; + +import java.nio.FloatBuffer; + +/** Read-only access to the GL state Angelica tracks. Call from the render thread. */ +public final class GLState { + + private GLState() {} + + public static boolean isFogEnabled() { + return GLSMFog.getFogMode().isEnabled(); + } + + /** @return The fog mode: GL_EXP, GL_EXP2 or GL_LINEAR. */ + public static int getFogMode() { + return GLSMFog.getFogState().getFogMode(); + } + + public static float getFogStart() { + return GLSMFog.getFogState().getStart(); + } + + public static float getFogEnd() { + return GLSMFog.getFogState().getEnd(); + } + + public static float getFogDensity() { + return GLSMFog.getFogState().getDensity(); + } + + public static Vector4f getFogColor(Vector4f dest) { + final FogStateStack fog = GLSMFog.getFogState(); + return dest.set((float) fog.getFogColor().x, (float) fog.getFogColor().y, (float) fog.getFogColor().z, fog.getFogAlpha()); + } + + public static Vector3d getFogColor(Vector3d dest) { + return dest.set(GLSMFog.getFogState().getFogColor()); + } + + /** Writes the fog color as RGBA at the buffer's position. The position is not changed. */ + public static void getFogColor(FloatBuffer rgba) { + final FogStateStack fog = GLSMFog.getFogState(); + final int pos = rgba.position(); + rgba.put(pos, (float) fog.getFogColor().x); + rgba.put(pos + 1, (float) fog.getFogColor().y); + rgba.put(pos + 2, (float) fog.getFogColor().z); + rgba.put(pos + 3, fog.getFogAlpha()); + } + + public static Matrix4f getModelViewMatrix(Matrix4f dest) { + return dest.set(GLSMMatrices.getModelViewMatrix()); + } + + public static Matrix4f getProjectionMatrix(Matrix4f dest) { + return dest.set(GLSMMatrices.getProjectionMatrix()); + } + + public static String getRenderBackendName() { + return GLStateManager.getRenderBackendName(); + } + + public static boolean isRenderThread() { + return GLStateManager.isMainThread(); + } +} diff --git a/src/main/java/com/gtnewhorizons/angelica/api/glstate/package-info.java b/src/main/java/com/gtnewhorizons/angelica/api/glstate/package-info.java new file mode 100644 index 000000000..a00f2fafb --- /dev/null +++ b/src/main/java/com/gtnewhorizons/angelica/api/glstate/package-info.java @@ -0,0 +1,4 @@ +@API(owner = "angelica", provides = "angelica|glstate", apiVersion = "1") +package com.gtnewhorizons.angelica.api.glstate; + +import cpw.mods.fml.common.API; diff --git a/src/main/java/com/gtnewhorizons/angelica/api/tesr/TesrMeshProvider.java b/src/main/java/com/gtnewhorizons/angelica/api/tesr/TesrMeshProvider.java index 6aa8315c9..d32561f6a 100644 --- a/src/main/java/com/gtnewhorizons/angelica/api/tesr/TesrMeshProvider.java +++ b/src/main/java/com/gtnewhorizons/angelica/api/tesr/TesrMeshProvider.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.api.tesr; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import net.minecraft.tileentity.TileEntity; /** @@ -21,7 +21,7 @@ public interface TesrMeshProvider { /** Per-instance transform, defaults to TE position */ default void angelica$transform(TileEntity te, double x, double y, double z) { - GLStateManager.glTranslated(x, y, z); + GLSMMatrices.glTranslated(x, y, z); } /** Build and cache the mesh */ diff --git a/src/main/java/com/gtnewhorizons/angelica/client/font/BatchingFontRenderer.java b/src/main/java/com/gtnewhorizons/angelica/client/font/BatchingFontRenderer.java index a185344f5..ef5777747 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/font/BatchingFontRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/font/BatchingFontRenderer.java @@ -7,6 +7,17 @@ import com.gtnewhorizon.gtnhlib.util.font.FontRendering; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.config.FontConfig; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.ffp.FFPVertexLighting; @@ -129,16 +140,16 @@ public class BatchingFontRenderer { FontProviderMC.get(this.isSGA).locationFontTexture = this.locationFontTexture; fontShaderId = FontAAShader.getProgram().getProgramId(); - AAMode = GLStateManager.glGetUniformLocation(fontShaderId, "aaMode"); - AAStrength = GLStateManager.glGetUniformLocation(fontShaderId, "strength"); - fontBrightness = GLStateManager.glGetUniformLocation(fontShaderId, "fontBrightness"); - alphaTestRefLocation = GLStateManager.glGetUniformLocation(fontShaderId, "alphaTestRef"); - mvpMatrixLocation = GLStateManager.glGetUniformLocation(fontShaderId, "u_MVPMatrix"); - lightmapLocation = GLStateManager.glGetUniformLocation(fontShaderId, "u_Lightmap"); - lightmapSamplerLocation = GLStateManager.glGetUniformLocation(fontShaderId, "lightmap"); + AAMode = GLSMPrograms.glGetUniformLocation(fontShaderId, "aaMode"); + AAStrength = GLSMPrograms.glGetUniformLocation(fontShaderId, "strength"); + fontBrightness = GLSMPrograms.glGetUniformLocation(fontShaderId, "fontBrightness"); + alphaTestRefLocation = GLSMPrograms.glGetUniformLocation(fontShaderId, "alphaTestRef"); + mvpMatrixLocation = GLSMPrograms.glGetUniformLocation(fontShaderId, "u_MVPMatrix"); + lightmapLocation = GLSMPrograms.glGetUniformLocation(fontShaderId, "u_Lightmap"); + lightmapSamplerLocation = GLSMPrograms.glGetUniformLocation(fontShaderId, "lightmap"); if (ebo == null) { ebo = new IndexBuffer(); - vbo = GLStateManager.glGenBuffers(); + vbo = GLSMBuffers.glGenBuffers(); allocateBuffers(); } } @@ -372,7 +383,7 @@ public class BatchingFontRenderer { return; } } - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); vboCapacity = StreamingUploader.upload(vertexData, vboCapacity); pendingBuffer = vbo; pendingBase = 0; @@ -607,12 +618,12 @@ public class BatchingFontRenderer { if (batchMatrixValid) { batchProj.mul(batchModelView, dest); } else { - GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), dest); + GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), dest); } } private void resolveModelView(Matrix4f dest) { - dest.set(batchMatrixValid ? batchModelView : GLStateManager.getModelViewMatrix()); + dest.set(batchMatrixValid ? batchModelView : GLSMMatrices.getModelViewMatrix()); } private void sealBatchSegment() { @@ -747,25 +758,25 @@ public class BatchingFontRenderer { final BatchingFontRenderer first = deferredSegments.getFirst().owner; final int prevBlockEntityId = CapturedRenderingState.INSTANCE.getCurrentRenderedBlockEntity(); - final int d = GLStateManager.pushState(StateSet.FONT_PIPELINE); + final int d = GLSMAttribStack.pushState(StateSet.FONT_PIPELINE); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.enableTexture(); - GLStateManager.enableAlphaTest(); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(first.blendSrcRGB, first.blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.enableTexture(); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(first.blendSrcRGB, first.blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO); final Boolean prevTranslucency = GbufferPrograms.beginTranslucencyDeclaration(Boolean.TRUE); GbufferPrograms.setBlockEntityDefaults(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); try { for (final TextSegment segment : deferredSegments) { final BatchingFontRenderer owner = segment.owner; if (segment.cmdStart == segment.cmdEnd) continue; - GLStateManager.setModelViewMatrix(segment.modelView); + GLSMMatrices.setModelViewMatrix(segment.modelView); CapturedRenderingState.INSTANCE.setCurrentBlockEntity(segment.blockEntityId); segment.drawState.apply(); @@ -776,12 +787,12 @@ public class BatchingFontRenderer { segment.packedLight, segment.normalX, segment.normalY, segment.normalZ); } } finally { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); CapturedRenderingState.INSTANCE.setCurrentBlockEntity(prevBlockEntityId); GbufferPrograms.endTranslucencyDeclaration(prevTranslucency); } } finally { - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); discardDeferredText(); } } @@ -791,32 +802,32 @@ public class BatchingFontRenderer { uploadVertexData(deferredVertexPos); } - final int d = GLStateManager.pushState(StateSet.FONT); + final int d = GLSMAttribStack.pushState(StateSet.FONT); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); deferredSegments.get(0).owner.setupFontDrawState(); flushLastTexture = INVALID_TEXTURE; resetFlushLightmap(); for (final TextSegment segment : deferredSegments) { FLUSH_MVP.clear(); segment.mvp.get(FLUSH_MVP); - GLStateManager.glUniformMatrix4(segment.owner.mvpMatrixLocation, false, FLUSH_MVP); + GLSMPrograms.glUniformMatrix4(segment.owner.mvpMatrixLocation, false, FLUSH_MVP); uploadLightmap(segment.owner.lightmapLocation, segment.lightmapActive, segment.lightmapU, segment.lightmapV, segment.lightmapTexture); segment.owner.applyDrawState(segment.drawState); drawCommands(segment.owner.batchCommands.elements(), segment.cmdStart, segment.cmdEnd, segment.owner); } } finally { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); - GLStateManager.popStateTo(d); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); + GLSMAttribStack.popStateTo(d); discardDeferredText(); } } private void applyDrawState(TextDrawState state) { state.apply(); - GLStateManager.glUniform1f(alphaTestRefLocation, state.alphaRef); + GLSMPrograms.glUniform1f(alphaTestRefLocation, state.alphaRef); } public static void discardDeferredText() { @@ -917,7 +928,7 @@ public class BatchingFontRenderer { } Arrays.sort(cmds, batchSealedEnd, cmdCount, FontDrawCmd.DRAW_ORDER_COMPARATOR); - final int d = GLStateManager.pushState(StateSet.FONT); + final int d = GLSMAttribStack.pushState(StateSet.FONT); try { setupFontDrawState(); flushLastTexture = INVALID_TEXTURE; @@ -927,7 +938,7 @@ public class BatchingFontRenderer { final TextSegment segment = batchSegments.get(i); FLUSH_MVP.clear(); segment.mvp.get(FLUSH_MVP); - GLStateManager.glUniformMatrix4(mvpMatrixLocation, false, FLUSH_MVP); + GLSMPrograms.glUniformMatrix4(mvpMatrixLocation, false, FLUSH_MVP); uploadLightmap(lightmapLocation, segment.lightmapActive, segment.lightmapU, segment.lightmapV, segment.lightmapTexture); applyDrawState(segment.drawState); drawCommands(cmds, segment.cmdStart, segment.cmdEnd, this); @@ -936,17 +947,17 @@ public class BatchingFontRenderer { FLUSH_MVP.clear(); resolveMvp(scratchMvp); scratchMvp.get(FLUSH_MVP); - GLStateManager.glUniformMatrix4(mvpMatrixLocation, false, FLUSH_MVP); + GLSMPrograms.glUniformMatrix4(mvpMatrixLocation, false, FLUSH_MVP); uploadLightmap(lightmapLocation, lightmapActive, lightmapU, lightmapV, lightmapTextureId); applyDrawState(drawState); drawCommands(cmds, batchSealedEnd, cmdCount, this); } } finally { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); } } finally { - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); } truncateBatchToWatermark(); @@ -957,27 +968,27 @@ public class BatchingFontRenderer { } private void setupFontDrawState() { - GLStateManager.enableTexture(); - GLStateManager.enableAlphaTest(); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(blendSrcRGB, blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glShadeModel(GL11.GL_FLAT); + GLSMTextures.enableTexture(); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(blendSrcRGB, blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO); + GLSMRasterizer.glShadeModel(GL11.GL_FLAT); - GLStateManager.glUseProgram(fontShaderId); + GLSMPrograms.glUseProgram(fontShaderId); if (FontConfig.fontAAMode != fontAAModeLast) { fontAAModeLast = FontConfig.fontAAMode; - GLStateManager.glUniform1i(AAMode, FontConfig.fontAAMode); + GLSMPrograms.glUniform1i(AAMode, FontConfig.fontAAMode); } if (FontConfig.fontAAStrength != fontAAStrengthLast) { fontAAStrengthLast = FontConfig.fontAAStrength; - GLStateManager.glUniform1f(AAStrength, preprocessAAStrength()); + GLSMPrograms.glUniform1f(AAStrength, preprocessAAStrength()); } if (FontConfig.fontBrightness != fontBrightnessLast) { fontBrightnessLast = FontConfig.fontBrightness; - GLStateManager.glUniform1f(fontBrightness, 0.625f * FontConfig.fontBrightness + 0.1875f); + GLSMPrograms.glUniform1f(fontBrightness, 0.625f * FontConfig.fontBrightness + 0.1875f); } if (lightmapSamplerProgram != fontShaderId) { - GLStateManager.glUniform1i(lightmapSamplerLocation, LIGHTMAP_TEX_UNIT); + GLSMPrograms.glUniform1i(lightmapSamplerLocation, LIGHTMAP_TEX_UNIT); lightmapSamplerProgram = fontShaderId; } @@ -988,28 +999,28 @@ public class BatchingFontRenderer { } int fontVAO = glCtx.fontVao; if (fontVAO == 0) { - fontVAO = GLStateManager.glGenVertexArrays(); + fontVAO = GLSMVertexInput.glGenVertexArrays(); glCtx.fontVao = fontVAO; - GLStateManager.glBindVertexArray(fontVAO); + GLSMVertexInput.glBindVertexArray(fontVAO); ebo.bind(); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glEnableVertexAttribArray(1); - GLStateManager.glEnableVertexAttribArray(2); - GLStateManager.glEnableVertexAttribArray(3); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glEnableVertexAttribArray(1); + GLSMVertexInput.glEnableVertexAttribArray(2); + GLSMVertexInput.glEnableVertexAttribArray(3); } else { - GLStateManager.glBindVertexArray(fontVAO); + GLSMVertexInput.glBindVertexArray(fontVAO); } } private static void bindVertexSource(int buffer, int base) { if (vaoBuffer != buffer || vaoBase != base) { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); - GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, base); - GLStateManager.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, base + 8); - GLStateManager.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, VERTEX_SIZE, base + 16); - GLStateManager.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, VERTEX_SIZE, base + 20); + GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, base); + GLSMVertexInput.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, base + 8); + GLSMVertexInput.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, VERTEX_SIZE, base + 16); + GLSMVertexInput.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, VERTEX_SIZE, base + 20); vaoBuffer = buffer; vaoBase = base; @@ -1029,18 +1040,18 @@ public class BatchingFontRenderer { } private static int boundLightmapTexture() { - return GLStateManager.getTextures().getTextureUnitBindings(LIGHTMAP_TEX_UNIT).getBinding(); + return GLSMTextures.getTextures().getTextureUnitBindings(LIGHTMAP_TEX_UNIT).getBinding(); } private static void bindLightmapTexture(int texture) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private static void uploadLightmap(int uniformLocation, boolean active, float u, float v, int texture) { if (u != flushLastLightmapU || v != flushLastLightmapV || active != flushLastLightmapActive) { - GLStateManager.glUniform3f(uniformLocation, u, v, active ? 1.0f : 0.0f); + GLSMPrograms.glUniform3f(uniformLocation, u, v, active ? 1.0f : 0.0f); flushLastLightmapU = u; flushLastLightmapV = v; flushLastLightmapActive = active; @@ -1075,9 +1086,9 @@ public class BatchingFontRenderer { final FontDrawCmd cmd = cmdsData[i]; if (flushLastTexture != cmd.texture) { if (flushLastTexture == 0) { - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); } else if (cmd.texture == 0) { - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); } if (cmd.texture != 0) { bindIntTexture(owner, cmd.texture); @@ -1086,7 +1097,7 @@ public class BatchingFontRenderer { } if (cmd.mesh == null) { bindVertexSource(pendingBuffer, pendingBase); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, cmd.idxCount, GL11.GL_UNSIGNED_SHORT, (long) cmd.startVtx * 2L); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, cmd.idxCount, GL11.GL_UNSIGNED_SHORT, (long) cmd.startVtx * 2L); continue; } int end = i + 1; @@ -1097,10 +1108,10 @@ public class BatchingFontRenderer { } bindVertexSource(cmd.buffer, 0); // GLSM's glDrawElementsBaseVertex and glMultiDrawElementsBaseVertex skip glDrawElements' preDraw (pending program, deferred blend, entity ids, deferred attribs); drop this and those go stale. - GLStateManager.preDraw(GLStateManager.ctx(), GL11.GL_TRIANGLES); + GLSMDraws.preDraw(GLStateManager.ctx(), GL11.GL_TRIANGLES); final int runLength = end - i; if (runLength == 1) { - GLStateManager.glDrawElementsBaseVertex(GL11.GL_TRIANGLES, cmd.idxCount, GL11.GL_UNSIGNED_SHORT, (long) cmd.startVtx * 2L, cmd.baseVertex); + GLSMDraws.glDrawElementsBaseVertex(GL11.GL_TRIANGLES, cmd.idxCount, GL11.GL_UNSIGNED_SHORT, (long) cmd.startVtx * 2L, cmd.baseVertex); } else { if (runLength > multiDrawCapacity) growMultiDraw(runLength); for (int k = 0; k < runLength; k++) { @@ -1109,7 +1120,7 @@ public class BatchingFontRenderer { memPutAddress(multiDrawIndicesAddress + (long) k * Pointer.POINTER_SIZE, (long) run.startVtx * 2L); memPutInt(multiDrawBaseVerticesAddress + (long) k * 4L, run.baseVertex); } - GLStateManager.glMultiDrawElementsBaseVertex(GL11.GL_TRIANGLES, multiDrawCountsAddress, GL11.GL_UNSIGNED_SHORT, + GLSMDraws.glMultiDrawElementsBaseVertex(GL11.GL_TRIANGLES, multiDrawCountsAddress, GL11.GL_UNSIGNED_SHORT, multiDrawIndicesAddress, runLength, multiDrawBaseVerticesAddress); } i = end - 1; @@ -1136,30 +1147,30 @@ public class BatchingFontRenderer { // The unsealed tail still belongs to the modelview live at flush time; capture it before the segments move it. resolveModelView(scratchModelView); - final int d = GLStateManager.pushState(StateSet.FONT_PIPELINE); + final int d = GLSMAttribStack.pushState(StateSet.FONT_PIPELINE); try { - GLStateManager.enableTexture(); - GLStateManager.enableAlphaTest(); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(blendSrcRGB, blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO); + GLSMTextures.enableTexture(); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(blendSrcRGB, blendDstRGB, GL11.GL_ONE, GL11.GL_ZERO); final Boolean prevTranslucency = GbufferPrograms.beginTranslucencyDeclaration(Boolean.TRUE); GbufferPrograms.setBlockEntityDefaults(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); try { for (int i = 0; i < segmentCount; i++) { final TextSegment segment = batchSegments.get(i); if (segment.cmdStart == segment.cmdEnd) continue; - GLStateManager.setModelViewMatrix(segment.modelView); + GLSMMatrices.setModelViewMatrix(segment.modelView); CapturedRenderingState.INSTANCE.setCurrentBlockEntity(segment.blockEntityId); segment.drawState.apply(); emitRangeThroughPipeline(this, cmdsData, segment.cmdStart, segment.cmdEnd, segment.packedLight, segment.normalX, segment.normalY, segment.normalZ); } if (batchSealedEnd < cmdCount) { - GLStateManager.setModelViewMatrix(scratchModelView); + GLSMMatrices.setModelViewMatrix(scratchModelView); CapturedRenderingState.INSTANCE.setCurrentBlockEntity(prevBlockEntityId); drawState.apply(); final Vector3f normal = ShaderManager.getCurrentNormal(); @@ -1167,12 +1178,12 @@ public class BatchingFontRenderer { lightmapPackedLight, normal.x, normal.y, normal.z); } } finally { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); CapturedRenderingState.INSTANCE.setCurrentBlockEntity(prevBlockEntityId); GbufferPrograms.endTranslucencyDeclaration(prevTranslucency); } } finally { - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); truncateBatchToWatermark(); } } @@ -1192,9 +1203,9 @@ public class BatchingFontRenderer { drawing = false; } if (cmd.texture == 0) { - GLStateManager.disableTexture(); + GLSMTextures.disableTexture(); } else { - GLStateManager.enableTexture(); + GLSMTextures.enableTexture(); bindIntTexture(owner, cmd.texture); } lastTexture = cmd.texture; diff --git a/src/main/java/com/gtnewhorizons/angelica/client/font/FontProviderCustom.java b/src/main/java/com/gtnewhorizons/angelica/client/font/FontProviderCustom.java index 21fc2a785..8ea062adc 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/font/FontProviderCustom.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/font/FontProviderCustom.java @@ -4,7 +4,7 @@ import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memAllocInt; import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memFree; import com.gtnewhorizons.angelica.config.FontConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import jss.util.RandomXoshiro256StarStar; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -65,7 +65,7 @@ public final class FontProviderCustom implements FontProvider { for (int i = 0; i < ATLAS_COUNT; i++) { if (this.atlasTextures[i] != 0) { - GLStateManager.glDeleteTextures(this.atlasTextures[i]); + GLSMTextures.glDeleteTextures(this.atlasTextures[i]); this.atlasTextures[i] = 0; } } @@ -236,18 +236,18 @@ public final class FontProviderCustom implements FontProvider { final BufferedImage image = rasterize(id); if (image == null) { return 0; } - final int texture = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); + final int texture = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); final int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); final IntBuffer pixelBuffer = memAllocInt(pixels.length); pixelBuffer.put(pixels); pixelBuffer.flip(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, image.getWidth(), image.getHeight(), 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, image.getWidth(), image.getHeight(), 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer); memFree(pixelBuffer); this.atlasTextures[id] = texture; diff --git a/src/main/java/com/gtnewhorizons/angelica/client/font/FontStrategist.java b/src/main/java/com/gtnewhorizons/angelica/client/font/FontStrategist.java index 4dfa1b0b7..a4017ec87 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/font/FontStrategist.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/font/FontStrategist.java @@ -3,6 +3,7 @@ package com.gtnewhorizons.angelica.client.font; import com.google.common.collect.HashMultiset; import com.gtnewhorizon.gtnhlib.util.font.GlyphReplacements; import com.gtnewhorizons.angelica.config.FontConfig; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor; import cpw.mods.fml.client.SplashProgress; @@ -260,7 +261,7 @@ public class FontStrategist { static void bindIntTexture(BatchingFontRenderer owner, int texture) { if (texture > 0) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); } else if (texture < 0) { final ResourceLocation location; synchronized (RESOURCE_LOCK) { diff --git a/src/main/java/com/gtnewhorizons/angelica/client/font/RetainedTextStore.java b/src/main/java/com/gtnewhorizons/angelica/client/font/RetainedTextStore.java index 745ff2058..1b9258f2d 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/font/RetainedTextStore.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/font/RetainedTextStore.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.client.font; import com.gtnewhorizons.angelica.glsm.FeedbackManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.backend.RenderBackend; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -108,10 +109,10 @@ final class RetainedTextStore { private static void create(int capacity) { final int previous = GLStateManager.ctx().boundVBO; - buffer = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, (long) capacity * BatchingFontRenderer.QUAD_BYTES, GL15.GL_DYNAMIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, previous); + buffer = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, (long) capacity * BatchingFontRenderer.QUAD_BYTES, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, previous); capacityQuads = capacity; allocator.reset(capacity); resident.clear(); @@ -123,9 +124,9 @@ final class RetainedTextStore { final ByteBuffer vertices = mesh.vertices; vertices.position(0); vertices.limit(mesh.quadCount * BatchingFontRenderer.QUAD_BYTES); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); - GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, (long) start * BatchingFontRenderer.QUAD_BYTES, vertices); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, previous); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); + GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, (long) start * BatchingFontRenderer.QUAD_BYTES, vertices); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, previous); vertices.clear(); } @@ -150,7 +151,7 @@ final class RetainedTextStore { final int id = retiredBuffers[i]; if (retiredBufferFrames[i] <= deletableUpTo) { BatchingFontRenderer.forgetVertexSource(id); - GLStateManager.glDeleteBuffers(id); + GLSMBuffers.glDeleteBuffers(id); } else { retiredBuffers[kept] = id; retiredBufferFrames[kept] = retiredBufferFrames[i]; diff --git a/src/main/java/com/gtnewhorizons/angelica/client/font/TextDrawState.java b/src/main/java/com/gtnewhorizons/angelica/client/font/TextDrawState.java index d8e5a15e1..92568008c 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/font/TextDrawState.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/font/TextDrawState.java @@ -1,7 +1,10 @@ package com.gtnewhorizons.angelica.client.font; import com.gtnewhorizons.angelica.glsm.GLContextState; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.states.ColorMask; import com.gtnewhorizons.angelica.glsm.states.PolygonState; import org.lwjgl.opengl.GL11; @@ -83,14 +86,14 @@ final class TextDrawState { } void apply() { - if (depthTest) GLStateManager.enableDepthTest(); else GLStateManager.disableDepthTest(); - GLStateManager.glDepthFunc(depthFunc); - GLStateManager.glDepthMask(depthMask); - GLStateManager.glColorMask(colorRed, colorGreen, colorBlue, colorAlpha); - if (cull) GLStateManager.enableCull(); else GLStateManager.disableCull(); - GLStateManager.glCullFace(cullFace); - GLStateManager.glFrontFace(frontFace); - if (polygonOffset) GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); else GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(offsetFactor, offsetUnits); + if (depthTest) GLSMDepthStencilAlpha.enableDepthTest(); else GLSMDepthStencilAlpha.disableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(depthFunc); + GLSMDepthStencilAlpha.glDepthMask(depthMask); + GLSMBlend.glColorMask(colorRed, colorGreen, colorBlue, colorAlpha); + if (cull) GLSMRasterizer.enableCull(); else GLSMRasterizer.disableCull(); + GLSMRasterizer.glCullFace(cullFace); + GLSMRasterizer.glFrontFace(frontFace); + if (polygonOffset) GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); else GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(offsetFactor, offsetUnits); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/client/gui/SliderClone.java b/src/main/java/com/gtnewhorizons/angelica/client/gui/SliderClone.java index 13516cf84..e7b2ecf4a 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/gui/SliderClone.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/gui/SliderClone.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.client.gui; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import lombok.AllArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; @@ -123,7 +123,7 @@ public class SliderClone extends GuiButton { this.displayString = displayStringFormatter.apply(f); } - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.drawTexturedModalRect(this.xPosition + (int)(this.sliderPercentage * (float)(this.width - 8)), this.yPosition, 0, 66, 4, 20); this.drawTexturedModalRect(this.xPosition + (int)(this.sliderPercentage * (float)(this.width - 8)) + 4, this.yPosition, 196, 66, 4, 20); } diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java index b5daa5d6c..4deec6494 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/AngelicaFogService.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.client.rendering; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFog; import org.embeddedt.embeddium.impl.render.chunk.fog.FogService; import org.embeddedt.embeddium.impl.render.chunk.shader.ChunkFogMode; @@ -11,17 +11,17 @@ public class AngelicaFogService implements FogService { @Override public float getFogEnd() { - return GLStateManager.getFogState().getEnd(); + return GLSMFog.getFogState().getEnd(); } @Override public float getFogStart() { - return GLStateManager.getFogState().getStart(); + return GLSMFog.getFogState().getStart(); } @Override public float getFogDensity() { - return GLStateManager.getFogState().getDensity(); + return GLSMFog.getFogState().getDensity(); } @Override @@ -36,7 +36,7 @@ public class AngelicaFogService implements FogService { @Override public float[] getFogColor() { - final var fogState = GLStateManager.getFogState(); + final var fogState = GLSMFog.getFogState(); final var color = fogState.getFogColor(); fogColorArray[0] = (float) color.x; fogColorArray[1] = (float) color.y; @@ -47,9 +47,9 @@ public class AngelicaFogService implements FogService { @Override public ChunkFogMode getFogMode() { - if (!GLStateManager.getFogMode().isEnabled()) { + if (!GLSMFog.getFogMode().isEnabled()) { return ChunkFogMode.NONE; } - return ChunkFogMode.fromGLMode(GLStateManager.getFogState().getFogMode()); + return ChunkFogMode.fromGLMode(GLSMFog.getFogState().getFogMode()); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java index 74c812960..436ac92dc 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/DeferredDrawBatcher.java @@ -1,7 +1,10 @@ package com.gtnewhorizons.angelica.client.rendering; import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer; import lombok.Getter; import net.minecraft.client.renderer.Tessellator; @@ -107,7 +110,7 @@ public class DeferredDrawBatcher { subEnd++; // Don't try to merge strips, fans, loops or polygons - if (GLStateManager.isContinuousDraw(drawMode)) break; + if (GLSMDraws.isContinuousDraw(drawMode)) break; } drawPackedBatch(batchTessellator, ranges, i, subEnd, totalBytes, totalVertices, drawMode, flags); @@ -150,14 +153,14 @@ public class DeferredDrawBatcher { * - fog state (mode, color, start/end — constant for the frame) */ static long captureStateKey() { - final int activeUnit = GLStateManager.getActiveTextureUnit(); - final int textureId = GLStateManager.getTextures().getTextureUnitBindings(activeUnit).getBinding(); - final int srcRgb = GLStateManager.getBlendState().getSrcRgb(); - final int dstRgb = GLStateManager.getBlendState().getDstRgb(); - final boolean blendEnabled = GLStateManager.getBlendMode().isEnabled(); - final boolean depthMask = GLStateManager.getDepthState().isEnabled(); - final boolean tex0Enabled = GLStateManager.getTextures().getTextureUnitStates(0).isEnabled(); - final boolean tex1Enabled = GLStateManager.getTextures().getTextureUnitStates(1).isEnabled(); + final int activeUnit = GLSMTextures.getActiveTextureUnit(); + final int textureId = GLSMTextures.getTextures().getTextureUnitBindings(activeUnit).getBinding(); + final int srcRgb = GLSMBlend.getBlendState().getSrcRgb(); + final int dstRgb = GLSMBlend.getBlendState().getDstRgb(); + final boolean blendEnabled = GLSMBlend.getBlendMode().isEnabled(); + final boolean depthMask = GLSMDepthStencilAlpha.getDepthState().isEnabled(); + final boolean tex0Enabled = GLSMTextures.getTextures().getTextureUnitStates(0).isEnabled(); + final boolean tex1Enabled = GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled(); return packStateKey(textureId, srcRgb, dstRgb, blendEnabled, depthMask, tex0Enabled, tex1Enabled); } @@ -189,15 +192,15 @@ public class DeferredDrawBatcher { final boolean tex0Enabled = unpackTex0Enabled(key); final boolean tex1Enabled = unpackTex1Enabled(key); - GLStateManager.getTextures().getTextureUnitStates(0).setEnabled(tex0Enabled); - GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(tex1Enabled); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textureId); - GLStateManager.glBlendFunc(srcRgb, dstRgb); + GLSMTextures.getTextures().getTextureUnitStates(0).setEnabled(tex0Enabled); + GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(tex1Enabled); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textureId); + GLSMBlend.glBlendFunc(srcRgb, dstRgb); if (blendEnabled) { - GLStateManager.enableBlend(); + GLSMBlend.enableBlend(); } else { - GLStateManager.disableBlend(); + GLSMBlend.disableBlend(); } - GLStateManager.glDepthMask(depthMask); + GLSMDepthStencilAlpha.glDepthMask(depthMask); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java index 173db07db..a22f8c657 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat2v.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.client.rendering; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniform; public class GlUniformFloat2v extends GlUniform { @@ -14,10 +14,10 @@ public class GlUniformFloat2v extends GlUniform { if (value.length != 2) { throw new IllegalArgumentException("value.length != 2"); } - GLStateManager.glUniform2f(this.index, value[0], value[1]); + GLSMPrograms.glUniform2f(this.index, value[0], value[1]); } public void set(float x, float y) { - GLStateManager.glUniform2f(this.index, x, y); + GLSMPrograms.glUniform2f(this.index, x, y); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat3Array.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat3Array.java index b3b74d128..5cd78c188 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat3Array.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat3Array.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.client.rendering; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniform; import java.nio.FloatBuffer; @@ -13,6 +13,6 @@ public class GlUniformFloat3Array extends GlUniform { @Override public void set(FloatBuffer value) { - GLStateManager.glUniform3(this.index, value); + GLSMPrograms.glUniform3(this.index, value); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat4Array.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat4Array.java index b24172386..ebfed5f2d 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat4Array.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/GlUniformFloat4Array.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.client.rendering; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniform; import java.nio.FloatBuffer; @@ -13,6 +13,6 @@ public class GlUniformFloat4Array extends GlUniform { @Override public void set(FloatBuffer value) { - GLStateManager.glUniform4(this.index, value); + GLSMPrograms.glUniform4(this.index, value); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/client/rendering/ModelViewDelta.java b/src/main/java/com/gtnewhorizons/angelica/client/rendering/ModelViewDelta.java index e1ff9888c..b13984596 100644 --- a/src/main/java/com/gtnewhorizons/angelica/client/rendering/ModelViewDelta.java +++ b/src/main/java/com/gtnewhorizons/angelica/client/rendering/ModelViewDelta.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.client.rendering; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import org.joml.Matrix4f; import org.joml.Matrix4fc; @@ -10,12 +10,12 @@ public final class ModelViewDelta { private final Matrix4f baseInverse = new Matrix4f(); public void snapshot() { - base.set(GLStateManager.getModelViewMatrix()); + base.set(GLSMMatrices.getModelViewMatrix()); base.invert(baseInverse); } public Matrix4fc deltaOrNull(Matrix4f scratch) { - final Matrix4f current = GLStateManager.getModelViewMatrix(); + final Matrix4f current = GLSMMatrices.getModelViewMatrix(); if (current.equals(base)) return null; return baseInverse.mul(current, scratch); } diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/DriverCompatabilityCheck.java b/src/main/java/com/gtnewhorizons/angelica/compat/DriverCompatabilityCheck.java index 38482b8c0..6b91ed18c 100644 --- a/src/main/java/com/gtnewhorizons/angelica/compat/DriverCompatabilityCheck.java +++ b/src/main/java/com/gtnewhorizons/angelica/compat/DriverCompatabilityCheck.java @@ -6,6 +6,8 @@ import org.lwjgl.opengl.ARBDebugOutput; import org.lwjgl.opengl.GL11; import com.gtnewhorizons.angelica.config.SystemProperties; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.LTWWorkaround; @@ -21,9 +23,9 @@ public class DriverCompatabilityCheck { * Should be called after GL context is created and GLStateManager is initialized. */ public static void checkDriverCompatibility() { - final String vendor = GLStateManager.glGetString(GL11.GL_VENDOR); - final String renderer = GLStateManager.glGetString(GL11.GL_RENDERER); - final String version = GLStateManager.glGetString(GL11.GL_VERSION); + final String vendor = GLSMQueries.glGetString(GL11.GL_VENDOR); + final String renderer = GLSMQueries.glGetString(GL11.GL_RENDERER); + final String version = GLSMQueries.glGetString(GL11.GL_VERSION); LOGGER.info("OpenGL Vendor: {}", vendor); LOGGER.info("OpenGL Renderer: {}", renderer); @@ -58,6 +60,6 @@ public class DriverCompatabilityCheck { } LOGGER.info("Enabling workaround for NVIDIA threaded optimizations"); - GLStateManager.glEnable(ARBDebugOutput.GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); + GLSMEnable.glEnable(ARBDebugOutput.GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/debug/BotaniaDebugEntry.java b/src/main/java/com/gtnewhorizons/angelica/compat/debug/BotaniaDebugEntry.java index 81e994e90..72f73cfb7 100644 --- a/src/main/java/com/gtnewhorizons/angelica/compat/debug/BotaniaDebugEntry.java +++ b/src/main/java/com/gtnewhorizons/angelica/compat/debug/BotaniaDebugEntry.java @@ -6,6 +6,7 @@ import com.gtnewhorizons.angelica.api.debug.DebugGroupHandle; import com.gtnewhorizons.angelica.api.debug.DebugScreenApi; import com.gtnewhorizons.angelica.api.debug.DebugScreenDisplayer; import com.gtnewhorizons.angelica.api.debug.DebugScreenEntry; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import com.gtnewhorizons.angelica.glsm.GLStateManager; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -59,9 +60,9 @@ public final class BotaniaDebugEntry implements DebugScreenEntry { return; } if (glVersion == null) { - glVersion = GLStateManager.glGetString(GL11.GL_VERSION); - glRenderer = GLStateManager.glGetString(GL11.GL_RENDERER); - glslVersion = GLStateManager.glGetString(GL20.GL_SHADING_LANGUAGE_VERSION); + glVersion = GLSMQueries.glGetString(GL11.GL_VERSION); + glRenderer = GLSMQueries.glGetString(GL11.GL_RENDERER); + glslVersion = GLSMQueries.glGetString(GL20.GL_SHADING_LANGUAGE_VERSION); } final ContextCapabilities caps = GLStateManager.capabilities; writeContext(displayer, group, ConfigHandler.useShaders, ConfigHandler.glSecondaryTextureUnit, glVersion, glRenderer, glslVersion, GLStateManager.MAX_TEXTURE_UNITS, caps.GL_ARB_multitexture, caps.GL_ARB_texture_non_power_of_two, caps.OpenGL13); diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompat.java b/src/main/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompat.java index 1e425b17b..edf204fa7 100644 --- a/src/main/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompat.java +++ b/src/main/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompat.java @@ -1,6 +1,8 @@ package com.gtnewhorizons.angelica.compat.draconicevolution; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.ItemBlock; @@ -21,24 +23,24 @@ public final class PlacedItemRenderCompat { public static void render(double x, double y, double z, Runnable draw) { final boolean inFrame = RenderItem.renderInFrame; - GLStateManager.glPushMatrix(); - GLStateManager.glPushAttrib(GL11.GL_ENABLE_BIT); + GLSMMatrices.glPushMatrix(); + GLSMAttribStack.glPushAttrib(GL11.GL_ENABLE_BIT); try { - GLStateManager.glTranslated(x, y, z); + GLSMMatrices.glTranslated(x, y, z); draw.run(); } finally { RenderItem.renderInFrame = inFrame; - GLStateManager.glPopAttrib(); - GLStateManager.glPopMatrix(); + GLSMAttribStack.glPopAttrib(); + GLSMMatrices.glPopMatrix(); } } public static byte renderWithBatchState(double x, double y, double z, byte state, Runnable draw) { - BatchEligibility.beginIsolated(state, GLStateManager.drawCalls); + BatchEligibility.beginIsolated(state, GLSMDraws.drawCalls); try { render(x, y, z, draw); } finally { - state = BatchEligibility.endIsolated(state, GLStateManager.drawCalls); + state = BatchEligibility.endIsolated(state, GLSMDraws.drawCalls); } return state; } diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/AutoClosableAbstractTexture.java b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/AutoClosableAbstractTexture.java index e333de8c1..3e933d290 100644 --- a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/AutoClosableAbstractTexture.java +++ b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/AutoClosableAbstractTexture.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.compat.mojang; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import net.minecraft.client.renderer.texture.AbstractTexture; import org.lwjgl.opengl.GL11; @@ -12,6 +12,6 @@ public abstract class AutoClosableAbstractTexture extends AbstractTexture implem // TODO: Is this needed? public void bind() { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, getGlTextureId()); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, getGlTextureId()); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/NativeImage.java b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/NativeImage.java index 04ae05d93..41444b1c7 100644 --- a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/NativeImage.java +++ b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/NativeImage.java @@ -9,7 +9,7 @@ import java.nio.IntBuffer; import javax.imageio.ImageIO; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import lombok.Getter; import net.coderbot.iris.Iris; import org.lwjgl.opengl.GL11; @@ -55,7 +55,7 @@ public class NativeImage extends BufferedImage { public void downloadTexture(int level, boolean bl) { // this.checkAllocated(); - GLStateManager.glPixelStorei(GL11.GL_PACK_ALIGNMENT, format.components); + GLSMTextures.glPixelStorei(GL11.GL_PACK_ALIGNMENT, format.components); // GlStateManager._getTexImage(3553, level, format.glFormat, GL11.GL_UNSIGNED_BYTE, this.pixels); // final int width = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_WIDTH); @@ -65,7 +65,7 @@ public class NativeImage extends BufferedImage { final IntBuffer buffer = MemoryUtilities.memAllocInt(pixels); try { - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, level, format.glFormat, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, buffer); + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, level, format.glFormat, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, buffer); int[] data = new int[pixels]; buffer.get(data, 0, pixels); diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/RenderLayer.java b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/RenderLayer.java index c75cad785..f00f35cd4 100644 --- a/src/main/java/com/gtnewhorizons/angelica/compat/mojang/RenderLayer.java +++ b/src/main/java/com/gtnewhorizons/angelica/compat/mojang/RenderLayer.java @@ -4,7 +4,7 @@ import com.gtnewhorizons.angelica.rendering.RenderFailures; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; import com.gtnewhorizons.angelica.api.tesr.TesrShader; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.hooks.TextureUtilHooks; import com.gtnewhorizons.angelica.rendering.tesr.DrawState; import com.gtnewhorizons.angelica.rendering.tesr.TesrShaderPrograms; @@ -226,14 +226,14 @@ public final class RenderLayer implements BlendingStateHolder { try { state.apply(); if (textureId != null) { - GLStateManager.enableTexture(); + GLSMTextures.enableTexture(); Minecraft.getMinecraft().getTextureManager().bindTexture(textureId); if (unfilteredAtlas) { filtering = true; TextureUtilHooks.forceNearestFilter(); } } else { - GLStateManager.disableTexture(); + GLSMTextures.disableTexture(); } if (hook != null) { hookActive = true; diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawer.java b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawer.java index 9d44d1552..9fd39c2e3 100644 --- a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawer.java +++ b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawer.java @@ -3,6 +3,15 @@ package com.gtnewhorizons.angelica.compat.thaumcraft; import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat2v; import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat3Array; import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat4Array; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.ffp.FragmentKey; @@ -62,7 +71,7 @@ final class PortalDrawer { for (int i = 0; i < LAYERS; i++) { LAYER_DEPTH[i] = i == 0 ? 65.0F : 16 - i; LAYER_SCALE[i] = i == 0 ? 0.125F : i == 1 ? 0.5F : 0.0625F; - // GLStateManager.glRotatef's float radians + // GLSMMatrices.glRotatef's float radians LAYER_ANGLE[i] = (float) Math.toRadians((float) (i * i * 4321 + i * 9) * 2.0F); } } @@ -78,7 +87,7 @@ final class PortalDrawer { static int maxPlanes() { if (maxPlanes == 0) { - final int vectors = GLStateManager.glGetInteger(GL20.GL_MAX_VERTEX_UNIFORM_COMPONENTS) / 4; + final int vectors = GLSMQueries.glGetInteger(GL20.GL_MAX_VERTEX_UNIFORM_COMPONENTS) / 4; maxPlanes = Math.clamp((vectors - 128) / 12, 1, 64); } return maxPlanes; @@ -105,7 +114,7 @@ final class PortalDrawer { } private static void uploadFog(Uniforms uniforms, int fogMode) { - final FogState fog = GLStateManager.getFogState(); + final FogState fog = GLSMFog.getFogState(); FOG_PARAMS[0] = fog.linearScale(); FOG_PARAMS[1] = fog.linearBias(); FOG_PARAMS[2] = fog.expScale(); @@ -117,9 +126,9 @@ final class PortalDrawer { } private static void instanced(int attribute, int size, int floatOffset) { - GLStateManager.glEnableVertexAttribArray(attribute); - GLStateManager.glVertexAttribPointer(attribute, size, GL11.GL_FLOAT, false, FACE_BYTES, (long) floatOffset * Float.BYTES); - GLStateManager.glVertexAttribDivisor(attribute, 1); + GLSMVertexInput.glEnableVertexAttribArray(attribute); + GLSMVertexInput.glVertexAttribPointer(attribute, size, GL11.GL_FLOAT, false, FACE_BYTES, (long) floatOffset * Float.BYTES); + GLSMVertexInput.glVertexAttribDivisor(attribute, 1); } private static GlProgram buildProgram(boolean capturing, boolean fogged) { @@ -137,15 +146,15 @@ final class PortalDrawer { frag.delete(); } - final int previous = GLStateManager.getActiveProgram(); + final int previous = GLSMPrograms.getActiveProgram(); final int handle = program.handle(); - GLStateManager.glUseProgram(handle); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(handle, "u_Tunnel"), TUNNEL_UNIT); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(handle, "u_Lightmap"), LIGHTMAP_UNIT); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(handle, "u_Field"), FIELD_UNIT); - GLStateManager.glUniform4f(GLStateManager.glGetUniformLocation(handle, "u_ObjectPlaneR"), 0.0F, 0.0F, 0.0F, 1.0F); - GLStateManager.glUniform3(GLStateManager.glGetUniformLocation(handle, "u_LayerColor"), floatBuffer(layerColors())); - GLStateManager.glUseProgram(previous); + GLSMPrograms.glUseProgram(handle); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(handle, "u_Tunnel"), TUNNEL_UNIT); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(handle, "u_Lightmap"), LIGHTMAP_UNIT); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(handle, "u_Field"), FIELD_UNIT); + GLSMPrograms.glUniform4f(GLSMPrograms.glGetUniformLocation(handle, "u_ObjectPlaneR"), 0.0F, 0.0F, 0.0F, 1.0F); + GLSMPrograms.glUniform3(GLSMPrograms.glGetUniformLocation(handle, "u_LayerColor"), floatBuffer(layerColors())); + GLSMPrograms.glUseProgram(previous); return program; } @@ -191,20 +200,20 @@ final class PortalDrawer { GlFramebuffer atlasFramebuffer() { if (atlasFramebuffer == null) { - atlasTexture = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, atlasTexture); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, ATLAS_SIZE, ATLAS_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); + atlasTexture = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, atlasTexture); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, ATLAS_SIZE, ATLAS_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); atlasFramebuffer = new GlFramebuffer(); atlasFramebuffer.addColorAttachment(0, atlasTexture); atlasFramebuffer.drawBuffers(new int[]{0}); atlasFramebuffer.readBuffer(0); if (!atlasFramebuffer.isComplete()) { atlasFramebuffer.destroy(); - GLStateManager.glDeleteTextures(atlasTexture); + GLSMTextures.glDeleteTextures(atlasTexture); atlasFramebuffer = null; atlasTexture = 0; throw new IllegalStateException("Incomplete Thaumcraft portal atlas framebuffer"); @@ -222,23 +231,23 @@ final class PortalDrawer { if (directFogged != null) directFogged.delete(); if (capture != null) capture.delete(); direct = directFogged = capture = null; - if (vao != 0) GLStateManager.glDeleteVertexArrays(vao); - if (vbo != 0) GLStateManager.glDeleteBuffers(vbo); - if (ebo != 0) GLStateManager.glDeleteBuffers(ebo); + if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao); + if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo); + if (ebo != 0) GLSMBuffers.glDeleteBuffers(ebo); vao = vbo = ebo = 0; if (atlasFramebuffer != null) atlasFramebuffer.destroy(); - if (atlasTexture != 0) GLStateManager.glDeleteTextures(atlasTexture); + if (atlasTexture != 0) GLSMTextures.glDeleteTextures(atlasTexture); atlasFramebuffer = null; atlasTexture = 0; } private void draw(GlProgram program, float[] faces, int first, int count, int tunnelTexture, int fieldTexture, Frame frame, int fogMode) { - final int previousProgram = GLStateManager.getActiveProgram(); - final int previousVao = GLStateManager.getBoundVAO(); - final int depth = GLStateManager.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_TEXTURE_BIT)); + final int previousProgram = GLSMPrograms.getActiveProgram(); + final int previousVao = GLSMVertexInput.getBoundVAO(); + final int depth = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_TEXTURE_BIT)); try { - GLStateManager.disableBlend(); - GLStateManager.glUseProgram(program.handle()); + GLSMBlend.disableBlend(); + GLSMPrograms.glUseProgram(program.handle()); final Uniforms uniforms = program.getInterface(); if (uniforms.modelViewProjection != null) uniforms.modelViewProjection.set(frame.modelViewProjection); if (uniforms.uploadedFrame != frame || uniforms.uploadedVersion != frame.version) { @@ -263,18 +272,18 @@ final class PortalDrawer { if (uniforms.atlasSize != null) uniforms.atlasSize.setFloat(ATLAS_SIZE); if (fogMode != FragmentKey.FOG_NONE) uploadFog(uniforms, fogMode); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + FIELD_UNIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, fieldTexture); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + TUNNEL_UNIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tunnelTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + FIELD_UNIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, fieldTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + TUNNEL_UNIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tunnelTexture); uploadFaces(faces, first, count); - GLStateManager.glDrawElementsInstanced(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_INT, 0L, count); + GLSMDraws.glDrawElementsInstanced(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_INT, 0L, count); } finally { - GLStateManager.glBindVertexArray(previousVao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glUseProgram(previousProgram); - GLStateManager.popStateTo(depth); + GLSMVertexInput.glBindVertexArray(previousVao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMPrograms.glUseProgram(previousProgram); + GLSMAttribStack.popStateTo(depth); } } @@ -286,24 +295,24 @@ final class PortalDrawer { upload.put(faces, first * FLOATS_PER_FACE, count * FLOATS_PER_FACE).flip(); if (vao == 0) createBuffers(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, upload, GL15.GL_STREAM_DRAW); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, upload, GL15.GL_STREAM_DRAW); } private void createBuffers() { - vao = GLStateManager.glGenVertexArrays(); - vbo = GLStateManager.glGenBuffers(); - ebo = GLStateManager.glGenBuffers(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + vao = GLSMVertexInput.glGenVertexArrays(); + vbo = GLSMBuffers.glGenBuffers(); + ebo = GLSMBuffers.glGenBuffers(); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); for (int corner = 0; corner < 4; corner++) { instanced(corner, 4, corner * 4); } final IntBuffer indices = BufferUtils.createIntBuffer(6); indices.put(0).put(1).put(2).put(0).put(2).put(3).flip(); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); } static final class Frame { @@ -367,7 +376,7 @@ final class PortalDrawer { } void readLightmap(int blockLight) { - final TextureUnitArray textures = GLStateManager.getTextures(); + final TextureUnitArray textures = GLSMTextures.getTextures(); lightmapEnabled = textures.getTextureUnitStates(LIGHTMAP_UNIT).isEnabled() && textures.getTextureUnitBindings(LIGHTMAP_UNIT).getBinding() != 0; textures.getTextureUnitMatrix(LIGHTMAP_UNIT).transform(lightmapCoord.set(blockLight, 0.0F, 0.0F, 1.0F)); lightmapU = lightmapCoord.x / lightmapCoord.w; diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalRenderer.java b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalRenderer.java index 213cedd82..8a4e21c51 100644 --- a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalRenderer.java @@ -1,7 +1,16 @@ package com.gtnewhorizons.angelica.compat.thaumcraft; import com.gtnewhorizons.angelica.glsm.DisplayListManager; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; @@ -92,7 +101,7 @@ public final class PortalRenderer implements PendingTesrDraws.Pending { } public static void addFace(int axis, boolean negative, double plane, double x0, double y0, double z0, double x1, double y1, double z1, double x3, double y3, double z3) { - addFace(GLStateManager.getFogMode().isEnabled(), axis, negative, plane, x0, y0, z0, x1, y1, z1, x3, y3, z3); + addFace(GLSMFog.getFogMode().isEnabled(), axis, negative, plane, x0, y0, z0, x1, y1, z1, x3, y3, z3); } static void addFace(boolean fogged, int axis, boolean negative, double plane, double x0, double y0, double z0, double x1, double y1, double z1, double x3, double y3, double z3) { @@ -153,18 +162,18 @@ public final class PortalRenderer implements PendingTesrDraws.Pending { } public static void endSkippedRender() { - if (!GLStateManager.glIsEnabled(GL11.GL_FOG)) GLStateManager.glEnable(GL11.GL_FOG); + if (!GLSMEnable.glIsEnabled(GL11.GL_FOG)) GLSMEnable.glEnable(GL11.GL_FOG); } private static void prepareBatch(boolean fogged) { if ((faceCount > 0 || farCount > 0) && fogged != batchFogged) flushFaces(); batchFogged = fogged; - final int modelViewGeneration = GLStateManager.getMvGeneration(); - final int projectionGeneration = GLStateManager.getProjGeneration(); + final int modelViewGeneration = GLSMMatrices.getMvGeneration(); + final int projectionGeneration = GLSMMatrices.getProjGeneration(); final boolean empty = faceCount == 0 && farCount == 0; if (empty || modelViewGeneration != batchModelViewGeneration || projectionGeneration != batchProjectionGeneration) { final int mode = currentMode(); - GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), modelViewProjection); + GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), modelViewProjection); if (!empty && (mode != batchMode || !modelViewProjection.equals(frame.modelViewProjection))) flushFaces(); if (faceCount == 0 && farCount == 0) startBatch(mode); batchModelViewGeneration = modelViewGeneration; @@ -186,14 +195,14 @@ public final class PortalRenderer implements PendingTesrDraws.Pending { private static void restoreSkippedPlaneState() { if (!skippedPlaneState) return; skippedPlaneState = false; - if (GLStateManager.glIsEnabled(GL11.GL_BLEND)) GLStateManager.disableBlend(); - if (GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_S)) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_S); - if (GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_T)) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_T); - if (GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_R)) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_R); - if (GLStateManager.glIsEnabled(GL11.GL_TEXTURE_GEN_Q)) GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_Q); - if (!GLStateManager.glIsEnabled(GL11.GL_LIGHTING)) GLStateManager.enableLighting(); - if (GLStateManager.getTextures().getTextureUnitBindings(GLStateManager.getActiveTextureUnit()).getBinding() != lastPlaneTexture) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lastPlaneTexture); + if (GLSMEnable.glIsEnabled(GL11.GL_BLEND)) GLSMBlend.disableBlend(); + if (GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_S)) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_S); + if (GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_T)) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_T); + if (GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_R)) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_R); + if (GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_GEN_Q)) GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_Q); + if (!GLSMEnable.glIsEnabled(GL11.GL_LIGHTING)) GLSMLighting.enableLighting(); + if (GLSMTextures.getTextures().getTextureUnitBindings(GLSMTextures.getActiveTextureUnit()).getBinding() != lastPlaneTexture) { + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lastPlaneTexture); } } @@ -248,7 +257,7 @@ public final class PortalRenderer implements PendingTesrDraws.Pending { farTexture = textureId(FAR_FIELD); frame.modelViewProjection.set(modelViewProjection); if (mode == MODE_SHADOW) return; - frame.modelView.set(GLStateManager.getModelViewMatrix()); + frame.modelView.set(GLSMMatrices.getModelViewMatrix()); frame.cameraX = (float) TileEntityRendererDispatcher.staticPlayerX; frame.cameraY = (float) TileEntityRendererDispatcher.staticPlayerY; frame.cameraZ = (float) TileEntityRendererDispatcher.staticPlayerZ; @@ -266,7 +275,7 @@ public final class PortalRenderer implements PendingTesrDraws.Pending { drawer.drawDirect(faces, faceCount, tunnel, field, frame, batchFogged); return; } - final ViewportState viewport = GLStateManager.getViewportState(); + final ViewportState viewport = GLSMRasterizer.getViewportState(); int first = 0, x = 0, y = 0, rowHeight = 0; for (int face = 0; face < faceCount; face++) { final int size = slotSize(face, viewport.width, viewport.height); @@ -313,40 +322,40 @@ public final class PortalRenderer implements PendingTesrDraws.Pending { private static void capture(DeferredWorldRenderingPipeline pipeline, int first, int count, int tunnel, int field) { BatchStateGuard.beforeChange(); - final int drawFramebuffer = GLStateManager.getDrawFramebuffer(); - final int readFramebuffer = GLStateManager.getReadFramebuffer(); + final int drawFramebuffer = GLSMFramebuffer.getDrawFramebuffer(); + final int readFramebuffer = GLSMFramebuffer.getReadFramebuffer(); pipeline.setIsMainBound(false); - final int depth = GLStateManager.pushState(StateSet.forMask(GL11.GL_VIEWPORT_BIT | GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT)); + final int depth = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_VIEWPORT_BIT | GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT)); try { drawer.atlasFramebuffer().bind(); - GLStateManager.glViewport(0, 0, PortalDrawer.ATLAS_SIZE, PortalDrawer.ATLAS_SIZE); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); - GLStateManager.glColorMask(true, true, true, true); + GLSMRasterizer.glViewport(0, 0, PortalDrawer.ATLAS_SIZE, PortalDrawer.ATLAS_SIZE); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); + GLSMBlend.glColorMask(true, true, true, true); drawer.drawCapture(faces, first, count, tunnel, field, frame); } finally { - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFramebuffer); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFramebuffer); - GLStateManager.popStateTo(depth); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFramebuffer); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFramebuffer); + GLSMAttribStack.popStateTo(depth); pipeline.setIsMainBound(true); pipeline.rebindCurrentPass(); } } private static void drawQuads(int texture, int first, int count, boolean fromAtlas) { - final int depth = GLStateManager.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_CURRENT_BIT | GL11.GL_TEXTURE_BIT)); - savedTextureMatrix.set(GLStateManager.getTextures().getTextureUnitMatrix(0)); + final int depth = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_CURRENT_BIT | GL11.GL_TEXTURE_BIT)); + savedTextureMatrix.set(GLSMTextures.getTextures().getTextureUnitMatrix(0)); CapturedRenderingState.INSTANCE.pushCurrentBlockEntity(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.enableTexture(); - GLStateManager.disableLighting(); - GLStateManager.disableBlend(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.enableTexture(); + GLSMLighting.disableLighting(); + GLSMBlend.disableBlend(); if (!batchFogged) disableFogUntilPop(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.setTextureMatrix(0, IDENTITY); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMMatrices.setTextureMatrix(0, IDENTITY); final Tessellator tess = Tessellator.instance; final float texel = 1.0F / PortalDrawer.ATLAS_SIZE; int runStart = first; @@ -372,21 +381,21 @@ public final class PortalRenderer implements PendingTesrDraws.Pending { if (fromAtlas) BatchStateGuard.beforeChange(); } finally { CapturedRenderingState.INSTANCE.popCurrentBlockEntity(); - GLStateManager.setTextureMatrix(0, savedTextureMatrix); + GLSMMatrices.setTextureMatrix(0, savedTextureMatrix); popStateTo(depth); } } private static void drawFarFaces() { - final int depth = GLStateManager.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_CURRENT_BIT | GL11.GL_TEXTURE_BIT)); + final int depth = GLSMAttribStack.pushState(StateSet.forMask(GL11.GL_ENABLE_BIT | GL11.GL_COLOR_BUFFER_BIT | GL11.GL_CURRENT_BIT | GL11.GL_TEXTURE_BIT)); CapturedRenderingState.INSTANCE.pushCurrentBlockEntity(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.enableTexture(); - GLStateManager.disableLighting(); - GLStateManager.disableBlend(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.enableTexture(); + GLSMLighting.disableLighting(); + GLSMBlend.disableBlend(); disableFogUntilPop(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, farTexture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, farTexture); final Tessellator tess = Tessellator.instance; final float[] f = farFaces; int runStart = 0; @@ -416,7 +425,7 @@ public final class PortalRenderer implements PendingTesrDraws.Pending { private static void disableFogUntilPop() { BatchStateGuard.suspend(); try { - GLStateManager.glDisable(GL11.GL_FOG); + GLSMEnable.glDisable(GL11.GL_FOG); } finally { BatchStateGuard.resume(); } @@ -425,7 +434,7 @@ public final class PortalRenderer implements PendingTesrDraws.Pending { private static void popStateTo(int depth) { BatchStateGuard.suspend(); try { - GLStateManager.popStateTo(depth); + GLSMAttribStack.popStateTo(depth); } finally { BatchStateGuard.resume(); } diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/Tc4JarMeshes.java b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/Tc4JarMeshes.java index b1d074813..f62b492c1 100644 --- a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/Tc4JarMeshes.java +++ b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/Tc4JarMeshes.java @@ -4,7 +4,8 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; import com.gtnewhorizons.angelica.api.tesr.TesrMeshBuilder; import com.gtnewhorizons.angelica.api.tesr.TesrMeshSink; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.rendering.tesr.AngelicaTesrMeshCache; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import net.minecraft.client.renderer.RenderBlocks; @@ -91,7 +92,7 @@ public final class Tc4JarMeshes { } private static void applyBrightness(int bright) { - GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, bright % 65536, (float) (bright / 65536)); + GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, bright % 65536, (float) (bright / 65536)); } private Tc4JarMeshes() {} @@ -123,13 +124,13 @@ public final class Tc4JarMeshes { holder = new Holder(color); HOLDERS.put(liquidKey, holder); } - GLStateManager.glPushMatrix(); - GLStateManager.glRotatef(180.0f, 1.0f, 0.0f, 0.0f); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glRotatef(180.0f, 1.0f, 0.0f, 0.0f); BUILDER.material = holder.material; BUILDER.level64 = level64; BUILDER.icon = icon; AngelicaTesrMeshCache.INSTANCE.renderCached(holder.cacheKey, BUILDER); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); return true; } diff --git a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/ThaumometerScreen.java b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/ThaumometerScreen.java index 4cb9f120b..7f85c89a2 100644 --- a/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/ThaumometerScreen.java +++ b/src/main/java/com/gtnewhorizons/angelica/compat/thaumcraft/ThaumometerScreen.java @@ -1,6 +1,14 @@ package com.gtnewhorizons.angelica.compat.thaumcraft; import com.gtnewhorizons.angelica.glsm.DisplayListManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; import com.gtnewhorizons.angelica.glsm.states.AlphaState; @@ -25,55 +33,55 @@ public final class ThaumometerScreen { public static Capture begin() { if (DisplayListManager.isRecording()) return null; final Capture capture = new Capture(); - GLStateManager.glNewList(capture.list, GL11.GL_COMPILE); + GLSMDraws.glNewList(capture.list, GL11.GL_COMPILE); return capture; } public static void finish(Capture capture) { - GLStateManager.glEndList(); + GLSMDraws.glEndList(); pending.add(capture); } public static void abort(Capture capture) { - if (DisplayListManager.isRecording()) GLStateManager.glEndList(); - GLStateManager.glDeleteLists(capture.list, 1); + if (DisplayListManager.isRecording()) GLSMDraws.glEndList(); + GLSMDraws.glDeleteLists(capture.list, 1); } public static void discard() { - for (Capture capture : pending) GLStateManager.glDeleteLists(capture.list, 1); + for (Capture capture : pending) GLSMDraws.glDeleteLists(capture.list, 1); pending.clear(); } public static void render(WorldRenderingPipeline pipeline) { if (pending.isEmpty()) return; final WorldRenderingPhase phase = pipeline.getPhase(); - final Matrix4f texture = new Matrix4f(GLStateManager.getTextures().getTextureUnitMatrix(0)); - final Matrix4f lightmap = new Matrix4f(GLStateManager.getTextures().getTextureUnitMatrix(1)); + final Matrix4f texture = new Matrix4f(GLSMTextures.getTextures().getTextureUnitMatrix(0)); + final Matrix4f lightmap = new Matrix4f(GLSMTextures.getTextures().getTextureUnitMatrix(1)); final float brightnessX = GLStateManager.ctx().lastBrightnessX; final float brightnessY = GLStateManager.ctx().lastBrightnessY; final Boolean translucency = GbufferPrograms.beginTranslucencyDeclaration(true); - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPushMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); ItemIdManager.pushItemId(); try { pipeline.setPhase(WorldRenderingPhase.HAND_TRANSLUCENT); GbufferPrograms.setBlockEntityDefaults(); - GLStateManager.enableDepthTest(); - GLStateManager.glDepthMask(false); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthMask(false); for (Capture capture : pending) capture.replay(); } finally { ItemIdManager.popItemId(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPopMatrix(); - GLStateManager.setTextureMatrix(0, texture); - GLStateManager.setTextureMatrix(1, lightmap); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPopMatrix(); - GLStateManager.glPopAttrib(); - GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, brightnessX, brightnessY); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.setTextureMatrix(0, texture); + GLSMMatrices.setTextureMatrix(1, lightmap); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPopMatrix(); + GLSMAttribStack.glPopAttrib(); + GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, brightnessX, brightnessY); GbufferPrograms.endTranslucencyDeclaration(translucency); pipeline.setPhase(phase); discard(); @@ -81,41 +89,41 @@ public final class ThaumometerScreen { } public static final class Capture { - private final int list = GLStateManager.glGenLists(1); - private final Matrix4f modelView = new Matrix4f(GLStateManager.getModelViewMatrix()); - private final Matrix4f projection = new Matrix4f(GLStateManager.getProjectionMatrix()); - private final Matrix4f texture = new Matrix4f(GLStateManager.getTextures().getTextureUnitMatrix(0)); - private final Matrix4f lightmapMatrix = new Matrix4f(GLStateManager.getTextures().getTextureUnitMatrix(1)); + private final int list = GLSMDraws.glGenLists(1); + private final Matrix4f modelView = new Matrix4f(GLSMMatrices.getModelViewMatrix()); + private final Matrix4f projection = new Matrix4f(GLSMMatrices.getProjectionMatrix()); + private final Matrix4f texture = new Matrix4f(GLSMTextures.getTextures().getTextureUnitMatrix(0)); + private final Matrix4f lightmapMatrix = new Matrix4f(GLSMTextures.getTextures().getTextureUnitMatrix(1)); private final float brightnessX = GLStateManager.ctx().lastBrightnessX; private final float brightnessY = GLStateManager.ctx().lastBrightnessY; private final Vector3f normal = new Vector3f(ShaderManager.getCurrentNormal()); - private final AlphaState alphaState = GLStateManager.getAlphaState().readEffective(new AlphaState()); - private final int depthFunction = GLStateManager.getDepthState().getFunc(); + private final AlphaState alphaState = GLSMDepthStencilAlpha.getAlphaState().readEffective(new AlphaState()); + private final int depthFunction = GLSMDepthStencilAlpha.getDepthState().getFunc(); private final int itemId = ItemIdManager.getItemId(); - private final boolean cull = GLStateManager.getCullState().isEnabled(); - private final boolean alpha = GLStateManager.getAlphaTest().isEffectivelyEnabled(); - private final boolean lightmap = GLStateManager.getTextures().getTextureUnitStates(1).isEnabled(); - private final boolean lighting = GLStateManager.getLightingState().isEnabled(); + private final boolean cull = GLSMRasterizer.getCullState().isEnabled(); + private final boolean alpha = GLSMDepthStencilAlpha.getAlphaTest().isEffectivelyEnabled(); + private final boolean lightmap = GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled(); + private final boolean lighting = GLSMLighting.getLightingState().isEnabled(); private void replay() { - GLStateManager.setProjectionMatrix(projection); - GLStateManager.setModelViewMatrix(modelView); - GLStateManager.setTextureMatrix(0, texture); - GLStateManager.setTextureMatrix(1, lightmapMatrix); - GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, brightnessX, brightnessY); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glNormal3f(normal.x, normal.y, normal.z); - GLStateManager.glDepthFunc(depthFunction); - GLStateManager.glAlphaFunc(alphaState.getFunction(), alphaState.getReference()); + GLSMMatrices.setProjectionMatrix(projection); + GLSMMatrices.setModelViewMatrix(modelView); + GLSMMatrices.setTextureMatrix(0, texture); + GLSMMatrices.setTextureMatrix(1, lightmapMatrix); + GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, brightnessX, brightnessY); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMCurrentAttribs.glNormal3f(normal.x, normal.y, normal.z); + GLSMDepthStencilAlpha.glDepthFunc(depthFunction); + GLSMDepthStencilAlpha.glAlphaFunc(alphaState.getFunction(), alphaState.getReference()); ItemIdManager.setItemIdRaw(itemId); - if (cull) GLStateManager.enableCull(); else GLStateManager.disableCull(); - if (alpha) GLStateManager.enableAlphaTest(); else GLStateManager.disableAlphaTest(); - if (lighting) GLStateManager.enableLighting(); else GLStateManager.disableLighting(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - if (lightmap) GLStateManager.enableTexture(); else GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.enableTexture(); - GLStateManager.glCallList(list); + if (cull) GLSMRasterizer.enableCull(); else GLSMRasterizer.disableCull(); + if (alpha) GLSMDepthStencilAlpha.enableAlphaTest(); else GLSMDepthStencilAlpha.disableAlphaTest(); + if (lighting) GLSMLighting.enableLighting(); else GLSMLighting.disableLighting(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + if (lightmap) GLSMTextures.enableTexture(); else GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.enableTexture(); + GLSMDraws.glCallList(list); } } } diff --git a/src/main/java/com/gtnewhorizons/angelica/config/CompatConfig.java b/src/main/java/com/gtnewhorizons/angelica/config/CompatConfig.java index 59306bacf..990ad828d 100644 --- a/src/main/java/com/gtnewhorizons/angelica/config/CompatConfig.java +++ b/src/main/java/com/gtnewhorizons/angelica/config/CompatConfig.java @@ -20,6 +20,11 @@ public class CompatConfig { @Config.RequiresMcRestart public static boolean fixStacksOnStacks; + @Config.Comment("Redirect KaizPatchX script GL calls through Angelica's GLRedirects API") + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean fixKaizPatchX; + @Config.Comment("Apply fixes to Minefactory Reloaded") @Config.DefaultBoolean(true) @Config.RequiresMcRestart diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/ChunkDebugMinimap.java b/src/main/java/com/gtnewhorizons/angelica/debug/ChunkDebugMinimap.java index b20dcd70d..ff7e0b5a5 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/ChunkDebugMinimap.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/ChunkDebugMinimap.java @@ -31,7 +31,7 @@ import com.gtnewhorizons.angelica.debug.render.DebugGeometry; import com.gtnewhorizons.angelica.debug.render.DebugProgram; import com.gtnewhorizons.angelica.debug.render.DebugPrograms; import com.gtnewhorizons.angelica.debug.render.NativeScratch; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer; import com.gtnewhorizons.angelica.rendering.celeritas.AngelicaRenderSectionManager; import com.gtnewhorizons.angelica.rendering.celeritas.CeleritasWorldRenderer; @@ -110,7 +110,7 @@ public class ChunkDebugMinimap { } } - GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), mvp).scale(2, 2, 1).translate(32, 32, 0); + GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), mvp).scale(2, 2, 1).translate(32, 32, 0); scope.beginHud(); try { diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/F3Direction.java b/src/main/java/com/gtnewhorizons/angelica/debug/F3Direction.java index 597637e25..9a3b6f9c4 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/F3Direction.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/F3Direction.java @@ -9,7 +9,11 @@ import com.gtnewhorizons.angelica.debug.render.DebugGeometry; import com.gtnewhorizons.angelica.debug.render.DebugPrograms; import com.gtnewhorizons.angelica.debug.render.DebugProgram; import com.gtnewhorizons.angelica.debug.render.NativeScratch; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.states.ViewportState; import com.gtnewhorizons.angelica.glsm.streaming.LineQuads; import net.minecraft.client.Minecraft; @@ -40,25 +44,25 @@ public class F3Direction { final int width = event.resolution.getScaledWidth(); final int height = event.resolution.getScaledHeight(); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); - GLStateManager.glTranslatef((float) (width / 2), (float) (height / 2), -90); + GLSMMatrices.glTranslatef((float) (width / 2), (float) (height / 2), -90); final Entity entity = mc.renderViewEntity; - GLStateManager.glRotatef(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * event.partialTicks, -1.0F, 0.0F, 0.0F); - GLStateManager.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * event.partialTicks, 0.0F, 1.0F, 0.0F); + GLSMMatrices.glRotatef(entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * event.partialTicks, -1.0F, 0.0F, 0.0F); + GLSMMatrices.glRotatef(entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * event.partialTicks, 0.0F, 1.0F, 0.0F); - GLStateManager.glScalef(-1.0F, -1.0F, -1.0F); + GLSMMatrices.glScalef(-1.0F, -1.0F, -1.0F); renderWorldDirections(); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } } public static void renderWorldDirections() { - GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), MVP); - final ViewportState viewport = GLStateManager.getViewportState(); + GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), MVP); + final ViewportState viewport = GLSMRasterizer.getViewportState(); SCOPE.beginHud(); try { @@ -68,8 +72,8 @@ public class F3Direction { lines.mvp(MVP); lines.lineWidth(LINE_WIDTH); lines.viewport(viewport.width, viewport.height); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, QUAD_VERTICES); + GLSMVertexInput.glBindVertexArray(vao); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, QUAD_VERTICES); } finally { SCOPE.end(); } @@ -88,11 +92,11 @@ public class F3Direction { putAxis(p, 0.0F, AXIS_LENGTH, 0.0F, 0xFF00FF00); LineQuads.expandWithOtherEnd(source.address(), FORMAT, GL11.GL_LINES, LINE_VERTICES, expanded.address()); - final int vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, expanded.window(quadBytes), GL15.GL_STATIC_DRAW); + final int vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, expanded.window(quadBytes), GL15.GL_STATIC_DRAW); vao = DebugGeometry.createVao(vbo, QUAD_FORMAT); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } finally { source.free(); expanded.free(); diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/F3Graph.java b/src/main/java/com/gtnewhorizons/angelica/debug/F3Graph.java index 03b1c61a2..96a616be6 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/F3Graph.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/F3Graph.java @@ -10,7 +10,11 @@ import com.gtnewhorizons.angelica.debug.render.DebugGeometry; import com.gtnewhorizons.angelica.debug.render.DebugPrograms; import com.gtnewhorizons.angelica.debug.render.NativeScratch; import com.gtnewhorizons.angelica.debug.screen.DebugNumbers; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -129,21 +133,21 @@ public abstract class F3Graph { private void init() { final int handle = DebugPrograms.link("angelica:debug_graph", "angelica:debug_graph.vert.glsl", "angelica:debug_graph.frag.glsl", ShaderConstants.EMPTY, new String[]{"pos"}, new int[]{0}); program = handle; - GLStateManager.glUseProgram(handle); + GLSMPrograms.glUseProgram(handle); - uFBWidth = GLStateManager.glGetUniformLocation(handle, "fbWidth"); - uFBHeight = GLStateManager.glGetUniformLocation(handle, "fbHeight"); - uScaleFactor = GLStateManager.glGetUniformLocation(handle, "scaleFactor"); - uSamples = GLStateManager.glGetUniformLocation(handle, "samples"); - uHeadIdx = GLStateManager.glGetUniformLocation(handle, "headIdx"); - final int uPxPerNs = GLStateManager.glGetUniformLocation(handle, "pxPerNs"); - final int uLeft = GLStateManager.glGetUniformLocation(handle, "left"); + uFBWidth = GLSMPrograms.glGetUniformLocation(handle, "fbWidth"); + uFBHeight = GLSMPrograms.glGetUniformLocation(handle, "fbHeight"); + uScaleFactor = GLSMPrograms.glGetUniformLocation(handle, "scaleFactor"); + uSamples = GLSMPrograms.glGetUniformLocation(handle, "samples"); + uHeadIdx = GLSMPrograms.glGetUniformLocation(handle, "headIdx"); + final int uPxPerNs = GLSMPrograms.glGetUniformLocation(handle, "pxPerNs"); + final int uLeft = GLSMPrograms.glGetUniformLocation(handle, "left"); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); - vertBuf = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL_ARRAY_BUFFER, vertBuf); + vertBuf = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL_ARRAY_BUFFER, vertBuf); try (final MemoryStack stack = stackPush()) { final FloatBuffer vertices = stack.mallocFloat(VERT_COUNT * VERT_FLOATS); // Since we use a triangle strip, we only need 4 vertices. The quad extends to the top of the screen so spikes @@ -156,18 +160,18 @@ public abstract class F3Graph { }); vertices.rewind(); - GLStateManager.glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW); + GLSMBuffers.glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW); } // Configure vertex attribute in the VAO - GLStateManager.glVertexAttribPointer(0, VERT_FLOATS, GL_FLOAT, false, VERT_FLOATS * 4, 0); - GLStateManager.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(0, VERT_FLOATS, GL_FLOAT, false, VERT_FLOATS * 4, 0); + GLSMVertexInput.glEnableVertexAttribArray(0); - GLStateManager.glBindBuffer(GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); - GLStateManager.glUniform1f(uPxPerNs, pxPerNs); - GLStateManager.glUniform1i(uLeft, left ? 1 : 0); + GLSMPrograms.glUniform1f(uPxPerNs, pxPerNs); + GLSMPrograms.glUniform1i(uLeft, left ? 1 : 0); } public void render(ScaledResolution sr, int tick) { @@ -185,7 +189,7 @@ public abstract class F3Graph { final Minecraft mc = Minecraft.getMinecraft(); - GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), mvp); + GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), mvp); scope.beginHud(); try { @@ -236,14 +240,14 @@ public abstract class F3Graph { color.mvp(mvp); TessellatorStreamingDrawer.drawPacked(scratch.window(4 * COLOR_STRIDE), GL11.GL_QUADS, COLOR_FLAGS, 4); - GLStateManager.glUseProgram(program); - GLStateManager.glUniform1f(uFBWidth, mc.displayWidth); - GLStateManager.glUniform1f(uFBHeight, mc.displayHeight); - GLStateManager.glUniform1f(uScaleFactor, sr.getScaleFactor()); - GLStateManager.glUniform1i(uHeadIdx, samplesHead); - GLStateManager.glUniform1(uSamples, sampleBuf); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glDrawArrays(GL_TRIANGLE_STRIP, 0, VERT_COUNT); + GLSMPrograms.glUseProgram(program); + GLSMPrograms.glUniform1f(uFBWidth, mc.displayWidth); + GLSMPrograms.glUniform1f(uFBHeight, mc.displayHeight); + GLSMPrograms.glUniform1f(uScaleFactor, sr.getScaleFactor()); + GLSMPrograms.glUniform1i(uHeadIdx, samplesHead); + GLSMPrograms.glUniform1(uSamples, sampleBuf); + GLSMVertexInput.glBindVertexArray(vao); + GLSMDraws.glDrawArrays(GL_TRIANGLE_STRIP, 0, VERT_COUNT); mc.getTextureManager().bindTexture(texture); p = scratch.address(); diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugDrawScope.java b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugDrawScope.java index 14fb8a86f..2b81075ce 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugDrawScope.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugDrawScope.java @@ -1,6 +1,13 @@ package com.gtnewhorizons.angelica.debug.render; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.StateSet; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; @@ -17,42 +24,42 @@ public final class DebugDrawScope { public void beginHud() { capture(); - GLStateManager.disableDepthTest(); + GLSMDepthStencilAlpha.disableDepthTest(); common(); } public void beginWorld() { capture(); - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.glFrontFace(GL11.GL_CCW); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMRasterizer.glFrontFace(GL11.GL_CCW); common(); } private void capture() { - depth = GLStateManager.pushState(SET); - program = GLStateManager.getActiveProgram(); - vao = GLStateManager.getBoundVAO(); - vbo = GLStateManager.getBoundVBO(); + depth = GLSMAttribStack.pushState(SET); + program = GLSMPrograms.getActiveProgram(); + vao = GLSMVertexInput.getBoundVAO(); + vbo = GLSMBuffers.getBoundVBO(); } public void end() { - GLStateManager.glUseProgram(program); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.popStateTo(depth); + GLSMPrograms.glUseProgram(program); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMAttribStack.popStateTo(depth); } private static void common() { - GLStateManager.glDepthMask(false); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.disableCull(); - GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); - GLStateManager.disableScissorTest(); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glLineWidth(1.0F); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMRasterizer.disableCull(); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); + GLSMRasterizer.disableScissorTest(); + GLSMBlend.glColorMask(true, true, true, true); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMRasterizer.glLineWidth(1.0F); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugGeometry.java b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugGeometry.java index f32fc5fe1..dc28d5c83 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugGeometry.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugGeometry.java @@ -2,7 +2,8 @@ package com.gtnewhorizons.angelica.debug.render; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormatElement; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.opengl.GL15; import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities.memPutByte; @@ -13,9 +14,9 @@ public final class DebugGeometry { private DebugGeometry() {} public static int createVao(int vbo, VertexFormat format) { - final int vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + final int vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); format.setupBufferState(0L); return vao; } diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugProgram.java b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugProgram.java index 31fa9c6a9..af23bc75a 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugProgram.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/render/DebugProgram.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.debug.render; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import org.joml.Matrix4fc; import org.lwjgl.BufferUtils; @@ -16,25 +16,25 @@ public final class DebugProgram { DebugProgram(int handle) { this.handle = handle; - this.mvpLocation = GLStateManager.glGetUniformLocation(handle, "u_MVP"); - this.lineWidthLocation = GLStateManager.glGetUniformLocation(handle, "u_LineWidth"); - this.viewportLocation = GLStateManager.glGetUniformLocation(handle, "u_ViewportSize"); + this.mvpLocation = GLSMPrograms.glGetUniformLocation(handle, "u_MVP"); + this.lineWidthLocation = GLSMPrograms.glGetUniformLocation(handle, "u_LineWidth"); + this.viewportLocation = GLSMPrograms.glGetUniformLocation(handle, "u_ViewportSize"); } public void use() { - GLStateManager.glUseProgram(handle); + GLSMPrograms.glUseProgram(handle); } public void mvp(Matrix4fc mvp) { mvp.get(matrix); - GLStateManager.glUniformMatrix4(mvpLocation, false, matrix); + GLSMPrograms.glUniformMatrix4(mvpLocation, false, matrix); } public void lineWidth(float pixels) { - GLStateManager.glUniform1f(lineWidthLocation, pixels); + GLSMPrograms.glUniform1f(lineWidthLocation, pixels); } public void viewport(int width, int height) { - GLStateManager.glUniform2f(viewportLocation, width, height); + GLSMPrograms.glUniform2f(viewportLocation, width, height); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreen.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreen.java index f0bb318e9..f78486b87 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreen.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreen.java @@ -5,7 +5,7 @@ import com.gtnewhorizons.angelica.api.debug.DebugEntryCategory; import com.gtnewhorizons.angelica.api.debug.DebugScreenEntryStatus; import com.gtnewhorizons.angelica.client.font.BatchingFontRenderer; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; @@ -724,7 +724,7 @@ public class DebugOptionsScreen extends GuiScreen { private void beginLayer() { if (painter == null) return; - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); batcher.beginBatch(); painter.beginRects(); } diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugScreenOverlay.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugScreenOverlay.java index 39d333d1a..f928cd80d 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugScreenOverlay.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugScreenOverlay.java @@ -6,7 +6,8 @@ import com.gtnewhorizons.angelica.client.font.GlyphSettings; import com.gtnewhorizons.angelica.client.font.TextMesh; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.debug.F3Graph; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor; import com.gtnewhorizons.angelica.mixins.interfaces.IGameSettingsExt; @@ -312,12 +313,12 @@ public final class DebugScreenOverlay { if (placedCount == 0) return; if (Tracy.ENABLED) Tracy.beginZone(Z_DRAW); if (scaled) { - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); final float factor = scale / (float) gameScale; - GLStateManager.glScalef(factor, factor, 1.0f); + GLSMMatrices.glScalef(factor, factor, 1.0f); } try { - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); text.batcher.beginBatch(); try { drawChrome(); @@ -326,7 +327,7 @@ public final class DebugScreenOverlay { text.batcher.endBatch(); } } finally { - if (scaled) GLStateManager.glPopMatrix(); + if (scaled) GLSMMatrices.glPopMatrix(); if (Tracy.ENABLED) Tracy.endZone(); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugText.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugText.java index e79af7c44..826010cda 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugText.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/DebugText.java @@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.debug.screen; import com.gtnewhorizons.angelica.client.font.BatchingFontRenderer; import com.gtnewhorizons.angelica.client.font.FormatCodes; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; import net.minecraft.client.gui.FontRenderer; public abstract class DebugText { @@ -156,8 +156,8 @@ public abstract class DebugText { } public void beginRects() { - depthWasEnabled = GLStateManager.getDepthTest().isEnabled(); - GLStateManager.disableDepthTest(); + depthWasEnabled = GLSMDepthStencilAlpha.getDepthTest().isEnabled(); + GLSMDepthStencilAlpha.disableDepthTest(); } @Override @@ -166,7 +166,7 @@ public abstract class DebugText { } public void endRects() { - if (depthWasEnabled) GLStateManager.enableDepthTest(); + if (depthWasEnabled) GLSMDepthStencilAlpha.enableDepthTest(); } } } diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/AngelicaEntries.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/AngelicaEntries.java index 7ae708e0b..5c624f626 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/AngelicaEntries.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/AngelicaEntries.java @@ -6,7 +6,7 @@ import com.gtnewhorizons.angelica.api.debug.DebugScreenDisplayer; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.debug.screen.DebugGroup; import com.gtnewhorizons.angelica.dynamiclights.DynamicLights; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFog; import com.gtnewhorizons.angelica.glsm.states.FogState; import com.gtnewhorizons.angelica.proxy.ClientProxy; import org.joml.Vector3d; @@ -36,10 +36,10 @@ public final class AngelicaEntries { } public static void writeFog(DebugFact fact) { - final FogState fog = GLStateManager.getFogState(); + final FogState fog = GLSMFog.getFogState(); final Vector3d color = fog.getFogColor(); fact - .value(GLStateManager.getFogMode().isEnabled() ? "ON" : "OFF") + .value(GLSMFog.getFogMode().isEnabled() ? "ON" : "OFF") .text(' ') .value(fogModeName(fog.getFogMode())) .text(' ') diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/SystemSpecsEntry.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/SystemSpecsEntry.java index 0c74edf99..477bfd281 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/SystemSpecsEntry.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/entries/SystemSpecsEntry.java @@ -4,7 +4,7 @@ import com.gtnewhorizons.angelica.api.debug.DebugContext; import com.gtnewhorizons.angelica.api.debug.DebugScreenDisplayer; import com.gtnewhorizons.angelica.api.debug.DebugScreenEntry; import com.gtnewhorizons.angelica.debug.screen.DebugGroup; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import net.minecraft.client.Minecraft; import org.lwjgl.opengl.GL11; @@ -33,8 +33,8 @@ public final class SystemSpecsEntry implements DebugScreenEntry { resolved = true; java = System.getProperty("java.version", UNKNOWN) + " (" + System.getProperty("java.vendor", UNKNOWN) + ")"; cores = Runtime.getRuntime().availableProcessors(); - gpu = orUnknown(GLStateManager.glGetString(GL11.GL_RENDERER)); - openGl = orUnknown(GLStateManager.glGetString(GL11.GL_VERSION)); + gpu = orUnknown(GLSMQueries.glGetString(GL11.GL_RENDERER)); + openGl = orUnknown(GLSMQueries.glGetString(GL11.GL_VERSION)); } private static String orUnknown(String value) { diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugLabelBatch.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugLabelBatch.java index dd66690b8..8a668ff4c 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugLabelBatch.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugLabelBatch.java @@ -12,7 +12,13 @@ import com.gtnewhorizons.angelica.debug.render.DebugGeometry; import com.gtnewhorizons.angelica.debug.render.DebugProgram; import com.gtnewhorizons.angelica.debug.render.DebugPrograms; import com.gtnewhorizons.angelica.debug.render.NativeScratch; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.states.Color4; import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer; import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor; @@ -245,26 +251,26 @@ final class DebugLabelBatch { private void drawFallback(int value, int argb, float eyeX, float eyeY, float eyeZ) { final String text = NUMBERS[value]; labelMatrix.translation(eyeX, eyeY, eyeZ).scale(SCALE, -SCALE, SCALE); - GLStateManager.setModelViewMatrix(labelMatrix); + GLSMMatrices.setModelViewMatrix(labelMatrix); font.drawString(text, -Math.round(stringWidth(value, glyphAdvance) * 0.5F), 0, argb); } private void pinFallback() { - fallbackModelView.set(GLStateManager.getModelViewMatrix()); - final Color4 color = GLStateManager.getColor(); + fallbackModelView.set(GLSMMatrices.getModelViewMatrix()); + final Color4 color = GLSMCurrentAttribs.getColor(); fallbackColor[0] = color.getRed(); fallbackColor[1] = color.getGreen(); fallbackColor[2] = color.getBlue(); fallbackColor[3] = color.getAlpha(); - GLStateManager.glUseProgram(0); - GLStateManager.disableLighting(); - GLStateManager.disableFog(); - GLStateManager.disableAlphaTest(); - GLStateManager.glActiveTexture(OpenGlHelper.lightmapTexUnit); - GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(OpenGlHelper.defaultTexUnit); - GLStateManager.enableTexture(); - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMPrograms.glUseProgram(0); + GLSMLighting.disableLighting(); + GLSMFog.disableFog(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMTextures.glActiveTexture(OpenGlHelper.lightmapTexUnit); + GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(OpenGlHelper.defaultTexUnit); + GLSMTextures.enableTexture(); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); } void end() { @@ -286,8 +292,8 @@ final class DebugLabelBatch { } } finally { if (batcher == null && font != null) { - GLStateManager.setModelViewMatrix(fallbackModelView); - GLStateManager.glColor4f(fallbackColor[0], fallbackColor[1], fallbackColor[2], fallbackColor[3]); + GLSMMatrices.setModelViewMatrix(fallbackModelView); + GLSMCurrentAttribs.glColor4f(fallbackColor[0], fallbackColor[1], fallbackColor[2], fallbackColor[3]); } for (int i = 0; i < bucketCount; i++) bucketBytes[i] = 0; batcher = null; diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMesh.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMesh.java index e952a5c28..36901a776 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMesh.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMesh.java @@ -5,7 +5,10 @@ import com.gtnewhorizons.angelica.debug.render.DebugGeometry; import com.gtnewhorizons.angelica.debug.render.DebugProgram; import com.gtnewhorizons.angelica.debug.render.DebugPrograms; import com.gtnewhorizons.angelica.debug.render.NativeScratch; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.states.ViewportState; import com.gtnewhorizons.angelica.glsm.streaming.LineQuads; import org.joml.Matrix4f; @@ -63,10 +66,10 @@ final class DebugMesh { if (plainBytes > 0) { if (plainVao == 0) { - plainVbo = GLStateManager.glGenBuffers(); + plainVbo = GLSMBuffers.glGenBuffers(); plainVao = DebugGeometry.createVao(plainVbo, DebugMeshData.PLAIN); } else { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, plainVbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, plainVbo); } scratch.ensure(plainBytes); long destination = scratch.address(); @@ -80,7 +83,7 @@ final class DebugMesh { data.copySection(DebugMeshData.lineSection(b), destination); destination += data.lineBytes(b); } - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, scratch.window(plainBytes), GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, scratch.window(plainBytes), GL15.GL_DYNAMIC_DRAW); } if (wideVertices > 0) { @@ -91,12 +94,12 @@ final class DebugMesh { LineQuads.expandWithOtherEnd(data.lineAddress(b), DebugMeshData.PLAIN, GL11.GL_LINES, data.lineVertexCount(b), scratch.address() + (long) lineFirst[b] * WIDE_STRIDE); } if (wideVao == 0) { - wideVbo = GLStateManager.glGenBuffers(); + wideVbo = GLSMBuffers.glGenBuffers(); wideVao = DebugGeometry.createVao(wideVbo, WIDE); } else { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, wideVbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, wideVbo); } - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, scratch.window(wideBytes), GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, scratch.window(wideBytes), GL15.GL_DYNAMIC_DRAW); } } @@ -109,7 +112,7 @@ final class DebugMesh { static DebugProgram useLines() { final DebugProgram lines = DebugPrograms.lines(); lines.use(); - final ViewportState viewport = GLStateManager.getViewportState(); + final ViewportState viewport = GLSMRasterizer.getViewportState(); lines.viewport(viewport.width, viewport.height); return lines; } @@ -131,33 +134,33 @@ final class DebugMesh { void drawPlain(boolean onTop, DebugProgram color) { if (!has(false, onTop)) return; color.mvp(mvp); - GLStateManager.glBindVertexArray(plainVao); + GLSMVertexInput.glBindVertexArray(plainVao); if (!onTop && fillCount > 0) { - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); try { - GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, fillCount); + GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, fillCount); } finally { - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); } } final int from = onTop ? DebugMeshData.WIDTH_COUNT : 0; final int to = from + DebugMeshData.WIDTH_COUNT; for (int b = from; b < to; b++) { if (lineWide[b] || lineCount[b] == 0) continue; - GLStateManager.glDrawArrays(GL11.GL_LINES, lineFirst[b], lineCount[b]); + GLSMDraws.glDrawArrays(GL11.GL_LINES, lineFirst[b], lineCount[b]); } } void drawWide(boolean onTop, DebugProgram lines) { if (!has(true, onTop)) return; lines.mvp(mvp); - GLStateManager.glBindVertexArray(wideVao); + GLSMVertexInput.glBindVertexArray(wideVao); final int from = onTop ? DebugMeshData.WIDTH_COUNT : 0; final int to = from + DebugMeshData.WIDTH_COUNT; for (int b = from; b < to; b++) { if (!lineWide[b] || lineCount[b] == 0) continue; lines.lineWidth(WIDTHS[b % DebugMeshData.WIDTH_COUNT].pixels); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, lineFirst[b], lineCount[b]); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, lineFirst[b], lineCount[b]); } } @@ -166,10 +169,10 @@ final class DebugMesh { } void delete() { - if (plainVbo != 0) GLStateManager.glDeleteBuffers(plainVbo); - if (plainVao != 0) GLStateManager.glDeleteVertexArrays(plainVao); - if (wideVbo != 0) GLStateManager.glDeleteBuffers(wideVbo); - if (wideVao != 0) GLStateManager.glDeleteVertexArrays(wideVao); + if (plainVbo != 0) GLSMBuffers.glDeleteBuffers(plainVbo); + if (plainVao != 0) GLSMVertexInput.glDeleteVertexArrays(plainVao); + if (wideVbo != 0) GLSMBuffers.glDeleteBuffers(wideVbo); + if (wideVao != 0) GLSMVertexInput.glDeleteVertexArrays(wideVao); plainVbo = 0; plainVao = 0; wideVbo = 0; diff --git a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugWorldRenderHandler.java b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugWorldRenderHandler.java index fb1ffd264..5f8a2c8e7 100644 --- a/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugWorldRenderHandler.java +++ b/src/main/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugWorldRenderHandler.java @@ -5,6 +5,10 @@ import com.gtnewhorizons.angelica.debug.render.DebugProgram; import com.gtnewhorizons.angelica.debug.render.NativeScratch; import com.gtnewhorizons.angelica.debug.screen.DebugRegistry; import com.gtnewhorizons.angelica.glsm.GLContextState; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -126,8 +130,8 @@ public final class DebugWorldRenderHandler { } catch (RuntimeException | LinkageError e) { slots.fail(slot, e); } finally { - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); } } @@ -143,8 +147,8 @@ public final class DebugWorldRenderHandler { final int n = slots.count; if (nextDrawable(0) == n) return; - base.set(GLStateManager.getModelViewMatrix()); - projBase.set(GLStateManager.getProjectionMatrix()).mul(base); + base.set(GLSMMatrices.getModelViewMatrix()); + projBase.set(GLSMMatrices.getProjectionMatrix()).mul(base); scope.beginWorld(); try { for (int i = nextDrawable(0); i < n; i = nextDrawable(i + 1)) { @@ -166,7 +170,7 @@ public final class DebugWorldRenderHandler { } } - GLStateManager.disableDepthTest(); + GLSMDepthStencilAlpha.disableDepthTest(); drawPass(true); } finally { scope.end(); @@ -215,7 +219,7 @@ public final class DebugWorldRenderHandler { private void drawLabels(Minecraft mc, GLContextState glCtx, double camX, double camY, double camZ) { final int n = slots.count; try { - labels.begin(mc.fontRenderer, GLStateManager.getProjectionMatrix(), glCtx.viewportState.height); + labels.begin(mc.fontRenderer, GLSMMatrices.getProjectionMatrix(), glCtx.viewportState.height); for (int i = nextDrawable(0); i < n; i = nextDrawable(i + 1)) { final DebugMesh mesh = meshes[i]; if (mesh.labels.count == 0) continue; diff --git a/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java b/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java index 8c41d3ee2..4dd0db34a 100644 --- a/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java +++ b/src/main/java/com/gtnewhorizons/angelica/hudcaching/HUDCaching.java @@ -6,7 +6,19 @@ import com.gtnewhorizons.angelica.compat.holoinventory.HoloInventoryReflectionCo import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.event.ClientEvent; import com.gtnewhorizons.angelica.event.ClientEventType; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.glsm.stacks.RetainedState; @@ -84,13 +96,13 @@ public class HUDCaching { } private static void setupOverlay(ScaledResolution scaled) { - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glOrtho(0.0D, scaled.getScaledWidth_double(), scaled.getScaledHeight_double(), 0.0D, 1000.0D, 3000.0D); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(0.0F, 0.0F, -2000.0F); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glOrtho(0.0D, scaled.getScaledWidth_double(), scaled.getScaledHeight_double(), 0.0D, 1000.0D, 3000.0D); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(0.0F, 0.0F, -2000.0F); } public static void init() { @@ -99,43 +111,43 @@ public class HUDCaching { public static void resetAfterCrash() { renderingCacheOverride = false; - GLStateManager.setHudCacheOverride(false); + GLSMBlend.setHudCacheOverride(false); dirty = true; } private static void initComposite() { compositeProgram = PanoramaRenderer.loadProgram("angelica:hud_composite", "angelica:panorama_blur", "angelica:hud_composite", ctx -> ctx); compositeProgram.bind(); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(compositeProgram.handle(), "u_Depth"), 1); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(compositeProgram.handle(), "u_Depth"), 1); compositeProgram.unbind(); - compositeVao = GLStateManager.glGenVertexArrays(); + compositeVao = GLSMVertexInput.glGenVertexArrays(); } private static void composite() { if (compositeProgram == null) initComposite(); - final int program = GLStateManager.getActiveProgram(); - final int vao = GLStateManager.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING); - final int stateDepth = GLStateManager.pushState(allState); + final int program = GLSMPrograms.getActiveProgram(); + final int vao = GLSMQueries.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING); + final int stateDepth = GLSMAttribStack.pushState(allState); try { - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_ALWAYS); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.disableCull(); - GLStateManager.disableScissorTest(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, framebuffer.depthAttachment); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, framebuffer.framebufferTexture); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, true, true, true); + GLSMRasterizer.disableCull(); + GLSMRasterizer.disableScissorTest(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, framebuffer.depthAttachment); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, framebuffer.framebufferTexture); compositeProgram.bind(); - GLStateManager.glBindVertexArray(compositeVao); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMVertexInput.glBindVertexArray(compositeVao); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); } finally { - GLStateManager.glBindVertexArray(vao); - GLStateManager.glUseProgram(program); - GLStateManager.popStateTo(stateDepth); + GLSMVertexInput.glBindVertexArray(vao); + GLSMPrograms.glUseProgram(program); + GLSMAttribStack.popStateTo(stateDepth); } } @@ -147,11 +159,11 @@ public class HUDCaching { XaeroMinimapCore.beforeIngameGuiRender(partialTicks); } - GLStateManager.disableLighting(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.enableTexture(); + GLSMLighting.disableLighting(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.enableTexture(); if (!AngelicaConfig.hudCachingActive || mc.displayWidth < 16 || mc.displayHeight < 16) { ingame.renderGameOverlay(partialTicks, hasScreen, mouseX, mouseY); @@ -168,29 +180,29 @@ public class HUDCaching { dirty = false; nextHudRefresh = System.currentTimeMillis() + (1000 / AngelicaConfig.hudCachingFPS); if (Tracy.ENABLED) Tracy.beginZone(Z_CACHE_WRAP); - final int outerDepth = GLStateManager.pushState(allState); + final int outerDepth = GLSMAttribStack.pushState(allState); try { if (framebuffer.framebufferWidth != mc.displayWidth || framebuffer.framebufferHeight != mc.displayHeight) { framebuffer.createBindFramebuffer(mc.displayWidth, mc.displayHeight); } else { framebuffer.clearBindFramebuffer(); } - final int hudDepth = GLStateManager.pushState(allState); + final int hudDepth = GLSMAttribStack.pushState(allState); renderingCacheOverride = true; - GLStateManager.setHudCacheOverride(true); + GLSMBlend.setHudCacheOverride(true); if (Tracy.ENABLED) Tracy.beginZone(Z_DRAW); try { ingame.renderGameOverlay(partialTicks, hasScreen, mouseX, mouseY); } finally { if (Tracy.ENABLED) Tracy.endZone(); } - GLStateManager.setHudCacheOverride(false); - GLStateManager.popStateTo(hudDepth + 1); - GLStateManager.retainModifiedState(hudDepth, hudExitState); + GLSMBlend.setHudCacheOverride(false); + GLSMAttribStack.popStateTo(hudDepth + 1); + GLSMAttribStack.retainModifiedState(hudDepth, hudExitState); } finally { renderingCacheOverride = false; - GLStateManager.setHudCacheOverride(false); - GLStateManager.popStateTo(outerDepth); + GLSMBlend.setHudCacheOverride(false); + GLSMAttribStack.popStateTo(outerDepth); mc.getFramebuffer().bindFramebuffer(false); if (Tracy.ENABLED) Tracy.endZone(); } @@ -201,17 +213,17 @@ public class HUDCaching { int width = scaled.getScaledWidth(); int height = scaled.getScaledHeight(); if (Tracy.ENABLED) Tracy.beginZone(Z_CAPTURED_BITS); - GLStateManager.enableBlend(); + GLSMBlend.enableBlend(); // reset the color that may be applied by some items - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); // render bits that were captured when rendering into cache GuiIngameAccessor gui = (GuiIngameAccessor) ingame; if (renderVignetteCaptured) { gui.callRenderVignette(mc.thePlayer.getBrightness(partialTicks), width, height); } else { - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); } if (ingame instanceof GuiIngameForge) { @@ -231,7 +243,7 @@ public class HUDCaching { if (renderCrosshairsCaptured) { if (ModStatus.isXaerosMinimapLoaded) { // this fixes the crosshair going invisible when no lines are being drawn under the minimap - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); } guiForge.callRenderCrosshairs(width, height); } @@ -262,7 +274,7 @@ public class HUDCaching { composite(); if (Tracy.ENABLED) Tracy.endZone(); if (Tracy.ENABLED) Tracy.beginZone(Z_APPLY_RETAINED); - GLStateManager.applyRetainedState(hudExitState); + GLSMAttribStack.applyRetainedState(hudExitState); if (Tracy.ENABLED) Tracy.endZone(); ClientEvent.post(ClientEventType.POST_RENDER_HUD, renderer, partialTicks); @@ -274,11 +286,11 @@ public class HUDCaching { * the state before we start rendering */ public static void fixGLStateBeforeRenderingCache() { - GLStateManager.glDepthMask(true); - GLStateManager.enableDepthTest(); - GLStateManager.enableAlphaTest(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.disableBlend(); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.disableBlend(); } public static void disableHoloInventory() { diff --git a/src/main/java/com/gtnewhorizons/angelica/iris/ImmediateExtendedAttribs.java b/src/main/java/com/gtnewhorizons/angelica/iris/ImmediateExtendedAttribs.java index 35fdeb8da..03547a5ec 100644 --- a/src/main/java/com/gtnewhorizons/angelica/iris/ImmediateExtendedAttribs.java +++ b/src/main/java/com/gtnewhorizons/angelica/iris/ImmediateExtendedAttribs.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.iris; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; @@ -56,9 +57,9 @@ public final class ImmediateExtendedAttribs implements ImmediateExtendedAttribHa wants = programWantsExtCache.get(program); } else { wants = 0; - if (GLStateManager.glGetAttribLocation(program, "mc_midTexCoord") >= 0) wants |= WANTS_MID; - if (GLStateManager.glGetAttribLocation(program, "at_tangent") >= 0) wants |= WANTS_TANGENT; - if (GLStateManager.glGetAttribLocation(program, "iris_Entity") == LOC_ENTITY_IDS) wants |= WANTS_ENTITY_IDS; + if (GLSMPrograms.glGetAttribLocation(program, "mc_midTexCoord") >= 0) wants |= WANTS_MID; + if (GLSMPrograms.glGetAttribLocation(program, "at_tangent") >= 0) wants |= WANTS_TANGENT; + if (GLSMPrograms.glGetAttribLocation(program, "iris_Entity") == LOC_ENTITY_IDS) wants |= WANTS_ENTITY_IDS; programWantsExtCache.put(program, wants); } currentProgramWants = wants; @@ -101,7 +102,7 @@ public final class ImmediateExtendedAttribs implements ImmediateExtendedAttribHa private static boolean programWants(int mask) { if (!Iris.enabled) return false; GLSMHooks.resolvePendingProgram(); - return (currentProgramWants & mask) != 0 && GLStateManager.getActiveProgram() != 0; + return (currentProgramWants & mask) != 0 && GLSMPrograms.getActiveProgram() != 0; } @Override @@ -281,7 +282,7 @@ public final class ImmediateExtendedAttribs implements ImmediateExtendedAttribHa } private static boolean isAtlasNotBound() { - final int tex = GLStateManager.getBoundTextureForServerState(0); + final int tex = GLSMTextures.getBoundTextureForServerState(0); if (tex <= 0) return true; final Minecraft mc = Minecraft.getMinecraft(); if (mc == null || mc.getTextureManager() == null) return true; diff --git a/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java b/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java index 554cb1c2c..3ccd30a5e 100644 --- a/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java +++ b/src/main/java/com/gtnewhorizons/angelica/iris/IrisGLSMBridge.java @@ -11,6 +11,8 @@ import com.gtnewhorizons.angelica.glsm.hooks.LineDrawHandler; import com.gtnewhorizons.angelica.glsm.hooks.ShaderTransformPostProcessor; import com.gtnewhorizons.angelica.glsm.shader.ShaderType; import org.taumc.glsl.grammar.GLSLParser; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.sdlgpu.SDLGPUGate; import net.coderbot.iris.Iris; @@ -70,7 +72,7 @@ public class IrisGLSMBridge { state.setEntityIdsListener(() -> { final boolean suspended = GLStateManager.suspendExitCapture(); try { - GLStateManager.setEntityIds( + GLSMCurrentAttribs.setEntityIds( state.getCurrentRenderedEntity(), state.getCurrentRenderedBlockEntity(), state.getCurrentRenderedItem()); } finally { GLStateManager.resumeExitCapture(suspended); @@ -278,7 +280,7 @@ public class IrisGLSMBridge { programRestoreDeferred = false; final WorldRenderingPipeline pipeline = Iris.getPipelineManager().getPipelineNullable(); if (pipeline instanceof DeferredWorldRenderingPipeline drp && drp.shouldOverrideShaders()) { - drp.restorePassAfterModProgram(GLStateManager.getActiveProgram()); + drp.restorePassAfterModProgram(GLSMPrograms.getActiveProgram()); } } }); diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/AngelicaClientTweaker.java b/src/main/java/com/gtnewhorizons/angelica/loading/AngelicaClientTweaker.java index d1c21bafb..1eb57eb79 100644 --- a/src/main/java/com/gtnewhorizons/angelica/loading/AngelicaClientTweaker.java +++ b/src/main/java/com/gtnewhorizons/angelica/loading/AngelicaClientTweaker.java @@ -56,6 +56,7 @@ public final class AngelicaClientTweaker implements IFMLLoadingPlugin, IEarlyMix Launch.classLoader.addTransformerExclusion("jss.notfine.asm"); Launch.classLoader.addTransformerExclusion("com.gtnewhorizons.angelica.loading"); Launch.classLoader.addTransformerExclusion("com.gtnewhorizons.angelica.glsm.GLStateManager"); + Launch.classLoader.addTransformerExclusion("com.gtnewhorizons.angelica.glsm.GLSM"); final boolean rfbLoaded = Launch.blackboard.getOrDefault("angelica.rfbPluginLoaded", Boolean.FALSE) == Boolean.TRUE; if (rfbLoaded) { diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/CompatHandlers.java b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/CompatHandlers.java index 42da20705..4819eb826 100644 --- a/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/CompatHandlers.java +++ b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/CompatHandlers.java @@ -3,6 +3,7 @@ package com.gtnewhorizons.angelica.loading.fml.compat; import com.gtnewhorizons.angelica.config.CompatConfig; import com.gtnewhorizons.angelica.loading.fml.compat.handlers.ExtraUtilsCompatHandler; import com.gtnewhorizons.angelica.loading.fml.compat.handlers.ImmersiveEngineeringCompatHandler; +import com.gtnewhorizons.angelica.loading.fml.compat.handlers.KaizPatchXCompatHandler; import com.gtnewhorizons.angelica.loading.fml.compat.handlers.StacksOnStacksCompatHandler; import com.gtnewhorizons.angelica.loading.fml.compat.handlers.ThaumcraftCompatHandler; import com.gtnewhorizons.angelica.loading.fml.compat.handlers.ThaumicHorizonsCompatHandler; @@ -17,7 +18,8 @@ public enum CompatHandlers { EXTRA_UTILS(() -> CompatConfig.fixExtraUtils, new ExtraUtilsCompatHandler()), IMMERSIVE_ENGINEERING(() -> CompatConfig.fixImmersiveEngineering, new ImmersiveEngineeringCompatHandler()), THAUMCRAFT(() -> CompatConfig.fixThaumcraft, new ThaumcraftCompatHandler()), - THAUMIC_HORIZONS(() -> CompatConfig.fixThaumicHorizons, new ThaumicHorizonsCompatHandler()); + THAUMIC_HORIZONS(() -> CompatConfig.fixThaumicHorizons, new ThaumicHorizonsCompatHandler()), + KAIZPATCHX(() -> CompatConfig.fixKaizPatchX, new KaizPatchXCompatHandler()); private final Supplier applyIf; private final ICompatHandler handler; diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/handlers/KaizPatchXCompatHandler.java b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/handlers/KaizPatchXCompatHandler.java new file mode 100644 index 000000000..3aaa6c1ca --- /dev/null +++ b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/handlers/KaizPatchXCompatHandler.java @@ -0,0 +1,14 @@ +package com.gtnewhorizons.angelica.loading.fml.compat.handlers; + +import com.google.common.collect.ImmutableList; +import com.gtnewhorizons.angelica.loading.fml.compat.ICompatHandler; + +import java.util.List; + +public class KaizPatchXCompatHandler implements ICompatHandler { + + @Override + public List extraTransformers() { + return ImmutableList.of("com.gtnewhorizons.angelica.loading.fml.compat.transformers.specific.KaizPatchXTransformer"); + } +} diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/transformers/specific/KaizPatchXTransformer.java b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/transformers/specific/KaizPatchXTransformer.java new file mode 100644 index 000000000..ed7ea94f9 --- /dev/null +++ b/src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/transformers/specific/KaizPatchXTransformer.java @@ -0,0 +1,61 @@ +package com.gtnewhorizons.angelica.loading.fml.compat.transformers.specific; + +import com.gtnewhorizon.gtnhlib.asm.ClassConstantPoolParser; +import com.gtnewhorizons.angelica.loading.AngelicaClientTweaker; +import com.gtnewhorizons.angelica.loading.shared.AngelicaClassDump; +import net.minecraft.launchwrapper.IClassTransformer; +import org.spongepowered.asm.lib.ClassReader; +import org.spongepowered.asm.lib.ClassWriter; +import org.spongepowered.asm.lib.Opcodes; +import org.spongepowered.asm.lib.tree.AbstractInsnNode; +import org.spongepowered.asm.lib.tree.ClassNode; +import org.spongepowered.asm.lib.tree.MethodInsnNode; +import org.spongepowered.asm.lib.tree.MethodNode; + +public class KaizPatchXTransformer implements IClassTransformer { + + private static final String ANGELICA_COMPAT = "jp.kaiz.kaizpatch.compat.AngelicaCompat"; + private static final String SCRIPT_DESC = "(Ljava/lang/String;)Ljava/lang/String;"; + private static final String GL_REDIRECTS = "com/gtnewhorizons/angelica/api/GLRedirects"; + private static final String REDIRECT_SCRIPT = "redirectScript"; + private static final ClassConstantPoolParser ADOPTED = new ClassConstantPoolParser(REDIRECT_SCRIPT); + + @Override + public byte[] transform(String name, String transformedName, byte[] basicClass) { + if (basicClass == null) return null; + if (!transformedName.equals(ANGELICA_COMPAT)) return basicClass; + if (ADOPTED.find(basicClass)) { + AngelicaClientTweaker.LOGGER.info("[AngelicaCompat]Extra Transformers: KaizPatchXTransformer skipped, {} already calls GLRedirects.redirectScript", transformedName); + return basicClass; + } + + final ClassReader cr = new ClassReader(basicClass); + final ClassNode cn = new ClassNode(); + cr.accept(cn, 0); + + MethodNode target = null; + for (MethodNode mn : cn.methods) { + if (mn.name.equals("transformScript") && mn.desc.equals(SCRIPT_DESC)) { + target = mn; + break; + } + } + if (target == null) { + AngelicaClientTweaker.LOGGER.info("[AngelicaCompat]Extra Transformers: KaizPatchXTransformer found no transformScript in {}", transformedName); + return basicClass; + } + + for (AbstractInsnNode in : target.instructions.toArray()) { + if (in.getOpcode() == Opcodes.ARETURN) { + target.instructions.insertBefore(in, new MethodInsnNode(Opcodes.INVOKESTATIC, GL_REDIRECTS, REDIRECT_SCRIPT, SCRIPT_DESC, false)); + } + } + + ClassWriter cw = new ClassWriter(0); + cn.accept(cw); + final byte[] bytes = cw.toByteArray(); + AngelicaClientTweaker.LOGGER.info("[AngelicaCompat]Extra Transformers: Applied KaizPatchXTransformer"); + AngelicaClassDump.dumpClass(transformedName, basicClass, bytes, this); + return bytes; + } +} diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/EarlyRedirectorTransformer.java b/src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/EarlyRedirectorTransformer.java index 6c60b6360..5789b375a 100644 --- a/src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/EarlyRedirectorTransformer.java +++ b/src/main/java/com/gtnewhorizons/angelica/loading/fml/transformers/EarlyRedirectorTransformer.java @@ -2,6 +2,8 @@ package com.gtnewhorizons.angelica.loading.fml.transformers; import com.gtnewhorizons.angelica.glsm.loading.EarlyRedirectorCore; import com.gtnewhorizons.angelica.glsm.loading.EcosystemNarrowRules; +import com.gtnewhorizons.angelica.loading.shared.transformers.AngelicaRedirector; +import com.gtnewhorizons.angelica.loading.shared.transformers.GLSMApiRedirects; import net.minecraft.launchwrapper.IClassTransformer; /** @@ -20,6 +22,11 @@ public class EarlyRedirectorTransformer implements IClassTransformer { private final EarlyRedirectorCore impl = new EarlyRedirectorCore("com.gtnewhorizons.angelica.transform"); + public EarlyRedirectorTransformer() { + impl.setLegacyHint(AngelicaRedirector.LEGACY_HINT); + impl.setLegacyRewriter(GLSMApiRedirects.INSTANCE); + } + @Override public byte[] transform(String name, String transformedName, byte[] basicClass) { return impl.transform(transformedName, basicClass, this); diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/AngelicaRedirector.java b/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/AngelicaRedirector.java index 5ecc71be9..6959b71e0 100644 --- a/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/AngelicaRedirector.java +++ b/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/AngelicaRedirector.java @@ -5,8 +5,13 @@ import com.gtnewhorizons.angelica.loading.shared.AngelicaClassDump; public final class AngelicaRedirector { + public static final String LEGACY_HINT = "Call GL11 for GL calls; read cached state via com.gtnewhorizons.angelica.api.glstate.GLState"; + public static ModRedirector create() { - return new ModRedirector(AngelicaClassDump.INSTANCE, "com.gtnewhorizons.angelica.transform"); + final ModRedirector redirector = new ModRedirector(AngelicaClassDump.INSTANCE, "com.gtnewhorizons.angelica.transform"); + redirector.setLegacyHint(LEGACY_HINT); + redirector.setLegacyRewriter(GLSMApiRedirects.INSTANCE); + return redirector; } private AngelicaRedirector() {} diff --git a/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/GLSMApiRedirects.java b/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/GLSMApiRedirects.java new file mode 100644 index 000000000..52c16b2dc --- /dev/null +++ b/src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/GLSMApiRedirects.java @@ -0,0 +1,59 @@ +package com.gtnewhorizons.angelica.loading.shared.transformers; + +import com.gtnewhorizons.angelica.glsm.redirect.LegacyRewriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.InsnList; +import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.TypeInsnNode; + +public final class GLSMApiRedirects implements LegacyRewriter { + + public static final GLSMApiRedirects INSTANCE = new GLSMApiRedirects(); + + private static final String GL_STATE = "com/gtnewhorizons/angelica/api/glstate/GLState"; + private static final String FOG_STATE_STACK = "com/gtnewhorizons/angelica/glsm/stacks/FogStateStack"; + private static final String VECTOR3D = "org/joml/Vector3d"; + + private GLSMApiRedirects() {} + + @Override + public String rewrite(InsnList instructions, MethodInsnNode call) { + if (call.getOpcode() != Opcodes.INVOKESTATIC) return null; + if (call.name.equals("getFogState") && call.desc.equals("()L" + FOG_STATE_STACK + ";")) { + final AbstractInsnNode next = nextReal(call); + if (!(next instanceof MethodInsnNode getter) || getter.getOpcode() != Opcodes.INVOKEVIRTUAL + || !getter.owner.equals(FOG_STATE_STACK) || !getter.name.equals("getFogColorBuffer") + || !getter.desc.equals("()Ljava/nio/FloatBuffer;")) { + return null; + } + final InsnList replacement = new InsnList(); + replacement.add(new InsnNode(Opcodes.ICONST_4)); + replacement.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/nio/FloatBuffer", "allocate", "(I)Ljava/nio/FloatBuffer;", false)); + replacement.add(new InsnNode(Opcodes.DUP)); + replacement.add(new MethodInsnNode(Opcodes.INVOKESTATIC, GL_STATE, "getFogColor", "(Ljava/nio/FloatBuffer;)V", false)); + instructions.insertBefore(call, replacement); + instructions.remove(call); + instructions.remove(getter); + return "com.gtnewhorizons.angelica.api.glstate.GLState.getFogColor(FloatBuffer)"; + } + if (call.name.equals("getFogColor") && call.desc.equals("()L" + VECTOR3D + ";")) { + final InsnList replacement = new InsnList(); + replacement.add(new TypeInsnNode(Opcodes.NEW, VECTOR3D)); + replacement.add(new InsnNode(Opcodes.DUP)); + replacement.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, VECTOR3D, "", "()V", false)); + replacement.add(new MethodInsnNode(Opcodes.INVOKESTATIC, GL_STATE, "getFogColor", "(L" + VECTOR3D + ";)L" + VECTOR3D + ";", false)); + instructions.insertBefore(call, replacement); + instructions.remove(call); + return "com.gtnewhorizons.angelica.api.glstate.GLState.getFogColor(Vector3d)"; + } + return null; + } + + private static AbstractInsnNode nextReal(AbstractInsnNode node) { + AbstractInsnNode next = node.getNext(); + while (next != null && next.getOpcode() < 0) next = next.getNext(); + return next; + } +} diff --git a/src/main/java/com/gtnewhorizons/angelica/mixins/hooks/TextHighlightHooks.java b/src/main/java/com/gtnewhorizons/angelica/mixins/hooks/TextHighlightHooks.java index 1692da856..c5a239583 100644 --- a/src/main/java/com/gtnewhorizons/angelica/mixins/hooks/TextHighlightHooks.java +++ b/src/main/java/com/gtnewhorizons/angelica/mixins/hooks/TextHighlightHooks.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.mixins.hooks; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import com.gtnewhorizons.angelica.glsm.StateSet; import net.minecraft.client.renderer.Tessellator; import org.lwjgl.opengl.GL11; @@ -8,21 +11,21 @@ import org.lwjgl.opengl.GL11; public class TextHighlightHooks { public static void draw(int x1, int y1, int x2, int y2) { - final int depth = GLStateManager.pushState(StateSet.BLEND); + final int depth = GLSMAttribStack.pushState(StateSet.BLEND); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glEnable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMEnable.glEnable(GL11.GL_BLEND); - GLStateManager.glBlendFuncSeparate(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMBlend.glBlendFuncSeparate(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR, GL11.GL_ONE, GL11.GL_ZERO); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); quad(x1, y1, x2, y2); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - GLStateManager.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMCurrentAttribs.glColor4f(0.0f, 0.0f, 1.0f, 1.0f); quad(x1, y1, x2, y2); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.popStateTo(depth); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMAttribStack.popStateTo(depth); } private static void quad(int x1, int y1, int x2, int y2) { diff --git a/src/main/java/com/gtnewhorizons/angelica/profiling/TracyFramePlots.java b/src/main/java/com/gtnewhorizons/angelica/profiling/TracyFramePlots.java index fb32ccb35..8a89596b4 100644 --- a/src/main/java/com/gtnewhorizons/angelica/profiling/TracyFramePlots.java +++ b/src/main/java/com/gtnewhorizons/angelica/profiling/TracyFramePlots.java @@ -3,7 +3,11 @@ package com.gtnewhorizons.angelica.profiling; import com.gtnewhorizons.angelica.dynamiclights.DynamicLights; import com.gtnewhorizons.angelica.glsm.CaptureGate; import com.gtnewhorizons.angelica.glsm.DisplayListManager; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextureLifetime; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.glsm.profiling.TracyBackend; @@ -189,15 +193,15 @@ public final class TracyFramePlots { Tracy.plotInt(P_ENTITIES_TOTAL, mc.theWorld.loadedEntityList.size()); } - P_GL_DRAW_CALLS.plot(GLStateManager.drawCalls); - P_GL_TEX_BIND_MISSES.plot(GLStateManager.texBindMisses); - P_GL_PROGRAM_SWITCHES.plot(GLStateManager.programSwitches); - Tracy.plotInt(P_GL_TEX_AWAITING_RELEASE, GLStateManager.deferredTexturesAwaitingRelease()); - P_GLSM_BRACKETS.plot(GLStateManager.attribPushes); - P_GLSM_COW_SLOTS.plot(GLStateManager.attribSlotsSaved); - P_GLSM_POP_RESTORES.plot(GLStateManager.attribValueRestores); - P_GLSM_POP_GL_CALLS.plot(GLStateManager.attribBackendCalls); - P_GLSM_POP_DISCARDS.plot(GLStateManager.attribDiscards); + P_GL_DRAW_CALLS.plot(GLSMDraws.drawCalls); + P_GL_TEX_BIND_MISSES.plot(GLSMTextures.texBindMisses); + P_GL_PROGRAM_SWITCHES.plot(GLSMPrograms.programSwitches); + Tracy.plotInt(P_GL_TEX_AWAITING_RELEASE, GLSMTextureLifetime.deferredTexturesAwaitingRelease()); + P_GLSM_BRACKETS.plot(GLSMAttribStack.attribPushes); + P_GLSM_COW_SLOTS.plot(GLSMAttribStack.attribSlotsSaved); + P_GLSM_POP_RESTORES.plot(GLSMAttribStack.attribValueRestores); + P_GLSM_POP_GL_CALLS.plot(GLSMAttribStack.attribBackendCalls); + P_GLSM_POP_DISCARDS.plot(GLSMAttribStack.attribDiscards); P_GL_LIST_PLAYBACKS.plot(DisplayListManager.listPlaybacks); P_GL_STREAMED_BYTES.plot(TessellatorStreamingDrawer.streamedBytes); P_GL_STREAM_DRAWS.plot(TessellatorStreamingDrawer.streamDraws); diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudFaceMesh.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudFaceMesh.java index 6fa4ba8ac..1cdb8f3ec 100644 --- a/src/main/java/com/gtnewhorizons/angelica/render/CloudFaceMesh.java +++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudFaceMesh.java @@ -1,6 +1,8 @@ package com.gtnewhorizons.angelica.render; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; @@ -74,9 +76,9 @@ final class CloudFaceMesh { } void delete() { - if (vao != -1) GLStateManager.glDeleteVertexArrays(vao); - if (vbo != -1) GLStateManager.glDeleteBuffers(vbo); - if (ebo != -1) GLStateManager.glDeleteBuffers(ebo); + if (vao != -1) GLSMVertexInput.glDeleteVertexArrays(vao); + if (vbo != -1) GLSMBuffers.glDeleteBuffers(vbo); + if (ebo != -1) GLSMBuffers.glDeleteBuffers(ebo); vao = -1; vbo = -1; ebo = -1; @@ -261,54 +263,54 @@ final class CloudFaceMesh { uploadBuffer.position(0).limit(uploadBytes); final boolean freshBuffers = vbo == -1; - if (freshBuffers) vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + if (freshBuffers) vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); if (uploadBytes > vboCapacityBytes) { - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, uploadBuffer, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, uploadBuffer, GL15.GL_DYNAMIC_DRAW); vboCapacityBytes = uploadBytes; } else { - GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, uploadBuffer); + GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0, uploadBuffer); } if (freshBuffers) { ensureQuadIndices(); - if (vao == -1) vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glEnableVertexAttribArray(FACE_ATTRIB); - GLStateManager.glVertexAttribDivisor(FACE_ATTRIB, 1); - GLStateManager.glVertexAttribIPointer(FACE_ATTRIB, 1, GL11.GL_INT, FACE_BYTES, 0L); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glBindVertexArray(0); + if (vao == -1) vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + GLSMVertexInput.glEnableVertexAttribArray(FACE_ATTRIB); + GLSMVertexInput.glVertexAttribDivisor(FACE_ATTRIB, 1); + GLSMVertexInput.glVertexAttribIPointer(FACE_ATTRIB, 1, GL11.GL_INT, FACE_BYTES, 0L); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMVertexInput.glBindVertexArray(0); } - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } private void ensureQuadIndices() { if (ebo != -1) return; - ebo = GLStateManager.glGenBuffers(); + ebo = GLSMBuffers.glGenBuffers(); final IntBuffer indices = BufferUtils.createIntBuffer(6); indices.put(0).put(1).put(2).put(0).put(2).put(3); indices.flip(); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); - GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ebo); + GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); } void bind() { - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); } void unbind() { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); } void drawRange(int startFace, int endFace) { final int faces = endFace - startFace; if (faces <= 0) return; - GLStateManager.glVertexAttribIPointer(FACE_ATTRIB, 1, GL11.GL_INT, FACE_BYTES, (long) startFace * FACE_BYTES); - GLStateManager.glDrawElementsInstanced(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_INT, 0L, faces); + GLSMVertexInput.glVertexAttribIPointer(FACE_ATTRIB, 1, GL11.GL_INT, FACE_BYTES, (long) startFace * FACE_BYTES); + GLSMDraws.glDrawElementsInstanced(GL11.GL_TRIANGLES, 6, GL11.GL_UNSIGNED_INT, 0L, faces); } void drawInterior() { diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudLayerRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudLayerRenderer.java index e43a0f347..7f61d77de 100644 --- a/src/main/java/com/gtnewhorizons/angelica/render/CloudLayerRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudLayerRenderer.java @@ -22,7 +22,12 @@ package com.gtnewhorizons.angelica.render; import com.gtnewhorizons.angelica.api.clouds.CloudLayer; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.glsm.states.FogState; import net.irisshaders.iris.api.v0.IrisApi; @@ -166,10 +171,10 @@ final class CloudLayerRenderer { } private void uploadFogUniforms(CloudUniforms uniforms, float fogStart, float fogEnd) { - final boolean fogEnabled = GLStateManager.getFogMode().isEnabled(); + final boolean fogEnabled = GLSMFog.getFogMode().isEnabled(); uniforms.setFogEnabled(fogEnabled); if (!fogEnabled) return; - final FogState fog = GLStateManager.getFogState(); + final FogState fog = GLSMFog.getFogState(); final Vector3d color = fog.getFogColor(); uniforms.setFogColor((float) color.x, (float) color.y, (float) color.z); switch (fog.getFogMode()) { @@ -320,11 +325,11 @@ final class CloudLayerRenderer { b = tempB; } - final float origFogStart = GLStateManager.getFogState().getStart(); - final float origFogEnd = GLStateManager.getFogState().getEnd(); + final float origFogStart = GLSMFog.getFogState().getStart(); + final float origFogEnd = GLSMFog.getFogState().getEnd(); final float cloudExtentBlocks = renderRadiusChunks * CELLS_PER_CHUNK * cellWidthBlocks; - final boolean stretchFog = GLStateManager.getFogMode().isEnabled() - && GLStateManager.getFogState().getFogMode() == GL11.GL_LINEAR + final boolean stretchFog = GLSMFog.getFogMode().isEnabled() + && GLSMFog.getFogState().getFogMode() == GL11.GL_LINEAR && origFogEnd > 0.0f && origFogEnd < cloudExtentBlocks; final float fogStart = stretchFog ? origFogStart * (cloudExtentBlocks / origFogEnd) : origFogStart; @@ -332,8 +337,8 @@ final class CloudLayerRenderer { final boolean pushFog = stretchFog && shadersActive; if (pushFog) { - GLStateManager.glFogf(GL11.GL_FOG_START, fogStart); - GLStateManager.glFogf(GL11.GL_FOG_END, fogEnd); + GLSMFog.glFogf(GL11.GL_FOG_START, fogStart); + GLSMFog.glFogf(GL11.GL_FOG_END, fogEnd); } final float anchorDriftX = (float) (anchorX - anchorCellX); @@ -354,18 +359,18 @@ final class CloudLayerRenderer { if (!shadersActive) { program.bind(); final CloudUniforms uniforms = program.getInterface(); - final Matrix4fStack modelView = GLStateManager.getModelViewMatrix(); + final Matrix4fStack modelView = GLSMMatrices.getModelViewMatrix(); modelView.pushMatrix(); modelView.scale(cellWidthBlocks, 1.0f, cellWidthBlocks); if (interiorActive) { modelView.pushMatrix(); modelView.translate(entityToCameraX - cellFractionX, deckBaseY, entityToCameraZ - cellFractionZ); - GLStateManager.getProjectionMatrix().mul(modelView, mvpInteriorScratch); + GLSMMatrices.getProjectionMatrix().mul(modelView, mvpInteriorScratch); modelView.popMatrix(); } modelView.translate(entityToCameraX - (cellFractionX + anchorDriftX), deckBaseY, entityToCameraZ - (cellFractionZ + anchorDriftZ)); modelViewScratch.set(modelView); - GLStateManager.getProjectionMatrix().mul(modelView, mvpScratch); + GLSMMatrices.getProjectionMatrix().mul(modelView, mvpScratch); modelView.popMatrix(); uniforms.mvp.set(mvpScratch); uniforms.modelView.set(modelViewScratch); @@ -377,16 +382,16 @@ final class CloudLayerRenderer { drawClouds(r, g, b, false); program.unbind(); } else { - GLStateManager.glPushMatrix(); - GLStateManager.glScalef(cellWidthBlocks, 1.0f, cellWidthBlocks); - GLStateManager.glTranslatef(entityToCameraX - (cellFractionX + anchorDriftX), deckBaseY, entityToCameraZ - (cellFractionZ + anchorDriftZ)); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glScalef(cellWidthBlocks, 1.0f, cellWidthBlocks); + GLSMMatrices.glTranslatef(entityToCameraX - (cellFractionX + anchorDriftX), deckBaseY, entityToCameraZ - (cellFractionZ + anchorDriftZ)); drawClouds(r, g, b, true); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } if (pushFog) { - GLStateManager.glFogf(GL11.GL_FOG_START, origFogStart); - GLStateManager.glFogf(GL11.GL_FOG_END, origFogEnd); + GLSMFog.glFogf(GL11.GL_FOG_START, origFogStart); + GLSMFog.glFogf(GL11.GL_FOG_END, origFogEnd); } if (Tracy.FINE_ZONES) Tracy.endZone(); return true; @@ -523,11 +528,11 @@ final class CloudLayerRenderer { } private void drawFaces(float r, float g, float b) { - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); applyAnaglyphColorMask(); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glDepthMask(true); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthMask(true); program.getInterface().setColorMult(r, g, b, alpha); @@ -540,9 +545,9 @@ final class CloudLayerRenderer { drawVisibleWedges(faceMesh.plateStarts(), faceMesh.wallStarts(), faceMesh.uploadedCount(), true); faceMesh.unbind(); - GLStateManager.glDepthMask(true); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.disableBlend(); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMBlend.disableBlend(); } private void drawVertices(float r, float g, float b, boolean depthPrepass) { @@ -550,16 +555,16 @@ final class CloudLayerRenderer { final int totalQuads = vertexMesh.quadCount(); if (cullBackFaces()) { - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); } else { - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); } if (depthPrepass) { - GLStateManager.disableBlend(); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(false, false, false, false); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, alpha); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(false, false, false, false); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, alpha); vertexMesh.drawAll(); drawCalls++; if (interiorActive) { @@ -575,15 +580,15 @@ final class CloudLayerRenderer { } applyAnaglyphColorMask(); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glDepthMask(!depthPrepass); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthMask(!depthPrepass); if (depthPrepass) { for (int face = 0; face < 4; face++) { if (vertexMesh.faceEmpty(face)) continue; final float shade = CloudVertexMesh.FACE_SHADE[face]; - GLStateManager.glColor4f(shade * r, shade * g, shade * b, alpha); + GLSMCurrentAttribs.glColor4f(shade * r, shade * g, shade * b, alpha); vertexMesh.drawFace(face); drawCalls++; } @@ -605,7 +610,7 @@ final class CloudLayerRenderer { for (int face = 0; face < 4; face++) { if (interiorMesh.faceEmpty(face)) continue; final float shade = CloudVertexMesh.FACE_SHADE[face]; - GLStateManager.glColor4f(shade * r, shade * g, shade * b, alpha); + GLSMCurrentAttribs.glColor4f(shade * r, shade * g, shade * b, alpha); interiorMesh.drawFace(face); drawCalls++; } @@ -617,16 +622,16 @@ final class CloudLayerRenderer { popInteriorTransform(depthPrepass); } - GLStateManager.enableCull(); - GLStateManager.glDepthMask(true); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.disableBlend(); + GLSMRasterizer.enableCull(); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMBlend.disableBlend(); } private void pushInteriorTransform(boolean shadersActive) { if (shadersActive) { - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(interiorDriftX, 0.0f, interiorDriftZ); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(interiorDriftX, 0.0f, interiorDriftZ); } else { program.getInterface().mvp.set(mvpInteriorScratch); } @@ -634,7 +639,7 @@ final class CloudLayerRenderer { private void popInteriorTransform(boolean shadersActive) { if (shadersActive) { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } else { program.getInterface().mvp.set(mvpScratch); } @@ -689,13 +694,13 @@ final class CloudLayerRenderer { private void applyAnaglyphColorMask() { if (!mc.gameSettings.anaglyph) { - GLStateManager.glColorMask(true, true, true, true); + GLSMBlend.glColorMask(true, true, true, true); return; } switch (EntityRenderer.anaglyphField) { - case 0 -> GLStateManager.glColorMask(false, true, true, true); - case 1 -> GLStateManager.glColorMask(true, false, false, true); - default -> GLStateManager.glColorMask(true, true, true, true); + case 0 -> GLSMBlend.glColorMask(false, true, true, true); + case 1 -> GLSMBlend.glColorMask(true, false, false, true); + default -> GLSMBlend.glColorMask(true, true, true, true); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderResources.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderResources.java index 7b99fc60a..422ed339a 100644 --- a/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderResources.java +++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderResources.java @@ -5,7 +5,8 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import net.minecraft.client.Minecraft; import net.minecraft.util.ResourceLocation; import org.embeddedt.embeddium.impl.gl.shader.GlProgram; @@ -89,16 +90,16 @@ final class CloudRenderResources { void bind() { if (mc.renderEngine == null) return; - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); mc.renderEngine.bindTexture(location); - final int boundTexId = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + final int boundTexId = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); if (boundTexId != mipmappedTexId) { - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 4); - GLStateManager.glGenerateMipmap(GL11.GL_TEXTURE_2D); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 4); + GLSMTextures.glGenerateMipmap(GL11.GL_TEXTURE_2D); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); mipmappedTexId = boundTexId; } if (boundTexId != cloudTexId || shape == null) { @@ -108,8 +109,8 @@ final class CloudRenderResources { } private void extractCloudShape() { - final int texWidth = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); - final int texHeight = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); + final int texWidth = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); + final int texHeight = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); if (texWidth <= 0 || texHeight <= 0) return; final int neededBytes = texWidth * texHeight * 4; if (texelStagingBuffer == null || texelStagingBuffer.capacity() < neededBytes) { @@ -117,7 +118,7 @@ final class CloudRenderResources { } else { texelStagingBuffer.clear(); } - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texelStagingBuffer); width = texWidth; shape = new CloudShape(texWidth, texHeight, texelStagingBuffer); diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java index 24b663fdd..6beab5609 100644 --- a/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudRenderer.java @@ -24,7 +24,8 @@ package com.gtnewhorizons.angelica.render; import com.gtnewhorizons.angelica.api.clouds.CloudLayer; import com.gtnewhorizons.angelica.api.clouds.CloudLayerProvider; import com.gtnewhorizons.angelica.compat.galaxyspace.GalaxySpaceClouds; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.states.ViewportState; import jss.notfine.core.Settings; import jss.notfine.gui.options.named.GraphicsQualityOff; @@ -157,8 +158,8 @@ public class CloudRenderer implements IResourceManagerReloadListener { return true; }); - final ViewportState viewport = GLStateManager.getViewportState(); - cloudView.update(GLStateManager.getProjectionMatrix(), GLStateManager.getModelViewMatrix(), viewport.width, viewport.height); + final ViewportState viewport = GLSMRasterizer.getViewportState(); + cloudView.update(GLSMMatrices.getProjectionMatrix(), GLSMMatrices.getModelViewMatrix(), viewport.width, viewport.height); final Entity view = mc.renderViewEntity; final double cameraY = view.lastTickPosY + (view.posY - view.lastTickPosY) * partialTicks + cloudView.offsetY; sortCameraY = cameraY; diff --git a/src/main/java/com/gtnewhorizons/angelica/render/CloudVertexMesh.java b/src/main/java/com/gtnewhorizons/angelica/render/CloudVertexMesh.java index dd9e8056c..c6f4a4fec 100644 --- a/src/main/java/com/gtnewhorizons/angelica/render/CloudVertexMesh.java +++ b/src/main/java/com/gtnewhorizons/angelica/render/CloudVertexMesh.java @@ -4,7 +4,9 @@ import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; import com.gtnewhorizon.gtnhlib.client.renderer.vao.IVertexArrayObject; import com.gtnewhorizon.gtnhlib.client.renderer.vao.VertexBufferType; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL11; @@ -644,10 +646,10 @@ final class CloudVertexMesh { private void setupShadeAttrib() { vao.bind(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vao.getVBO().getId()); - GLStateManager.glEnableVertexAttribArray(FACE_SHADE_ATTRIB); - GLStateManager.glVertexAttribPointer(FACE_SHADE_ATTRIB, 4, GL11.GL_UNSIGNED_BYTE, true, vertexStride, normalOffset); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vao.getVBO().getId()); + GLSMVertexInput.glEnableVertexAttribArray(FACE_SHADE_ATTRIB); + GLSMVertexInput.glVertexAttribPointer(FACE_SHADE_ATTRIB, 4, GL11.GL_UNSIGNED_BYTE, true, vertexStride, normalOffset); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); vao.unbind(); } @@ -752,9 +754,9 @@ final class CloudVertexMesh { void reorderUpload() { if (orderPendingQuads <= 0) return; if (Tracy.FINE_ZONES) Tracy.beginZone(Z_REORDER_UPLOAD); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId); - GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, orderIndexBuffer, GL15.GL_DYNAMIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId); + GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, orderIndexBuffer, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); System.arraycopy(plateStartScratch, 0, plateStart, 0, plateStart.length); System.arraycopy(wallStartScratch, 0, wallStart, 0, wallStart.length); eboQuadCapacity = orderPendingQuads; @@ -771,7 +773,7 @@ final class CloudVertexMesh { private void ensureEbo(int quads) { if (eboId == -1) { - eboId = GLStateManager.glGenBuffers(); + eboId = GLSMBuffers.glGenBuffers(); } if (quads <= eboQuadCapacity && eboIsSequential) return; @@ -779,9 +781,9 @@ final class CloudVertexMesh { final int capacity = Math.max(quads + (quads >> 1), 4096); final IntBuffer indices = sequentialIndices(capacity); indices.position(0).limit(capacity * 6); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId); - GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId); + GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indices, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); eboQuadCapacity = capacity; } @@ -802,7 +804,7 @@ final class CloudVertexMesh { void deleteEbo() { if (eboId != -1) { - GLStateManager.glDeleteBuffers(eboId); + GLSMBuffers.glDeleteBuffers(eboId); eboId = -1; eboQuadCapacity = 0; } @@ -819,7 +821,7 @@ final class CloudVertexMesh { void bind() { vao.bind(); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, eboId); } void unbind() { @@ -829,11 +831,11 @@ final class CloudVertexMesh { void drawRange(int startQuad, int endQuad) { final int quads = endQuad - startQuad; if (quads <= 0) return; - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, quads * 6, GL11.GL_UNSIGNED_INT, (long) startQuad * 6L * 4L); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, quads * 6, GL11.GL_UNSIGNED_INT, (long) startQuad * 6L * 4L); } void drawAll() { - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, (vertexCount / 4) * 6, GL11.GL_UNSIGNED_INT, 0L); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, (vertexCount / 4) * 6, GL11.GL_UNSIGNED_INT, 0L); } boolean faceEmpty(int face) { diff --git a/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java index a5398ab65..44066b9c2 100644 --- a/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/render/PanoramaRenderer.java @@ -1,6 +1,14 @@ package com.gtnewhorizons.angelica.render; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.client.rendering.GlUniformFloat2v; import net.minecraft.client.Minecraft; import net.minecraft.util.MathHelper; @@ -81,7 +89,7 @@ public class PanoramaRenderer { fboB = createFbo(texB); buildCubeGeometry(); - emptyVao = GLStateManager.glGenVertexArrays(); + emptyVao = GLSMVertexInput.glGenVertexArrays(); initShaders(); } @@ -100,7 +108,7 @@ public class PanoramaRenderer { try { final GlProgram program = GlProgram.builder(name).attachShader(vert).attachShader(frag).link(factory); program.bind(); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program.handle(), "u_Texture"), 0); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program.handle(), "u_Texture"), 0); program.unbind(); return program; } finally { @@ -136,48 +144,48 @@ public class PanoramaRenderer { } ibuf.flip(); - cubeVao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(cubeVao); + cubeVao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(cubeVao); - cubeVbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, cubeVbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, vbuf, GL15.GL_STATIC_DRAW); + cubeVbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, cubeVbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, vbuf, GL15.GL_STATIC_DRAW); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, VERTEX_STRIDE, 0); - GLStateManager.glEnableVertexAttribArray(1); - GLStateManager.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_STRIDE, 12); - GLStateManager.glEnableVertexAttribArray(2); - GLStateManager.glVertexAttribPointer(2, 1, GL11.GL_FLOAT, false, VERTEX_STRIDE, 20); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, VERTEX_STRIDE, 0); + GLSMVertexInput.glEnableVertexAttribArray(1); + GLSMVertexInput.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_STRIDE, 12); + GLSMVertexInput.glEnableVertexAttribArray(2); + GLSMVertexInput.glVertexAttribPointer(2, 1, GL11.GL_FLOAT, false, VERTEX_STRIDE, 20); - cubeIbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, cubeIbo); - GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, ibuf, GL15.GL_STATIC_DRAW); + cubeIbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, cubeIbo); + GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, ibuf, GL15.GL_STATIC_DRAW); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } private static int createTexture() { - final int tex = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, FBO_SIZE, FBO_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + final int tex = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, FBO_SIZE, FBO_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); return tex; } private static int createFbo(int colorTex) { - final int fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, colorTex, 0); - final int status = GLStateManager.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, colorTex, 0); + final int status = GLSMFramebuffer.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER); if (status != GL30.GL_FRAMEBUFFER_COMPLETE) { throw new RuntimeException("Panorama FBO incomplete: 0x" + Integer.toHexString(status)); } - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); return fbo; } @@ -185,35 +193,35 @@ public class PanoramaRenderer { if (!initialized) return; initialized = false; if (fboA != 0) { - GLStateManager.glDeleteFramebuffers(fboA); + GLSMFramebuffer.glDeleteFramebuffers(fboA); fboA = 0; } if (fboB != 0) { - GLStateManager.glDeleteFramebuffers(fboB); + GLSMFramebuffer.glDeleteFramebuffers(fboB); fboB = 0; } if (texA != 0) { - GLStateManager.glDeleteTextures(texA); + GLSMTextures.glDeleteTextures(texA); texA = 0; } if (texB != 0) { - GLStateManager.glDeleteTextures(texB); + GLSMTextures.glDeleteTextures(texB); texB = 0; } if (cubeVao != 0) { - GLStateManager.glDeleteVertexArrays(cubeVao); + GLSMVertexInput.glDeleteVertexArrays(cubeVao); cubeVao = 0; } if (cubeVbo != 0) { - GLStateManager.glDeleteBuffers(cubeVbo); + GLSMBuffers.glDeleteBuffers(cubeVbo); cubeVbo = 0; } if (cubeIbo != 0) { - GLStateManager.glDeleteBuffers(cubeIbo); + GLSMBuffers.glDeleteBuffers(cubeIbo); cubeIbo = 0; } if (emptyVao != 0) { - GLStateManager.glDeleteVertexArrays(emptyVao); + GLSMVertexInput.glDeleteVertexArrays(emptyVao); emptyVao = 0; } if (cubeProgram != null) { @@ -233,54 +241,54 @@ public class PanoramaRenderer { public void renderSkybox(int panoramaTimer, float partialTicks, ResourceLocation[] panoramaPaths, Minecraft mc, int screenWidth, int screenHeight, float zLevel) { init(); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.disableCull(); - GLStateManager.disableScissorTest(); - GLStateManager.disableDepthTest(); + GLSMBlend.glColorMask(true, true, true, true); + GLSMRasterizer.disableCull(); + GLSMRasterizer.disableScissorTest(); + GLSMDepthStencilAlpha.disableDepthTest(); mc.getFramebuffer().unbindFramebuffer(); - GLStateManager.glViewport(0, 0, FBO_SIZE, FBO_SIZE); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboA); - GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMRasterizer.glViewport(0, 0, FBO_SIZE, FBO_SIZE); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboA); + GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); drawCubeFaces(panoramaTimer, partialTicks, panoramaPaths, mc); - GLStateManager.disableBlend(); + GLSMBlend.disableBlend(); blurProgram.bind(); - GLStateManager.glBindVertexArray(emptyVao); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glBindVertexArray(emptyVao); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); final BlurUniforms bu = blurProgram.getInterface(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboB); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texA); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboB); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texA); bu.direction.set(1.0f / FBO_SIZE, 0.0f); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboA); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texB); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fboA); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texB); bu.direction.set(0.0f, 1.0f / FBO_SIZE); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); mc.getFramebuffer().bindFramebuffer(true); - GLStateManager.glViewport(0, 0, mc.displayWidth, mc.displayHeight); + GLSMRasterizer.glViewport(0, 0, mc.displayWidth, mc.displayHeight); blitProgram.bind(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texA); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texA); final float f1 = screenWidth > screenHeight ? 120.0F / screenWidth : 120.0F / screenHeight; blitProgram.getInterface().scaleV.setFloat(screenHeight * f1 / 256.0F); blitProgram.getInterface().scaleU.setFloat(screenWidth * f1 / 256.0F); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); blitProgram.unbind(); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); - GLStateManager.enableBlend(); - GLStateManager.enableTexture(); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); + GLSMBlend.enableBlend(); + GLSMTextures.enableTexture(); } private void drawCubeFaces(int panoramaTimer, float partialTicks, ResourceLocation[] panoramaPaths, Minecraft mc) { @@ -292,13 +300,13 @@ public class PanoramaRenderer { final Matrix4f proj = projScratch.setPerspective((float) Math.toRadians(120.0), 1.0f, 0.05f, 10.0f); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glDepthMask(false); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthMask(false); cubeProgram.bind(); - GLStateManager.glBindVertexArray(cubeVao); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glBindVertexArray(cubeVao); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); final CubeUniforms cu = cubeProgram.getInterface(); @@ -307,12 +315,12 @@ public class PanoramaRenderer { cu.mvp.set(mvpScratch); mc.getTextureManager().bindTexture(panoramaPaths[face]); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, INDICES_PER_FACE, GL11.GL_UNSIGNED_SHORT, 0); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, INDICES_PER_FACE, GL11.GL_UNSIGNED_SHORT, 0); } - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); cubeProgram.unbind(); - GLStateManager.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthMask(true); } diff --git a/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java index a801c0c03..d006508d9 100644 --- a/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/render/SelectionBoxRenderer.java @@ -4,7 +4,9 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vao.IVertexArrayObject; import com.gtnewhorizon.gtnhlib.client.renderer.vao.VertexBufferType; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.states.Color4; import com.gtnewhorizons.angelica.glsm.streaming.TessellatorStreamingDrawer; import net.irisshaders.iris.api.v0.IrisApi; @@ -64,7 +66,7 @@ public final class SelectionBoxRenderer { final float extY = (float) (aabb.maxY - aabb.minY); final float extZ = (float) (aabb.maxZ - aabb.minZ); - if (GLStateManager.wideLineEmulationEnabled || (AngelicaConfig.enableIris && IrisApi.getInstance().isShaderPackInUse())) { + if (GLSMRasterizer.wideLineEmulationEnabled || (AngelicaConfig.enableIris && IrisApi.getInstance().isShaderPackInUse())) { drawAsLines(minX, minY, minZ, extX, extY, extZ, color); } else { drawFast(minX, minY, minZ, extX, extY, extZ, color); @@ -76,7 +78,7 @@ public final class SelectionBoxRenderer { program.bind(); - GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), mvpMatrix); + GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), mvpMatrix); mvpMatrix.translate(minX, minY, minZ).scale(extX, extY, extZ); uniforms.mvp.set(mvpMatrix); @@ -86,7 +88,7 @@ public final class SelectionBoxRenderer { colorBuf[2] = (color & 0xFF) / 255.0f; colorBuf[3] = 1.0f; } else { - final Color4 c = GLStateManager.getColor(); + final Color4 c = GLSMCurrentAttribs.getColor(); colorBuf[0] = c.getRed(); colorBuf[1] = c.getGreen(); colorBuf[2] = c.getBlue(); @@ -101,24 +103,24 @@ public final class SelectionBoxRenderer { // The streaming drawer's line path widens the edges in the FFP vertex shader or sends them to a pack's gbuffers_line private static void drawAsLines(float minX, float minY, float minZ, float extX, float extY, float extZ, int color) { - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(minX, minY, minZ); - GLStateManager.glScalef(extX, extY, extZ); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(minX, minY, minZ); + GLSMMatrices.glScalef(extX, extY, extZ); - final Color4 prev = GLStateManager.getColor(); + final Color4 prev = GLSMCurrentAttribs.getColor(); final float prevRed = prev.getRed(), prevGreen = prev.getGreen(), prevBlue = prev.getBlue(), prevAlpha = prev.getAlpha(); final boolean overrideColor = color != -1; if (overrideColor) { - GLStateManager.glColor4f(((color >> 16) & 0xFF) / 255.0f, ((color >> 8) & 0xFF) / 255.0f, (color & 0xFF) / 255.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(((color >> 16) & 0xFF) / 255.0f, ((color >> 8) & 0xFF) / 255.0f, (color & 0xFF) / 255.0f, 1.0f); } edges.clear(); TessellatorStreamingDrawer.drawPacked(edges, GL11.GL_LINES, DefaultVertexFormat.POSITION.getVertexFlags(), VERT_COUNT); if (overrideColor) { - GLStateManager.glColor4f(prevRed, prevGreen, prevBlue, prevAlpha); + GLSMCurrentAttribs.glColor4f(prevRed, prevGreen, prevBlue, prevAlpha); } - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } public static void destroy() { diff --git a/src/main/java/com/gtnewhorizons/angelica/render/WeatherRenderer.java b/src/main/java/com/gtnewhorizons/angelica/render/WeatherRenderer.java index 58828f7f7..d7ae2b34f 100644 --- a/src/main/java/com/gtnewhorizons/angelica/render/WeatherRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/render/WeatherRenderer.java @@ -3,7 +3,14 @@ package com.gtnewhorizons.angelica.render; import com.gtnewhorizons.angelica.compat.dragonapi.DragonAPICompat; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.config.SystemProperties; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.ffp.Instancing; import com.gtnewhorizons.angelica.glsm.ffp.VAOManager; import com.gtnewhorizons.angelica.glsm.ffp.WeatherInstancedAttribs; @@ -273,20 +280,20 @@ public final class WeatherRenderer { updateCount & 31, updateCount & 511, rainStrength); mc.entityRenderer.enableLightmap(partialTicks); - GLStateManager.disableCull(); - GLStateManager.glNormal3f(0.0F, 1.0F, 0.0F); - GLStateManager.enableBlend(); + GLSMRasterizer.disableCull(); + GLSMCurrentAttribs.glNormal3f(0.0F, 1.0F, 0.0F); + GLSMBlend.enableBlend(); OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); int drawCalls = 0; drawCalls += drawRange(mc, deferred, RAIN_TEXTURE, 0, rainInstances); drawCalls += drawRange(mc, deferred, SNOW_TEXTURE, rainInstances, instanceCount - rainInstances); - GLStateManager.enableCull(); - GLStateManager.disableBlend(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMRasterizer.enableCull(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); mc.entityRenderer.disableLightmap(partialTicks); report(instanceCount, drawCalls, startNanos); @@ -303,15 +310,15 @@ public final class WeatherRenderer { deferred.bindInstancedVariant(Instancing.WEATHER); } - GLStateManager.glBindVertexArray(WeatherQuadMesh.vao()); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer); + GLSMVertexInput.glBindVertexArray(WeatherQuadMesh.vao()); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer); WeatherInstancedAttribs.pointInstanceAttribs((long) first * WeatherInstancedAttribs.STRIDE); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); VAOManager.setCurrentVertexFlags(WeatherQuadMesh.VERTEX_FLAGS); - if (deferred == null) GLStateManager.setFfpInstancing(Instancing.WEATHER); - GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLE_FAN, 0, WeatherQuadMesh.VERTEX_COUNT, count); - GLStateManager.setFfpInstancing(Instancing.NONE); - GLStateManager.glBindVertexArray(0); + if (deferred == null) GLSMPrograms.setFfpInstancing(Instancing.WEATHER); + GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLE_FAN, 0, WeatherQuadMesh.VERTEX_COUNT, count); + GLSMPrograms.setFfpInstancing(Instancing.NONE); + GLSMVertexInput.glBindVertexArray(0); if (deferred != null) deferred.rebindCurrentPass(); return 1; @@ -324,10 +331,10 @@ public final class WeatherRenderer { if (instanceCapacity < slots) { instanceCapacity = slots; instanceData = ByteBuffer.allocateDirect(slots * stride).order(ByteOrder.nativeOrder()); - if (instanceBuffer == 0) instanceBuffer = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, (long) slots * stride, GL15.GL_DYNAMIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + if (instanceBuffer == 0) instanceBuffer = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, (long) slots * stride, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); WeatherQuadMesh.bindInstanceBuffer(instanceBuffer); } @@ -339,9 +346,9 @@ public final class WeatherRenderer { instanceData.position(0); instanceData.limit(count * stride); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer); - GLStateManager.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0L, instanceData); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, instanceBuffer); + GLSMBuffers.glBufferSubData(GL15.GL_ARRAY_BUFFER, 0L, instanceData); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); instanceData.clear(); } @@ -394,12 +401,12 @@ public final class WeatherRenderer { mc.entityRenderer.enableLightmap(partialTicks); final float age = updateCount + partialTicks; - GLStateManager.disableCull(); - GLStateManager.glNormal3f(0.0F, 1.0F, 0.0F); - GLStateManager.enableBlend(); + GLSMRasterizer.disableCull(); + GLSMCurrentAttribs.glNormal3f(0.0F, 1.0F, 0.0F); + GLSMBlend.enableBlend(); OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); final Tessellator tessellator = Tessellator.instance; int bound = -1; @@ -473,9 +480,9 @@ public final class WeatherRenderer { drawCalls++; } - GLStateManager.enableCull(); - GLStateManager.disableBlend(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMRasterizer.enableCull(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); mc.entityRenderer.disableLightmap(partialTicks); report(quads, drawCalls, startNanos); @@ -517,7 +524,7 @@ public final class WeatherRenderer { public static void clear() { WeatherQuadMesh.delete(); if (instanceBuffer != 0) { - GLStateManager.glDeleteBuffers(instanceBuffer); + GLSMBuffers.glDeleteBuffers(instanceBuffer); instanceBuffer = 0; } instanceData = null; diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/BlockMaterialAttribute.java b/src/main/java/com/gtnewhorizons/angelica/rendering/BlockMaterialAttribute.java index 1f37e97cf..0aec3e77b 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/BlockMaterialAttribute.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/BlockMaterialAttribute.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.rendering; import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import com.gtnewhorizons.angelica.iris.IrisDisplayListState; import com.gtnewhorizons.angelica.rendering.celeritas.BlockRenderLayer; import it.unimi.dsi.fastutil.ints.Int2IntMap; @@ -24,14 +24,14 @@ public final class BlockMaterialAttribute { IrisDisplayListState.recordBlockEntityAttribute(block, metadata); if (!shadersActive()) return; IrisDisplayListState.runUnrecorded(() -> - GLStateManager.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short) blockMaterialId(block, metadata), (short) 0)); + GLSMCurrentAttribs.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short) blockMaterialId(block, metadata), (short) 0)); } public static void reset() { IrisDisplayListState.recordBlockEntityAttribute(null, 0); if (!shadersActive()) return; IrisDisplayListState.runUnrecorded(() -> - GLStateManager.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short) -1, (short) -1)); + GLSMCurrentAttribs.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short) -1, (short) -1)); } static boolean shadersActive() { diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/DeferredEntityOverlay.java b/src/main/java/com/gtnewhorizons/angelica/rendering/DeferredEntityOverlay.java index 6e32a402a..fd63764c3 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/DeferredEntityOverlay.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/DeferredEntityOverlay.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.rendering; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay; import lombok.Getter; import net.coderbot.iris.layer.GbufferPrograms; @@ -87,7 +90,7 @@ public class DeferredEntityOverlay { entry.set(pendingShouldRenderPass, pendingRenderer, pendingEntity, pendingPartialTick, limbSwing, limbSwingAmount, ageInTicks, headYaw, headPitch, scale); - GLStateManager.getModelViewMatrix().get(entry.matrix); + GLSMMatrices.getModelViewMatrix().get(entry.matrix); deferred.add(entry); EntityShadowReplay.recordDeferredOverlay(entry); @@ -145,29 +148,29 @@ public class DeferredEntityOverlay { // Restore the entity's lightmap coords int brightness = entity.getBrightnessForRender(entry.partialTick); - GLStateManager.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, + GLSMCurrentAttribs.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, brightness % 65536, (float) brightness / 65536); // Restore the saved modelview matrix - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); boolean depthMaskDisabled = false; try { MATRIX_BUF.clear(); MATRIX_BUF.put(entry.matrix); MATRIX_BUF.flip(); - GLStateManager.glLoadMatrix(MATRIX_BUF); + GLSMMatrices.glLoadMatrix(MATRIX_BUF); // Replay shouldRenderPass pass 1 replaying = true; int result = entry.shouldRenderPass.invoke(entity, 1, entry.partialTick); if (result > 0) { // Disable depth writes so coplanar faces don't z-fight each other - GLStateManager.glDepthMask(false); + GLSMDepthStencilAlpha.glDepthMask(false); depthMaskDisabled = true; // Disable backface culling so both sides of the overlay shell are visible - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); // Render using the model set by shouldRenderPass entry.renderer.renderPassModel.setLivingAnimations(entity, @@ -183,10 +186,10 @@ public class DeferredEntityOverlay { } finally { replaying = false; if (depthMaskDisabled) { - GLStateManager.glDepthMask(true); - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); } - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/FramePacer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/FramePacer.java index 0b9f543d6..e945f2cb2 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/FramePacer.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/FramePacer.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.rendering; import com.gtnewhorizons.angelica.AngelicaMod; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.backend.RenderBackend.GateSample; import com.gtnewhorizons.angelica.glsm.backend.RenderBackend; @@ -165,7 +166,7 @@ public final class FramePacer { } public static void beforePresent() { - final long firstClearBlockNanos = GLStateManager.takeFirstClearBlockNanos(); + final long firstClearBlockNanos = GLSMFramebuffer.takeFirstClearBlockNanos(); Tracy.beginZone(Z_PACER_PRESENT_SLEEP); try { core.beforePresent(nanoTime(), firstClearBlockNanos); diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/GlintClock.java b/src/main/java/com/gtnewhorizons/angelica/rendering/GlintClock.java index e9317664d..93532581d 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/GlintClock.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/GlintClock.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.rendering; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import org.joml.Matrix4fc; import org.joml.Matrix4f; @@ -57,10 +57,10 @@ public final class GlintClock { } public static void translateArmorGlint() { - if (secondArmorLayer(GLStateManager.getMatrixStack())) { - GLStateManager.glTranslatef(armorU1, armorV1, 0f); + if (secondArmorLayer(GLSMMatrices.getMatrixStack())) { + GLSMMatrices.glTranslatef(armorU1, armorV1, 0f); } else { - GLStateManager.glTranslatef(armorU0, armorV0, 0f); + GLSMMatrices.glTranslatef(armorU0, armorV0, 0f); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/GuiBlockSupersampling.java b/src/main/java/com/gtnewhorizons/angelica/rendering/GuiBlockSupersampling.java index fea6e362d..465289303 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/GuiBlockSupersampling.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/GuiBlockSupersampling.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.rendering; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.proxy.ClientProxy; public final class GuiBlockSupersampling { @@ -9,10 +9,10 @@ public final class GuiBlockSupersampling { public static int begin() { if (!RenderingState.INSTANCE.isRenderingGuiItem() || RenderingState.INSTANCE.isRenderingWorld()) return 0; final int samples = ClientProxy.options().quality.guiBlockSupersampling; - return samples > 1 ? GLStateManager.setTextureSupersamplingSamples(samples) : 0; + return samples > 1 ? GLSMTextures.setTextureSupersamplingSamples(samples) : 0; } public static void end(int previous) { - if (previous != 0) GLStateManager.setTextureSupersamplingSamples(previous); + if (previous != 0) GLSMTextures.setTextureSupersamplingSamples(previous); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionCapture.java b/src/main/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionCapture.java index 014fe7163..1cb3219b7 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionCapture.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionCapture.java @@ -3,6 +3,15 @@ package com.gtnewhorizons.angelica.rendering; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.QuadConverter; import com.gtnewhorizons.angelica.glsm.StateSet; @@ -130,8 +139,8 @@ public final class PlayerReflectionCapture { final float[] data = vertexScratch(); emitModel(model, scale, data); - pendingModelView.set(GLStateManager.getModelViewMatrix()); - pendingSkin = GLStateManager.getBoundTextureForServerState(0); + pendingModelView.set(GLSMMatrices.getModelViewMatrix()); + pendingSkin = GLSMTextures.getBoundTextureForServerState(0); pendingEntityId = CapturedRenderingState.INSTANCE.getCurrentRenderedEntity(); pendingItemId = CapturedRenderingState.INSTANCE.getCurrentRenderedItem(); pending = true; @@ -212,7 +221,7 @@ public final class PlayerReflectionCapture { if (!(Iris.getPipelineManager().getPipelineNullable() instanceof DeferredWorldRenderingPipeline pipeline)) return; pipeline.rebindCurrentPass(); - if (GLStateManager.getActiveProgram() != pipeline.getActivePassProgramId()) return; + if (GLSMPrograms.getActiveProgram() != pipeline.getActivePassProgramId()) return; if (Tracy.ENABLED) Tracy.beginZone(Z_PLAYER_REFLECTION_FLUSH); try { @@ -251,14 +260,14 @@ public final class PlayerReflectionCapture { repackBuffer.limit((int) (writePtr - repackAddress)); ensureVAO(format); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, repackBuffer, GL15.GL_STREAM_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, repackBuffer, GL15.GL_STREAM_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - final int prevUnit = GL13.GL_TEXTURE0 + GLStateManager.getActiveTextureUnitForServerState(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - final int prevTexture = GLStateManager.getBoundTextureForServerState(); + final int prevUnit = GL13.GL_TEXTURE0 + GLSMTextures.getActiveTextureUnitForServerState(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + final int prevTexture = GLSMTextures.getBoundTextureForServerState(); if (pendingSkin > 0 && pendingSkin != skin64Tex) { final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(pendingSkin); @@ -285,8 +294,8 @@ public final class PlayerReflectionCapture { skinPixels = ByteBuffer.allocateDirect(required).order(ByteOrder.nativeOrder()); } skinPixels.clear(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, pendingSkin); - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, pendingSkin); + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels); skinCopyWidth = srcW; skinCopyHeight = srcH; } @@ -295,12 +304,12 @@ public final class PlayerReflectionCapture { if (skinCopyWidth > 0 && (skinChanged || atlasChanged)) { ensureSkin64Texture(Math.max(skinCopyWidth, skinCopyHeight)); - final int prevRowLength = GLStateManager.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, skinCopyWidth); + final int prevRowLength = GLSMQueries.glGetInteger(GL11.GL_UNPACK_ROW_LENGTH); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, skinCopyWidth); try { skinPixels.rewind(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, skinCopyWidth, skinCopyHeight, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, skinCopyWidth, skinCopyHeight, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels); skin64Valid = true; if (atlasInfo != null) { @@ -308,39 +317,39 @@ public final class PlayerReflectionCapture { final int dstH = Math.min(atlasInfo.getHeight(), skinCopyHeight); if (dstW > 0 && dstH > 0) { skinPixels.rewind(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, atlasId); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, dstW, dstH, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, atlasId); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, dstW, dstH, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, skinPixels); } } } finally { - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, prevRowLength); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, prevRowLength); } lastUploadedAtlasInfo = atlasInfo; lastUploadedAtlasGeneration = atlasInfo != null ? atlasInfo.getUploadGeneration() : 0; } - if (skin64Valid) GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex); + if (skin64Valid) GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex); } final int prevEntityId = CapturedRenderingState.INSTANCE.getCurrentRenderedEntity(); final int prevItemId = CapturedRenderingState.INSTANCE.getCurrentRenderedItem(); - savedModelView.set(GLStateManager.getModelViewMatrix()); + savedModelView.set(GLSMMatrices.getModelViewMatrix()); CapturedRenderingState.INSTANCE.setCurrentEntityAndItem(pendingEntityId, pendingItemId); - GLStateManager.setModelViewMatrix(pendingModelView); - final int maskStateDepth = GLStateManager.pushState(StateSet.MASKS); - GLStateManager.glColorMask(false, false, false, false); - GLStateManager.glDepthMask(false); + GLSMMatrices.setModelViewMatrix(pendingModelView); + final int maskStateDepth = GLSMAttribStack.pushState(StateSet.MASKS); + GLSMBlend.glColorMask(false, false, false, false); + GLSMDepthStencilAlpha.glDepthMask(false); try { QuadConverter.drawQuadsAsTriangles(GLStateManager.ctx(), 0, VERTEX_COUNT); } finally { - GLStateManager.popStateTo(maskStateDepth); - GLStateManager.setModelViewMatrix(savedModelView); + GLSMAttribStack.popStateTo(maskStateDepth); + GLSMMatrices.setModelViewMatrix(savedModelView); CapturedRenderingState.INSTANCE.setCurrentEntityAndItem(prevEntityId, prevItemId); - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, prevTexture); - GLStateManager.glActiveTexture(prevUnit); + GLSMVertexInput.glBindVertexArray(0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, prevTexture); + GLSMTextures.glActiveTexture(prevUnit); } } @@ -351,23 +360,23 @@ public final class PlayerReflectionCapture { private static void ensureVAO(VertexFormat format) { if (vao != 0) return; - vbo = GLStateManager.glGenBuffers(); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + vbo = GLSMBuffers.glGenBuffers(); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); format.setupBufferState(0L); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); } private static void ensureSkin64Texture(int size) { if (skin64Tex != 0 && skin64Size == size) return; - if (skin64Tex == 0) skin64Tex = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex); + if (skin64Tex == 0) skin64Tex = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, skin64Tex); final ByteBuffer zero = ByteBuffer.allocateDirect(size * size * 4); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, zero); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, zero); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); skin64Size = size; skin64Valid = false; } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/SkippedGlintBlock.java b/src/main/java/com/gtnewhorizons/angelica/rendering/SkippedGlintBlock.java index 86a93897b..1a0f15674 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/SkippedGlintBlock.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/SkippedGlintBlock.java @@ -1,6 +1,13 @@ package com.gtnewhorizons.angelica.rendering; import com.gtnewhorizon.gtnhlib.client.renderer.MatrixHelper; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.states.BlendState; import com.gtnewhorizons.angelica.glsm.states.Color4; @@ -33,22 +40,22 @@ public final class SkippedGlintBlock { private static void applyExitState(float red, float green, float blue, float alpha, int srcRgb, int dstRgb, int srcAlpha, int dstAlpha, boolean resetTextureMatrix, boolean restoreDepthMask) { final boolean recording = GLStateManager.isExitCaptureActive(); - final Color4 color = GLStateManager.getColor(); + final Color4 color = GLSMCurrentAttribs.getColor(); if (recording || color.getRed() != red || color.getGreen() != green || color.getBlue() != blue || color.getAlpha() != alpha) { - GLStateManager.glColor4f(red, green, blue, alpha); + GLSMCurrentAttribs.glColor4f(red, green, blue, alpha); } - if (resetTextureMatrix && (recording || !MatrixHelper.isIdentity(GLStateManager.getTextures().getTextureUnitMatrix(0)))) { - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + if (resetTextureMatrix && (recording || !MatrixHelper.isIdentity(GLSMTextures.getTextures().getTextureUnitMatrix(0)))) { + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); } - if (recording || GLStateManager.getMatrixMode().getMode() != GL11.GL_MODELVIEW) GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - if (restoreDepthMask && (recording || !GLStateManager.isEffectiveDepthMaskEnabled())) GLStateManager.glDepthMask(true); - if (recording || !GLStateManager.getLightingState().isEnabled()) GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.getEffectiveBlendState(blend); - if (recording || GLStateManager.getBlendState().isFuncUnknown() || blend.getSrcRgb() != srcRgb || blend.getDstRgb() != dstRgb || blend.getSrcAlpha() != srcAlpha || blend.getDstAlpha() != dstAlpha) { - GLStateManager.tryBlendFuncSeparate(srcRgb, dstRgb, srcAlpha, dstAlpha); + if (recording || GLSMMatrices.getMatrixMode().getMode() != GL11.GL_MODELVIEW) GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + if (restoreDepthMask && (recording || !GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled())) GLSMDepthStencilAlpha.glDepthMask(true); + if (recording || !GLSMLighting.getLightingState().isEnabled()) GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMBlend.getEffectiveBlendState(blend); + if (recording || GLSMBlend.getBlendState().isFuncUnknown() || blend.getSrcRgb() != srcRgb || blend.getDstRgb() != dstRgb || blend.getSrcAlpha() != srcAlpha || blend.getDstAlpha() != dstAlpha) { + GLSMBlend.tryBlendFuncSeparate(srcRgb, dstRgb, srcAlpha, dstAlpha); } - if (recording || GLStateManager.isEffectiveBlendEnabled()) GLStateManager.glDisable(GL11.GL_BLEND); - if (recording || GLStateManager.getDepthState().getFunc() != GL11.GL_LEQUAL) GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + if (recording || GLSMBlend.isEffectiveBlendEnabled()) GLSMEnable.glDisable(GL11.GL_BLEND); + if (recording || GLSMDepthStencilAlpha.getDepthState().getFunc() != GL11.GL_LEQUAL) GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaChunkRenderer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaChunkRenderer.java index 495b3f425..04398fe1c 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaChunkRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaChunkRenderer.java @@ -2,7 +2,8 @@ package com.gtnewhorizons.angelica.rendering.celeritas; import com.gtnewhorizons.angelica.AngelicaMod; import com.gtnewhorizons.angelica.client.rendering.AngelicaFogService; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.rendering.culling.GpuTerrainCuller; @@ -391,7 +392,7 @@ class AngelicaChunkRenderer extends DefaultChunkRenderer { return; } - final int prevProgram = GLStateManager.glGetInteger(GL20.GL_CURRENT_PROGRAM); + final int prevProgram = GLSMQueries.glGetInteger(GL20.GL_CURRENT_PROGRAM); voxelCompute.use(); deferred.prepareShadowVoxelizationCompute(matrices.modelView()); try { @@ -399,7 +400,7 @@ class AngelicaChunkRenderer extends DefaultChunkRenderer { shadowVoxelSink.flush(); } finally { shadowVoxelSink.discard(); - if (prevProgram != 0) GLStateManager.glUseProgram(prevProgram); + if (prevProgram != 0) GLSMPrograms.glUseProgram(prevProgram); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaRenderPassConfiguration.java b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaRenderPassConfiguration.java index d98575c5e..666f7b691 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaRenderPassConfiguration.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/AngelicaRenderPassConfiguration.java @@ -1,7 +1,8 @@ package com.gtnewhorizons.angelica.rendering.celeritas; import com.google.common.collect.ImmutableListMultimap; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.proxy.ClientProxy; import com.gtnewhorizons.angelica.utils.SpritePadding; @@ -117,32 +118,32 @@ public class AngelicaRenderPassConfiguration { @Override public void setup() { - GLStateManager.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthMask(true); if (alphaCutoff > 0.0f) { if (alphaStateDepth >= 0) { - GLStateManager.popStateTo(alphaStateDepth); + GLSMAttribStack.popStateTo(alphaStateDepth); alphaStateDepth = -1; } - alphaStateDepth = GLStateManager.pushState(StateSet.ALPHA); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, alphaCutoff); + alphaStateDepth = GLSMAttribStack.pushState(StateSet.ALPHA); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, alphaCutoff); if (pass == 1) { - GLStateManager.enableAlphaTest(); + GLSMDepthStencilAlpha.enableAlphaTest(); } } if (disableAlphaTest) { - GLStateManager.disableAlphaTest(); + GLSMDepthStencilAlpha.disableAlphaTest(); } } @Override public void clear() { if (alphaStateDepth >= 0) { - GLStateManager.popStateTo(alphaStateDepth); + GLSMAttribStack.popStateTo(alphaStateDepth); alphaStateDepth = -1; } if (disableAlphaTest) { - GLStateManager.enableAlphaTest(); + GLSMDepthStencilAlpha.enableAlphaTest(); } } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasWorldRenderer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasWorldRenderer.java index 5cc453f3d..2983e1e8b 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasWorldRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/celeritas/CeleritasWorldRenderer.java @@ -43,7 +43,9 @@ import com.gtnewhorizons.angelica.compat.cubicchunks.CubicChunksAPI; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.dynamiclights.DynamicLights; import com.gtnewhorizons.angelica.dynamiclights.IDynamicLightWorldRenderer; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.mixins.interfaces.ITileEntityBoundingBoxCache; @@ -386,7 +388,7 @@ public class CeleritasWorldRenderer extends SimpleWorldRenderer metaCapacityBytes) { final int newCap = Math.max(needed, Math.max(metaCapacityBytes * 2, SectionMetaBuffer.BYTES_PER_SECTION * INITIAL_META_SECTIONS)); - GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, newCap, GL15.GL_DYNAMIC_DRAW); + GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, newCap, GL15.GL_DYNAMIC_DRAW); metaCapacityBytes = newCap; } - GLStateManager.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, metaBytes); + GLSMBuffers.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, metaBytes); return true; } public void uploadFrustum(ByteBuffer frustumUboBytes) { if (!ready || frustumUboBytes == null) return; - GLStateManager.glBindBuffer(GL31.GL_UNIFORM_BUFFER, frustumUboGlId); - GLStateManager.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 0L, frustumUboBytes); + GLSMBuffers.glBindBuffer(GL31.GL_UNIFORM_BUFFER, frustumUboGlId); + GLSMBuffers.glBufferSubData(GL31.GL_UNIFORM_BUFFER, 0L, frustumUboBytes); } void beginDispatches(int visibleSsboGlId, int indirectSsboGlId) { - savedProgram = GLStateManager.getActiveProgram(); + savedProgram = GLSMPrograms.getActiveProgram(); savedVisibleSsbo = RenderSystem.getIndexedBufferBinding(GL43.GL_SHADER_STORAGE_BUFFER, VISIBLE_SSBO_BINDING); savedMetaSsbo = RenderSystem.getIndexedBufferBinding(GL43.GL_SHADER_STORAGE_BUFFER, META_SSBO_BINDING); savedIndirectSsbo = RenderSystem.getIndexedBufferBinding(GL43.GL_SHADER_STORAGE_BUFFER, INDIRECT_SSBO_BINDING); savedFrustumUbo = RenderSystem.getIndexedBufferBinding(GL31.GL_UNIFORM_BUFFER, FRUSTUM_UBO_BINDING); - GLStateManager.glUseProgram(program.handle()); + GLSMPrograms.glUseProgram(program.handle()); RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, VISIBLE_SSBO_BINDING, visibleSsboGlId); RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, META_SSBO_BINDING, metaSsboGlId); RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, INDIRECT_SSBO_BINDING, indirectSsboGlId); @@ -109,22 +110,22 @@ public final class GpuDrivenChunkCuller { void dispatch(int visibleCount) { final int groups = (visibleCount + LOCAL_SIZE_X - 1) / LOCAL_SIZE_X; - GLStateManager.glDispatchCompute(groups, 1, 1); + GLSMPrograms.glDispatchCompute(groups, 1, 1); } void endDispatches() { - GLStateManager.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT | GL42.GL_COMMAND_BARRIER_BIT); + GLSMBuffers.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT | GL42.GL_COMMAND_BARRIER_BIT); RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, VISIBLE_SSBO_BINDING, savedVisibleSsbo); RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, META_SSBO_BINDING, savedMetaSsbo); RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, INDIRECT_SSBO_BINDING, savedIndirectSsbo); RenderSystem.bindBufferBase(GL31.GL_UNIFORM_BUFFER, FRUSTUM_UBO_BINDING, savedFrustumUbo); - GLStateManager.glUseProgram(savedProgram); + GLSMPrograms.glUseProgram(savedProgram); } public synchronized void shutdown() { if (program != null) { program.delete(); program = null; } - if (metaSsboGlId != 0) { GLStateManager.glDeleteBuffers(metaSsboGlId); metaSsboGlId = 0; } - if (frustumUboGlId != 0) { GLStateManager.glDeleteBuffers(frustumUboGlId); frustumUboGlId = 0; } + if (metaSsboGlId != 0) { GLSMBuffers.glDeleteBuffers(metaSsboGlId); metaSsboGlId = 0; } + if (frustumUboGlId != 0) { GLSMBuffers.glDeleteBuffers(frustumUboGlId); frustumUboGlId = 0; } ready = false; disabled = true; } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/culling/GpuTerrainCuller.java b/src/main/java/com/gtnewhorizons/angelica/rendering/culling/GpuTerrainCuller.java index c0cdf9280..97dfd916a 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/culling/GpuTerrainCuller.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/culling/GpuTerrainCuller.java @@ -1,7 +1,8 @@ package com.gtnewhorizons.angelica.rendering.culling; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.mixins.interfaces.SectionRenderDataStorageRegionAccessor; @@ -236,7 +237,7 @@ public final class GpuTerrainCuller { public void endPass() { if (indirectBufferBound) { - GLStateManager.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0); indirectBufferBound = false; } currentDrawStart = 0; @@ -258,8 +259,8 @@ public final class GpuTerrainCuller { ensureGpuBuffers(totalAppendedEntries); visibleStagingView.position(0).limit(totalAppendedEntries * ENTRY_BYTES); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visibleSsboGlId); - GLStateManager.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, visibleStagingView); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visibleSsboGlId); + GLSMBuffers.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, visibleStagingView); culler.beginDispatches(visibleSsboGlId, indirectSsboGlId); BackendManager.RENDER_BACKEND.beginComputeDispatchBatch(); @@ -287,14 +288,14 @@ public final class GpuTerrainCuller { } private void ensureGpuBuffers(int maxVisible) { - if (visibleSsboGlId == 0) visibleSsboGlId = GLStateManager.glGenBuffers(); - if (indirectSsboGlId == 0) indirectSsboGlId = GLStateManager.glGenBuffers(); + if (visibleSsboGlId == 0) visibleSsboGlId = GLSMBuffers.glGenBuffers(); + if (indirectSsboGlId == 0) indirectSsboGlId = GLSMBuffers.glGenBuffers(); if (maxVisible <= gpuCapacityEntries) return; final int newCap = Math.max(maxVisible, Math.max(gpuCapacityEntries * 2, 64)); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visibleSsboGlId); - GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, (long) newCap * ENTRY_BYTES, GL15.GL_STREAM_DRAW); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, indirectSsboGlId); - GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, (long) newCap * GpuDrivenChunkCuller.FACINGS_PER_SECTION * GpuDrivenChunkCuller.INDIRECT_COMMAND_BYTES, GL15.GL_STREAM_DRAW); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visibleSsboGlId); + GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, (long) newCap * ENTRY_BYTES, GL15.GL_STREAM_DRAW); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, indirectSsboGlId); + GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, (long) newCap * GpuDrivenChunkCuller.FACINGS_PER_SECTION * GpuDrivenChunkCuller.INDIRECT_COMMAND_BYTES, GL15.GL_STREAM_DRAW); gpuCapacityEntries = newCap; } @@ -624,19 +625,19 @@ public final class GpuTerrainCuller { } if (!indirectBufferBound) { - GLStateManager.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, indirectSsboGlId); + GLSMBuffers.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, indirectSsboGlId); indirectBufferBound = true; } final long offsetBytes = (long) drawStart * GpuDrivenChunkCuller.INDIRECT_COMMAND_BYTES; try (DrawCommandList ignored = commandList.beginTessellating(tessellation)) { - GLStateManager.glMultiDrawElementsIndirect(primitiveType.getId(), GL11.GL_UNSIGNED_INT, offsetBytes, drawCount, 0); + GLSMDraws.glMultiDrawElementsIndirect(primitiveType.getId(), GL11.GL_UNSIGNED_INT, offsetBytes, drawCount, 0); } } public void delete() { if (indirectBufferBound) { - GLStateManager.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0); indirectBufferBound = false; } if (visibleStaging != null) { @@ -646,11 +647,11 @@ public final class GpuTerrainCuller { stagingCapacityEntries = 0; } if (visibleSsboGlId != 0) { - GLStateManager.glDeleteBuffers(visibleSsboGlId); + GLSMBuffers.glDeleteBuffers(visibleSsboGlId); visibleSsboGlId = 0; } if (indirectSsboGlId != 0) { - GLStateManager.glDeleteBuffers(indirectSsboGlId); + GLSMBuffers.glDeleteBuffers(indirectSsboGlId); indirectSsboGlId = 0; } gpuCapacityEntries = 0; diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/items/BlockRenderListManager.java b/src/main/java/com/gtnewhorizons/angelica/rendering/items/BlockRenderListManager.java index c46b380ed..25bdb544d 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/items/BlockRenderListManager.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/items/BlockRenderListManager.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.rendering.items; import com.gtnewhorizons.angelica.glsm.DisplayListManager; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -49,15 +49,15 @@ public class BlockRenderListManager { public static int callOrStartCompiling(int cached) { if (cached != 0) { - GLStateManager.glCallList(cached); + GLSMDraws.glCallList(cached); return -1; } return startCompiling(); } private static int startCompiling() { - final int list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + final int list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); return list; } @@ -65,25 +65,25 @@ public class BlockRenderListManager { if (list <= 0) return; finishCompiling(); displayListMap.put(new BlockMeta(block, meta), list); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); } public static void endItemFrameCompiling(int list, int variant) { if (list <= 0) return; finishCompiling(); itemFrameDisplayLists[variant] = list; - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); } public static void abortCompiling(int list) { if (list <= 0) return; finishCompiling(); - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); } private static void finishCompiling() { DisplayListManager.discardMatrixTransforms(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); } public static void registerReloadListener(){ @@ -91,12 +91,12 @@ public class BlockRenderListManager { .getResourceManager(); resourceManager.registerReloadListener(_ -> { for (int list : displayListMap.values()) { - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); } displayListMap.clear(); for (int i = 0; i < itemFrameDisplayLists.length; i++) { if (itemFrameDisplayLists[i] != 0) { - GLStateManager.glDeleteLists(itemFrameDisplayLists[i], 1); + GLSMDraws.glDeleteLists(itemFrameDisplayLists[i], 1); itemFrameDisplayLists[i] = 0; } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/items/DroppedItemInstancer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/items/DroppedItemInstancer.java index fec4eff21..7e99a3375 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/items/DroppedItemInstancer.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/items/DroppedItemInstancer.java @@ -4,6 +4,9 @@ import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; import com.gtnewhorizons.angelica.config.AngelicaConfig; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.states.Color4; import com.gtnewhorizons.angelica.rendering.items.BlockRenderListManager.BlockMeta; @@ -122,7 +125,7 @@ public final class DroppedItemInstancer { } static long batchIcon(TesrMaterial material, boolean afterGlint, float maxU, float minV, float minU, float maxV, int width, int height, float thickness) { - final long drawsBefore = GLStateManager.drawCalls; + final long drawsBefore = GLSMDraws.drawCalls; if (BatchEligibility.batchingAllowed()) { final TemplateBuffer template = iconTemplate(maxU, minV, minU, maxV, width, height, thickness); if (template == null) { @@ -154,7 +157,7 @@ public final class DroppedItemInstancer { BatchEligibility.onPartQueued(); return SKIP; } - final long drawsBefore = GLStateManager.drawCalls; + final long drawsBefore = GLSMDraws.drawCalls; if (allowed) { currentGlintProperties.set(maxU, minV, minU, maxV, width, height, thickness); if (glintSeen && glintProperties.equals(currentGlintProperties) && ModelPartBatcher.INSTANCE.replayGlint(glintCapture)) { @@ -211,9 +214,9 @@ public final class DroppedItemInstancer { public static long directBlock(RenderBlocks rb, Block block, int meta, float brightness) { if (itemsDrawingBlocks != 0 || !ModelPartBatcher.INSTANCE.entitiesActive()) return RUN; - if (!BatchEligibility.batchingAllowed()) return GLStateManager.drawCalls; + if (!BatchEligibility.batchingAllowed()) return GLSMDraws.drawCalls; final TesrMaterial material = EntityMaterials.itemFromCurrentState(false); - return material != null ? batchBlock(material, rb, block, meta, brightness) : GLStateManager.drawCalls; + return material != null ? batchBlock(material, rb, block, meta, brightness) : GLSMDraws.drawCalls; } private static long itemBlock(ItemStack stack, RenderBlocks rb, Block block, int meta, float brightness, boolean unfilteredAtlas) { @@ -231,13 +234,13 @@ public final class DroppedItemInstancer { } static long batchBlock(TesrMaterial material, RenderBlocks rb, Block block, int meta, float brightness) { - final long drawsBefore = GLStateManager.drawCalls; + final long drawsBefore = GLSMDraws.drawCalls; if (BatchEligibility.batchingAllowed()) { BlockMesh mesh = lookupBlock(block, meta); if (mesh == null) { mesh = captureBlock(rb, block, meta, brightness); } else if (mesh.template() != null) { - GLStateManager.glColor4f(mesh.red(), mesh.green(), mesh.blue(), mesh.alpha()); + GLSMCurrentAttribs.glColor4f(mesh.red(), mesh.green(), mesh.blue(), mesh.alpha()); } if (mesh.template() == null) { fallback++; @@ -260,7 +263,7 @@ public final class DroppedItemInstancer { public static void endPart(long part) { if (part >= 0L) { - BatchEligibility.onPartFallback(part, GLStateManager.drawCalls); + BatchEligibility.onPartFallback(part, GLSMDraws.drawCalls); } } @@ -317,7 +320,7 @@ public final class DroppedItemInstancer { } final TemplateBuffer template; final AnimationsRenderUtils.SpriteCapture sprites = AnimationsRenderUtils.captureSprites(); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); try { blockBackend.begin(); try { @@ -326,10 +329,10 @@ public final class DroppedItemInstancer { template = blockBackend.end(); } } finally { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); sprites.close(); } - final Color4 color = GLStateManager.getColor(); + final Color4 color = GLSMCurrentAttribs.getColor(); final BlockMesh mesh = new BlockMesh(template, color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha(), sprites); blocks.put(new BlockMeta(block, meta), mesh); return mesh; diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemGlint.java b/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemGlint.java index 0a5dc99c9..2f6b86e61 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemGlint.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemGlint.java @@ -1,6 +1,8 @@ package com.gtnewhorizons.angelica.rendering.items; import com.gtnewhorizons.angelica.config.AngelicaConfig; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.ffp.CombinedGlint; import com.gtnewhorizons.angelica.rendering.GlintClock; @@ -39,8 +41,8 @@ public final class ItemGlint { } public static boolean canResetStencil() { - if (!GLStateManager.getStencilTest().isEnabled()) return true; - final var stencil = GLStateManager.getStencilState(); + if (!GLSMDepthStencilAlpha.getStencilTest().isEnabled()) return true; + final var stencil = GLSMDepthStencilAlpha.getStencilState(); return stencil.getFuncFront() == GL11.GL_ALWAYS && stencil.getFuncBack() == GL11.GL_ALWAYS && stencil.getFailOpFront() == GL11.GL_KEEP && stencil.getFailOpBack() == GL11.GL_KEEP && stencil.getZFailOpFront() == GL11.GL_KEEP && stencil.getZFailOpBack() == GL11.GL_KEEP && stencil.getZPassOpFront() == GL11.GL_KEEP && stencil.getZPassOpBack() == GL11.GL_KEEP; } @@ -53,8 +55,8 @@ public final class ItemGlint { if (!eligible()) return false; final var mc = Minecraft.getMinecraft(); final var texture = mc.getTextureManager().getTexture(TEXTURE); - if (texture == null || texture.getGlTextureId() != GLStateManager.getTextures().getTextureUnitBindings(0).getBinding()) return false; - return firstMatrix().equals(GLStateManager.getTextures().getTextureUnitMatrix(0), 0.000001f) && CombinedGlint.begin(secondMatrix()); + if (texture == null || texture.getGlTextureId() != GLSMTextures.getTextures().getTextureUnitBindings(0).getBinding()) return false; + return firstMatrix().equals(GLSMTextures.getTextures().getTextureUnitMatrix(0), 0.000001f) && CombinedGlint.begin(secondMatrix()); } public static ResourceLocation texture() { diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemRenderListManager.java b/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemRenderListManager.java index a749a5302..08e448085 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemRenderListManager.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/items/ItemRenderListManager.java @@ -33,7 +33,8 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vao.VAOManager; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; @@ -121,19 +122,19 @@ public class ItemRenderListManager { final boolean firstAttach = extVbo == 0; if (firstAttach) { - extVbo = GLStateManager.glGenBuffers(); + extVbo = GLSMBuffers.glGenBuffers(); } - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); ext.position(0).limit(vertexCount * extStride); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); memFree(ext); if (firstAttach) { vertexBuffer.bind(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); ImmediateExtendedAttribHandler.setupExtAttribPointers(0L, extStride); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); vertexBuffer.unbind(); } } @@ -141,10 +142,10 @@ public class ItemRenderListManager { private void detachExtAttribs() { if (extVbo == 0) return; vertexBuffer.bind(); - GLStateManager.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_MID_TEX); - GLStateManager.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_TANGENT); + GLSMVertexInput.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_MID_TEX); + GLSMVertexInput.glDisableVertexAttribArray(ImmediateExtendedAttribHandler.LOC_TANGENT); vertexBuffer.unbind(); - GLStateManager.glDeleteBuffers(extVbo); + GLSMBuffers.glDeleteBuffers(extVbo); extVbo = 0; } @@ -156,7 +157,7 @@ public class ItemRenderListManager { vertexBuffer.delete(); // EBO gets deleted by vertexBuffer.delete() if (extVbo != 0) { - GLStateManager.glDeleteBuffers(extVbo); + GLSMBuffers.glDeleteBuffers(extVbo); extVbo = 0; } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/BopParticleDescriptors.java b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/BopParticleDescriptors.java index 660637aaa..d8d7d81c8 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/BopParticleDescriptors.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/BopParticleDescriptors.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.rendering.particles; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.ITextureObject; @@ -55,10 +55,10 @@ public final class BopParticleDescriptors { final TextureManager manager = Minecraft.getMinecraft().getTextureManager(); ITextureObject texture = manager.getTexture(PIXIE_TRAIL_TEXTURE); if (texture == null) { - final int previous = GLStateManager.getBoundTextureForServerState(); + final int previous = GLSMTextures.getBoundTextureForServerState(); manager.bindTexture(PIXIE_TRAIL_TEXTURE); texture = manager.getTexture(PIXIE_TRAIL_TEXTURE); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previous); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previous); } id = texture == null ? 0 : texture.getGlTextureId(); if (id == 0) LOG.warn("Pixie trail texture {} is unavailable; those particles will not draw", PIXIE_TRAIL_TEXTURE); diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleCaptureTessellator.java b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleCaptureTessellator.java index 39e771140..44fa81d11 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleCaptureTessellator.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleCaptureTessellator.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.rendering.particles; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import net.minecraft.client.renderer.Tessellator; import org.joml.Matrix4fc; import org.lwjgl.opengl.GL11; @@ -141,7 +141,7 @@ public final class ParticleCaptureTessellator extends Tessellator { } boolean overflow = !uvSet || closed || captured == MAX_VERTICES; if (!overflow && captured == 0) { - if (GLStateManager.getModelViewMatrix().equals(layerModelView)) state.sample(); + if (GLSMMatrices.getModelViewMatrix().equals(layerModelView)) state.sample(); else overflow = true; } if (overflow) { diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancer.java index 847ef04ef..3c7899a1e 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancer.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancer.java @@ -2,7 +2,12 @@ package com.gtnewhorizons.angelica.rendering.particles; import com.gtnewhorizons.angelica.rendering.RenderFailures; import com.gtnewhorizons.angelica.client.rendering.DeferredDrawBatcher; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs; import com.gtnewhorizons.angelica.glsm.ffp.Instancing; @@ -105,7 +110,7 @@ public final class ParticleInstancer { if (available()) { layerActive = true; groupCount = 0; - LAYER_MV.set(GLStateManager.getModelViewMatrix()); + LAYER_MV.set(GLSMMatrices.getModelViewMatrix()); } else { deferred = null; DeferredDrawBatcher.enter(); @@ -181,7 +186,7 @@ public final class ParticleInstancer { Throwable failure = null; try { if (groupCount > 0) { - restoreDepth = GLStateManager.pushState(StateSet.BATCH); + restoreDepth = GLSMAttribStack.pushState(StateSet.BATCH); for (int i = 0; i < groupCount; i++) { final Group group = GROUP_POOL.get(i); if (!group.translucent) flush(group); @@ -196,7 +201,7 @@ public final class ParticleInstancer { } finally { if (restoreDepth >= 0) { try { - GLStateManager.popStateTo(restoreDepth); + GLSMAttribStack.popStateTo(restoreDepth); } catch (Throwable t) { failure = RenderFailures.suppress(failure, t); } finally { @@ -304,28 +309,28 @@ public final class ParticleInstancer { if (extHandler != null && extHandler.wantsExtended()) { FfpExtendedAttribs.setNeutralCurrentValues(); } - GLStateManager.glBindVertexArray(ParticleQuadMesh.vao()); + GLSMVertexInput.glBindVertexArray(ParticleQuadMesh.vao()); VAOManager.setCurrentVertexFlags(ParticleQuadMesh.VERTEX_FLAGS); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, ring().bufferId()); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, ring().bufferId()); ParticleInstancedAttribs.pointInstanceAttribs(base); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); try { - if (ffp) GLStateManager.setFfpInstancing(Instancing.PARTICLE); - GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, ParticleQuadMesh.VERTEX_COUNT, count); + if (ffp) GLSMPrograms.setFfpInstancing(Instancing.PARTICLE); + GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, ParticleQuadMesh.VERTEX_COUNT, count); draws++; } finally { - GLStateManager.setFfpInstancing(Instancing.NONE); - GLStateManager.glBindVertexArray(0); + GLSMPrograms.setFfpInstancing(Instancing.NONE); + GLSMVertexInput.glBindVertexArray(0); } } private static void drawInstancesCpu(ParticleRenderState state, ByteBuffer list, int count, boolean listTranslucent) { final Tessellator t = run; - GLStateManager.popStateTo(restoreDepth); + GLSMAttribStack.popStateTo(restoreDepth); GbufferPrograms.setTranslucencyDeclaration(ParticleRunSplitter.currentRunTranslucent()); t.draw(); t.startDrawingQuads(); - restoreDepth = GLStateManager.pushState(StateSet.BATCH); + restoreDepth = GLSMAttribStack.pushState(StateSet.BATCH); GbufferPrograms.setTranslucencyDeclaration(listTranslucent); state.apply(); for (int i = 0; i < count; i++) { diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderState.java b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderState.java index bd8e5ef74..690bb7b95 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderState.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderState.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.rendering.particles; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.states.BlendState; import org.lwjgl.opengl.GL11; @@ -17,14 +20,14 @@ public final class ParticleRenderState { public boolean depthMask; public void sample() { - texture = GLStateManager.getBoundTextureForServerState(); - blend = GLStateManager.isEffectiveBlendEnabled(); - GLStateManager.getEffectiveBlendState(scratch); + texture = GLSMTextures.getBoundTextureForServerState(); + blend = GLSMBlend.isEffectiveBlendEnabled(); + GLSMBlend.getEffectiveBlendState(scratch); blendSrc = scratch.getSrcRgb(); blendDst = scratch.getDstRgb(); blendSrcAlpha = scratch.getSrcAlpha(); blendDstAlpha = scratch.getDstAlpha(); - depthMask = GLStateManager.isEffectiveDepthMaskEnabled(); + depthMask = GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled(); } public void set(ParticleRenderState other) { @@ -42,13 +45,13 @@ public final class ParticleRenderState { } public void apply() { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); if (blend) { - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glBlendFuncSeparate(blendSrc, blendDst, blendSrcAlpha, blendDstAlpha); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMBlend.glBlendFuncSeparate(blendSrc, blendDst, blendSrcAlpha, blendDstAlpha); } else { - GLStateManager.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_BLEND); } - GLStateManager.glDepthMask(depthMask); + GLSMDepthStencilAlpha.glDepthMask(depthMask); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BakedTransformCapture.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BakedTransformCapture.java index 59449f272..f963cfc9e 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BakedTransformCapture.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BakedTransformCapture.java @@ -5,7 +5,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; import com.gtnewhorizon.gtnhlib.client.renderer.cel.api.util.ColorABGR; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; import com.gtnewhorizons.angelica.client.rendering.ModelViewDelta; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import com.gtnewhorizons.angelica.glsm.states.Color4; import net.minecraft.client.renderer.Tessellator; import org.joml.Matrix4f; @@ -53,7 +53,7 @@ public final class BakedTransformCapture extends DirectTessellator { @Override public int draw() { - final Color4 color = GLStateManager.getColor(); + final Color4 color = GLSMCurrentAttribs.getColor(); final int packed = ColorABGR.pack(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); if (!sawRun) { sawRun = true; diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchDrawDefaults.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchDrawDefaults.java index 0055533c6..ec72b3cc3 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchDrawDefaults.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchDrawDefaults.java @@ -1,7 +1,10 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizon.gtnhlib.client.renderer.MatrixHelper; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.hooks.TextureUtilHooks; import net.coderbot.iris.gl.blending.DepthColorStorage; import net.coderbot.iris.gl.program.Program; @@ -22,31 +25,31 @@ public final class BatchDrawDefaults { private boolean overridesCleared; public static void capturePassFramebuffer() { - passFramebuffer = GLStateManager.getDrawFramebuffer(); + passFramebuffer = GLSMFramebuffer.getDrawFramebuffer(); } public static boolean drawsToPassFramebuffer() { return passFramebuffer < 0 || TesrBatchRenderer.deferredPipeline() != null - || GLStateManager.getDrawFramebuffer() == passFramebuffer; + || GLSMFramebuffer.getDrawFramebuffer() == passFramebuffer; } public void apply() { if (passFramebuffer >= 0 && TesrBatchRenderer.deferredPipeline() == null) { - final int framebuffer = GLStateManager.getDrawFramebuffer(); + final int framebuffer = GLSMFramebuffer.getDrawFramebuffer(); if (framebuffer != passFramebuffer) { callerFramebuffer = framebuffer; - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, passFramebuffer); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, passFramebuffer); } } - final int program = GLStateManager.getActiveProgram(); + final int program = GLSMPrograms.getActiveProgram(); if (program != 0 && !Program.isManagedBind(program) && !DepthColorStorage.isOwnedProgram(program)) { callerProgram = program; - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); } - final Matrix4f textureMatrix = GLStateManager.getTextures().getTextureUnitMatrix(0); + final Matrix4f textureMatrix = GLSMTextures.getTextures().getTextureUnitMatrix(0); if (!MatrixHelper.isIdentity(textureMatrix)) { callerTextureMatrix.set(textureMatrix); - GLStateManager.setTextureMatrix(0, IDENTITY); + GLSMMatrices.setTextureMatrix(0, IDENTITY); textureMatrixReset = true; } filterPaused = TextureUtilHooks.pauseTemporaryFilter(); @@ -68,17 +71,17 @@ public final class BatchDrawDefaults { } if (textureMatrixReset) { textureMatrixReset = false; - GLStateManager.setTextureMatrix(0, callerTextureMatrix); + GLSMMatrices.setTextureMatrix(0, callerTextureMatrix); } if (callerProgram != 0) { final int program = callerProgram; callerProgram = 0; - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); } if (callerFramebuffer >= 0) { final int framebuffer = callerFramebuffer; callerFramebuffer = -1; - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, framebuffer); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, framebuffer); } } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateFallback.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateFallback.java index 12d0ae72e..498a11239 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateFallback.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateFallback.java @@ -1,5 +1,8 @@ package com.gtnewhorizons.angelica.rendering.tesr; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard; import org.lwjgl.opengl.GL11; @@ -22,18 +25,18 @@ final class BatchStateFallback { GLStateManager.warnOnce("batch-fallback-entities:" + inside, "Uncaptured state change {} a renderer flushed the entity batch early", inside ? "inside" : "between", new Throwable()); } - final int mode = GLStateManager.getMatrixMode().getMode(); - final int unit = GLStateManager.getActiveTextureUnit(); + final int mode = GLSMMatrices.getMatrixMode().getMode(); + final int unit = GLSMTextures.getActiveTextureUnit(); BatchEligibility.onUncapturedState(); - final long before = GLStateManager.drawCalls; + final long before = GLSMDraws.drawCalls; try { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); models.flushForStateChange(); tesrs.flushForStateChange(); } finally { - GLStateManager.glMatrixMode(mode); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); - BatchEligibility.onBatchFlushed(GLStateManager.drawCalls - before); + GLSMMatrices.glMatrixMode(mode); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); + BatchEligibility.onBatchFlushed(GLSMDraws.drawCalls - before); } } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BeaconBeamMeshes.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BeaconBeamMeshes.java index 5cd6cbcb5..0991d808f 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BeaconBeamMeshes.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/BeaconBeamMeshes.java @@ -3,7 +3,9 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; import com.gtnewhorizons.angelica.api.tesr.TesrMeshBuilder; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.tileentity.TileEntityBeacon; @@ -66,7 +68,7 @@ public final class BeaconBeamMeshes { public static boolean render(TileEntityBeacon beacon, double x, double y, double z, float partialTicks) { final float f1 = beacon.func_146002_i(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f); if (f1 <= 0.0f) { return true; } @@ -75,33 +77,33 @@ public final class BeaconBeamMeshes { } Minecraft.getMinecraft().getTextureManager().bindTexture(BEACON_TEXTURE); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); final float f2 = (float) beacon.getWorldObj().getTotalWorldTime() + partialTicks; final float f3 = -f2 * 0.2f - MathHelper.floor_float(-f2 * 0.1f); final double d3 = f2 * 0.025 * -1.5; - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(0f, f3 - 1f, 0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(0f, f3 - 1f, 0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); try { - GLStateManager.glPushMatrix(); - GLStateManager.glTranslated(x + 0.5, y, z + 0.5); - GLStateManager.glRotatef((float) -Math.toDegrees(d3), 0f, 1f, 0f); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslated(x + 0.5, y, z + 0.5); + GLSMMatrices.glRotatef((float) -Math.toDegrees(d3), 0f, 1f, 0f); AngelicaTesrMeshCache.INSTANCE.renderCached(INNER_KEY, INNER_BUILDER); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); - GLStateManager.glPushMatrix(); - GLStateManager.glTranslated(x + 0.5, y, z + 0.5); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslated(x + 0.5, y, z + 0.5); AngelicaTesrMeshCache.INSTANCE.renderCached(OUTER_KEY, OUTER_BUILDER); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } finally { - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } return true; } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/DrawState.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/DrawState.java index eac5c9f5b..5882c545a 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/DrawState.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/DrawState.java @@ -1,7 +1,12 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.states.PolygonState; import it.unimi.dsi.fastutil.Hash; import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; @@ -105,8 +110,8 @@ public final class DrawState { } public static int liveCull() { - final PolygonState polygon = GLStateManager.getPolygonState(); - final int cull = packCull(GLStateManager.getCullState().isEnabled(), polygon.getCullFaceMode()); + final PolygonState polygon = GLSMRasterizer.getPolygonState(); + final int cull = packCull(GLSMRasterizer.getCullState().isEnabled(), polygon.getCullFaceMode()); return cull != DISABLED && polygon.getFrontFace() == GL11.GL_CW ? cull | FRONT_FACE_CLOCKWISE : cull; } @@ -115,76 +120,76 @@ public final class DrawState { } public static boolean liveLit(TesrMaterial material) { - return GLStateManager.getLightingState().isEnabled() && !material.isUnlit(); + return GLSMLighting.getLightingState().isEnabled() && !material.isUnlit(); } public static boolean liveLightmap() { - return GLStateManager.getTextures().getTextureUnitStates(LIGHTMAP_UNIT).isEnabled(); + return GLSMTextures.getTextures().getTextureUnitStates(LIGHTMAP_UNIT).isEnabled(); } public void apply() { switch (blend) { case TRANSLUCENT -> { - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); } case ADDITIVE -> { - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); } case ADDITIVE_ALPHA -> { - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); } case GLINT -> { - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_COLOR, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_COLOR, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE); } - default -> GLStateManager.disableBlend(); + default -> GLSMBlend.disableBlend(); } - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(depthEqual ? GL11.GL_EQUAL : GL11.GL_LEQUAL); - GLStateManager.glDepthMask(depthWrite); - GLStateManager.glColorMask(colorWrite, colorWrite, colorWrite, colorWrite); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(depthEqual ? GL11.GL_EQUAL : GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(depthWrite); + GLSMBlend.glColorMask(colorWrite, colorWrite, colorWrite, colorWrite); if (alphaCutoff > 0.0f) { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, alphaCutoff); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, alphaCutoff); } else { - GLStateManager.disableAlphaTest(); + GLSMDepthStencilAlpha.disableAlphaTest(); } if (lit) { - GLStateManager.enableLighting(); + GLSMLighting.enableLighting(); } else { - GLStateManager.disableLighting(); + GLSMLighting.disableLighting(); } - GLStateManager.getTextures().getTextureUnitStates(LIGHTMAP_UNIT).setEnabled(lightmap); + GLSMTextures.getTextures().getTextureUnitStates(LIGHTMAP_UNIT).setEnabled(lightmap); switch (cull & CULL_FACE_MASK) { case CULL_BACK -> { - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); } case CULL_FRONT -> { - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_FRONT); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); } case CULL_BOTH -> { - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_FRONT_AND_BACK); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_FRONT_AND_BACK); } - default -> GLStateManager.disableCull(); + default -> GLSMRasterizer.disableCull(); } - GLStateManager.glFrontFace((cull & FRONT_FACE_CLOCKWISE) != 0 ? GL11.GL_CW : GL11.GL_CCW); + GLSMRasterizer.glFrontFace((cull & FRONT_FACE_CLOCKWISE) != 0 ? GL11.GL_CW : GL11.GL_CCW); if (offsetFactor != 0.0f || offsetUnits != 0.0f) { - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(offsetFactor, offsetUnits); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(offsetFactor, offsetUnits); } else { - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(0.0f, 0.0f); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(0.0f, 0.0f); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityMaterials.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityMaterials.java index 2abcdc64c..d01576809 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityMaterials.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityMaterials.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.states.AlphaState; import com.gtnewhorizons.angelica.glsm.states.BlendState; @@ -45,26 +48,26 @@ public final class EntityMaterials { static TesrMaterial fromCurrentState(boolean texIdentity) { GLStateManager.requireExitDrawState(true); - final boolean textured = GLStateManager.getTextures().getTextureUnitStates(0).isEnabled(); - final AlphaState alpha = GLStateManager.getEffectiveAlphaState(effectiveAlpha); - final ColorMask colorMask = GLStateManager.getEffectiveColorMask(effectiveColorMask); + final boolean textured = GLSMTextures.getTextures().getTextureUnitStates(0).isEnabled(); + final AlphaState alpha = GLSMDepthStencilAlpha.getEffectiveAlphaState(effectiveAlpha); + final ColorMask colorMask = GLSMBlend.getEffectiveColorMask(effectiveColorMask); if (!colorMask.red && !colorMask.green && !colorMask.blue && !colorMask.alpha) { - return depthOnlyFromState(textured, GLStateManager.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(), - GLStateManager.getDepthState().getFunc(), GLStateManager.isEffectiveDepthMaskEnabled()); + return depthOnlyFromState(textured, GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(), + GLSMDepthStencilAlpha.getDepthState().getFunc(), GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled()); } - final BlendState blend = GLStateManager.getEffectiveBlendState(effectiveBlend); - return fromState(textured, textured && !texIdentity, GLStateManager.isEffectiveBlendEnabled(), blend.getSrcRgb(), blend.getDstRgb(), - GLStateManager.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(), GLStateManager.getDepthState().getFunc(), - GLStateManager.isEffectiveDepthMaskEnabled()); + final BlendState blend = GLSMBlend.getEffectiveBlendState(effectiveBlend); + return fromState(textured, textured && !texIdentity, GLSMBlend.isEffectiveBlendEnabled(), blend.getSrcRgb(), blend.getDstRgb(), + GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(), GLSMDepthStencilAlpha.getDepthState().getFunc(), + GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled()); } public static TesrMaterial itemFromCurrentState(boolean unfilteredAtlas) { GLStateManager.requireExitDrawState(true); - final BlendState blend = GLStateManager.getEffectiveBlendState(effectiveBlend); - final AlphaState alpha = GLStateManager.getEffectiveAlphaState(effectiveAlpha); - return itemFromState(unfilteredAtlas, GLStateManager.isEffectiveBlendEnabled(), blend.getSrcRgb(), blend.getDstRgb(), - GLStateManager.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(), GLStateManager.getDepthState().getFunc(), - GLStateManager.isEffectiveDepthMaskEnabled()); + final BlendState blend = GLSMBlend.getEffectiveBlendState(effectiveBlend); + final AlphaState alpha = GLSMDepthStencilAlpha.getEffectiveAlphaState(effectiveAlpha); + return itemFromState(unfilteredAtlas, GLSMBlend.isEffectiveBlendEnabled(), blend.getSrcRgb(), blend.getDstRgb(), + GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled(), alpha.getFunction(), alpha.getReference(), GLSMDepthStencilAlpha.getDepthState().getFunc(), + GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled()); } static TesrMaterial itemFromState(boolean unfilteredAtlas, boolean blend, int srcRgb, int dstRgb, boolean alphaTest, int alphaFunc, float alphaRef, int depthFunc, boolean depthMask) { diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowBatcher.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowBatcher.java index 572a4cef2..796d1e419 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowBatcher.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowBatcher.java @@ -2,7 +2,11 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizon.gtnhlib.client.renderer.cel.util.ModelQuadUtil; import com.gtnewhorizons.angelica.compat.mojang.RenderLayer; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig; import com.gtnewhorizons.angelica.shadercompat.ShaderGlint; import net.coderbot.batchedentityrendering.impl.AngelicaBufferSource; @@ -103,10 +107,10 @@ final class EntityShadowBatcher { } } - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDepthMask(true); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMDepthStencilAlpha.glDepthMask(true); return true; } @@ -136,10 +140,10 @@ final class EntityShadowBatcher { } private int currentMvIndex() { - final int mvGen = GLStateManager.getMvGeneration(); + final int mvGen = GLSMMatrices.getMvGeneration(); if (mvCount > 0 && mvGen == lastMvGeneration) return mvCount - 1; lastMvGeneration = mvGen; - mvScratch.set(GLStateManager.getModelViewMatrix()); + mvScratch.set(GLSMMatrices.getModelViewMatrix()); if (mvCount > 0 && mvs[mvCount - 1].equals(mvScratch)) return mvCount - 1; if (mvCount == mvs.length) mvs = Arrays.copyOf(mvs, mvs.length * 2); Matrix4f slot = mvs[mvCount]; diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplay.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplay.java index d909ce4b7..7ba1f01d7 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplay.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplay.java @@ -5,6 +5,9 @@ import com.gtnewhorizons.angelica.compat.mojang.RenderLayer; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.config.SystemProperties; import com.gtnewhorizons.angelica.glsm.ExitState; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.rendering.DeferredEntityOverlay; @@ -94,7 +97,7 @@ public final class EntityShadowReplay { static void beginPass(boolean shadow, int renderPass) { if (shadow) { resetRecords(); - shadowInverse.set(GLStateManager.getModelViewMatrix()).invert(); + shadowInverse.set(GLSMMatrices.getModelViewMatrix()).invert(); shadowViewValid = shadowInverse.isFinite(); shadowX = RenderManager.renderPosX; shadowY = RenderManager.renderPosY; @@ -104,7 +107,7 @@ public final class EntityShadowReplay { } else { mainReady = shadowAvailable && renderPass == 0; if (mainReady) { - mainFromShadow.set(GLStateManager.getModelViewMatrix()).translate( + mainFromShadow.set(GLSMMatrices.getModelViewMatrix()).translate( (float) (shadowX - RenderManager.renderPosX), (float) (shadowY - RenderManager.renderPosY), (float) (shadowZ - RenderManager.renderPosZ)).mul(shadowInverse); } @@ -135,7 +138,7 @@ public final class EntityShadowReplay { recording = record; record.capturingState = true; GLStateManager.beginExitCapture(record.exitState); - drawsAtStart = GLStateManager.drawCalls; + drawsAtStart = GLSMDraws.drawCalls; return true; } @@ -145,7 +148,7 @@ public final class EntityShadowReplay { recording.capturingState = false; if (!GLStateManager.finishExitCapture(recording.exitState)) reject(Rejection.EXIT_STATE_UNSUPPORTED); } - if (GLStateManager.drawCalls != drawsAtStart) reject(Rejection.FOREIGN_DRAW); + if (GLSMDraws.drawCalls != drawsAtStart) reject(Rejection.FOREIGN_DRAW); if (recording.renderer == null) reject(Rejection.UNSAFE_RENDERER); if (!completed) reject(Rejection.RENDER_FAILED); if (recording.entity instanceof IBossDisplayData && (!recording.hasBossStatus || bossStatusChanged())) { @@ -215,7 +218,7 @@ public final class EntityShadowReplay { else if (record.partialTicks != partialTicks) reason = Rejection.PARTIAL_TICKS_CHANGED; else if (shadowYaw != RenderManager.instance.playerViewY || shadowPitch != RenderManager.instance.playerViewX) reason = Rejection.VIEW_CHANGED; else if (!GLStateManager.canApplyExitState(record.exitState)) reason = Rejection.ENTRY_STATE_CHANGED; - else if (GLStateManager.getPolygonState().getOffsetClamp() != 0) reason = Rejection.UNCAPTURED_STATE; + else if (GLSMRasterizer.getPolygonState().getOffsetClamp() != 0) reason = Rejection.UNCAPTURED_STATE; } if (reason == null) { reason = commands.validate(record.start, record.end); @@ -274,7 +277,7 @@ public final class EntityShadowReplay { } private static boolean captureInheritedState(DrawInputs inputs) { - if (GLStateManager.getPolygonState().getOffsetClamp() != 0) reject(Rejection.UNCAPTURED_STATE); + if (GLSMRasterizer.getPolygonState().getOffsetClamp() != 0) reject(Rejection.UNCAPTURED_STATE); if (!isRecording()) return false; final int offsetWrites = GLStateManager.getExitPolygonOffsetWrites(); inputs.inheritedOffsetEnable = (offsetWrites & ExitState.POLYGON_OFFSET_ENABLE_WRITTEN) == 0; diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlas.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlas.java index 2a5190e6c..a6b4ace55 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlas.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlas.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.rendering.tesr; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard; import com.gtnewhorizons.angelica.glsm.texture.TextureInfo; import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache; @@ -246,20 +249,20 @@ public final class EntityTextureAtlas { private Page newPage() { if (pages.size() == MAX_PAGES) return null; - final int previous = GLStateManager.getBoundTextureForServerState(); + final int previous = GLSMTextures.getBoundTextureForServerState(); final int texture; BatchStateGuard.suspend(); try { - texture = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, PAGE_SIZE, PAGE_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + texture = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 0); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, PAGE_SIZE, PAGE_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previous); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previous); BatchStateGuard.resume(); } final ResourceLocation location = new ResourceLocation("angelica", "entity_atlas_" + pages.size()); @@ -270,22 +273,22 @@ public final class EntityTextureAtlas { } private void copy(int texture, Slot slot) { - final int previousRead = GLStateManager.getReadFramebuffer(); - final int previousDraw = GLStateManager.getDrawFramebuffer(); - final boolean scissor = GLStateManager.getScissorTest().isEnabled(); + final int previousRead = GLSMFramebuffer.getReadFramebuffer(); + final int previousDraw = GLSMFramebuffer.getDrawFramebuffer(); + final boolean scissor = GLSMRasterizer.getScissorTest().isEnabled(); BatchStateGuard.suspend(); try { if (readFbo == 0) { - readFbo = GLStateManager.glGenFramebuffers(); - drawFbo = GLStateManager.glGenFramebuffers(); + readFbo = GLSMFramebuffer.glGenFramebuffers(); + drawFbo = GLSMFramebuffer.glGenFramebuffers(); } - if (scissor) GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo); - GLStateManager.attachTextureForReading(GL30.GL_COLOR_ATTACHMENT0, texture); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo); + if (scissor) GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, readFbo); + GLSMFramebuffer.attachTextureForReading(GL30.GL_COLOR_ATTACHMENT0, texture); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, drawFbo); assert slot.page != null; if (drawFboPage != slot.page.texture) { - GLStateManager.glFramebufferTexture2D(GL30.GL_DRAW_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, slot.page.texture, 0); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_DRAW_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, slot.page.texture, 0); drawFboPage = slot.page.texture; } final int w = slot.width, h = slot.height, x = slot.x + 1, y = slot.y + 1; @@ -295,16 +298,16 @@ public final class EntityTextureAtlas { for (int col = 0; col < 3; col++) blit(fromX[col], fromY[row], widths[col], heights[row], toX[col], toY[row]); } } finally { - GLStateManager.attachTextureForReading(GL30.GL_COLOR_ATTACHMENT0, 0); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, previousRead); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, previousDraw); - if (scissor) GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); + GLSMFramebuffer.attachTextureForReading(GL30.GL_COLOR_ATTACHMENT0, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, previousRead); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, previousDraw); + if (scissor) GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); BatchStateGuard.resume(); } } private static void blit(int srcX, int srcY, int width, int height, int dstX, int dstY) { - GLStateManager.glBlitFramebuffer(srcX, srcY, srcX + width, srcY + height, dstX, dstY, dstX + width, dstY + height, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + GLSMFramebuffer.glBlitFramebuffer(srcX, srcY, srcX + width, srcY + height, dstX, dstY, dstX + width, dstY + height, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); } public void clear() { @@ -320,11 +323,11 @@ public final class EntityTextureAtlas { void freePages() { if (pages.isEmpty() && readFbo == 0) return; clear(); - for (Page page : pages) GLStateManager.glDeleteTextures(page.texture); + for (Page page : pages) GLSMTextures.glDeleteTextures(page.texture); pages.clear(); if (readFbo != 0) { - GLStateManager.glDeleteFramebuffers(readFbo); - GLStateManager.glDeleteFramebuffers(drawFbo); + GLSMFramebuffer.glDeleteFramebuffers(readFbo); + GLSMFramebuffer.glDeleteFramebuffers(drawFbo); readFbo = 0; drawFbo = 0; } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/GlintCapture.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/GlintCapture.java index 767532b9e..68427e949 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/GlintCapture.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/GlintCapture.java @@ -1,6 +1,11 @@ package com.gtnewhorizons.angelica.rendering.tesr; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.ffp.FragmentKey; import com.gtnewhorizons.angelica.glsm.hooks.GLSMConfig; import com.gtnewhorizons.angelica.glsm.states.BlendState; @@ -57,15 +62,15 @@ public final class GlintCapture { boolean begin(RetainedTesrGroups groups) { if (!open(groups)) return false; - parent.set(GLStateManager.getModelViewMatrix()); - texture = GLStateManager.getBoundTextureForServerState(); + parent.set(GLSMMatrices.getModelViewMatrix()); + texture = GLSMTextures.getBoundTextureForServerState(); color = currentColor(); light = GLSMConfig.packedLastBrightness(); fragmentLength = FragmentKey.packFromState(fragment); - GLStateManager.getEffectiveBlendState(blend); - blendEnabled = GLStateManager.isEffectiveBlendEnabled(); - depthMask = GLStateManager.isEffectiveDepthMaskEnabled(); - depthFunc = GLStateManager.getDepthState().getFunc(); + GLSMBlend.getEffectiveBlendState(blend); + blendEnabled = GLSMBlend.isEffectiveBlendEnabled(); + depthMask = GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled(); + depthFunc = GLSMDepthStencilAlpha.getDepthState().getFunc(); return true; } @@ -74,7 +79,7 @@ public final class GlintCapture { */ boolean beginBase(RetainedTesrGroups groups, int overlay) { if (!open(groups)) return false; - parent.set(GLStateManager.getModelViewMatrix()); + parent.set(GLSMMatrices.getModelViewMatrix()); light = GLSMConfig.packedLastBrightness(); this.overlay = overlay; base = true; @@ -98,7 +103,7 @@ public final class GlintCapture { owner = groups; pass = groups.captureVersion(); groups.glintCapture = this; - draws = GLStateManager.drawCalls; + draws = GLSMDraws.drawCalls; valid = true; uniformLight = true; return true; @@ -148,24 +153,24 @@ public final class GlintCapture { private void close(boolean poseRestored) { if (owner == null || owner.glintCapture != this) return; owner.glintCapture = null; - valid &= GLStateManager.drawCalls == draws && used > 0; + valid &= GLSMDraws.drawCalls == draws && used > 0; this.poseRestored = poseRestored; - restoredGeneration = GLStateManager.getMvGeneration(); + restoredGeneration = GLSMMatrices.getMvGeneration(); if (replayStart >= 0) replayEnd = EntityShadowReplay.splitCommands(); } private boolean sameParentPose() { - return poseRestored && restoredGeneration == GLStateManager.getMvGeneration() || parent.equals(GLStateManager.getModelViewMatrix()); + return poseRestored && restoredGeneration == GLSMMatrices.getMvGeneration() || parent.equals(GLSMMatrices.getModelViewMatrix()); } boolean replay(RetainedTesrGroups groups) { - return replay(groups, GLStateManager.getTextures().getTextureUnitMatrix(0)); + return replay(groups, GLSMTextures.getTextures().getTextureUnitMatrix(0)); } boolean replay(RetainedTesrGroups groups, Matrix4f textureMatrix) { - if (base || !valid || owner != groups || pass != groups.captureVersion() || groups.glintCapture != null || GLStateManager.drawCalls != draws) return false; - if (!trusted && (blendEnabled != GLStateManager.isEffectiveBlendEnabled() || depthMask != GLStateManager.isEffectiveDepthMaskEnabled() || depthFunc != GLStateManager.getDepthState().getFunc() - || !blend.sameAs(GLStateManager.getEffectiveBlendState(scratchBlend)) || !sameParentPose() || texture != GLStateManager.getBoundTextureForServerState() || color != currentColor() || light != GLSMConfig.packedLastBrightness() + if (base || !valid || owner != groups || pass != groups.captureVersion() || groups.glintCapture != null || GLSMDraws.drawCalls != draws) return false; + if (!trusted && (blendEnabled != GLSMBlend.isEffectiveBlendEnabled() || depthMask != GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled() || depthFunc != GLSMDepthStencilAlpha.getDepthState().getFunc() + || !blend.sameAs(GLSMBlend.getEffectiveBlendState(scratchBlend)) || !sameParentPose() || texture != GLSMTextures.getBoundTextureForServerState() || color != currentColor() || light != GLSMConfig.packedLastBrightness() || fragmentLength != FragmentKey.packFromState(scratch) || !Arrays.equals(fragment, 0, fragmentLength, scratch, 0, fragmentLength))) return false; for (int i = 0; i < used; i++) { final Range range = ranges.get(i); @@ -225,7 +230,7 @@ public final class GlintCapture { } private static int currentColor() { - final var c = GLStateManager.getColor(); + final var c = GLSMCurrentAttribs.getColor(); return AngelicaBufferSource.packAbgr(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/InstancedTemplateRenderer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/InstancedTemplateRenderer.java index 7c19cfebe..f0aa07230 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/InstancedTemplateRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/InstancedTemplateRenderer.java @@ -1,7 +1,11 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFlags; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; import com.gtnewhorizons.angelica.glsm.ffp.CubeInstancedAttribs; @@ -112,7 +116,7 @@ final class InstancedTemplateRenderer { int draws = 0; long recordOffset = ringBase; neutralizeExtendedAttribs(); - GLStateManager.setFfpInstancing(Instancing.TEMPLATE); + GLSMPrograms.setFfpInstancing(Instancing.TEMPLATE); for (int b = 0, n = liveBuckets.size(); b < n; b++) { final Bucket bucket = liveBuckets.get(b); final TemplateMesh mesh = bucket.mesh; @@ -122,16 +126,16 @@ final class InstancedTemplateRenderer { } bindRingTo(mesh.vao, TEMPLATE_FLAGS); InstancedAttribs.pointTemplate(recordOffset); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDrawArraysInstanced(mesh.drawMode, 0, mesh.vertexCount, bucket.indices.size()); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMDraws.glDrawArraysInstanced(mesh.drawMode, 0, mesh.vertexCount, bucket.indices.size()); draws++; recordOffset += (long) bucket.indices.size() * InstancedAttribs.STRIDE; bucket.indices.clear(); bucket.mesh = null; bucketPool.add(bucket); } - GLStateManager.setFfpInstancing(Instancing.NONE); - GLStateManager.glBindVertexArray(0); + GLSMPrograms.setFfpInstancing(Instancing.NONE); + GLSMVertexInput.glBindVertexArray(0); liveBuckets.clear(); return draws; } @@ -142,26 +146,26 @@ final class InstancedTemplateRenderer { int redrawTemplates(TexRun base, int colorABGR) { long recordOffset = base.uploadOffset; neutralizeExtendedAttribs(); - GLStateManager.setFfpInstancing(Instancing.TEMPLATE); + GLSMPrograms.setFfpInstancing(Instancing.TEMPLATE); for (int b = 0, n = base.uploadMeshes.size(); b < n; b++) { final TemplateMesh mesh = (TemplateMesh) base.uploadMeshes.get(b); final int count = base.uploadCounts.getInt(b); bindRingTo(mesh.vao, TEMPLATE_FLAGS); InstancedAttribs.pointTemplate(recordOffset); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); setConstantColor(colorABGR); - GLStateManager.glDrawArraysInstanced(mesh.drawMode, 0, mesh.vertexCount, count); - GLStateManager.glEnableVertexAttribArray(InstancedAttribs.LOC_COLOR); + GLSMDraws.glDrawArraysInstanced(mesh.drawMode, 0, mesh.vertexCount, count); + GLSMVertexInput.glEnableVertexAttribArray(InstancedAttribs.LOC_COLOR); recordOffset += (long) count * InstancedAttribs.STRIDE; } - GLStateManager.setFfpInstancing(Instancing.NONE); - GLStateManager.glBindVertexArray(0); + GLSMPrograms.setFfpInstancing(Instancing.NONE); + GLSMVertexInput.glBindVertexArray(0); return base.uploadMeshes.size(); } private static void setConstantColor(int colorABGR) { - GLStateManager.glDisableVertexAttribArray(InstancedAttribs.LOC_COLOR); - GLStateManager.glVertexAttrib4f(InstancedAttribs.LOC_COLOR, (colorABGR & 0xFF) / 255.0f, (colorABGR >>> 8 & 0xFF) / 255.0f, (colorABGR >>> 16 & 0xFF) / 255.0f, (colorABGR >>> 24) / 255.0f); + GLSMVertexInput.glDisableVertexAttribArray(InstancedAttribs.LOC_COLOR); + GLSMCurrentAttribs.glVertexAttrib4f(InstancedAttribs.LOC_COLOR, (colorABGR & 0xFF) / 255.0f, (colorABGR >>> 8 & 0xFF) / 255.0f, (colorABGR >>> 16 & 0xFF) / 255.0f, (colorABGR >>> 24) / 255.0f); } /** Returns the ring offset of the uploaded instances, for {@link #redrawCubes}. */ @@ -195,11 +199,11 @@ final class InstancedTemplateRenderer { neutralizeExtendedAttribs(); bindRingTo(UnitCubeMesh.vao(), UnitCubeMesh.VERTEX_FLAGS); CubeInstancedAttribs.pointInstanceAttribs(ringBase); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.setFfpInstancing(Instancing.CUBE); - GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, run.instances); - GLStateManager.setFfpInstancing(Instancing.NONE); - GLStateManager.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMPrograms.setFfpInstancing(Instancing.CUBE); + GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, run.instances); + GLSMPrograms.setFfpInstancing(Instancing.NONE); + GLSMVertexInput.glBindVertexArray(0); return ringBase; } @@ -219,13 +223,13 @@ final class InstancedTemplateRenderer { neutralizeExtendedAttribs(); bindRingTo(UnitCubeMesh.vao(), UnitCubeMesh.VERTEX_FLAGS); CubeInstancedAttribs.pointInstanceAttribs(offset); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); setConstantColor(colorABGR); - GLStateManager.setFfpInstancing(Instancing.CUBE); - GLStateManager.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, instances); - GLStateManager.setFfpInstancing(Instancing.NONE); - GLStateManager.glEnableVertexAttribArray(InstancedAttribs.LOC_COLOR); - GLStateManager.glBindVertexArray(0); + GLSMPrograms.setFfpInstancing(Instancing.CUBE); + GLSMDraws.glDrawArraysInstanced(GL11.GL_QUADS, 0, UnitCubeMesh.VERTEX_COUNT, instances); + GLSMPrograms.setFfpInstancing(Instancing.NONE); + GLSMVertexInput.glEnableVertexAttribArray(InstancedAttribs.LOC_COLOR); + GLSMVertexInput.glBindVertexArray(0); } private long uploadStaging(long base, long end, int stride) { @@ -237,9 +241,9 @@ final class InstancedTemplateRenderer { } private void bindRingTo(int vao, int vertexFlags) { - GLStateManager.glBindVertexArray(vao); + GLSMVertexInput.glBindVertexArray(vao); VAOManager.setCurrentVertexFlags(vertexFlags); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, ring.bufferId()); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, ring.bufferId()); } private static void neutralizeExtendedAttribs() { @@ -263,32 +267,32 @@ final class InstancedTemplateRenderer { final TemplateMesh mesh = new TemplateMesh(); mesh.vertexCount = template.vertexCount; mesh.drawMode = template.drawMode; - mesh.vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(mesh.vao); - mesh.vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, mesh.vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, template.data, GL15.GL_STATIC_DRAW); + mesh.vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(mesh.vao); + mesh.vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, mesh.vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, template.data, GL15.GL_STATIC_DRAW); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, 0L); - GLStateManager.glEnableVertexAttribArray(1); - GLStateManager.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, TEMPLATE_STRIDE, COLOR_INDEX * 4L); - GLStateManager.glEnableVertexAttribArray(2); - GLStateManager.glVertexAttribPointer(2, 2, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, TEX_X_INDEX * 4L); - GLStateManager.glEnableVertexAttribArray(4); - GLStateManager.glVertexAttribPointer(4, 3, GL11.GL_BYTE, true, TEMPLATE_STRIDE, NORMAL_INDEX * 4L); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, 0L); + GLSMVertexInput.glEnableVertexAttribArray(1); + GLSMVertexInput.glVertexAttribPointer(1, 4, GL11.GL_UNSIGNED_BYTE, true, TEMPLATE_STRIDE, COLOR_INDEX * 4L); + GLSMVertexInput.glEnableVertexAttribArray(2); + GLSMVertexInput.glVertexAttribPointer(2, 2, GL11.GL_FLOAT, false, TEMPLATE_STRIDE, TEX_X_INDEX * 4L); + GLSMVertexInput.glEnableVertexAttribArray(4); + GLSMVertexInput.glVertexAttribPointer(4, 3, GL11.GL_BYTE, true, TEMPLATE_STRIDE, NORMAL_INDEX * 4L); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); mesh.extVbo = buildExt(template); if (mesh.extVbo != 0) { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, mesh.extVbo); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, mesh.extVbo); ImmediateExtendedAttribHandler.setupExtAttribPointers(0L, ImmediateExtendedAttribHandler.EXT_STRIDE); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } InstancedAttribs.enableHeadArrays(); VAOManager.setCurrentVertexFlags(TEMPLATE_FLAGS); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); return mesh; } @@ -303,10 +307,10 @@ final class InstancedTemplateRenderer { handler.build(template.data, template.vertexCount, extPrim, ImmediateExtendedAttribHandler.RAW_NORMAL_INDEX, memAddress0(ext), extStride); - final int extVbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); + final int extVbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, extVbo); ext.position(0).limit(template.vertexCount * extStride); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, ext, GL15.GL_STATIC_DRAW); memFree(ext); return extVbo; } @@ -347,9 +351,9 @@ final class InstancedTemplateRenderer { } private static void delete(TemplateMesh mesh) { - GLStateManager.glDeleteBuffers(mesh.vbo); - if (mesh.extVbo != 0) GLStateManager.glDeleteBuffers(mesh.extVbo); - GLStateManager.glDeleteVertexArrays(mesh.vao); + GLSMBuffers.glDeleteBuffers(mesh.vbo); + if (mesh.extVbo != 0) GLSMBuffers.glDeleteBuffers(mesh.extVbo); + GLSMVertexInput.glDeleteVertexArrays(mesh.vao); } int meshCount() { diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/MeshBuffer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/MeshBuffer.java index d1a01641e..5088c1d1b 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/MeshBuffer.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/MeshBuffer.java @@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import org.lwjgl.BufferUtils; import java.nio.ByteBuffer; @@ -35,9 +35,9 @@ public final class MeshBuffer { public void bind() { if (vao == 0) { - vao = GLStateManager.glGenVertexArrays(); + vao = GLSMVertexInput.glGenVertexArrays(); } - GLStateManager.glBindVertexArray(vao); + GLSMVertexInput.glBindVertexArray(vao); vbo.setupState(); } @@ -47,7 +47,7 @@ public final class MeshBuffer { public void unbind() { vbo.cleanupState(); - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); } public void render() { @@ -62,7 +62,7 @@ public final class MeshBuffer { vbo = null; } if (vao != 0) { - GLStateManager.glDeleteVertexArrays(vao); + GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/ModelPartBatcher.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/ModelPartBatcher.java index 8c86c7c56..37f7755e5 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/ModelPartBatcher.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/ModelPartBatcher.java @@ -9,6 +9,16 @@ import com.gtnewhorizons.angelica.client.font.BatchingFontRenderer; import com.gtnewhorizons.angelica.compat.mojang.RenderLayer; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.DisplayListManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard; @@ -243,13 +253,13 @@ public final class ModelPartBatcher { int id, glintSlot; void capture() { - id = GLStateManager.getBoundTextureForServerState(0); + id = GLSMTextures.getBoundTextureForServerState(0); location = id == lastBoundGlId ? lastBoundLocation : null; glintSlot = id == lastBoundGlId ? lastBoundGlintSlot : ShaderGlint.NO_TINT; } void apply() { - if (GLStateManager.getBoundTextureForServerState(0) != id) return; + if (GLSMTextures.getBoundTextureForServerState(0) != id) return; lastBoundLocation = location; lastBoundGlId = id; lastBoundGlintSlot = glintSlot; @@ -374,15 +384,15 @@ public final class ModelPartBatcher { if (Tracy.ENABLED) Tracy.beginZone(Z_ENTITY_DEFERRED); try { final EntityRenderer entityRenderer = Minecraft.getMinecraft().entityRenderer; - final int deferredDepth = GLStateManager.pushState(StateSet.BATCH); + final int deferredDepth = GLSMAttribStack.pushState(StateSet.BATCH); try { - GLStateManager.glDepthMask(true); - GLStateManager.enableDepthTest(); - GLStateManager.enableBlend(); - GLStateManager.defaultBlendFunc(); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMBlend.enableBlend(); + GLSMBlend.defaultBlendFunc(); entityRenderer.enableLightmap(0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); final boolean wrap = Iris.enabled && GbufferPrograms.getCurrentPhase() == WorldRenderingPhase.NONE; if (wrap) GbufferPrograms.beginEntities(); try { @@ -394,7 +404,7 @@ public final class ModelPartBatcher { entityRenderer.disableLightmap(0); } } finally { - GLStateManager.popStateTo(deferredDepth); + GLSMAttribStack.popStateTo(deferredDepth); } } finally { if (Tracy.ENABLED) Tracy.endZone(); @@ -450,22 +460,22 @@ public final class ModelPartBatcher { } private boolean passProgramBound() { - return GLStateManager.getActiveProgram() == (shaderPipeline != null ? shaderPipeline.getActivePassProgramId() : 0); + return GLSMPrograms.getActiveProgram() == (shaderPipeline != null ? shaderPipeline.getActivePassProgramId() : 0); } public boolean replayGlint(GlintCapture capture) { - return replayGlint(capture, GLStateManager.getTextures().getTextureUnitMatrix(0)); + return replayGlint(capture, GLSMTextures.getTextures().getTextureUnitMatrix(0)); } public boolean queueSecondArmorGlint(GlintCapture capture) { - final Matrix4f second = GlintClock.secondArmorMatrix(GLStateManager.getTextures().getTextureUnitMatrix(0)); + final Matrix4f second = GlintClock.secondArmorMatrix(GLSMTextures.getTextures().getTextureUnitMatrix(0)); if (second == null || !replayGlint(capture, second)) return false; armorLoopSkips++; return true; } private boolean replayGlint(GlintCapture capture, Matrix4f textureMatrix) { - if (!active || shaderPipeline != null || shadow || !BatchEligibility.batchingAllowed() || GLStateManager.getActiveProgram() != 0 || GLStateManager.isRecordingDisplayList()) return false; + if (!active || shaderPipeline != null || shadow || !BatchEligibility.batchingAllowed() || GLSMPrograms.getActiveProgram() != 0 || GLStateManager.isRecordingDisplayList()) return false; if (!capture.replay(activeGroups, textureMatrix)) return false; glintPassReuses++; BatchEligibility.onPartQueued(); @@ -511,7 +521,7 @@ public final class ModelPartBatcher { } public boolean queueSkippedArmorGlint(GlintCapture base, ResourceLocation glintTexture) { - if (cannotQueueOrRecordGlint() || GLStateManager.getActiveTextureUnit() != 0 || !GLStateManager.getTextures().getTextureUnitStates(0).isEnabled()) return false; + if (cannotQueueOrRecordGlint() || GLSMTextures.getActiveTextureUnit() != 0 || !GLSMTextures.getTextures().getTextureUnitStates(0).isEnabled()) return false; if (!(shadow ? base.recordBothLayers(this, activeGroups, glintTexture) : base.queueBothLayers(this, activeGroups, glintTexture))) return false; if (!shadow) { armorBaseReuses++; @@ -523,7 +533,7 @@ public final class ModelPartBatcher { } public boolean queueSkippedItemGlint(TemplateBuffer template, TesrMaterial material) { - if (cannotQueueOrRecordGlint() || GLStateManager.getActiveTextureUnit() != 0 || !activeGroups.canCopyInstances(material) || !MatrixHelper.isIdentity(GLStateManager.getTextures().getTextureUnitMatrix(0))) return false; + if (cannotQueueOrRecordGlint() || GLSMTextures.getActiveTextureUnit() != 0 || !activeGroups.canCopyInstances(material) || !MatrixHelper.isIdentity(GLSMTextures.getTextures().getTextureUnitMatrix(0))) return false; final EntityRenderCommands.DrawInputs inputs = glintInputs(ItemGlint.texture(), material, ShaderGlint.NO_TINT, false); if (shadow) { if (material == EntityMaterials.ITEM_GLINT && !ItemGlint.canResetStencil()) return false; @@ -553,15 +563,15 @@ public final class ModelPartBatcher { private EntityRenderCommands.DrawInputs liveInputs(ResourceLocation texture, int textureId, TesrMaterial material, PassOverride pass, int glintSlot, int cull, boolean lit, boolean lightmap, boolean afterGlint) { - final PolygonState polygon = GLStateManager.getPolygonState(); - return drawInputs.set(texture, textureId, material, pass, GLStateManager.getPolygonOffsetFillState().isEnabled(), + final PolygonState polygon = GLSMRasterizer.getPolygonState(); + return drawInputs.set(texture, textureId, material, pass, GLSMRasterizer.getPolygonOffsetFillState().isEnabled(), polygon.getOffsetFactor(), polygon.getOffsetUnits(), glintSlot, cull, lit, lightmap, afterGlint); } private Matrix4f currentModelView() { - final int mvGen = GLStateManager.getMvGeneration(); + final int mvGen = GLSMMatrices.getMvGeneration(); if (!mvCaptured || mvGen != lastMvGeneration) { - modelView.set(GLStateManager.getModelViewMatrix()); + modelView.set(GLSMMatrices.getModelViewMatrix()); lastMvGeneration = mvGen; mvCaptured = true; } @@ -574,13 +584,13 @@ public final class ModelPartBatcher { int currentOverlay() { return shaderPipeline != null ? AngelicaBufferSource.packEntityColor(CapturedRenderingState.INSTANCE.getCurrentEntityColor()) - : AngelicaBufferSource.packAbgr(GLStateManager.getOverlayR(), GLStateManager.getOverlayG(), GLStateManager.getOverlayB(), GLStateManager.getOverlayA()); + : AngelicaBufferSource.packAbgr(GLSMCurrentAttribs.getOverlayR(), GLSMCurrentAttribs.getOverlayG(), GLSMCurrentAttribs.getOverlayB(), GLSMCurrentAttribs.getOverlayA()); } boolean prepareArmorGlint() { - if (GLStateManager.getBoundTextureForServerState() != lastBoundGlId || lastBoundLocation == null) return false; - final Color4 color = GLStateManager.getColor(); - setArmorGlint(lastBoundLocation, lastBoundGlintSlot, DrawState.liveLit(EntityMaterials.GLINT), GLStateManager.getTextures().getTextureUnitMatrix(0), + if (GLSMTextures.getBoundTextureForServerState() != lastBoundGlId || lastBoundLocation == null) return false; + final Color4 color = GLSMCurrentAttribs.getColor(); + setArmorGlint(lastBoundLocation, lastBoundGlintSlot, DrawState.liveLit(EntityMaterials.GLINT), GLSMTextures.getTextures().getTextureUnitMatrix(0), AngelicaBufferSource.packAbgr(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha())); return true; } @@ -683,7 +693,7 @@ public final class ModelPartBatcher { bail(BailReason.INACTIVE); return false; } - if (shaderPipeline != null && GLStateManager.getActiveProgram() != shaderPipeline.getActivePassProgramId()) { + if (shaderPipeline != null && GLSMPrograms.getActiveProgram() != shaderPipeline.getActivePassProgramId()) { bail(BailReason.FOREIGN_PROGRAM); return false; } @@ -700,7 +710,7 @@ public final class ModelPartBatcher { if (material == EntityMaterials.OVERLAY) { texture = null; } else { - if (GLStateManager.getBoundTextureForServerState() != lastBoundGlId) { + if (GLSMTextures.getBoundTextureForServerState() != lastBoundGlId) { bail(BailReason.TEXTURE); return false; } @@ -726,7 +736,7 @@ public final class ModelPartBatcher { final RenderLayer layer = layerFor(atlasSlot != null ? Objects.requireNonNull(atlasSlot.page).location : texture, inputs); // Entities nested inside a TESR (mob spawner, OpenBlocks trophy) run in the block entity pass but carry an entity id final int entityId = groupId(shaderPipeline != null, mode == Mode.ENTITIES || pass.isEntityPhase(), CapturedRenderingState.INSTANCE.getCurrentRenderedEntity(), CapturedRenderingState.INSTANCE.getCurrentRenderedBlockEntity()); - final Color4 color = GLStateManager.getColor(); + final Color4 color = GLSMCurrentAttribs.getColor(); final int colorABGR = AngelicaBufferSource.packAbgr(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); final int overlayABGR = currentOverlay(); final long entityInfo = currentEntityInfo(CapturedRenderingState.INSTANCE.getCurrentRenderedItem()); @@ -753,8 +763,8 @@ public final class ModelPartBatcher { void beginReplay(Matrix4fc mainFromShadow) { replayTransform = mainFromShadow; - final PolygonState polygon = GLStateManager.getPolygonState(); - replayOffsetEnabled = GLStateManager.getPolygonOffsetFillState().isEnabled(); + final PolygonState polygon = GLSMRasterizer.getPolygonState(); + replayOffsetEnabled = GLSMRasterizer.getPolygonOffsetFillState().isEnabled(); replayOffsetFactor = polygon.getOffsetFactor(); replayOffsetUnits = polygon.getOffsetUnits(); } @@ -848,11 +858,11 @@ public final class ModelPartBatcher { return result; } case DRAW_NOW_EXPECTED -> { - BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls); + BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls); try { return TessellatorStreamingDrawer.draw(tess); } finally { - BatchEligibility.endExpectedDraws(GLStateManager.drawCalls); + BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls); } } default -> { @@ -870,11 +880,11 @@ public final class ModelPartBatcher { if (!entityFire && (mode != Mode.BLOCK_ENTITIES || !BatchEligibility.insideRenderer())) return TessellatorRoute.DRAW_NOW; if (!tess.isDrawing || tess.drawMode != GL11.GL_QUADS || tess.vertexCount == 0 || (tess.vertexCount & 3) != 0) return TessellatorRoute.DRAW_NOW; if (shaderPipeline != null && TessellatorEntityIds.hasIdChanges(tess)) return TessellatorRoute.DRAW_NOW; - if (DisplayListManager.isRecording() || !GLStateManager.getDepthTest().isEnabled() || !unitTexIdentity()) return TessellatorRoute.DRAW_NOW; + if (DisplayListManager.isRecording() || !GLSMDepthStencilAlpha.getDepthTest().isEnabled() || !unitTexIdentity()) return TessellatorRoute.DRAW_NOW; if (!passProgramBound()) return TessellatorRoute.DRAW_NOW; final TesrMaterial material = EntityMaterials.fromCurrentState(true); if (material == null || material == EntityMaterials.OVERLAY) return TessellatorRoute.DRAW_NOW; - if (lastBoundLocation == null || GLStateManager.getBoundTextureForServerState() != lastBoundGlId) return TessellatorRoute.DRAW_NOW; + if (lastBoundLocation == null || GLSMTextures.getBoundTextureForServerState() != lastBoundGlId) return TessellatorRoute.DRAW_NOW; if (!entityFire && !BatchEligibility.batchingAllowed()) return TessellatorRoute.DRAW_NOW_EXPECTED; GLStateManager.requireExitDrawState(false); @@ -901,13 +911,13 @@ public final class ModelPartBatcher { private void logMaterialBail() { final Class cls = TesrAttribution.currentRenderable; if (cls == null || !loggedMaterialBails.add(cls)) return; - final boolean textured = GLStateManager.getTextures().getTextureUnitStates(0).isEnabled(); - final BlendState blendState = GLStateManager.getEffectiveBlendState(bailBlend); - final AlphaState alphaState = GLStateManager.getEffectiveAlphaState(bailAlpha); + final boolean textured = GLSMTextures.getTextures().getTextureUnitStates(0).isEnabled(); + final BlendState blendState = GLSMBlend.getEffectiveBlendState(bailBlend); + final AlphaState alphaState = GLSMDepthStencilAlpha.getEffectiveAlphaState(bailAlpha); AngelicaMod.LOGGER.info("TESR MATERIAL bail: cls={} shadow={} textured={} texAnimated={} blend={} src={} dst={} alphaTest={} alphaFunc={} alphaRef={} depthFunc={} depthMask={}", - cls.getName(), shadow, textured, textured && !unitTexIdentity(), GLStateManager.isEffectiveBlendEnabled(), blendState.getSrcRgb(), - blendState.getDstRgb(), GLStateManager.isEffectiveAlphaTestEnabled(), alphaState.getFunction(), alphaState.getReference(), - GLStateManager.getDepthState().getFunc(), GLStateManager.isEffectiveDepthMaskEnabled()); + cls.getName(), shadow, textured, textured && !unitTexIdentity(), GLSMBlend.isEffectiveBlendEnabled(), blendState.getSrcRgb(), + blendState.getDstRgb(), GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled(), alphaState.getFunction(), alphaState.getReference(), + GLSMDepthStencilAlpha.getDepthState().getFunc(), GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled()); } static int groupId(boolean piped, boolean entityPhase, int entityId, int blockEntityId) { @@ -916,9 +926,9 @@ public final class ModelPartBatcher { } private boolean unitTexIdentity() { - final int generation = GLStateManager.getTexMatrixGeneration(); + final int generation = GLSMMatrices.getTexMatrixGeneration(); if (!texCaptured || generation != texGeneration) { - final Matrix4f unitMatrix = GLStateManager.getTextures().getTextureUnitMatrix(0); + final Matrix4f unitMatrix = GLSMTextures.getTextures().getTextureUnitMatrix(0); texIdentity = MatrixHelper.isIdentity(unitMatrix); if (!texIdentity) texMatrixScratch.set(unitMatrix); texGeneration = generation; @@ -928,7 +938,7 @@ public final class ModelPartBatcher { } private static boolean isDepthEqualDecalState() { - return GLStateManager.getDepthState().getFunc() == GL11.GL_EQUAL && !GLStateManager.isEffectiveDepthMaskEnabled(); + return GLSMDepthStencilAlpha.getDepthState().getFunc() == GL11.GL_EQUAL && !GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled(); } private PartTemplate templateFor(ModelRenderer part, float scale, ModelPartMeshBuilder builder) { diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/PassRebindGate.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/PassRebindGate.java index 56afd0218..05f8e637e 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/PassRebindGate.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/PassRebindGate.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.rendering.tesr; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import net.coderbot.iris.Iris; import net.coderbot.iris.pipeline.WorldRenderingPipeline; @@ -13,15 +14,15 @@ public final class PassRebindGate { public static void rebindIfDirty() { if (!Iris.enabled) return; - if (GLStateManager.getProgramGeneration() == lastProgramGen - && GLStateManager.getDrawFramebufferGeneration() == lastFbGen) { + if (GLSMPrograms.getProgramGeneration() == lastProgramGen + && GLSMFramebuffer.getDrawFramebufferGeneration() == lastFbGen) { return; } final WorldRenderingPipeline pipeline = Iris.getPipelineManager().getPipelineNullable(); if (pipeline != null) { pipeline.rebindCurrentPass(); } - lastProgramGen = GLStateManager.getProgramGeneration(); - lastFbGen = GLStateManager.getDrawFramebufferGeneration(); + lastProgramGen = GLSMPrograms.getProgramGeneration(); + lastFbGen = GLSMFramebuffer.getDrawFramebufferGeneration(); } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroups.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroups.java index 4497acf8c..91d6ed1fd 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroups.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroups.java @@ -3,6 +3,13 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.VertexFormat; import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; import com.gtnewhorizons.angelica.compat.mojang.RenderLayer; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs; import com.gtnewhorizons.angelica.glsm.ffp.CubeParams; @@ -1322,7 +1329,7 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook { final Group group = list.get(i); if (!live(group) || !queuedInstanced(group)) continue; if (group.templateColumns.hasInstances()) { - final boolean fixedFunction = deferred == null && GLStateManager.getActiveProgram() == 0; + final boolean fixedFunction = deferred == null && GLSMPrograms.getActiveProgram() == 0; drawTemplateRuns(group.templateColumns, group.material.special().isGlint() && fixedFunction, group.material == EntityMaterials.ITEM_GLINT); } if (!cubeAvailable && group.cubeColumns.hasInstances() && !group.cubeColumns.anyAtlasSlot) { @@ -1438,13 +1445,13 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook { applyTexMatrix(run); final boolean combined = combineGlint && r + 1 < n && combineRuns(cols, run, cols.runs.get(r + 1)); if (itemStencil) { - GLStateManager.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.glStencilMask(1); - GLStateManager.glClearStencil(0); - GLStateManager.glClear(GL11.GL_STENCIL_BUFFER_BIT); - GLStateManager.glStencilFunc(GL11.GL_EQUAL, 0, 1); - GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_INCR); + GLSMAttribStack.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.glStencilMask(1); + GLSMDepthStencilAlpha.glClearStencil(0); + GLSMFramebuffer.glClear(GL11.GL_STENCIL_BUFFER_BIT); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 0, 1); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_INCR); } try { if (canRedraw(run)) { @@ -1456,7 +1463,7 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook { } instancedInstances += run.parts; } finally { - if (itemStencil) GLStateManager.glPopAttrib(); + if (itemStencil) GLSMAttribStack.glPopAttrib(); if (combined) CombinedGlint.end(); } if (combined) r++; @@ -1509,16 +1516,16 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook { if (run.identity && !texApplied) return; if (!texApplied) { texApplied = true; - savedTexMatrix.set(GLStateManager.getTextures().getTextureUnitMatrix(0)); + savedTexMatrix.set(GLSMTextures.getTextures().getTextureUnitMatrix(0)); } - GLStateManager.setTextureMatrix(0, run.identity ? IDENTITY : run.matrix); + GLSMMatrices.setTextureMatrix(0, run.identity ? IDENTITY : run.matrix); if (!run.identity) texMatrixRuns++; } private void restoreTexMatrix() { if (!texApplied) return; texApplied = false; - GLStateManager.setTextureMatrix(0, savedTexMatrix); + GLSMMatrices.setTextureMatrix(0, savedTexMatrix); } private static final Matrix4f IDENTITY = new Matrix4f(); @@ -1537,7 +1544,7 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook { private void drawInstancesCpu(Group group, InstanceColumns cols) { saveMV(); - GLStateManager.setModelViewMatrix(IDENTITY); + GLSMMatrices.setModelViewMatrix(IDENTITY); final VertexFormat format = group.layer.getVertexFormat(); for (int r = 0, rn = cols.runs.size(); r < rn; r++) { final TexRun head = cols.runs.get(r); @@ -1744,21 +1751,21 @@ final class RetainedTesrGroups implements AngelicaBufferSource.LayerDrawHook { AngelicaBufferSource.setEntityColor(group.entityColor); drawMV.set(baseMV).translate((float) (group.anchor.x - camX), (float) (group.anchor.y - camY), (float) (group.anchor.z - camZ)); saveMV(); - GLStateManager.setModelViewMatrix(drawMV); + GLSMMatrices.setModelViewMatrix(drawMV); group.mesh.render(); } private void saveMV() { if (!mvSaved) { mvSaved = true; - savedMV.set(GLStateManager.getModelViewMatrix()); + savedMV.set(GLSMMatrices.getModelViewMatrix()); } } private void restoreMV() { if (mvSaved) { mvSaved = false; - GLStateManager.setModelViewMatrix(savedMV); + GLSMMatrices.setModelViewMatrix(savedMV); } } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrBatchRenderer.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrBatchRenderer.java index 55f0ed221..1da183b8b 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrBatchRenderer.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrBatchRenderer.java @@ -7,7 +7,14 @@ import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; import com.gtnewhorizons.angelica.api.tesr.TesrShader; import com.gtnewhorizons.angelica.client.font.BatchingFontRenderer; import com.gtnewhorizons.angelica.compat.mojang.RenderLayer; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs; @@ -183,12 +190,12 @@ public final class TesrBatchRenderer { } public void queue(TemplateBuffer template, ResourceLocation texture, TesrMaterial material) { - modelView.set(GLStateManager.getModelViewMatrix()); + modelView.set(GLSMMatrices.getModelViewMatrix()); final int packedLight = currentPackedLight(material); final int colorABGR = resolveColor(material); if (activePass >= 0) { - final boolean offset = GLStateManager.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL); - final PolygonState polygon = GLStateManager.getPolygonState(); + final boolean offset = GLSMEnable.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL); + final PolygonState polygon = GLSMRasterizer.getPolygonState(); final PassOverride pass = PassOverride.capture(); final int cullCode = DrawState.liveCull(material); final boolean lit = DrawState.liveLit(material); @@ -206,7 +213,7 @@ public final class TesrBatchRenderer { } private static Matrix4f captureTextureMatrix() { - final Matrix4f texMatrix = GLStateManager.getTextures().getTextureUnitMatrix(0); + final Matrix4f texMatrix = GLSMTextures.getTextures().getTextureUnitMatrix(0); return MatrixHelper.isIdentity(texMatrix) ? null : texMatrix; } @@ -367,7 +374,7 @@ public final class TesrBatchRenderer { if (material.hasColor()) { return AngelicaBufferSource.packAbgr(material.colorRed(), material.colorGreen(), material.colorBlue(), material.colorAlpha()); } - final Color4 color = GLStateManager.getColor(); + final Color4 color = GLSMCurrentAttribs.getColor(); return AngelicaBufferSource.packAbgr(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); } @@ -437,15 +444,15 @@ public final class TesrBatchRenderer { if (Tracy.ENABLED) Tracy.beginZone(Z_TESR_DEFERRED); try { final EntityRenderer entityRenderer = Minecraft.getMinecraft().entityRenderer; - final int deferredDepth = GLStateManager.pushState(StateSet.BATCH); + final int deferredDepth = GLSMAttribStack.pushState(StateSet.BATCH); try { - GLStateManager.glDepthMask(true); - GLStateManager.enableDepthTest(); - GLStateManager.enableBlend(); - GLStateManager.defaultBlendFunc(); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMBlend.enableBlend(); + GLSMBlend.defaultBlendFunc(); entityRenderer.enableLightmap(0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); final boolean wrap = Iris.enabled && GbufferPrograms.getCurrentPhase() == WorldRenderingPhase.NONE; boolean blockEntitiesBegun = false; if (wrap) { @@ -461,7 +468,7 @@ public final class TesrBatchRenderer { entityRenderer.disableLightmap(0); } } finally { - GLStateManager.popStateTo(deferredDepth); + GLSMAttribStack.popStateTo(deferredDepth); } } finally { if (Tracy.ENABLED) Tracy.endZone(); @@ -594,9 +601,9 @@ public final class TesrBatchRenderer { immediateScratch.position((int) (end - addr)); immediateScratch.flip(); final RenderLayer layer = noPassLayerFor(texture, material); - final int d = GLStateManager.pushState(StateSet.BATCH); + final int d = GLSMAttribStack.pushState(StateSet.BATCH); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); boolean layerStarted = false; Throwable failure = null; try { @@ -617,7 +624,7 @@ public final class TesrBatchRenderer { } if (failure != null) RenderFailures.rethrow(failure); } finally { - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); } } } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrProviderDispatch.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrProviderDispatch.java index d761889f4..ce1631bb5 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrProviderDispatch.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrProviderDispatch.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizons.angelica.api.tesr.TesrMeshProvider; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import net.coderbot.iris.uniforms.CapturedRenderingState; import net.minecraft.tileentity.TileEntity; @@ -26,12 +26,12 @@ public final class TesrProviderDispatch { CapturedRenderingState.INSTANCE.pushCurrentBlockEntity(); CapturedRenderingState.INSTANCE.setCurrentBlockEntity(te == null ? null : te.getBlockType(), blockMetadata(te)); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); try { provider.angelica$transform(te, x, y, z); AngelicaTesrMeshCache.INSTANCE.renderCached(key, provider.angelica$meshDirty(te), provider, te); } finally { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); CapturedRenderingState.INSTANCE.popCurrentBlockEntity(); } return true; diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderPrograms.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderPrograms.java index 219e15722..a6c8b0d34 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderPrograms.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderPrograms.java @@ -3,6 +3,8 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; import com.gtnewhorizons.angelica.api.tesr.TesrShader; import com.gtnewhorizons.angelica.api.tesr.TesrShaderUniforms; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; @@ -103,7 +105,7 @@ public final class TesrShaderPrograms { } if (entry.programBound) { entry.programBound = false; - GLStateManager.glUseProgram(entry.savedProgram); + GLSMPrograms.glUseProgram(entry.savedProgram); } } @@ -119,7 +121,7 @@ public final class TesrShaderPrograms { } private static void reset(Variant variant) { - if (variant.program != 0) GLStateManager.glDeleteProgram(variant.program); + if (variant.program != 0) GLSMPrograms.glDeleteProgram(variant.program); variant.program = 0; variant.state = UNKNOWN; } @@ -132,12 +134,12 @@ public final class TesrShaderPrograms { } if (!entry.programBound) { entry.programBound = true; - entry.savedProgram = GLStateManager.getActiveProgram(); + entry.savedProgram = GLSMPrograms.getActiveProgram(); } - GLStateManager.glUseProgram(variant.program); + GLSMPrograms.glUseProgram(variant.program); if (entry.wantsLightmap && !entry.lightmapBound) { entry.lightmapBound = true; - entry.savedLightmapBinding = GLStateManager.getBoundTextureForServerState(DrawState.LIGHTMAP_UNIT); + entry.savedLightmapBinding = GLSMTextures.getBoundTextureForServerState(DrawState.LIGHTMAP_UNIT); bindLightmapUnit(((EntityRendererAccessor) Minecraft.getMinecraft().entityRenderer).getLightmapTexture().getGlTextureId()); } final TesrShaderUniforms uniforms = entry.shader.uniforms(); @@ -146,10 +148,10 @@ public final class TesrShaderPrograms { } private static void bindLightmapUnit(int texture) { - final int active = GLStateManager.getActiveTextureUnit(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + DrawState.LIGHTMAP_UNIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + active); + final int active = GLSMTextures.getActiveTextureUnit(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + DrawState.LIGHTMAP_UNIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + active); } private static void ensureLinked(Entry entry) { @@ -190,23 +192,23 @@ public final class TesrShaderPrograms { if (vertex == 0) return; fragment = compile(entry, variant, GL20.GL_FRAGMENT_SHADER, TesrShaderPrelude.fragment() + TesrShaderPrelude.stripVersion(name, fragmentBody)); if (fragment == 0) return; - program = GLStateManager.glCreateProgram(); - GLStateManager.glAttachShader(program, vertex); - GLStateManager.glAttachShader(program, fragment); - GLStateManager.glLinkProgram(program); - if (GLStateManager.glGetProgrami(program, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) { - fail(entry, variant, "failed to link", GLStateManager.glGetProgramInfoLog(program)); + program = GLSMPrograms.glCreateProgram(); + GLSMPrograms.glAttachShader(program, vertex); + GLSMPrograms.glAttachShader(program, fragment); + GLSMPrograms.glLinkProgram(program); + if (GLSMPrograms.glGetProgrami(program, GL20.GL_LINK_STATUS) != GL11.GL_TRUE) { + fail(entry, variant, "failed to link", GLSMPrograms.glGetProgramInfoLog(program)); return; } - final int previous = GLStateManager.getActiveProgram(); - GLStateManager.glUseProgram(program); + final int previous = GLSMPrograms.getActiveProgram(); + GLSMPrograms.glUseProgram(program); try { setSampler(program, TesrShaderPrelude.LAYER_SAMPLER, 0); setSampler(program, TesrShaderPrelude.LIGHTMAP_SAMPLER, DrawState.LIGHTMAP_UNIT); final TesrShaderUniforms uniforms = entry.shader.uniforms(); if (uniforms != null) uniforms.angelica$linked(program, instanced); } finally { - GLStateManager.glUseProgram(previous); + GLSMPrograms.glUseProgram(previous); } variant.program = program; variant.state = READY; @@ -215,25 +217,25 @@ public final class TesrShaderPrograms { } catch (RuntimeException e) { fail(entry, variant, "failed to build", e.toString()); } finally { - if (vertex != 0) GLStateManager.glDeleteShader(vertex); - if (fragment != 0) GLStateManager.glDeleteShader(fragment); - if (program != 0) GLStateManager.glDeleteProgram(program); + if (vertex != 0) GLSMPrograms.glDeleteShader(vertex); + if (fragment != 0) GLSMPrograms.glDeleteShader(fragment); + if (program != 0) GLSMPrograms.glDeleteProgram(program); } } private static int compile(Entry entry, Variant variant, int type, String source) { - final int shader = GLStateManager.glCreateShader(type); - GLStateManager.glShaderSource(shader, source); - GLStateManager.glCompileShader(shader); - if (GLStateManager.glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == GL11.GL_TRUE) return shader; - fail(entry, variant, type == GL20.GL_VERTEX_SHADER ? "vertex stage failed to compile" : "fragment stage failed to compile", GLStateManager.glGetShaderInfoLog(shader)); - GLStateManager.glDeleteShader(shader); + final int shader = GLSMPrograms.glCreateShader(type); + GLSMPrograms.glShaderSource(shader, source); + GLSMPrograms.glCompileShader(shader); + if (GLSMPrograms.glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == GL11.GL_TRUE) return shader; + fail(entry, variant, type == GL20.GL_VERTEX_SHADER ? "vertex stage failed to compile" : "fragment stage failed to compile", GLSMPrograms.glGetShaderInfoLog(shader)); + GLSMPrograms.glDeleteShader(shader); return 0; } private static void setSampler(int program, String name, int unit) { - final int location = GLStateManager.glGetUniformLocation(program, name); - if (location >= 0) GLStateManager.glUniform1i(location, unit); + final int location = GLSMPrograms.glGetUniformLocation(program, name); + if (location >= 0) GLSMPrograms.glUniform1i(location, unit); } private static void fail(Entry entry, Variant variant, String what, String detail) { diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaModelMeshes.java b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaModelMeshes.java index 9635fc887..ae41d0a7e 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaModelMeshes.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaModelMeshes.java @@ -4,7 +4,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; import com.gtnewhorizons.angelica.api.tesr.TesrMeshBuilder; import com.gtnewhorizons.angelica.api.tesr.TesrMeshSink; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import net.minecraft.client.model.ModelChest; @@ -67,12 +67,12 @@ public final class VanillaModelMeshes { } private static void renderRotatedPart(Object key, ResourceLocation texture, ModelRenderer part, float angleX) { - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(part.offsetX + part.rotationPointX * MODEL_SCALE, part.offsetY + part.rotationPointY * MODEL_SCALE, part.offsetZ + part.rotationPointZ * MODEL_SCALE); - GLStateManager.glRotatef(angleX * (180f / (float) Math.PI), 1.0f, 0.0f, 0.0f); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(part.offsetX + part.rotationPointX * MODEL_SCALE, part.offsetY + part.rotationPointY * MODEL_SCALE, part.offsetZ + part.rotationPointZ * MODEL_SCALE); + GLSMMatrices.glRotatef(angleX * (180f / (float) Math.PI), 1.0f, 0.0f, 0.0f); BUILDER.setLocal(texture, MODEL_SCALE, part); AngelicaTesrMeshCache.INSTANCE.renderCached(key, BUILDER); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } public static void renderSign(ModelSign model) { @@ -86,16 +86,16 @@ public final class VanillaModelMeshes { return false; } final Object key = SKULL_KEYS.computeIfAbsent(model, m -> new Object2ObjectOpenHashMap<>()).computeIfAbsent(texture, t -> new Object()); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); if (yawDegrees != 0.0f) { - GLStateManager.glRotatef(yawDegrees, 0.0f, 1.0f, 0.0f); + GLSMMatrices.glRotatef(yawDegrees, 0.0f, 1.0f, 0.0f); } if (pitchDegrees != 0.0f) { - GLStateManager.glRotatef(pitchDegrees, 1.0f, 0.0f, 0.0f); + GLSMMatrices.glRotatef(pitchDegrees, 1.0f, 0.0f, 0.0f); } BUILDER.set(texture, scale, model.skeletonHead, null, null); AngelicaTesrMeshCache.INSTANCE.renderCached(key, BUILDER); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); return true; } diff --git a/src/main/java/com/gtnewhorizons/angelica/rendering/voxelization/SdlShadowVoxelizationSink.java b/src/main/java/com/gtnewhorizons/angelica/rendering/voxelization/SdlShadowVoxelizationSink.java index 5808923a0..f0d48acc9 100644 --- a/src/main/java/com/gtnewhorizons/angelica/rendering/voxelization/SdlShadowVoxelizationSink.java +++ b/src/main/java/com/gtnewhorizons/angelica/rendering/voxelization/SdlShadowVoxelizationSink.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.rendering.voxelization; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.glsm.backend.RenderBackend; @@ -81,15 +81,15 @@ public final class SdlShadowVoxelizationSink implements ShadowVoxelizer.Sink { private void upload() { final ByteBuffer data = table.entries(); final int bytes = data.remaining(); - if (rangesBuf == 0) rangesBuf = GLStateManager.glGenBuffers(); + if (rangesBuf == 0) rangesBuf = GLSMBuffers.glGenBuffers(); RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, RANGES_BINDING, rangesBuf); if (rangesCapacityBytes < bytes) { long cap = Math.max(rangesCapacityBytes, 4096L); while (cap < bytes) cap <<= 1; rangesCapacityBytes = cap; - GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, rangesCapacityBytes, GL15.GL_STREAM_DRAW); + GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, rangesCapacityBytes, GL15.GL_STREAM_DRAW); } - GLStateManager.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, data); + GLSMBuffers.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, data); } public void discard() { @@ -98,7 +98,7 @@ public final class SdlShadowVoxelizationSink implements ShadowVoxelizer.Sink { public void delete() { if (rangesBuf != 0) { - GLStateManager.glDeleteBuffers(rangesBuf); + GLSMBuffers.glDeleteBuffers(rangesBuf); rangesBuf = 0; rangesCapacityBytes = 0; } diff --git a/src/main/java/com/gtnewhorizons/angelica/shadercompat/ShaderGlint.java b/src/main/java/com/gtnewhorizons/angelica/shadercompat/ShaderGlint.java index 01d5d91ec..be11c18c1 100644 --- a/src/main/java/com/gtnewhorizons/angelica/shadercompat/ShaderGlint.java +++ b/src/main/java/com/gtnewhorizons/angelica/shadercompat/ShaderGlint.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.shadercompat; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; import com.gtnewhorizons.angelica.glsm.hooks.GlintColorHandler; import com.gtnewhorizons.angelica.iris.IrisDisplayListState; @@ -72,7 +73,7 @@ public final class ShaderGlint { injecting = false; // Save the texture bound before the glint section so endGlint can put it back if we swap - prevTexture = GLStateManager.getBoundTextureForServerState(0); + prevTexture = GLSMTextures.getBoundTextureForServerState(0); // Observe vertex-color changes for the rest of the glint section GLSMHooks.glintColorHandler = COLOR_HANDLER; @@ -85,7 +86,7 @@ public final class ShaderGlint { GLSMHooks.glintColorHandler = null; if (swapped) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, prevTexture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, prevTexture); ModelPartBatcher.onTextureSwap(prevTexture, NO_TINT); } swapped = false; @@ -100,8 +101,8 @@ public final class ShaderGlint { final int texture = slotTextures[slot]; injecting = true; - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, alpha); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, alpha); injecting = false; swapped = true; ModelPartBatcher.onTextureSwap(texture, slot); @@ -110,7 +111,7 @@ public final class ShaderGlint { public static void invalidate() { for (int i = 0; i < slotTextures.length; i++) { if (slotTextures[i] != 0) { - GLStateManager.glDeleteTextures(slotTextures[i]); + GLSMTextures.glDeleteTextures(slotTextures[i]); slotTextures[i] = 0; } } @@ -129,8 +130,8 @@ public final class ShaderGlint { } if (!IrisApi.getInstance().isShaderPackInUse()) return; final ITextureObject mask = Minecraft.getMinecraft().getTextureManager().getTexture(GLINT_MASK); - if (mask == null || GLStateManager.getBoundTextureForServerState() != mask.getGlTextureId()) return; - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, slotTextures[slot]); + if (mask == null || GLSMTextures.getBoundTextureForServerState() != mask.getGlTextureId()) return; + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, slotTextures[slot]); } private static int tintSlot(float r, float g, float b) { @@ -148,7 +149,7 @@ public final class ShaderGlint { final int slot; if (colorToSlot.size() >= TINT_SLOTS) { slot = colorToSlot.remove(colorToSlot.firstIntKey()); - GLStateManager.glDeleteTextures(slotTextures[slot]); + GLSMTextures.glDeleteTextures(slotTextures[slot]); } else { slot = colorToSlot.size(); } @@ -168,14 +169,14 @@ public final class ShaderGlint { } pixels.flip(); - final int texture = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); + final int texture = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); // Match the vanilla glint texture - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, maskW, maskH, 0, + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, maskW, maskH, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); return texture; } diff --git a/src/main/java/com/gtnewhorizons/angelica/textures/atlas/AtlasAssembler.java b/src/main/java/com/gtnewhorizons/angelica/textures/atlas/AtlasAssembler.java index a8c2ede33..341482b14 100644 --- a/src/main/java/com/gtnewhorizons/angelica/textures/atlas/AtlasAssembler.java +++ b/src/main/java/com/gtnewhorizons/angelica/textures/atlas/AtlasAssembler.java @@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.textures.atlas; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.texture.TextureStaging; import com.gtnewhorizons.angelica.glsm.threading.AngelicaWorkers; import com.gtnewhorizons.angelica.rendering.celeritas.SpriteExtension; @@ -89,7 +89,7 @@ public final class AtlasAssembler { discard(previous); discard(current); } finally { - GLStateManager.trimTextureStaging(); + GLSMTextures.trimTextureStaging(); } final TextureAtlasSprite last = sprites.getLast(); @@ -170,7 +170,7 @@ public final class AtlasAssembler { final int rows = (y1 >> l) - ly0; final int lw = atlasWidth >> l; if (rows <= 0 || lw <= 0) continue; - final TextureStaging staging = GLStateManager.beginTextureStaging(l, 0, ly0, lw, rows); + final TextureStaging staging = GLSMTextures.beginTextureStaging(l, 0, ly0, lw, rows); if (staging == null) { abandon(band, 0); return null; @@ -237,7 +237,7 @@ public final class AtlasAssembler { band.stagings[l] = null; boolean committed = false; try { - committed = GLStateManager.commitTextureStaging(staging); + committed = GLSMTextures.commitTextureStaging(staging); } finally { if (!committed) abandon(band, l + 1); } @@ -260,7 +260,7 @@ public final class AtlasAssembler { final TextureStaging staging = band.stagings[l]; if (staging == null) continue; band.stagings[l] = null; - GLStateManager.abandonTextureStaging(staging); + GLSMTextures.abandonTextureStaging(staging); } } diff --git a/src/main/java/com/prupe/mcpatcher/cc/ColorizeBlock.java b/src/main/java/com/prupe/mcpatcher/cc/ColorizeBlock.java index 726c342f5..241ce23d2 100644 --- a/src/main/java/com/prupe/mcpatcher/cc/ColorizeBlock.java +++ b/src/main/java/com/prupe/mcpatcher/cc/ColorizeBlock.java @@ -16,7 +16,7 @@ import net.minecraft.init.Blocks; import net.minecraft.util.ResourceLocation; import net.minecraft.world.IBlockAccess; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import com.prupe.mcpatcher.MCLogger; import com.prupe.mcpatcher.MCPatcherUtils; @@ -414,7 +414,7 @@ public class ColorizeBlock { waterColor = new float[3]; ColorUtils.intToFloat3(waterColorMap.getColorMultiplier(), waterColor); } - GLStateManager.glColor4f(waterColor[0], waterColor[1], waterColor[2], 1.0f); + GLSMCurrentAttribs.glColor4f(waterColor[0], waterColor[1], waterColor[2], 1.0f); } } diff --git a/src/main/java/com/prupe/mcpatcher/cit/Enchantment.java b/src/main/java/com/prupe/mcpatcher/cit/Enchantment.java index e26a2f0b1..3729be646 100644 --- a/src/main/java/com/prupe/mcpatcher/cit/Enchantment.java +++ b/src/main/java/com/prupe/mcpatcher/cit/Enchantment.java @@ -9,7 +9,12 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import com.prupe.mcpatcher.mal.resource.BlendMethod; import com.prupe.mcpatcher.mal.resource.PropertiesFile; import com.prupe.mcpatcher.mal.resource.TexturePackAPI; @@ -34,45 +39,45 @@ final class Enchantment extends OverrideBase { private float armorScaleY; static void beginOuter2D() { - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.01f); - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); - GLStateManager.glDepthMask(false); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.01f); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); } static void endOuter2D() { - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } static void beginOuter3D() { - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.01f); - GLStateManager.glEnable(GL11.GL_BLEND); - lightingWasEnabled = GLStateManager.glGetBoolean(GL11.GL_LIGHTING); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF); - GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.01f); + GLSMEnable.glEnable(GL11.GL_BLEND); + lightingWasEnabled = GLSMQueries.glGetBoolean(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 1, 0xFF); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); } static void endOuter3D() { - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); if (lightingWasEnabled) { - GLStateManager.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_LIGHTING); } - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } Enchantment(PropertiesFile properties) { @@ -144,15 +149,15 @@ final class Enchantment extends OverrideBase { begin(intensity); // Depth pre-pass - GLStateManager.glColorMask(false, false, false, false); - GLStateManager.glDepthMask(true); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMBlend.glColorMask(false, false, false, false); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); ItemRenderer.renderItemIn2D(Tessellator.instance, 1.0f, 0.0f, 0.0f, 1.0f, width, height, ITEM_2D_THICKNESS); // Color pass - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.glDepthMask(false); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); + GLSMBlend.glColorMask(true, true, true, true); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); ItemRenderer.renderItemIn2D(Tessellator.instance, 1.0f, 0.0f, 0.0f, 1.0f, width, height, ITEM_2D_THICKNESS); end(); } @@ -176,46 +181,46 @@ final class Enchantment extends OverrideBase { } void beginArmor(float intensity) { - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); - GLStateManager.glDepthMask(false); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); begin(intensity); if (!armorScaleSet) { setArmorScale(); } - GLStateManager.glScalef(armorScaleX, armorScaleY, 1.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glScalef(armorScaleX, armorScaleY, 1.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } void endArmor() { - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); end(); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } void begin(float intensity) { blendMethod.applyBlending(); blendMethod.applyDepthFunc(); blendMethod.applyFade(intensity); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); if (speed != 0.0) { double offset = ((double) System.currentTimeMillis() * speed) / 3000.0; offset -= Math.floor(offset); - GLStateManager.glTranslatef((float) offset * 8.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef((float) offset * 8.0f, 0.0f, 0.0f); } - GLStateManager.glRotatef(rotation, 0.0f, 0.0f, 1.0f); + GLSMMatrices.glRotatef(rotation, 0.0f, 0.0f, 1.0f); } void end() { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } private void setArmorScale() { diff --git a/src/main/java/com/prupe/mcpatcher/hd/CustomAnimation.java b/src/main/java/com/prupe/mcpatcher/hd/CustomAnimation.java index a68a451a8..5133a85dd 100644 --- a/src/main/java/com/prupe/mcpatcher/hd/CustomAnimation.java +++ b/src/main/java/com/prupe/mcpatcher/hd/CustomAnimation.java @@ -14,7 +14,8 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import org.lwjgl.util.glu.GLU; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.prupe.mcpatcher.MCLogger; import com.prupe.mcpatcher.MCPatcherUtils; import com.prupe.mcpatcher.mal.resource.GLAPI; @@ -146,8 +147,8 @@ public class CustomAnimation implements Comparable { return; } TexturePackAPI.bindTexture(dstName); - int dstWidth = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); - int dstHeight = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); + int dstWidth = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); + int dstHeight = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); int levels = MipmapHelper.getMipmapLevelsForCurrentTexture(); if (x + w > dstWidth || y + h > dstHeight) { properties.error( @@ -239,7 +240,7 @@ public class CustomAnimation implements Comparable { } GLAPI.glBindTexture(texture); update(texture, 0, 0); - int glError = GLStateManager.glGetError(); + int glError = GLSMQueries.glGetError(); if (glError != 0) { logger.severe("%s: %s", this, GLU.gluErrorString(glError)); error = true; @@ -352,7 +353,7 @@ public class CustomAnimation implements Comparable { // Without the cast the code won't compile @SuppressWarnings("RedundantCast") private void update(int texture, int dx, int dy) { - GLStateManager.glTexSubImage2D( + GLSMTextures.glTexSubImage2D( GL11.GL_TEXTURE_2D, mipmapLevel, x + dx, diff --git a/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java b/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java index 6548fde43..49759855c 100644 --- a/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java +++ b/src/main/java/com/prupe/mcpatcher/hd/FancyDial.java @@ -28,6 +28,17 @@ import org.lwjgl.opengl.GL12; import org.lwjgl.opengl.GL13; import org.lwjgl.util.glu.GLU; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.prupe.mcpatcher.MCLogger; import com.prupe.mcpatcher.MCPatcherUtils; @@ -55,7 +66,7 @@ public class FancyDial { private static final int glAttributes; private static boolean initialized; private static boolean active; - private static final int drawList = GLStateManager.glGenLists(1); + private static final int drawList = GLSMDraws.glGenLists(1); private static final Map setupInfo = new IdentityHashMap<>(); private static final Map instances = new IdentityHashMap<>(); @@ -97,9 +108,9 @@ public class FancyDial { } glAttributes = bits; - GLStateManager.glNewList(drawList, GL11.GL_COMPILE); + GLSMDraws.glNewList(drawList, GL11.GL_COMPILE); drawBox(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); } public static void setup(TextureAtlasSprite icon) { @@ -136,18 +147,18 @@ public class FancyDial { if (!active) { return false; } - int oldFB = GLStateManager.glGetInteger(EXTFramebufferObject.GL_FRAMEBUFFER_BINDING_EXT); + int oldFB = GLSMQueries.glGetInteger(EXTFramebufferObject.GL_FRAMEBUFFER_BINDING_EXT); if (oldFB != 0 && warnCount < 10) { logger.finer("rendering %s while non-default framebuffer %d is active", icon.getIconName(), oldFB); warnCount++; } - int oldTexture = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + int oldTexture = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); try { FancyDial instance = getInstance(icon); return instance != null && instance.render(itemFrameRenderer); } finally { - GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, oldFB); + GLSMFramebuffer.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, oldFB); GLAPI.glBindTexture(oldTexture); } } @@ -271,7 +282,7 @@ public class FancyDial { outputFrames = properties.getInt("outputFrames", 0); - int glError = GLStateManager.glGetError(); + int glError = GLSMQueries.glGetError(); if (glError != 0) { logger.severe("%s during %s setup", GLU.gluErrorString(glError), name); return; @@ -367,7 +378,7 @@ public class FancyDial { lastItemFrameRenderer = false; } - int glError = GLStateManager.glGetError(); + int glError = GLSMQueries.glGetError(); if (glError != 0) { logger.severe("%s during %s update", GLU.gluErrorString(glError), name); ok = false; @@ -433,7 +444,7 @@ public class FancyDial { private void renderImpl(double angle) { for (Layer layer : layers) { layer.blendMethod.applyBlending(); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); TexturePackAPI.bindTexture(layer.textureName); float offsetX = layer.offsetX; float offsetY = layer.offsetY; @@ -445,26 +456,26 @@ public class FancyDial { scaleX += scaleXDelta; scaleY += scaleYDelta; } - GLStateManager.glTranslatef(offsetX, offsetY, 0.0f); - GLStateManager.glScalef(scaleX, scaleY, 1.0f); + GLSMMatrices.glTranslatef(offsetX, offsetY, 0.0f); + GLSMMatrices.glScalef(scaleX, scaleY, 1.0f); float layerAngle = (float) (angle * layer.rotationMultiplier + layer.rotationOffset); - GLStateManager.glRotatef(layerAngle, 0.0f, 0.0f, 1.0f); - GLStateManager.glCallList(drawList); - GLStateManager.glPopMatrix(); + GLSMMatrices.glRotatef(layerAngle, 0.0f, 0.0f, 1.0f); + GLSMDraws.glCallList(drawList); + GLSMMatrices.glPopMatrix(); } } private static void drawBox() { - GLStateManager.glBegin(GL11.GL_QUADS); - GLStateManager.glTexCoord2f(0.0f, 0.0f); - GLStateManager.glVertex3f(-1.0f, -1.0f, 0.0f); - GLStateManager.glTexCoord2f(1.0f, 0.0f); - GLStateManager.glVertex3f(1.0f, -1.0f, 0.0f); - GLStateManager.glTexCoord2f(1.0f, 1.0f); - GLStateManager.glVertex3f(1.0f, 1.0f, 0.0f); - GLStateManager.glTexCoord2f(0.0f, 1.0f); - GLStateManager.glVertex3f(-1.0f, 1.0f, 0.0f); - GLStateManager.glEnd(); + GLSMDraws.glBegin(GL11.GL_QUADS); + GLSMCurrentAttribs.glTexCoord2f(0.0f, 0.0f); + GLSMDraws.glVertex3f(-1.0f, -1.0f, 0.0f); + GLSMCurrentAttribs.glTexCoord2f(1.0f, 0.0f); + GLSMDraws.glVertex3f(1.0f, -1.0f, 0.0f); + GLSMCurrentAttribs.glTexCoord2f(1.0f, 1.0f); + GLSMDraws.glVertex3f(1.0f, 1.0f, 0.0f); + GLSMCurrentAttribs.glTexCoord2f(0.0f, 1.0f); + GLSMDraws.glVertex3f(-1.0f, 1.0f, 0.0f); + GLSMDraws.glEnd(); } private void finish() { @@ -605,13 +616,13 @@ public class FancyDial { this.width = width; this.height = height; - frameBuffer = GLStateManager.glGenFramebuffers(); + frameBuffer = GLSMFramebuffer.glGenFramebuffers(); if (frameBuffer < 0) { throw new RuntimeException("could not get framebuffer object"); } GLAPI.glBindTexture(texture); - GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); - GLStateManager.glFramebufferTexture2D( + GLSMFramebuffer.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); + GLSMFramebuffer.glFramebufferTexture2D( EXTFramebufferObject.GL_FRAMEBUFFER_EXT, EXTFramebufferObject.GL_COLOR_ATTACHMENT0_EXT, GL11.GL_TEXTURE_2D, @@ -620,75 +631,75 @@ public class FancyDial { } void bind() { - GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); + GLSMFramebuffer.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); - GLStateManager.glPushAttrib(glAttributes); - GLStateManager.glViewport(x0, y0, width, height); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(x0, y0, width, height); + GLSMAttribStack.glPushAttrib(glAttributes); + GLSMRasterizer.glViewport(x0, y0, width, height); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(x0, y0, width, height); lightmapEnabled = false; if (gl13Supported) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - lightmapEnabled = GLStateManager.glIsEnabled(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + lightmapEnabled = GLSMEnable.glIsEnabled(GL11.GL_TEXTURE_2D); if (lightmapEnabled) { - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.01f); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.01f); if (useGL13) { - GLStateManager.glDisable(GL13.GL_MULTISAMPLE); + GLSMEnable.glDisable(GL13.GL_MULTISAMPLE); } - GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); } void unbind() { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); if (lightmapEnabled) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } - GLStateManager.glEnable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_BLEND); GLAPI.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0); + GLSMFramebuffer.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, 0); } void read(ByteBuffer buffer) { - GLStateManager.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); + GLSMFramebuffer.glBindFramebuffer(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, frameBuffer); buffer.position(0); - GLStateManager.glReadPixels(x0, y0, width, height, MipmapHelper.TEX_FORMAT, MipmapHelper.TEX_DATA_TYPE, buffer); + GLSMFramebuffer.glReadPixels(x0, y0, width, height, MipmapHelper.TEX_FORMAT, MipmapHelper.TEX_DATA_TYPE, buffer); } void write(ByteBuffer buffer) { GLAPI.glBindTexture(texture); buffer.position(0); - GLStateManager.glTexSubImage2D( + GLSMTextures.glTexSubImage2D( GL11.GL_TEXTURE_2D, 0, x0, @@ -704,9 +715,9 @@ public class FancyDial { if (!deleted) { deleted = true; if (ownTexture) { - GLStateManager.glDeleteTextures(texture); + GLSMTextures.glDeleteTextures(texture); } - GLStateManager.glDeleteFramebuffers(frameBuffer); + GLSMFramebuffer.glDeleteFramebuffers(frameBuffer); } } @@ -717,7 +728,7 @@ public class FancyDial { } private static int blankTexture(int width, int height) { - int texture = GLStateManager.glGenTextures(); + int texture = GLSMTextures.glGenTextures(); MipmapHelper.setupTexture(texture, width, height, "scratch"); return texture; } diff --git a/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java b/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java index 764b1f82d..791a68048 100644 --- a/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java +++ b/src/main/java/com/prupe/mcpatcher/hd/MipmapHelper.java @@ -13,6 +13,9 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import org.lwjgl.util.glu.GLU; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMTexEnvGen; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.prupe.mcpatcher.MCLogger; import com.prupe.mcpatcher.mal.resource.GLAPI; @@ -51,7 +54,7 @@ public class MipmapHelper { anisoSupported = GLStateManager.capabilities.GL_EXT_texture_filter_anisotropic; if (anisoSupported) { - anisoMax = (int) GLStateManager.glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT); + anisoMax = (int) GLSMQueries.glGetFloat(EXTTextureFilterAnisotropic.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT); checkGLError("glGetFloat(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT)"); anisoLevel = Math.max(Math.min(MCPatcherForgeConfig.ExtendedHD.anisotropicFiltering, anisoMax), 1); } else { @@ -76,30 +79,30 @@ public class MipmapHelper { final int magFilter = blur ? GL11.GL_LINEAR : GL11.GL_NEAREST; final int minFilter = mipmaps > 0 ? GL11.GL_LINEAR_MIPMAP_LINEAR : magFilter; final int wrap = clamp ? GL11.GL_CLAMP : GL11.GL_REPEAT; - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, mipmaps); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, mipmaps); if (mipmaps > 0) { checkGLError("%s: set GL_TEXTURE_MAX_LEVEL = %d", textureName, mipmaps); if (anisoSupported && anisoLevel > 1) { - GLStateManager.glTexParameterf( + GLSMTextures.glTexParameterf( GL11.GL_TEXTURE_2D, EXTTextureFilterAnisotropic.GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoLevel); checkGLError("%s: set GL_TEXTURE_MAX_ANISOTROPY_EXT = %f", textureName, anisoLevel); } if (lodSupported) { - GLStateManager.glTexEnvi( + GLSMTexEnvGen.glTexEnvi( EXTTextureLODBias.GL_TEXTURE_FILTER_CONTROL_EXT, EXTTextureLODBias.GL_TEXTURE_LOD_BIAS_EXT, lodBias); checkGLError("%s: set GL_TEXTURE_LOD_BIAS_EXT = %d", textureName, lodBias); } } - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, minFilter); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, magFilter); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, wrap); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, wrap); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, minFilter); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, magFilter); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, wrap); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, wrap); for (int level = 0; level <= mipmaps; level++) { - GLStateManager.glTexImage2D( + GLSMTextures.glTexImage2D( GL11.GL_TEXTURE_2D, level, GL11.GL_RGBA, @@ -172,11 +175,11 @@ public class MipmapHelper { } static int getMipmapLevelsForCurrentTexture() { - final int filter = GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); + final int filter = GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER); if (filter != GL11.GL_NEAREST_MIPMAP_LINEAR && filter != GL11.GL_NEAREST_MIPMAP_NEAREST) { return 0; } - return Math.min(maxMipmapLevel, GLStateManager.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL)); + return Math.min(maxMipmapLevel, GLSMTextures.glGetTexParameteri(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL)); } private static int gcd(int a, int b) { @@ -273,7 +276,7 @@ public class MipmapHelper { } private static void checkGLError(String format, Object... params) { - final int error = GLStateManager.glGetError(); + final int error = GLSMQueries.glGetError(); if (error != 0) { final String message = GLU.gluErrorString(error) + ": " + String.format(format, params); new RuntimeException(message).printStackTrace(); diff --git a/src/main/java/com/prupe/mcpatcher/mal/resource/BlendMethod.java b/src/main/java/com/prupe/mcpatcher/mal/resource/BlendMethod.java index cf5386ec3..b264ff88a 100644 --- a/src/main/java/com/prupe/mcpatcher/mal/resource/BlendMethod.java +++ b/src/main/java/com/prupe/mcpatcher/mal/resource/BlendMethod.java @@ -7,7 +7,9 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import com.prupe.mcpatcher.MCPatcherUtils; public class BlendMethod { @@ -156,38 +158,38 @@ public class BlendMethod { public void applyFade(float fade) { if (fadeRGB && fadeAlpha) { - GLStateManager.glColor4f(fade, fade, fade, fade); + GLSMCurrentAttribs.glColor4f(fade, fade, fade, fade); } else if (fadeRGB) { - GLStateManager.glColor4f(fade, fade, fade, 1.0f); + GLSMCurrentAttribs.glColor4f(fade, fade, fade, 1.0f); } else if (fadeAlpha) { - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, fade); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, fade); } } public void applyAlphaTest() { if (blend) { - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); } else { - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.01f); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.01f); } } public void applyDepthFunc() { if (blend) { - GLStateManager.glDepthFunc(GL11.GL_EQUAL); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); } else { - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); } } public void applyBlending() { if (blend) { - GLStateManager.glEnable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_BLEND); GLAPI.glBlendFuncSeparate(srcBlend, dstBlend, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); } else { - GLStateManager.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_BLEND); } } diff --git a/src/main/java/com/prupe/mcpatcher/mal/resource/GLAPI.java b/src/main/java/com/prupe/mcpatcher/mal/resource/GLAPI.java index 970f64a26..88babcc19 100644 --- a/src/main/java/com/prupe/mcpatcher/mal/resource/GLAPI.java +++ b/src/main/java/com/prupe/mcpatcher/mal/resource/GLAPI.java @@ -1,6 +1,8 @@ package com.prupe.mcpatcher.mal.resource; import org.lwjgl.opengl.GL11; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; public class GLAPI { @@ -9,15 +11,15 @@ public class GLAPI { public static void glBindTexture(int texture) { if (texture >= 0) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); } } public static void glBlendFuncSeparate(int src, int dst, int srcAlpha, int dstAlpha) { if (useGlBlendFuncSeparate) { - GLStateManager.glBlendFuncSeparate(src, dst, srcAlpha, dstAlpha); + GLSMBlend.glBlendFuncSeparate(src, dst, srcAlpha, dstAlpha); } else { - GLStateManager.glBlendFunc(src, dst); + GLSMBlend.glBlendFunc(src, dst); } } } diff --git a/src/main/java/com/prupe/mcpatcher/mob/LineRenderer.java b/src/main/java/com/prupe/mcpatcher/mob/LineRenderer.java index bfc394cff..cab8a08e6 100644 --- a/src/main/java/com/prupe/mcpatcher/mob/LineRenderer.java +++ b/src/main/java/com/prupe/mcpatcher/mob/LineRenderer.java @@ -6,7 +6,8 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import com.prupe.mcpatcher.MCLogger; import com.prupe.mcpatcher.mal.resource.PropertiesFile; import com.prupe.mcpatcher.mal.resource.TexturePackAPI; @@ -125,8 +126,8 @@ public class LineRenderer { TexturePackAPI.bindTexture(texture); Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); - GLStateManager.glDisable(GL11.GL_CULL_FACE); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); dx += sx + plusSX; dy += sy + plusSY; dz += sz + plusSZ; @@ -178,7 +179,7 @@ public class LineRenderer { u0 = u1; } tessellator.draw(); - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); return true; } diff --git a/src/main/java/com/prupe/mcpatcher/renderpass/RenderPass.java b/src/main/java/com/prupe/mcpatcher/renderpass/RenderPass.java index 5c4620f4c..9b0b7f1dd 100644 --- a/src/main/java/com/prupe/mcpatcher/renderpass/RenderPass.java +++ b/src/main/java/com/prupe/mcpatcher/renderpass/RenderPass.java @@ -13,7 +13,9 @@ import net.minecraft.world.IBlockAccess; import org.lwjgl.opengl.GL11; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.prupe.mcpatcher.MCLogger; import com.prupe.mcpatcher.MCPatcherUtils; import com.prupe.mcpatcher.ctm.CTMUtils; @@ -291,21 +293,21 @@ public class RenderPass { case RenderPassAPI.TRANSLUCENT_RENDER_PASS: case RenderPassAPI.BACKFACE_RENDER_PASS: if (!backfaceCulling[pass]) { - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); } break; case RenderPassAPI.OVERLAY_RENDER_PASS: - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.glPolygonOffset(-2.0f, -2.0f); - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMRasterizer.glPolygonOffset(-2.0f, -2.0f); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); if (backfaceCulling[pass]) { - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); } else { - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); } if (ambientOcclusion) { - GLStateManager.glShadeModel(GL11.GL_SMOOTH); + GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH); } blendMethod.applyBlending(); break; @@ -324,18 +326,18 @@ public class RenderPass { case RenderPassAPI.TRANSLUCENT_RENDER_PASS: case RenderPassAPI.BACKFACE_RENDER_PASS: if (!backfaceCulling[currentRenderPass]) { - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); } break; case RenderPassAPI.OVERLAY_RENDER_PASS: - GLStateManager.glPolygonOffset(0.0f, 0.0f); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(0.0f, 0.0f); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); if (!backfaceCulling[currentRenderPass]) { - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); } - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glShadeModel(GL11.GL_FLAT); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMRasterizer.glShadeModel(GL11.GL_FLAT); break; default: diff --git a/src/main/java/com/prupe/mcpatcher/sky/SkyRenderer.java b/src/main/java/com/prupe/mcpatcher/sky/SkyRenderer.java index 31e165d1c..37d7c1cc2 100644 --- a/src/main/java/com/prupe/mcpatcher/sky/SkyRenderer.java +++ b/src/main/java/com/prupe/mcpatcher/sky/SkyRenderer.java @@ -14,7 +14,9 @@ import net.minecraft.world.World; import org.lwjgl.opengl.GL11; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.prupe.mcpatcher.MCLogger; import com.prupe.mcpatcher.MCPatcherUtils; import com.prupe.mcpatcher.mal.resource.BlendMethod; @@ -385,42 +387,42 @@ public class SkyRenderer { TexturePackAPI.bindTexture(texture); setBlendingMethod(brightness); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); if (rotate) { - GLStateManager.glRotatef(celestialAngle * 360.0f * speed, axis[0], axis[1], axis[2]); + GLSMMatrices.glRotatef(celestialAngle * 360.0f * speed, axis[0], axis[1], axis[2]); } // north - GLStateManager.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); - GLStateManager.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); + GLSMMatrices.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + GLSMMatrices.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); drawTile(4); // top - GLStateManager.glPushMatrix(); - GLStateManager.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glRotatef(90.0f, 1.0f, 0.0f, 0.0f); drawTile(1); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); // bottom - GLStateManager.glPushMatrix(); - GLStateManager.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); drawTile(0); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); // west - GLStateManager.glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + GLSMMatrices.glRotatef(90.0f, 0.0f, 0.0f, 1.0f); drawTile(5); // south - GLStateManager.glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + GLSMMatrices.glRotatef(90.0f, 0.0f, 0.0f, 1.0f); drawTile(2); // east - GLStateManager.glRotatef(90.0f, 0.0f, 0.0f, 1.0f); + GLSMMatrices.glRotatef(90.0f, 0.0f, 0.0f, 1.0f); drawTile(3); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); return true; } @@ -441,14 +443,14 @@ public class SkyRenderer { blendMethod.applyFade(brightness); blendMethod.applyAlphaTest(); blendMethod.applyBlending(); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); } static void clearBlendingMethod() { - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); - GLStateManager.glEnable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); + GLSMEnable.glEnable(GL11.GL_BLEND); GLAPI.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, rainStrength); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, rainStrength); } } } diff --git a/src/main/java/jss/notfine/render/RenderStars.java b/src/main/java/jss/notfine/render/RenderStars.java index caee756a3..59fdd1371 100644 --- a/src/main/java/jss/notfine/render/RenderStars.java +++ b/src/main/java/jss/notfine/render/RenderStars.java @@ -1,7 +1,7 @@ package jss.notfine.render; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import jss.notfine.core.Settings; import jss.util.RandomXoshiro256StarStar; import net.minecraft.client.renderer.RenderGlobal; @@ -13,9 +13,9 @@ public class RenderStars { //private static final ResourceLocation locationStarsPng = new ResourceLocation("textures/colormap/stars.png"); public static void reloadStarRenderList(RenderGlobal render) { - GLStateManager.glNewList(render.starGLCallList, GL11.GL_COMPILE); + GLSMDraws.glNewList(render.starGLCallList, GL11.GL_COMPILE); renderStars(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); } public static void renderStars() { diff --git a/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/frame/AbstractFrame.java b/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/frame/AbstractFrame.java index f8cd646e8..f082df92a 100644 --- a/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/frame/AbstractFrame.java +++ b/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/frame/AbstractFrame.java @@ -3,7 +3,7 @@ package me.flashyreese.mods.reeses_sodium_options.client.gui.frame; import com.gtnewhorizons.angelica.compat.mojang.Drawable; import com.gtnewhorizons.angelica.compat.mojang.Element; import com.gtnewhorizons.angelica.compat.mojang.ParentElement; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import me.jellysquid.mods.sodium.client.gui.options.control.ControlElement; import me.jellysquid.mods.sodium.client.gui.widgets.AbstractWidget; import me.jellysquid.mods.sodium.client.util.Dim2i; @@ -55,10 +55,10 @@ public abstract class AbstractFrame extends AbstractWidget implements ParentElem public void applyScissor(int x, int y, int width, int height, Runnable action) { final double scale = new ScaledResolution(Minecraft.getMinecraft(), Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight).getScaleFactor(); - GLStateManager.enableScissorTest(); - GLStateManager.glScissor((int) (x * scale), (int) (Minecraft.getMinecraft().getFramebuffer().framebufferHeight - (y + height) * scale), (int) (width * scale), (int) (height * scale)); + GLSMRasterizer.enableScissorTest(); + GLSMRasterizer.glScissor((int) (x * scale), (int) (Minecraft.getMinecraft().getFramebuffer().framebufferHeight - (y + height) * scale), (int) (width * scale), (int) (height * scale)); action.run(); - GLStateManager.disableScissorTest(); + GLSMRasterizer.disableScissorTest(); } protected void drawRectOutline(double x, double y, double w, double h, int color) { diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/AbstractWidget.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/AbstractWidget.java index 06c32cf35..da8eb6f42 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/AbstractWidget.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/widgets/AbstractWidget.java @@ -2,7 +2,8 @@ package me.jellysquid.mods.sodium.client.gui.widgets; import com.gtnewhorizons.angelica.compat.mojang.Drawable; import com.gtnewhorizons.angelica.compat.mojang.Element; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.FontRenderer; @@ -33,17 +34,17 @@ public abstract class AbstractWidget implements Drawable, Element { } protected void drawQuads(Consumer consumer) { - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.defaultBlendFunc(); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMBlend.defaultBlendFunc(); final Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); consumer.accept(tessellator); tessellator.draw(); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glDisable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glDisable(GL11.GL_BLEND); } protected static void addQuad(Tessellator consumer, double x1, double y1, double x2, double y2, float a, float r, float g, float b) { diff --git a/src/main/java/net/coderbot/batchedentityrendering/impl/AngelicaBufferSource.java b/src/main/java/net/coderbot/batchedentityrendering/impl/AngelicaBufferSource.java index 88ee2ce74..66a052b0b 100644 --- a/src/main/java/net/coderbot/batchedentityrendering/impl/AngelicaBufferSource.java +++ b/src/main/java/net/coderbot/batchedentityrendering/impl/AngelicaBufferSource.java @@ -3,7 +3,10 @@ package net.coderbot.batchedentityrendering.impl; import com.gtnewhorizons.angelica.rendering.RenderFailures; import com.gtnewhorizons.angelica.compat.mojang.RenderLayer; import com.gtnewhorizons.angelica.rendering.tesr.BatchDrawDefaults; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.LightingSnapshot; import com.gtnewhorizons.angelica.glsm.StateSet; import it.unimi.dsi.fastutil.objects.Object2IntLinkedOpenHashMap; @@ -59,7 +62,7 @@ public class AngelicaBufferSource implements Groupable { public void capturePassLighting() { if (passLighting == null) passLighting = new LightingSnapshot(); - GLStateManager.captureLighting(passLighting); + GLSMLighting.captureLighting(passLighting); } public SegmentedBufferBuilder getBuffer(RenderLayer type, int blockEntityId) { @@ -198,7 +201,7 @@ public class AngelicaBufferSource implements Groupable { private void restoreDrawState() { if (drawStateDepth >= 0) { drawDefaults.restore(); - GLStateManager.popStateTo(drawStateDepth); + GLSMAttribStack.popStateTo(drawStateDepth); drawStateDepth = -1; } } @@ -225,9 +228,9 @@ public class AngelicaBufferSource implements Groupable { final boolean hasRetained = hook != null && hook.hasDraws(layer); if (!hasDynamic && !hasRetained) return; if (drawStateDepth < 0) { - drawStateDepth = GLStateManager.pushState(StateSet.BATCH); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - if (passLighting != null) GLStateManager.applyLighting(passLighting); + drawStateDepth = GLSMAttribStack.pushState(StateSet.BATCH); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + if (passLighting != null) GLSMLighting.applyLighting(passLighting); drawDefaults.apply(); } saveIrisState(); @@ -258,9 +261,9 @@ public class AngelicaBufferSource implements Groupable { boolean boundSetup = false; Throwable failure = null; try { - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); matrixPushed = true; - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); int currentEntity = Integer.MIN_VALUE; int currentBlock = Integer.MIN_VALUE; int currentItem = Integer.MIN_VALUE; @@ -306,7 +309,7 @@ public class AngelicaBufferSource implements Groupable { } if (matrixPushed) { try { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } catch (Throwable cleanup) { failure = RenderFailures.suppress(failure, cleanup); } diff --git a/src/main/java/net/coderbot/iris/celeritas/IrisCeleritasChunkShaderInterface.java b/src/main/java/net/coderbot/iris/celeritas/IrisCeleritasChunkShaderInterface.java index b0ad197a9..bbe445f4e 100644 --- a/src/main/java/net/coderbot/iris/celeritas/IrisCeleritasChunkShaderInterface.java +++ b/src/main/java/net/coderbot/iris/celeritas/IrisCeleritasChunkShaderInterface.java @@ -1,6 +1,7 @@ package net.coderbot.iris.celeritas; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor; import net.coderbot.iris.Iris; @@ -106,22 +107,22 @@ public class IrisCeleritasChunkShaderInterface implements ChunkShaderInterface { bindFramebuffer(pass); if (ShadowRenderingState.areShadowsCurrentlyBeingRendered()) { - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); } // Explicitly set iris_LightmapTextureMatrix rather than relying on CompatUniformManager. // At high uniform locations in large UBOs, the compat manager's writes may not persist // through the per-program dirtyUniforms swap in non-GL backends. if (uniformLightmapTextureMatrix != null) { - uniformLightmapTextureMatrix.set(GLStateManager.getTextures().getTextureUnitMatrix(1)); + uniformLightmapTextureMatrix.set(GLSMTextures.getTextures().getTextureUnitMatrix(1)); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.ALBEDO_TEXTURE_UNIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, Minecraft.getMinecraft().getTextureMapBlocks().getGlTextureId()); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.ALBEDO_TEXTURE_UNIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, Minecraft.getMinecraft().getTextureMapBlocks().getGlTextureId()); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT); final DynamicTexture lightmapTexture = ((EntityRendererAccessor) Minecraft.getMinecraft().entityRenderer).getLightmapTexture(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId()); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId()); if (blendModeOverride != null) { blendModeOverride.apply(); diff --git a/src/main/java/net/coderbot/iris/compat/dh/DHCompatInternal.java b/src/main/java/net/coderbot/iris/compat/dh/DHCompatInternal.java index ca97a8ded..42040f4e5 100644 --- a/src/main/java/net/coderbot/iris/compat/dh/DHCompatInternal.java +++ b/src/main/java/net/coderbot/iris/compat/dh/DHCompatInternal.java @@ -1,6 +1,6 @@ package net.coderbot.iris.compat.dh; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.seibel.distanthorizons.api.DhApi; import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiFramebuffer; import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiGenericObjectShaderProgram; @@ -260,9 +260,9 @@ public class DHCompatInternal { public void copyTranslucents(int width, int height) { if (translucentDepthDirty) { translucentDepthDirty = false; - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, depthTexNoTranslucent.getTextureId()); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, depthTexNoTranslucent.getTextureId()); dhTerrainFramebuffer.bindAsReadBuffer(); - GLStateManager.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0, DepthBufferFormat.DEPTH32F.getGlInternalFormat(), 0, 0, width, height, 0); + GLSMTextures.glCopyTexImage2D(GL11.GL_TEXTURE_2D, 0, DepthBufferFormat.DEPTH32F.getGlInternalFormat(), 0, 0, width, height, 0); } else { DepthCopyStrategy.fastest(false).copy(dhTerrainFramebuffer, storedDepthTex, null, depthTexNoTranslucent.getTextureId(), width, height); } diff --git a/src/main/java/net/coderbot/iris/compat/dh/DhFrameBufferWrapper.java b/src/main/java/net/coderbot/iris/compat/dh/DhFrameBufferWrapper.java index 1d4a68cb4..be50b6523 100644 --- a/src/main/java/net/coderbot/iris/compat/dh/DhFrameBufferWrapper.java +++ b/src/main/java/net/coderbot/iris/compat/dh/DhFrameBufferWrapper.java @@ -1,6 +1,6 @@ package net.coderbot.iris.compat.dh; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiFramebuffer; import net.coderbot.iris.gl.framebuffer.GlFramebuffer; import org.lwjgl.opengl.GL30; @@ -37,7 +37,7 @@ public class DhFrameBufferWrapper implements IDhApiFramebuffer { @Override public int getStatus() { this.bind(); - int status = GLStateManager.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER); + int status = GLSMFramebuffer.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER); return status; } diff --git a/src/main/java/net/coderbot/iris/compat/dh/IrisGenericRenderProgram.java b/src/main/java/net/coderbot/iris/compat/dh/IrisGenericRenderProgram.java index dc9310cd1..d3971e9f6 100644 --- a/src/main/java/net/coderbot/iris/compat/dh/IrisGenericRenderProgram.java +++ b/src/main/java/net/coderbot/iris/compat/dh/IrisGenericRenderProgram.java @@ -1,7 +1,11 @@ package net.coderbot.iris.compat.dh; import com.google.common.primitives.Ints; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor; import org.lwjgl.BufferUtils; import com.seibel.distanthorizons.api.interfaces.override.rendering.IDhApiGenericObjectShaderProgram; @@ -67,49 +71,49 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra // This will bind AbstractVertexAttribute private IrisGenericRenderProgram(String name, boolean isShadowPass, boolean translucent, BlendModeOverride override, BufferBlendOverride[] bufferBlendOverrides, String vertex, String tessControl, String tessEval, String geometry, String fragment, CustomUniforms customUniforms, DeferredWorldRenderingPipeline pipeline) { - id = GLStateManager.glCreateProgram(); + id = GLSMPrograms.glCreateProgram(); - GLStateManager.glBindAttribLocation(this.id, 0, "vPosition"); - GLStateManager.glBindAttribLocation(this.id, 1, "iris_color"); - GLStateManager.glBindAttribLocation(this.id, 2, "aScale"); - GLStateManager.glBindAttribLocation(this.id, 3, "aTranslateChunk"); - GLStateManager.glBindAttribLocation(this.id, 4, "aTranslateSubChunk"); - GLStateManager.glBindAttribLocation(this.id, 5, "aMaterial"); + GLSMPrograms.glBindAttribLocation(this.id, 0, "vPosition"); + GLSMPrograms.glBindAttribLocation(this.id, 1, "iris_color"); + GLSMPrograms.glBindAttribLocation(this.id, 2, "aScale"); + GLSMPrograms.glBindAttribLocation(this.id, 3, "aTranslateChunk"); + GLSMPrograms.glBindAttribLocation(this.id, 4, "aTranslateSubChunk"); + GLSMPrograms.glBindAttribLocation(this.id, 5, "aMaterial"); this.bufferBlendOverrides = bufferBlendOverrides; GlShader vert = new GlShader(ShaderType.VERTEX, name + ".vsh", vertex); - GLStateManager.glAttachShader(id, vert.getHandle()); + GLSMPrograms.glAttachShader(id, vert.getHandle()); GlShader tessCont = null; if (tessControl != null) { tessCont = new GlShader(ShaderType.TESSELATION_CONTROL, name + ".tcs", tessControl); - GLStateManager.glAttachShader(id, tessCont.getHandle()); + GLSMPrograms.glAttachShader(id, tessCont.getHandle()); } GlShader tessE = null; if (tessEval != null) { tessE = new GlShader(ShaderType.TESSELATION_EVAL, name + ".tes", tessEval); - GLStateManager.glAttachShader(id, tessE.getHandle()); + GLSMPrograms.glAttachShader(id, tessE.getHandle()); } GlShader geom = null; if (geometry != null) { geom = new GlShader(ShaderType.GEOMETRY, name + ".gsh", geometry); - GLStateManager.glAttachShader(id, geom.getHandle()); + GLSMPrograms.glAttachShader(id, geom.getHandle()); } GlShader frag = new GlShader(ShaderType.FRAGMENT, name + ".fsh", fragment); - GLStateManager.glAttachShader(id, frag.getHandle()); + GLSMPrograms.glAttachShader(id, frag.getHandle()); - GLStateManager.glLinkProgram(this.id); - int status = GLStateManager.glGetProgrami(this.id, GL20.GL_LINK_STATUS); + GLSMPrograms.glLinkProgram(this.id); + int status = GLSMPrograms.glGetProgrami(this.id, GL20.GL_LINK_STATUS); if (status != 1) { - String message = "Shader link error in Iris DH program! Details: " + GLStateManager.glGetProgramInfoLog(this.id, 9999); + String message = "Shader link error in Iris DH program! Details: " + GLSMPrograms.glGetProgramInfoLog(this.id, 9999); this.free(); throw new RuntimeException(message); } else { - GLStateManager.glUseProgram(this.id); + GLSMPrograms.glUseProgram(this.id); } vert.destroy(); @@ -135,9 +139,9 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra samplers = samplerBuilder.build(); images = builder.build(); - this.va = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(va); - GLStateManager.glEnableVertexAttribArray(0); + this.va = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(va); + GLSMVertexInput.glEnableVertexAttribArray(0); this.instancedShaderOffsetChunkUniform = this.tryGetUniformLocation2("uOffsetChunk"); this.instancedShaderOffsetSubChunkUniform = this.tryGetUniformLocation2("uOffsetSubChunk"); @@ -188,7 +192,7 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra } public int tryGetUniformLocation2(CharSequence name) { - return GLStateManager.glGetUniformLocation(this.id, name); + return GLSMPrograms.glGetUniformLocation(this.id, name); } private final FloatBuffer matrixScratch = BufferUtils.createFloatBuffer(16); @@ -196,13 +200,13 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra public void setUniform(int index, Matrix4f matrix) { if (index == -1 || matrix == null) return; matrix.get(matrixScratch); - GLStateManager.glUniformMatrix4(index, false, matrixScratch); + GLSMPrograms.glUniformMatrix4(index, false, matrixScratch); } // Override ShaderProgram.bind() public void bind(DhApiRenderParam renderParam) { - GLStateManager.glBindVertexArray(va); - GLStateManager.glUseProgram(id); + GLSMVertexInput.glBindVertexArray(va); + GLSMPrograms.glUseProgram(id); if (blend != null) blend.apply(); for (BufferBlendOverride override : bufferBlendOverrides) { @@ -214,9 +218,9 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra this.setUniform(this.instancedShaderProjectionModelViewMatrixUniform, tempMat4.set(tempProj).mul(tempModel)); LodRendererEvents.pushDhMatrices(tempProj, tempModel); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT); DynamicTexture lightmapTexture = ((EntityRendererAccessor) Minecraft.getMinecraft().entityRenderer).getLightmapTexture(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId()); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId()); samplers.update(); uniforms.update(); @@ -228,8 +232,8 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra public void unbind() { LodRendererEvents.popDhMatrices(); - GLStateManager.glBindVertexArray(0); - GLStateManager.glUseProgram(0); + GLSMVertexInput.glBindVertexArray(0); + GLSMPrograms.glUseProgram(0); ProgramUniforms.clearActiveUniforms(); ProgramSamplers.clearActiveSamplers(); BlendModeOverride.restore(); @@ -237,8 +241,8 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra @Override public void bindVertexBuffer(int i) { - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, i); - GLStateManager.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, i); + GLSMVertexInput.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 12, 0); } @Override @@ -252,13 +256,13 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra } public void free() { - GLStateManager.glDeleteProgram(id); + GLSMPrograms.glDeleteProgram(id); } public void fillIndirectUniformData(DhApiRenderParam dhApiRenderParam, DhApiRenderableBoxGroupShading dhApiRenderableBoxGroupShading, IDhApiRenderableBoxGroup boxGroup, DhApiVec3d camPos) { bind(dhApiRenderParam); - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); this.setUniform(this.instancedShaderOffsetChunkUniform, getChunkPosFromDouble(boxGroup.getOriginBlockPos().x), getChunkPosFromDouble(boxGroup.getOriginBlockPos().y), @@ -302,19 +306,19 @@ public class IrisGenericRenderProgram implements IDhApiGenericObjectShaderProgra } private void setUniform(int index, int value) { - GLStateManager.glUniform1i(index, value); + GLSMPrograms.glUniform1i(index, value); } private void setUniform(int index, float value) { - GLStateManager.glUniform1f(index, value); + GLSMPrograms.glUniform1f(index, value); } private void setUniform(int index, float x, float y, float z) { - GLStateManager.glUniform3f(index, x, y, z); + GLSMPrograms.glUniform3f(index, x, y, z); } private void setUniform(int index, int x, int y, int z) { - GLStateManager.glUniform3i(index, x, y, z); + GLSMPrograms.glUniform3i(index, x, y, z); } } diff --git a/src/main/java/net/coderbot/iris/compat/dh/IrisLodRenderProgram.java b/src/main/java/net/coderbot/iris/compat/dh/IrisLodRenderProgram.java index 7fba9f17f..6ab8fb029 100644 --- a/src/main/java/net/coderbot/iris/compat/dh/IrisLodRenderProgram.java +++ b/src/main/java/net/coderbot/iris/compat/dh/IrisLodRenderProgram.java @@ -1,7 +1,8 @@ package net.coderbot.iris.compat.dh; import com.google.common.primitives.Ints; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor; import com.seibel.distanthorizons.api.DhApi; import com.seibel.distanthorizons.api.objects.math.DhApiVec3f; @@ -52,46 +53,46 @@ public class IrisLodRenderProgram { // This will bind AbstractVertexAttribute private IrisLodRenderProgram(String name, boolean isShadowPass, boolean translucent, BlendModeOverride override, BufferBlendOverride[] bufferBlendOverrides, String vertex, String tessControl, String tessEval, String geometry, String fragment, CustomUniforms customUniforms, DeferredWorldRenderingPipeline pipeline) { - id = GLStateManager.glCreateProgram(); + id = GLSMPrograms.glCreateProgram(); - GLStateManager.glBindAttribLocation(this.id, 0, "vPosition"); - GLStateManager.glBindAttribLocation(this.id, 1, "iris_color"); - GLStateManager.glBindAttribLocation(this.id, 2, "irisExtra"); + GLSMPrograms.glBindAttribLocation(this.id, 0, "vPosition"); + GLSMPrograms.glBindAttribLocation(this.id, 1, "iris_color"); + GLSMPrograms.glBindAttribLocation(this.id, 2, "irisExtra"); this.bufferBlendOverrides = bufferBlendOverrides; GlShader vert = new GlShader(ShaderType.VERTEX, name + ".vsh", vertex); - GLStateManager.glAttachShader(id, vert.getHandle()); + GLSMPrograms.glAttachShader(id, vert.getHandle()); GlShader tessCont = null; if (tessControl != null) { tessCont = new GlShader(ShaderType.TESSELATION_CONTROL, name + ".tcs", tessControl); - GLStateManager.glAttachShader(id, tessCont.getHandle()); + GLSMPrograms.glAttachShader(id, tessCont.getHandle()); } GlShader tessE = null; if (tessEval != null) { tessE = new GlShader(ShaderType.TESSELATION_EVAL, name + ".tes", tessEval); - GLStateManager.glAttachShader(id, tessE.getHandle()); + GLSMPrograms.glAttachShader(id, tessE.getHandle()); } GlShader geom = null; if (geometry != null) { geom = new GlShader(ShaderType.GEOMETRY, name + ".gsh", geometry); - GLStateManager.glAttachShader(id, geom.getHandle()); + GLSMPrograms.glAttachShader(id, geom.getHandle()); } GlShader frag = new GlShader(ShaderType.FRAGMENT, name + ".fsh", fragment); - GLStateManager.glAttachShader(id, frag.getHandle()); + GLSMPrograms.glAttachShader(id, frag.getHandle()); - GLStateManager.glLinkProgram(this.id); - int status = GLStateManager.glGetProgrami(this.id, GL20.GL_LINK_STATUS); + GLSMPrograms.glLinkProgram(this.id); + int status = GLSMPrograms.glGetProgrami(this.id, GL20.GL_LINK_STATUS); if (status != 1) { - String message = "Shader link error in Iris DH program! Details: " + GLStateManager.glGetProgramInfoLog(this.id, 9999); + String message = "Shader link error in Iris DH program! Details: " + GLSMPrograms.glGetProgramInfoLog(this.id, 9999); this.free(); throw new RuntimeException(message); } else { - GLStateManager.glUseProgram(this.id); + GLSMPrograms.glUseProgram(this.id); } vert.destroy(); @@ -156,12 +157,12 @@ public class IrisLodRenderProgram { // Noise Uniforms public int tryGetUniformLocation2(CharSequence name) { - return GLStateManager.glGetUniformLocation(this.id, name); + return GLSMPrograms.glGetUniformLocation(this.id, name); } // Override ShaderProgram.bind() public void bind() { - GLStateManager.glUseProgram(id); + GLSMPrograms.glUseProgram(id); if (blend != null) blend.apply(); for (BufferBlendOverride override : bufferBlendOverrides) { @@ -170,22 +171,22 @@ public class IrisLodRenderProgram { } public void unbind() { - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); ProgramUniforms.clearActiveUniforms(); ProgramSamplers.clearActiveSamplers(); BlendModeOverride.restore(); } public void free() { - GLStateManager.glDeleteProgram(id); + GLSMPrograms.glDeleteProgram(id); } public void fillUniformData(Matrix4fc projection, Matrix4fc modelView, int worldYOffset, float partialTicks) { - GLStateManager.glUseProgram(id); + GLSMPrograms.glUseProgram(id); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + IrisSamplers.LIGHTMAP_TEXTURE_UNIT); DynamicTexture lightmapTexture = ((EntityRendererAccessor) Minecraft.getMinecraft().entityRenderer).getLightmapTexture(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId()); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture.getGlTextureId()); LodRendererEvents.pushDhMatrices(projection, modelView); @@ -208,7 +209,7 @@ public class IrisLodRenderProgram { } private void setUniform(int index, float value) { - GLStateManager.glUniform1f(index, value); + GLSMPrograms.glUniform1f(index, value); } public void setModelPos(DhApiVec3f modelPos) { @@ -216,7 +217,7 @@ public class IrisLodRenderProgram { } private void setUniform(int index, DhApiVec3f pos) { - GLStateManager.glUniform3f(index, pos.x, pos.y, pos.z); + GLSMPrograms.glUniform3f(index, pos.x, pos.y, pos.z); } } diff --git a/src/main/java/net/coderbot/iris/compat/dh/LodRendererEvents.java b/src/main/java/net/coderbot/iris/compat/dh/LodRendererEvents.java index 7e09e295b..7a3d7d784 100644 --- a/src/main/java/net/coderbot/iris/compat/dh/LodRendererEvents.java +++ b/src/main/java/net/coderbot/iris/compat/dh/LodRendererEvents.java @@ -1,6 +1,8 @@ package net.coderbot.iris.compat.dh; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.rendering.RenderingState; import com.seibel.distanthorizons.api.DhApi; import com.seibel.distanthorizons.api.enums.rendering.EDhApiFogDrawMode; @@ -53,18 +55,18 @@ public class LodRendererEvents { static void pushDhMatrices(Matrix4fc projection, Matrix4fc modelView) { if (!dhMatricesActive) { - savedModelView.set(GLStateManager.getModelViewMatrix()); - savedProjection.set(GLStateManager.getProjectionMatrix()); + savedModelView.set(GLSMMatrices.getModelViewMatrix()); + savedProjection.set(GLSMMatrices.getProjectionMatrix()); dhMatricesActive = true; } - GLStateManager.setModelViewMatrix(modelView); - GLStateManager.setProjectionMatrix(projection); + GLSMMatrices.setModelViewMatrix(modelView); + GLSMMatrices.setProjectionMatrix(projection); } static void popDhMatrices() { if (dhMatricesActive) { - GLStateManager.setModelViewMatrix(savedModelView); - GLStateManager.setProjectionMatrix(savedProjection); + GLSMMatrices.setModelViewMatrix(savedModelView); + GLSMMatrices.setProjectionMatrix(savedProjection); dhMatricesActive = false; } } @@ -211,7 +213,7 @@ public class LodRendererEvents { } else { getInstance().getSolidShader().unbind(); if (atTranslucent) { - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); } } } @@ -229,7 +231,7 @@ public class LodRendererEvents { if (ShadowRenderingState.areShadowsCurrentlyBeingRendered()) { event.cancelEvent(); } else if (getInstance().shouldOverride) { - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); event.cancelEvent(); } } @@ -364,7 +366,7 @@ public class LodRendererEvents { instance.copyTranslucents(textureWidth, textureHeight); instance.getTranslucentShader().bind(); Matrix4f projection = RenderingState.INSTANCE.getProjectionMatrix(); - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); instance.getTranslucentShader().fillUniformData( new Matrix4f().setPerspective(projection.perspectiveFov(), projection.m11() / projection.m00(), event.value.nearClipPlane, event.value.farClipPlane), diff --git a/src/main/java/net/coderbot/iris/gbuffer_overrides/matching/TranslucentBlendMatcher.java b/src/main/java/net/coderbot/iris/gbuffer_overrides/matching/TranslucentBlendMatcher.java index c07b1bd54..a61c03997 100644 --- a/src/main/java/net/coderbot/iris/gbuffer_overrides/matching/TranslucentBlendMatcher.java +++ b/src/main/java/net/coderbot/iris/gbuffer_overrides/matching/TranslucentBlendMatcher.java @@ -1,6 +1,6 @@ package net.coderbot.iris.gbuffer_overrides.matching; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; import com.gtnewhorizons.angelica.glsm.states.BlendState; import org.lwjgl.opengl.GL11; @@ -15,10 +15,10 @@ public final class TranslucentBlendMatcher { private TranslucentBlendMatcher() {} public static boolean matchesCurrentState() { - if (!GLStateManager.isEffectiveBlendEnabled()) { + if (!GLSMBlend.isEffectiveBlendEnabled()) { return false; } - GLStateManager.getEffectiveBlendState(scratch); + GLSMBlend.getEffectiveBlendState(scratch); return scratch.getSrcRgb() == GL11.GL_SRC_ALPHA && scratch.getDstRgb() == GL11.GL_ONE_MINUS_SRC_ALPHA; } } diff --git a/src/main/java/net/coderbot/iris/gl/blending/AlphaTestStorage.java b/src/main/java/net/coderbot/iris/gl/blending/AlphaTestStorage.java index d51e598ae..41a0f8fb6 100644 --- a/src/main/java/net/coderbot/iris/gl/blending/AlphaTestStorage.java +++ b/src/main/java/net/coderbot/iris/gl/blending/AlphaTestStorage.java @@ -2,7 +2,7 @@ package net.coderbot.iris.gl.blending; import com.gtnewhorizons.angelica.glsm.states.AlphaTestFunction; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; import com.gtnewhorizons.angelica.glsm.hooks.VanillaBooleanLayer; import com.gtnewhorizons.angelica.glsm.hooks.VanillaStateLayer; import com.gtnewhorizons.angelica.glsm.states.AlphaState; @@ -22,10 +22,10 @@ public class AlphaTestStorage { public static void overrideAlphaTest(AlphaTest override) { if (!overrideHeld) { - final AlphaState alphaState = GLStateManager.getAlphaState(); + final AlphaState alphaState = GLSMDepthStencilAlpha.getAlphaState(); // Only save the previous state if the alpha test wasn't already overridden - vanillaEnabled = GLStateManager.getAlphaTest().isEnabled(); + vanillaEnabled = GLSMDepthStencilAlpha.getAlphaTest().isEnabled(); vanillaFunction = alphaState.getFunction(); vanillaReference = alphaState.getReference(); } @@ -43,10 +43,10 @@ public class AlphaTestStorage { alphaTestLocked = false; try { if (enabled) { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(function, reference); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(function, reference); } else { - GLStateManager.disableAlphaTest(); + GLSMDepthStencilAlpha.disableAlphaTest(); } } finally { alphaTestLocked = true; @@ -74,12 +74,12 @@ public class AlphaTestStorage { alphaTestLocked = false; if (vanillaEnabled) { - GLStateManager.enableAlphaTest(); + GLSMDepthStencilAlpha.enableAlphaTest(); } else { - GLStateManager.disableAlphaTest(); + GLSMDepthStencilAlpha.disableAlphaTest(); } - GLStateManager.glAlphaFunc(vanillaFunction, vanillaReference); + GLSMDepthStencilAlpha.glAlphaFunc(vanillaFunction, vanillaReference); overrideHeld = false; } diff --git a/src/main/java/net/coderbot/iris/gl/blending/BlendModeStorage.java b/src/main/java/net/coderbot/iris/gl/blending/BlendModeStorage.java index f3ef25f79..10baa5ff4 100644 --- a/src/main/java/net/coderbot/iris/gl/blending/BlendModeStorage.java +++ b/src/main/java/net/coderbot/iris/gl/blending/BlendModeStorage.java @@ -1,6 +1,6 @@ package net.coderbot.iris.gl.blending; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.hooks.VanillaBooleanLayer; import com.gtnewhorizons.angelica.glsm.hooks.VanillaStateLayer; @@ -45,10 +45,10 @@ public class BlendModeStorage { blendLocked = false; try { if (override == null) { - GLStateManager.disableBlend(); + GLSMBlend.disableBlend(); } else { - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(override.getSrcRgb(), override.getDstRgb(), override.getSrcAlpha(), override.getDstAlpha()); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(override.getSrcRgb(), override.getDstRgb(), override.getSrcAlpha(), override.getDstAlpha()); } } finally { blendLocked = true; @@ -79,8 +79,8 @@ public class BlendModeStorage { private static void captureVanilla() { if (!overrideHeld) { - vanillaBlendEnable = GLStateManager.getBlendMode().isEnabled(); - vanillaBlend.set(GLStateManager.getBlendState()); + vanillaBlendEnable = GLSMBlend.getBlendMode().isEnabled(); + vanillaBlend.set(GLSMBlend.getBlendState()); } } @@ -146,11 +146,11 @@ public class BlendModeStorage { blendLocked = false; try { if (vanillaBlendEnable) { - GLStateManager.enableBlend(); + GLSMBlend.enableBlend(); } else { - GLStateManager.disableBlend(); + GLSMBlend.disableBlend(); } - GLStateManager.tryBlendFuncSeparate(vanillaBlend.getSrcRgb(), vanillaBlend.getDstRgb(), vanillaBlend.getSrcAlpha(), vanillaBlend.getDstAlpha()); + GLSMBlend.tryBlendFuncSeparate(vanillaBlend.getSrcRgb(), vanillaBlend.getDstRgb(), vanillaBlend.getSrcAlpha(), vanillaBlend.getDstAlpha()); } finally { blendLocked = wasLocked; } diff --git a/src/main/java/net/coderbot/iris/gl/blending/DepthColorStorage.java b/src/main/java/net/coderbot/iris/gl/blending/DepthColorStorage.java index 73a391099..5985d044d 100644 --- a/src/main/java/net/coderbot/iris/gl/blending/DepthColorStorage.java +++ b/src/main/java/net/coderbot/iris/gl/blending/DepthColorStorage.java @@ -2,7 +2,8 @@ package net.coderbot.iris.gl.blending; import com.gtnewhorizons.angelica.glsm.states.DepthState; import com.gtnewhorizons.angelica.glsm.states.ColorMask; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; import com.gtnewhorizons.angelica.glsm.hooks.VanillaStateLayer; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import lombok.Getter; @@ -33,8 +34,8 @@ public class DepthColorStorage { public static void disableDepthColor() { if (!overrideHeld) { - final ColorMask colorMask = GLStateManager.getColorMask(); - final DepthState depthState = GLStateManager.getDepthState(); + final ColorMask colorMask = GLSMBlend.getColorMask(); + final DepthState depthState = GLSMDepthStencilAlpha.getDepthState(); vanillaDepthEnable = depthState.isEnabled(); vanillaColor.set(colorMask); @@ -44,8 +45,8 @@ public class DepthColorStorage { depthColorLocked = false; try { - GLStateManager.glDepthMask(false); - GLStateManager.glColorMask(false, false, false, false); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMBlend.glColorMask(false, false, false, false); } finally { depthColorLocked = true; } @@ -66,8 +67,8 @@ public class DepthColorStorage { depthColorLocked = false; - GLStateManager.glDepthMask(vanillaDepthEnable); - GLStateManager.glColorMask(vanillaColor.red, vanillaColor.green, vanillaColor.blue, vanillaColor.alpha); + GLSMDepthStencilAlpha.glDepthMask(vanillaDepthEnable); + GLSMBlend.glColorMask(vanillaColor.red, vanillaColor.green, vanillaColor.blue, vanillaColor.alpha); overrideHeld = false; } diff --git a/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBuffer.java b/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBuffer.java index fd72e1a2c..cc5fc893e 100644 --- a/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBuffer.java +++ b/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBuffer.java @@ -1,6 +1,6 @@ package net.coderbot.iris.gl.buffer; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.RenderSystem; import lombok.Getter; import org.embeddedt.embeddium.impl.gl.debug.GLDebug; @@ -41,8 +41,8 @@ public class ShaderStorageBuffer { if (!info.relative()) return; RenderSystem.deleteBuffers(id); - int newId = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, newId); + int newId = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, newId); // Calculation time long newWidth = (long) (width * info.scaleX()); diff --git a/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBufferHolder.java b/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBufferHolder.java index 5ed03c326..bd5827639 100644 --- a/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBufferHolder.java +++ b/src/main/java/net/coderbot/iris/gl/buffer/ShaderStorageBufferHolder.java @@ -1,6 +1,6 @@ package net.coderbot.iris.gl.buffer; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; import com.gtnewhorizons.angelica.glsm.RenderSystem; import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import net.coderbot.iris.gl.sampler.SamplerLimits; @@ -38,7 +38,7 @@ public class ShaderStorageBufferHolder { if (bufferInfo.relative()) { buffers[index].resizeIfRelative(width, height); } else { - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, buffer); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, buffer); RenderSystem.bufferStorage(GL43.GL_SHADER_STORAGE_BUFFER, bufferInfo.size(), 0); RenderSystem.clearBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, GL30.GL_R8, 0, bufferInfo.size(), GL11.GL_RED, GL11.GL_BYTE, new int[]{0}); RenderSystem.bindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, index, buffer); @@ -49,7 +49,7 @@ public class ShaderStorageBufferHolder { destroyBuffers(); throw e; } finally { - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); } } diff --git a/src/main/java/net/coderbot/iris/gl/framebuffer/GlFramebuffer.java b/src/main/java/net/coderbot/iris/gl/framebuffer/GlFramebuffer.java index 02ada8c3e..206690b20 100644 --- a/src/main/java/net/coderbot/iris/gl/framebuffer/GlFramebuffer.java +++ b/src/main/java/net/coderbot/iris/gl/framebuffer/GlFramebuffer.java @@ -3,7 +3,8 @@ package net.coderbot.iris.gl.framebuffer; import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryStack.*; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryStack; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache; import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; @@ -25,8 +26,8 @@ public class GlFramebuffer extends GlResource { super(RenderSystem.createFramebuffer()); this.attachments = new Int2IntArrayMap(); - this.maxDrawBuffers = GLStateManager.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS); - this.maxColorAttachments = GLStateManager.glGetInteger(GL30.GL_MAX_COLOR_ATTACHMENTS); + this.maxDrawBuffers = GLSMQueries.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS); + this.maxColorAttachments = GLSMQueries.glGetInteger(GL30.GL_MAX_COLOR_ATTACHMENTS); this.hasDepthAttachment = false; } @@ -100,25 +101,25 @@ public class GlFramebuffer extends GlResource { } public void bind() { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, getGlId()); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, getGlId()); } public void bindAsReadBuffer() { - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, getGlId()); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, getGlId()); } public void bindAsDrawBuffer() { - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, getGlId()); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, getGlId()); } @Override protected void destroyInternal() { - GLStateManager.glDeleteFramebuffers(getGlId()); + GLSMFramebuffer.glDeleteFramebuffers(getGlId()); } public int getStatus() { bind(); - return GLStateManager.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER); + return GLSMFramebuffer.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER); } public boolean isComplete() { diff --git a/src/main/java/net/coderbot/iris/gl/image/GlImage.java b/src/main/java/net/coderbot/iris/gl/image/GlImage.java index 145a970a3..ba5d9d587 100644 --- a/src/main/java/net/coderbot/iris/gl/image/GlImage.java +++ b/src/main/java/net/coderbot/iris/gl/image/GlImage.java @@ -1,6 +1,6 @@ package net.coderbot.iris.gl.image; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.texture.InternalTextureFormat; import com.gtnewhorizons.angelica.glsm.texture.PixelFormat; @@ -39,14 +39,14 @@ public class GlImage extends GlObject { GLDebug.nameObject(GL11.GL_TEXTURE, handle(), name); - GLStateManager.glBindTexture(target.getGlType(), handle()); + GLSMTextures.glBindTexture(target.getGlType(), handle()); target.apply(handle(), width, height, depth, internalFormat.getGlFormat(), format.getGlFormat(), pixelType.getGlFormat(), null); final int texture = handle(); setup(texture, width, height, depth); - GLStateManager.glBindTexture(target.getGlType(), 0); + GLSMTextures.glBindTexture(target.getGlType(), 0); BY_NAME.put(name, this); } @@ -112,7 +112,7 @@ public class GlImage extends GlObject { @Override protected void destroyInternal() { - GLStateManager.glDeleteTextures(handle()); + GLSMTextures.glDeleteTextures(handle()); BY_NAME.remove(name, this); } @@ -147,14 +147,14 @@ public class GlImage extends GlObject { @Override public void updateNewSize(int width, int height) { - GLStateManager.glBindTexture(target.getGlType(), handle()); + GLSMTextures.glBindTexture(target.getGlType(), handle()); target.apply(handle(), (int) (width * relativeWidth), (int) (height * relativeHeight), 0, internalTextureFormat.getGlFormat(), format.getGlFormat(), pixelType.getGlFormat(), null); final int texture = handle(); setup(texture, width, height, 0); - GLStateManager.glBindTexture(target.getGlType(), 0); + GLSMTextures.glBindTexture(target.getGlType(), 0); } } } diff --git a/src/main/java/net/coderbot/iris/gl/program/ComputeProgram.java b/src/main/java/net/coderbot/iris/gl/program/ComputeProgram.java index d95501fe6..1a2d5cf9f 100644 --- a/src/main/java/net/coderbot/iris/gl/program/ComputeProgram.java +++ b/src/main/java/net/coderbot/iris/gl/program/ComputeProgram.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.Nullable; import org.joml.Vector2f; import org.joml.Vector3i; import org.lwjgl.BufferUtils; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import org.lwjgl.opengl.GL42; import org.lwjgl.opengl.GL43; @@ -71,7 +71,7 @@ public final class ComputeProgram extends GlResource { } public void use() { - GLStateManager.glUseProgram(getGlId()); + GLSMPrograms.glUseProgram(getGlId()); uniforms.update(); samplers.update(); @@ -94,7 +94,7 @@ public final class ComputeProgram extends GlResource { public static void unbind() { ProgramUniforms.clearActiveUniforms(); ProgramSamplers.clearActiveSamplers(); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); } @Override @@ -103,7 +103,7 @@ public final class ComputeProgram extends GlResource { if (sources != null) { RetainedPrograms.retain(sources, getGlId()); } else { - GLStateManager.glDeleteProgram(getGlId()); + GLSMPrograms.glDeleteProgram(getGlId()); } } diff --git a/src/main/java/net/coderbot/iris/gl/program/Program.java b/src/main/java/net/coderbot/iris/gl/program/Program.java index 3302d58c7..dc6fdbd67 100644 --- a/src/main/java/net/coderbot/iris/gl/program/Program.java +++ b/src/main/java/net/coderbot/iris/gl/program/Program.java @@ -3,6 +3,7 @@ package net.coderbot.iris.gl.program; import lombok.Getter; import net.coderbot.iris.gl.GlResource; import net.coderbot.iris.gl.blending.DepthColorStorage; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import org.jetbrains.annotations.Nullable; @@ -59,7 +60,7 @@ public final class Program extends GlResource { final int previousManagedBind = managedBindProgram; managedBindProgram = program; try { - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); } finally { managedBindProgram = previousManagedBind; } @@ -70,7 +71,7 @@ public final class Program extends GlResource { try { ProgramUniforms.clearActiveUniforms(); ProgramSamplers.clearActiveSamplers(); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); } finally { GLStateManager.resumeExitCapture(suspended); } @@ -82,7 +83,7 @@ public final class Program extends GlResource { if (sources != null) { RetainedPrograms.retain(sources, getGlId()); } else { - GLStateManager.glDeleteProgram(getGlId()); + GLSMPrograms.glDeleteProgram(getGlId()); } } diff --git a/src/main/java/net/coderbot/iris/gl/program/ProgramBuilder.java b/src/main/java/net/coderbot/iris/gl/program/ProgramBuilder.java index ba079434b..0258ff535 100644 --- a/src/main/java/net/coderbot/iris/gl/program/ProgramBuilder.java +++ b/src/main/java/net/coderbot/iris/gl/program/ProgramBuilder.java @@ -2,7 +2,7 @@ package net.coderbot.iris.gl.program; import com.google.common.collect.ImmutableSet; import com.gtnewhorizons.angelica.glsm.DisplayListManager; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.recording.CommandRecorder; import com.gtnewhorizons.angelica.glsm.shader.ProgramBinaryCache; @@ -61,7 +61,7 @@ public class ProgramBuilder extends ProgramUniforms.Builder implements SamplerHo initializeFallbackUniforms(retained); return new ProgramBuilder(name, retained, reservedTextureUnits).retainAs(sources); } - GLStateManager.glDeleteProgram(retained); + GLSMPrograms.glDeleteProgram(retained); } if (cacheKey != null) { @@ -97,14 +97,14 @@ public class ProgramBuilder extends ProgramUniforms.Builder implements SamplerHo /** Initialize alpha and color uniforms to neutral values until the first pass update. */ private static void initializeFallbackUniforms(int programId) { - final int previous = GLStateManager.getActiveProgram(); + final int previous = GLSMPrograms.getActiveProgram(); final CommandRecorder recorder = DisplayListManager.isRecording() ? DisplayListManager.pauseRecording() : null; try { Program.bindManaged(programId); seedUniform1i(programId, "iris_currentAlphaFunc", 7); seedUniform1f(programId, "iris_currentAlphaTest", -1.0f); seedUniform1f(programId, "alphaTestRef", -1.0f); - final int modulator = GLStateManager.glGetUniformLocation(programId, "iris_ColorModulator"); + final int modulator = GLSMPrograms.glGetUniformLocation(programId, "iris_ColorModulator"); if (modulator != -1) { RenderSystem.uniform4f(modulator, 1.0f, 1.0f, 1.0f, 1.0f); } @@ -118,14 +118,14 @@ public class ProgramBuilder extends ProgramUniforms.Builder implements SamplerHo } private static void seedUniform1i(int programId, String name, int value) { - final int location = GLStateManager.glGetUniformLocation(programId, name); + final int location = GLSMPrograms.glGetUniformLocation(programId, name); if (location != -1) { RenderSystem.uniform1i(location, value); } } private static void seedUniform1f(int programId, String name, float value) { - final int location = GLStateManager.glGetUniformLocation(programId, name); + final int location = GLSMPrograms.glGetUniformLocation(programId, name); if (location != -1) { RenderSystem.uniform1f(location, value); } @@ -146,7 +146,7 @@ public class ProgramBuilder extends ProgramUniforms.Builder implements SamplerHo if (cacheKey == null || ProgramBinaryCache.saveRetained(cacheKey, retained)) { return new ProgramBuilder(name, retained, reservedTextureUnits).retainAs(sources); } - GLStateManager.glDeleteProgram(retained); + GLSMPrograms.glDeleteProgram(retained); } if (cacheKey != null) { diff --git a/src/main/java/net/coderbot/iris/gl/program/ProgramImages.java b/src/main/java/net/coderbot/iris/gl/program/ProgramImages.java index 60a7e4c76..7a83e1e5a 100644 --- a/src/main/java/net/coderbot/iris/gl/program/ProgramImages.java +++ b/src/main/java/net/coderbot/iris/gl/program/ProgramImages.java @@ -6,7 +6,7 @@ import net.coderbot.iris.gl.image.ImageBinding; import net.coderbot.iris.gl.image.ImageHolder; import net.coderbot.iris.gl.image.ImageLimits; import com.gtnewhorizons.angelica.glsm.texture.InternalTextureFormat; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import java.util.ArrayList; import java.util.List; @@ -60,12 +60,12 @@ public class ProgramImages { @Override public boolean hasImage(String name) { - return GLStateManager.glGetUniformLocation(program, name) != -1; + return GLSMPrograms.glGetUniformLocation(program, name) != -1; } @Override public void addTextureImage(IntSupplier textureID, InternalTextureFormat internalFormat, String name) { - int location = GLStateManager.glGetUniformLocation(program, name); + int location = GLSMPrograms.glGetUniformLocation(program, name); if (location == -1) { return; diff --git a/src/main/java/net/coderbot/iris/gl/program/ProgramSamplers.java b/src/main/java/net/coderbot/iris/gl/program/ProgramSamplers.java index de8247e2e..3e65c3f2a 100644 --- a/src/main/java/net/coderbot/iris/gl/program/ProgramSamplers.java +++ b/src/main/java/net/coderbot/iris/gl/program/ProgramSamplers.java @@ -2,7 +2,7 @@ package net.coderbot.iris.gl.program; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import net.coderbot.iris.gl.sampler.GlSampler; @@ -40,7 +40,7 @@ public class ProgramSamplers { active = this; - int activeTexture = GLStateManager.getActiveTextureUnit(); + int activeTexture = GLSMTextures.getActiveTextureUnit(); try { if (initializer != null) { for (GlUniform1iCall call : initializer) { @@ -57,7 +57,7 @@ public class ProgramSamplers { clearActiveSamplers(); throw e; } finally { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + activeTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + activeTexture); } } diff --git a/src/main/java/net/coderbot/iris/gl/program/ProgramUniforms.java b/src/main/java/net/coderbot/iris/gl/program/ProgramUniforms.java index abbb61ede..d17c22479 100644 --- a/src/main/java/net/coderbot/iris/gl/program/ProgramUniforms.java +++ b/src/main/java/net/coderbot/iris/gl/program/ProgramUniforms.java @@ -2,7 +2,7 @@ package net.coderbot.iris.gl.program; import com.google.common.collect.ImmutableList; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.DisplayListManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import java.nio.IntBuffer; @@ -72,7 +72,7 @@ public class ProgramUniforms { public void update() { // glUseProgram is only recorded during GL_COMPILE if (DisplayListManager.getRecordMode() == DisplayListManager.RecordMode.COMPILE - || GLStateManager.getActiveProgram() != program) { + || GLSMPrograms.getActiveProgram() != program) { hasDeferredUploads = true; return; } @@ -128,7 +128,7 @@ public class ProgramUniforms { } public static boolean isActiveProgramBound() { - return active != null && GLStateManager.getActiveProgram() == active.program; + return active != null && GLSMPrograms.getActiveProgram() == active.program; } public static void markActiveDeferred() { @@ -212,7 +212,7 @@ public class ProgramUniforms { public ProgramUniforms buildUniforms() { // Check for any unsupported uniforms and warn about them so that we can easily figure out what uniforms we need to add. - final int activeUniforms = GLStateManager.glGetProgrami(program, GL20.GL_ACTIVE_UNIFORMS); + final int activeUniforms = GLSMPrograms.glGetProgrami(program, GL20.GL_ACTIVE_UNIFORMS); IntBuffer sizeType = BufferUtils.createIntBuffer(2); for (int index = 0; index < activeUniforms; index++) { diff --git a/src/main/java/net/coderbot/iris/gl/program/RetainedPrograms.java b/src/main/java/net/coderbot/iris/gl/program/RetainedPrograms.java index 3c8aff160..8eb6e1e7f 100644 --- a/src/main/java/net/coderbot/iris/gl/program/RetainedPrograms.java +++ b/src/main/java/net/coderbot/iris/gl/program/RetainedPrograms.java @@ -1,6 +1,6 @@ package net.coderbot.iris.gl.program; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import org.jetbrains.annotations.Nullable; import java.util.ArrayDeque; @@ -51,7 +51,7 @@ public final class RetainedPrograms { public static void afterPipelineBuilt() { for (ArrayDeque programs : older.values()) { for (int program : programs) { - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glDeleteProgram(program); } } older = recent; diff --git a/src/main/java/net/coderbot/iris/gl/sampler/SamplerLimits.java b/src/main/java/net/coderbot/iris/gl/sampler/SamplerLimits.java index 343df8df9..456b2f075 100644 --- a/src/main/java/net/coderbot/iris/gl/sampler/SamplerLimits.java +++ b/src/main/java/net/coderbot/iris/gl/sampler/SamplerLimits.java @@ -1,6 +1,6 @@ package net.coderbot.iris.gl.sampler; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import com.gtnewhorizons.angelica.glsm.RenderSystem; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL20; @@ -13,9 +13,9 @@ public class SamplerLimits { private final int maxShaderStorageUnits; private SamplerLimits() { - this.maxTextureUnits = GLStateManager.glGetInteger(GL20.GL_MAX_TEXTURE_IMAGE_UNITS); - this.maxDrawBuffers = GLStateManager.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS); - this.maxShaderStorageUnits = RenderSystem.supportsSSBO() ? GLStateManager.glGetInteger(GL43.GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS) : 0; + this.maxTextureUnits = GLSMQueries.glGetInteger(GL20.GL_MAX_TEXTURE_IMAGE_UNITS); + this.maxDrawBuffers = GLSMQueries.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS); + this.maxShaderStorageUnits = RenderSystem.supportsSSBO() ? GLSMQueries.glGetInteger(GL43.GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS) : 0; } public static SamplerLimits get() { diff --git a/src/main/java/net/coderbot/iris/gl/shader/GlShader.java b/src/main/java/net/coderbot/iris/gl/shader/GlShader.java index 68b4fa6f4..ebf4ad7f1 100644 --- a/src/main/java/net/coderbot/iris/gl/shader/GlShader.java +++ b/src/main/java/net/coderbot/iris/gl/shader/GlShader.java @@ -3,7 +3,7 @@ package net.coderbot.iris.gl.shader; import com.gtnewhorizons.angelica.glsm.GLDebug; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.shader.ShaderType; import net.coderbot.iris.gl.GlResource; @@ -30,12 +30,12 @@ public class GlShader extends GlResource { } private static int createShader(ShaderType type, String name, String src) { - int handle = GLStateManager.glCreateShader(type.id); + int handle = GLSMPrograms.glCreateShader(type.id); // TODO: Iris // ShaderWorkarounds.safeShaderSource(handle, src); // TODO: ShaderWorkaround - GLStateManager.glShaderSource(handle, src + '\0'); - GLStateManager.glCompileShader(handle); + GLSMPrograms.glShaderSource(handle, src + '\0'); + GLSMPrograms.glCompileShader(handle); GLDebug.nameObject(KHRDebug.GL_SHADER, handle, name + "(" + type.name().toLowerCase(Locale.ROOT) + ")"); @@ -45,7 +45,7 @@ public class GlShader extends GlResource { LOGGER.warn("Shader compilation log for " + name + ": " + log); } - int result = GLStateManager.glGetShaderi(handle, GL20.GL_COMPILE_STATUS); + int result = GLSMPrograms.glGetShaderi(handle, GL20.GL_COMPILE_STATUS); if (result != GL11.GL_TRUE) { throw new RuntimeException("Shader compilation failed, see log for details"); @@ -64,6 +64,6 @@ public class GlShader extends GlResource { @Override protected void destroyInternal() { - GLStateManager.glDeleteShader(this.getGlId()); + GLSMPrograms.glDeleteShader(this.getGlId()); } } diff --git a/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java b/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java index 57ad40002..83cdf3d82 100644 --- a/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java +++ b/src/main/java/net/coderbot/iris/gl/shader/ProgramCreator.java @@ -3,7 +3,7 @@ package net.coderbot.iris.gl.shader; import com.gtnewhorizons.angelica.glsm.GLDebug; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs; import com.gtnewhorizons.angelica.glsm.hooks.ImmediateExtendedAttribHandler; @@ -51,17 +51,17 @@ public class ProgramCreator { } public static int create(String name, @Nullable ProgramBinaryCache.Key cacheKey, GlShader... shaders) { - int program = GLStateManager.glCreateProgram(); + int program = GLSMPrograms.glCreateProgram(); for (int i = 0; i < ATTRIBUTE_NAMES.length; i++) { RenderSystem.bindAttributeLocation(program, ATTRIBUTE_LOCATIONS[i], ATTRIBUTE_NAMES[i]); } for (GlShader shader : shaders) { - GLStateManager.glAttachShader(program, shader.getHandle()); + GLSMPrograms.glAttachShader(program, shader.getHandle()); } - GLStateManager.glLinkProgram(program); + GLSMPrograms.glLinkProgram(program); GLDebug.nameObject(KHRDebug.GL_PROGRAM, program, name); @@ -76,7 +76,7 @@ public class ProgramCreator { LOGGER.warn("Program link log for " + name + ": " + log); } - int result = GLStateManager.glGetProgrami(program, GL20.GL_LINK_STATUS); + int result = GLSMPrograms.glGetProgrami(program, GL20.GL_LINK_STATUS); if (result != GL11.GL_TRUE) { throw new RuntimeException("Shader program linking failed, see log for details"); diff --git a/src/main/java/net/coderbot/iris/gl/shader/StandardMacros.java b/src/main/java/net/coderbot/iris/gl/shader/StandardMacros.java index cf306f7f3..0d11ed3bb 100644 --- a/src/main/java/net/coderbot/iris/gl/shader/StandardMacros.java +++ b/src/main/java/net/coderbot/iris/gl/shader/StandardMacros.java @@ -15,7 +15,7 @@ import net.coderbot.iris.texture.format.TextureFormat; import net.coderbot.iris.texture.format.TextureFormatLoader; import net.coderbot.iris.uniforms.VanillaBiomeList; import net.minecraft.world.biome.BiomeGenBase; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import org.lwjgl.LWJGLUtil; @@ -190,7 +190,7 @@ public class StandardMacros { * @see Optifine Doc for GLSL Version */ public static String getGlVersion(int name) { - return RenderSystem.parseGlVersionString(GLStateManager.glGetString(name)); + return RenderSystem.parseGlVersionString(GLSMQueries.glGetString(name)); } /** @@ -219,7 +219,7 @@ public class StandardMacros { * @see Optifine Doc */ public static String getVendor() { - String vendor = Objects.requireNonNull(GLStateManager.glGetString(GL11.GL_VENDOR)).toLowerCase(Locale.ROOT); + String vendor = Objects.requireNonNull(GLSMQueries.glGetString(GL11.GL_VENDOR)).toLowerCase(Locale.ROOT); if (vendor.startsWith("ati")) { return "MC_GL_VENDOR_ATI"; } else if (vendor.startsWith("intel")) { @@ -241,7 +241,7 @@ public class StandardMacros { * @see Optifine Doc */ public static String getRenderer() { - String renderer = Objects.requireNonNull(GLStateManager.glGetString(GL11.GL_RENDERER)).toLowerCase(Locale.ROOT); + String renderer = Objects.requireNonNull(GLSMQueries.glGetString(GL11.GL_RENDERER)).toLowerCase(Locale.ROOT); if (renderer.startsWith("amd")) { return "MC_GL_RENDERER_RADEON"; } else if (renderer.startsWith("ati")) { @@ -274,10 +274,10 @@ public class StandardMacros { * @see Optifine Doc */ public static Set getGlExtensions() { - int numExtensions = GLStateManager.glGetInteger(GL30.GL_NUM_EXTENSIONS); + int numExtensions = GLSMQueries.glGetInteger(GL30.GL_NUM_EXTENSIONS); String[] extensions = new String[numExtensions]; for (int i = 0; i < numExtensions; i++) { - extensions[i] = GLStateManager.glGetStringi(GL11.GL_EXTENSIONS, i); + extensions[i] = GLSMQueries.glGetStringi(GL11.GL_EXTENSIONS, i); } // TODO note that we do not add extensions based on if the shader uses them and if they are supported diff --git a/src/main/java/net/coderbot/iris/gl/texture/DepthCopyStrategy.java b/src/main/java/net/coderbot/iris/gl/texture/DepthCopyStrategy.java index 44d384d50..63fa43daa 100644 --- a/src/main/java/net/coderbot/iris/gl/texture/DepthCopyStrategy.java +++ b/src/main/java/net/coderbot/iris/gl/texture/DepthCopyStrategy.java @@ -1,5 +1,6 @@ package net.coderbot.iris.gl.texture; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; @@ -97,7 +98,7 @@ public interface DepthCopyStrategy { public void copy(GlFramebuffer sourceFb, int sourceTexture, GlFramebuffer destFb, int destTexture, int width, int height) { if (Tracy.ENABLED) Tracy.beginZone(Z_DEPTH_COPY_IMAGE); try { - GLStateManager.glCopyImageSubData(sourceTexture, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, destTexture, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1); + GLSMTextures.glCopyImageSubData(sourceTexture, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, destTexture, GL11.GL_TEXTURE_2D, 0, 0, 0, 0, width, height, 1); } finally { if (Tracy.ENABLED) Tracy.endZone(); } diff --git a/src/main/java/net/coderbot/iris/gl/texture/GlTexture.java b/src/main/java/net/coderbot/iris/gl/texture/GlTexture.java index fcedfab4e..6389e8dd9 100644 --- a/src/main/java/net/coderbot/iris/gl/texture/GlTexture.java +++ b/src/main/java/net/coderbot/iris/gl/texture/GlTexture.java @@ -2,7 +2,7 @@ package net.coderbot.iris.gl.texture; import com.gtnewhorizons.angelica.glsm.texture.TextureType; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import net.coderbot.iris.shaderpack.texture.TextureFilteringData; import org.embeddedt.embeddium.impl.gl.GlObject; @@ -20,7 +20,7 @@ public class GlTexture extends GlObject implements TextureAccess { private final TextureType target; public GlTexture(TextureType target, int sizeX, int sizeY, int sizeZ, int internalFormat, int format, int pixelType, byte[] pixels, TextureFilteringData filteringData) { - this.setHandle(GLStateManager.glGenTextures()); + this.setHandle(GLSMTextures.glGenTextures()); bindTextureForSetup(target.getGlType(), handle()); TextureUploadHelper.resetTextureUploadState(); @@ -56,7 +56,7 @@ public class GlTexture extends GlObject implements TextureAccess { } public static void bindTextureForSetup(int glType, int glId) { - GLStateManager.glBindTexture(glType, glId); + GLSMTextures.glBindTexture(glType, glId); } public TextureType getTarget() { @@ -79,6 +79,6 @@ public class GlTexture extends GlObject implements TextureAccess { @Override protected void destroyInternal() { - GLStateManager.glDeleteTextures(handle()); + GLSMTextures.glDeleteTextures(handle()); } } diff --git a/src/main/java/net/coderbot/iris/gl/texture/TextureUploadHelper.java b/src/main/java/net/coderbot/iris/gl/texture/TextureUploadHelper.java index c4b03f280..73da2675f 100644 --- a/src/main/java/net/coderbot/iris/gl/texture/TextureUploadHelper.java +++ b/src/main/java/net/coderbot/iris/gl/texture/TextureUploadHelper.java @@ -1,6 +1,6 @@ package net.coderbot.iris.gl.texture; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import org.lwjgl.opengl.GL11; public class TextureUploadHelper { @@ -15,9 +15,9 @@ public class TextureUploadHelper { // It is likely that this also avoids the crashes on AMD that I previously experienced with texture creation. // // This code is from Canvas: https://github.com/grondag/canvas/commit/f0ab652d7a8b7cc9febf0209bee15cffce9eac83 - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 0); - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ROW_LENGTH, 0); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_ROWS, 0); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_SKIP_PIXELS, 0); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 4); } } diff --git a/src/main/java/net/coderbot/iris/gui/GuiUtil.java b/src/main/java/net/coderbot/iris/gui/GuiUtil.java index aa54a5959..4301d22aa 100644 --- a/src/main/java/net/coderbot/iris/gui/GuiUtil.java +++ b/src/main/java/net/coderbot/iris/gui/GuiUtil.java @@ -1,6 +1,9 @@ package net.coderbot.iris.gui; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import cpw.mods.fml.client.config.GuiUtils; import lombok.Getter; import net.minecraft.client.Minecraft; @@ -63,11 +66,11 @@ public final class GuiUtil { final int vOffset = disabled ? 46 : hovered ? 86 : 66; // Sets RenderSystem to use solid white as the tint color for blend mode, and enables blend mode - GLStateManager.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.enableBlend(); + GLSMBlend.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f); + GLSMBlend.enableBlend(); // Sets RenderSystem to be able to use textures when drawing - GLStateManager.enableTexture(); + GLSMTextures.enableTexture(); // Top left section GuiUtils.drawTexturedModalRect(x, y, 0, vOffset, halfWidth, halfHeight, 0); @@ -141,10 +144,10 @@ public final class GuiUtil { final Minecraft mc = client(); final int scale = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight).getScaleFactor(); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(minX * scale, mc.displayHeight - (maxY * scale), boxWidth * scale, (maxY - minY) * scale); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(minX * scale, mc.displayHeight - (maxY * scale), boxWidth * scale, (maxY - minY) * scale); font.drawStringWithShadow(text, minX - scroll, textY, color); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); } else { int textX = centerX - (textWidth / 2); textX = Math.min(textX, maxX - textWidth); @@ -247,11 +250,11 @@ public final class GuiUtil { */ public void draw(int x, int y) { // Sets RenderSystem to use solid white as the tint color for blend mode, and enables blend mode - GLStateManager.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.enableBlend(); + GLSMBlend.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f); + GLSMBlend.enableBlend(); // Sets RenderSystem to be able to use textures when drawing - GLStateManager.enableTexture(); + GLSMTextures.enableTexture(); // Draw the texture to the screen GuiUtils.drawTexturedModalRect(x, y, u, v, width, height, 256); diff --git a/src/main/java/net/coderbot/iris/gui/element/IrisGuiSlot.java b/src/main/java/net/coderbot/iris/gui/element/IrisGuiSlot.java index ef4490781..dac4ea5c9 100644 --- a/src/main/java/net/coderbot/iris/gui/element/IrisGuiSlot.java +++ b/src/main/java/net/coderbot/iris/gui/element/IrisGuiSlot.java @@ -1,6 +1,7 @@ package net.coderbot.iris.gui.element; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import lombok.Getter; import lombok.Setter; import net.minecraft.client.Minecraft; @@ -166,8 +167,8 @@ public abstract class IrisGuiSlot extends GuiSlot { this.bindAmountScrolled(); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glDisable(GL11.GL_FOG); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_FOG); final Tessellator tessellator = Tessellator.instance; drawContainerBackground(tessellator); final int elementRight = this.left + this.width / 2 - this.getListWidth() / 2 + 2; @@ -178,14 +179,14 @@ public abstract class IrisGuiSlot extends GuiSlot { } this.drawSelectionBox(elementRight, relativeY, mouseX, mouseY); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); this.overlayBackground(0, this.top, 255, 255); this.overlayBackground(this.bottom, this.height, 255, 255); - GLStateManager.glEnable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 0, 1); - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); - GLStateManager.glShadeModel(GL11.GL_SMOOTH); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); + GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); tessellator.startDrawingQuads(); tessellator.setColorRGBA_I(0, 0); tessellator.addVertexWithUV(this.left, (this.top + offset), 0.0D, 0.0D, 1.0D); @@ -246,9 +247,9 @@ public abstract class IrisGuiSlot extends GuiSlot { tessellator.draw(); } - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glShadeModel(GL11.GL_FLAT); - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glDisable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMRasterizer.glShadeModel(GL11.GL_FLAT); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMEnable.glDisable(GL11.GL_BLEND); } } diff --git a/src/main/java/net/coderbot/iris/gui/element/shaderoptions/HeaderEntry.java b/src/main/java/net/coderbot/iris/gui/element/shaderoptions/HeaderEntry.java index 523f16761..36a0a63e9 100644 --- a/src/main/java/net/coderbot/iris/gui/element/shaderoptions/HeaderEntry.java +++ b/src/main/java/net/coderbot/iris/gui/element/shaderoptions/HeaderEntry.java @@ -1,6 +1,6 @@ package net.coderbot.iris.gui.element.shaderoptions; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import net.coderbot.iris.Iris; import net.coderbot.iris.gui.GuiUtil; import net.coderbot.iris.gui.NavigationController; @@ -91,7 +91,7 @@ public class HeaderEntry extends BaseEntry { public void drawEntry(ShaderPackScreen screen, int index, int x, int y, int slotWidth, int slotHeight, Tessellator tessellator, int mouseX, int mouseY, boolean isMouseOver) { Gui.drawRect(x - 3, (y + slotHeight) - 3, x + slotWidth, (y + slotHeight) - 2, 0x66BEBEBE); // Gui.drawRect leaves GL color set to the rect's color; reset to white so button textures aren't tinted. - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); final int tickDelta = 0; final FontRenderer font = Minecraft.getMinecraft().fontRenderer; diff --git a/src/main/java/net/coderbot/iris/gui/element/widget/IrisImageButton.java b/src/main/java/net/coderbot/iris/gui/element/widget/IrisImageButton.java index 1d74a842a..68be62835 100644 --- a/src/main/java/net/coderbot/iris/gui/element/widget/IrisImageButton.java +++ b/src/main/java/net/coderbot/iris/gui/element/widget/IrisImageButton.java @@ -1,6 +1,7 @@ package net.coderbot.iris.gui.element.widget; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import cpw.mods.fml.client.config.GuiUtils; import net.minecraft.client.Minecraft; import net.minecraft.util.ResourceLocation; @@ -36,11 +37,11 @@ public class IrisImageButton extends IrisButton { } // Sets RenderSystem to use solid white as the tint color for blend mode, and enables blend mode - GLStateManager.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f); - GLStateManager.enableBlend(); + GLSMBlend.glBlendColor(1.0f, 1.0f, 1.0f, 1.0f); + GLSMBlend.enableBlend(); // Sets RenderSystem to be able to use textures when drawing - GLStateManager.enableTexture(); + GLSMTextures.enableTexture(); mc.getTextureManager().bindTexture(this.textureLocation); // Draw the texture to the screen diff --git a/src/main/java/net/coderbot/iris/gui/screen/ShaderPackScreen.java b/src/main/java/net/coderbot/iris/gui/screen/ShaderPackScreen.java index f8824fae5..f88aa8c52 100644 --- a/src/main/java/net/coderbot/iris/gui/screen/ShaderPackScreen.java +++ b/src/main/java/net/coderbot/iris/gui/screen/ShaderPackScreen.java @@ -1,7 +1,7 @@ package net.coderbot.iris.gui.screen; import com.gtnewhorizons.angelica.AngelicaMod; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.glsm.shader.ProgramBinaryCache; @@ -132,7 +132,7 @@ public class ShaderPackScreen extends GuiScreen implements HudHideable { @Override public void drawScreen(int mouseX, int mouseY, float delta) { - GLStateManager.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_COLOR_BUFFER_BIT); try { if(dirty) { dirty = false; @@ -215,7 +215,7 @@ public class ShaderPackScreen extends GuiScreen implements HudHideable { this.fontRendererObj.drawStringWithShadow(irisTextComponent, 2, this.height - 10, 0xFFFFFF); } } finally { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } } diff --git a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java index 85f824c68..9565a116a 100644 --- a/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java +++ b/src/main/java/net/coderbot/iris/layer/GbufferPrograms.java @@ -5,7 +5,9 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.coderbot.iris.Iris; import net.coderbot.iris.gbuffer_overrides.matching.SpecialCondition; import com.gtnewhorizons.angelica.glsm.DisplayListManager; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.ffp.FfpExtendedAttribs; import com.gtnewhorizons.angelica.iris.IrisDisplayListState; import net.coderbot.iris.gl.shader.ProgramCreator; @@ -148,23 +150,23 @@ public class GbufferPrograms { } public static void setCutoutDefaults() { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); if (DisplayListManager.getRecordMode() == DisplayListManager.RecordMode.NONE) { - GLStateManager.getTextures().getTextureUnitStates(1).enable(); + GLSMTextures.getTextures().getTextureUnitStates(1).enable(); return; } - final int previousUnit = GLStateManager.getActiveTextureUnitForServerState(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.enableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + previousUnit); + final int previousUnit = GLSMTextures.getActiveTextureUnitForServerState(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.enableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + previousUnit); } public static void setBlockEntityDefaults() { - GLStateManager.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short)-1, (short)-1); + GLSMCurrentAttribs.glVertexAttrib2s(ProgramCreator.MC_ENTITY, (short)-1, (short)-1); FfpExtendedAttribs.setNeutralCurrentValues(); - GLStateManager.glVertexAttrib4f(ProgramCreator.AT_MIDBLOCK, 0.0f, 0.0f, 0.0f, 0.0f); + GLSMCurrentAttribs.glVertexAttrib4f(ProgramCreator.AT_MIDBLOCK, 0.0f, 0.0f, 0.0f, 0.0f); } public static WorldRenderingPhase getCurrentPhase() { diff --git a/src/main/java/net/coderbot/iris/pipeline/ClearPass.java b/src/main/java/net/coderbot/iris/pipeline/ClearPass.java index 0d725032b..25daa061b 100644 --- a/src/main/java/net/coderbot/iris/pipeline/ClearPass.java +++ b/src/main/java/net/coderbot/iris/pipeline/ClearPass.java @@ -1,6 +1,8 @@ package net.coderbot.iris.pipeline; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import net.coderbot.iris.gl.framebuffer.GlFramebuffer; import net.minecraft.client.Minecraft; import net.minecraft.profiler.Profiler; @@ -30,7 +32,7 @@ public class ClearPass { public void execute(Vector4f defaultClearColor) { final Profiler profiler = Minecraft.getMinecraft().mcProfiler; profiler.startSection(name); - GLStateManager.glViewport(0, 0, viewportX.getAsInt(), viewportY.getAsInt()); + GLSMRasterizer.glViewport(0, 0, viewportX.getAsInt(), viewportY.getAsInt()); framebuffer.bind(); Vector4f color = Objects.requireNonNull(defaultClearColor); @@ -39,8 +41,8 @@ public class ClearPass { color = this.color; } - GLStateManager.glClearColor(color.x, color.y, color.z, color.w); - GLStateManager.glClear(clearFlags); + GLSMBlend.glClearColor(color.x, color.y, color.z, color.w); + GLSMFramebuffer.glClear(clearFlags); profiler.endSection(); } diff --git a/src/main/java/net/coderbot/iris/pipeline/ClearPassCreator.java b/src/main/java/net/coderbot/iris/pipeline/ClearPassCreator.java index e1acc1302..c56e23c9f 100644 --- a/src/main/java/net/coderbot/iris/pipeline/ClearPassCreator.java +++ b/src/main/java/net/coderbot/iris/pipeline/ClearPassCreator.java @@ -10,7 +10,7 @@ import net.coderbot.iris.shaderpack.PackShadowDirectives; import net.coderbot.iris.shadows.ShadowRenderTargets; import org.joml.Vector2i; import org.joml.Vector4f; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL20; @@ -22,7 +22,7 @@ import java.util.Map; public class ClearPassCreator { public static ImmutableList createClearPasses(RenderTargets renderTargets, boolean fullClear, PackRenderTargetDirectives renderTargetDirectives) { - final int maxDrawBuffers = GLStateManager.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS); + final int maxDrawBuffers = GLSMQueries.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS); // Sort buffers by their clear color so we can group up glClear calls. Map> clearByColor = new HashMap<>(); @@ -82,7 +82,7 @@ public class ClearPassCreator { public static ImmutableList createShadowClearPasses(ShadowRenderTargets renderTargets, boolean fullClear, PackShadowDirectives renderTargetDirectives) { - final int maxDrawBuffers = GLStateManager.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS); + final int maxDrawBuffers = GLSMQueries.glGetInteger(GL20.GL_MAX_DRAW_BUFFERS); // Sort buffers by their clear color so we can group up glClear calls. Map clearByColor = new HashMap<>(); diff --git a/src/main/java/net/coderbot/iris/pipeline/CustomTextureManager.java b/src/main/java/net/coderbot/iris/pipeline/CustomTextureManager.java index 85787381a..e94ba5182 100644 --- a/src/main/java/net/coderbot/iris/pipeline/CustomTextureManager.java +++ b/src/main/java/net/coderbot/iris/pipeline/CustomTextureManager.java @@ -1,7 +1,8 @@ package net.coderbot.iris.pipeline; import com.gtnewhorizons.angelica.compat.mojang.NativeImage; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.mixins.interfaces.EntityRendererAccessor; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectMaps; @@ -200,10 +201,10 @@ public class CustomTextureManager { final TextureFormat textureFormat = TextureFormatLoader.getFormat(); if (textureFormat != null) { - final int previousBinding = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, pbrTexture.getGlTextureId()); + final int previousBinding = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, pbrTexture.getGlTextureId()); textureFormat.setupTextureParameters(pbrType, pbrTexture); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previousBinding); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previousBinding); } return pbrTexture.getGlTextureId(); diff --git a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java index 4f03b9c53..27a79db99 100644 --- a/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/DeferredWorldRenderingPipeline.java @@ -14,6 +14,15 @@ import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniformMatrix3f; import org.embeddedt.embeddium.impl.gl.shader.uniform.GlUniformMatrix4f; import org.joml.Matrix3f; import org.joml.Matrix4fc; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.ffp.Instancing; @@ -258,10 +267,10 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R final long _t0 = System.nanoTime(); long _tLast = _t0; - final int entryTextureUnit = GLStateManager.getActiveTextureUnit(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); + final int entryTextureUnit = GLSMTextures.getActiveTextureUnit(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); customTextureManager = new CustomTextureManager(programs.getPackDirectives(), programs.getPack().getCustomTextureDataMap(), programs.getPack().getIrisCustomTextureDataMap(), programs.getPack().getCustomNoiseTexture()); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + entryTextureUnit); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + entryTextureUnit); final Map>> prepareTransformFutures = submitCompositeTransforms(programs.getPrepare(), TextureStage.PREPARE, programs.getPackDirectives().getTextureMap()); @@ -392,7 +401,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R updatePbrSamplers(TextureFormatLoader.getFormat(), SodiumGameOptions.resolvedAnisotropicFiltering()); // Don't clobber anything in texture unit 0. It probably won't cause issues, but we're just being cautious here. - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); whitePixel = new NativeImageBackedSingleColorTexture(255, 255, 255, 255); @@ -428,7 +437,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R this.ssboHolder = null; } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); BufferFlipper flipper = new BufferFlipper(); @@ -1125,14 +1134,14 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R GLSMHooks.resolvePendingProgram(); final Pass pass = this.current; if (pass == null) { - if (GLStateManager.getActiveProgram() == 0) { + if (GLSMPrograms.getActiveProgram() == 0) { matchPass(); } return; } final Program program = pass.getProgram(); final GlFramebuffer expected = isBeforeTranslucent ? pass.framebufferBeforeTranslucents : pass.framebufferAfterTranslucents; - if (program != null && GLStateManager.getActiveProgram() == program.getProgramId() && GLStateManager.getDrawFramebuffer() == expected.getId()) { + if (program != null && GLSMPrograms.getActiveProgram() == program.getProgramId() && GLSMFramebuffer.getDrawFramebuffer() == expected.getId()) { return; } pass.use(); @@ -1476,10 +1485,10 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R } if (shadowViewport) { - GLStateManager.glViewport(0, 0, shadowMapResolution, shadowMapResolution); + GLSMRasterizer.glViewport(0, 0, shadowMapResolution, shadowMapResolution); } else { final Framebuffer main = Minecraft.getMinecraft().getFramebuffer(); - GLStateManager.glViewport(0, 0, main.framebufferWidth, main.framebufferHeight); + GLSMRasterizer.glViewport(0, 0, main.framebufferWidth, main.framebufferHeight); } // Apply state overrides before program.use() so that uniforms (e.g. iris_currentAlphaTest) @@ -1627,7 +1636,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R } private boolean usesImage(@Nullable Program program, String image) { - return program != null && (GLStateManager.glGetUniformLocation(program.getProgramId(), image) != -1 || vertexWriteReplays.writesImage(program, image)); + return program != null && (GLSMPrograms.glGetUniformLocation(program.getProgramId(), image) != -1 || vertexWriteReplays.writesImage(program, image)); } @Override @@ -1673,7 +1682,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R vertexWriteReplays.attach(name, program, transformed, (samplers, images) -> wireGbufferResources(samplers, images, availability, shadow)); this.customUniforms.mapholderToPass(builder, program); final int id = program.getProgramId(); - return new WideLineProgram(program, GLStateManager.glGetUniformLocation(id, "iris_LineWidth"), GLStateManager.glGetUniformLocation(id, "iris_ScreenSize")); + return new WideLineProgram(program, GLSMPrograms.glGetUniformLocation(id, "iris_LineWidth"), GLSMPrograms.glGetUniformLocation(id, "iris_ScreenSize")); } catch (Exception e) { Iris.logger.warn("Wide line program link failed for {}; lines there stay 1 px wide", sourceName, e); return null; @@ -1690,7 +1699,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R GLSMHooks.resolvePendingProgram(); final Pass pass = current; if (pass == null || pass.getProgram() == null || activeInstancing != Instancing.NONE - || GLStateManager.getActiveProgram() != pass.getProgram().getProgramId()) { + || GLSMPrograms.getActiveProgram() != pass.getProgram().getProgramId()) { return false; } @@ -1712,8 +1721,8 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R if (wide != null) { wide.program().use(); this.customUniforms.push(wide.program()); - final var viewport = GLStateManager.getViewportState(); - RenderSystem.uniform1f(wide.lineWidthLocation(), GLStateManager.getLineState().getWidth()); + final var viewport = GLSMRasterizer.getViewportState(); + RenderSystem.uniform1f(wide.lineWidthLocation(), GLSMRasterizer.getLineState().getWidth()); RenderSystem.uniform2f(wide.screenSizeLocation(), viewport.width, viewport.height); } return true; @@ -1746,9 +1755,9 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R DepthColorStorage.unlockDepthColor(); BlendModeOverride.restore(); AlphaTestOverride.restore(); - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); GLStateManager.incrementFragmentGeneration(); FullScreenQuadRenderer.clearLocCache(); @@ -1867,7 +1876,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R private void prepareRenderTargets() { parityState.onFrameStart(); // Make sure we're using texture unit 0 for this. - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); if (shadowRenderTargets != null) { profiler.startSection("iris_shadow_clear"); @@ -1881,7 +1890,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R } else { // Clear depth first, regardless of any color clearing. shadowRenderTargets.getDepthSourceFb().bind(); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); ImmutableList passes; @@ -1968,7 +1977,7 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R passes = clearPasses; } - final Vector3d fogColor3 = GLStateManager.getFogColor(); + final Vector3d fogColor3 = GLSMFog.getFogColor(); // NB: The alpha value must be 1.0 here, or else you will get a bunch of bugs. Sildur's Vibrant Shaders // will give you pink reflections and other weirdness if this is zero. @@ -2034,8 +2043,8 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R private void bindVoxelizationMatrixUniforms() { if (shadowVoxelizationCompute == null) return; final int id = shadowVoxelizationCompute.getProgramId(); - final int modelView = GLStateManager.glGetUniformLocation(id, "iris_ModelViewMatrix"); - final int normal = GLStateManager.glGetUniformLocation(id, "iris_NormalMatrix"); + final int modelView = GLSMPrograms.glGetUniformLocation(id, "iris_ModelViewMatrix"); + final int normal = GLSMPrograms.glGetUniformLocation(id, "iris_NormalMatrix"); this.voxelizationModelView = modelView >= 0 ? new GlUniformMatrix4f(modelView) : null; this.voxelizationNormalMatrix = normal >= 0 ? new GlUniformMatrix3f(normal) : null; } @@ -2214,8 +2223,8 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R profiler.endSection(); } - GLStateManager.enableBlend(); - GLStateManager.enableAlphaTest(); + GLSMBlend.enableBlend(); + GLSMDepthStencilAlpha.enableAlphaTest(); // note: we are careful not to touch the lightmap texture unit or overlay color texture unit here, // so we don't need to do anything to restore them if needed. @@ -2374,16 +2383,16 @@ public class DeferredWorldRenderingPipeline implements WorldRenderingPipeline, R if (true/*skyType == DimensionSpecialEffects.SkyType.NORMAL*/) { profiler.startSection("iris_horizon"); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glDepthMask(false); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMDepthStencilAlpha.glDepthMask(false); - final Vector3d fogColor = GLStateManager.getFogColor(); - GLStateManager.glColor4f((float) fogColor.x, (float) fogColor.y, (float) fogColor.z, 1.0F); + final Vector3d fogColor = GLSMFog.getFogColor(); + GLSMCurrentAttribs.glColor4f((float) fogColor.x, (float) fogColor.y, (float) fogColor.z, 1.0F); horizonRenderer.renderHorizon(RenderingState.INSTANCE.getModelViewBuffer()); - GLStateManager.glDepthMask(true); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); profiler.endSection(); } } diff --git a/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java b/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java index 81828bc9e..130ee63b1 100644 --- a/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java +++ b/src/main/java/net/coderbot/iris/pipeline/FixedFunctionWorldRenderingPipeline.java @@ -1,7 +1,7 @@ package net.coderbot.iris.pipeline; import com.gtnewhorizons.angelica.compat.mojang.Camera; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectMaps; import net.coderbot.iris.block_rendering.BlockRenderingSettings; @@ -42,7 +42,7 @@ public class FixedFunctionWorldRenderingPipeline implements WorldRenderingPipeli } // Use the default Minecraft framebuffer and ensure that no programs are in use mainFb.bindFramebuffer(true); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); } @Override diff --git a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java index 6bad2b930..21c44eeba 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HandRenderer.java @@ -5,7 +5,10 @@ import com.gtnewhorizons.angelica.compat.mojang.Camera; import com.gtnewhorizons.angelica.compat.mojang.GameModeUtil; import com.gtnewhorizons.angelica.compat.mojang.InteractionHand; import com.gtnewhorizons.angelica.event.RenderHandEvent; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.mixins.interfaces.ItemRendererAccessor; import com.gtnewhorizons.angelica.rendering.RenderingState; @@ -37,30 +40,30 @@ public class HandRenderer { private void setupGlState(RenderGlobal gameRenderer, Camera camera, float tickDelta) { final Minecraft mc = Minecraft.getMinecraft(); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); // We need to scale the matrix by 0.125 so the hand doesn't clip through blocks. - GLStateManager.glScalef(1.0F, 1.0F, DEPTH); + GLSMMatrices.glScalef(1.0F, 1.0F, DEPTH); // TODO: Anaglyph /*if (this.mc.gameSettings.anaglyph) { - GLStateManager.glTranslatef((float) (-(anaglyphChannel * 2 - 1)) * 0.07F, 0.0F, 0.0F); + GLSMMatrices.glTranslatef((float) (-(anaglyphChannel * 2 - 1)) * 0.07F, 0.0F, 0.0F); }*/ if (mc.entityRenderer.cameraZoom != 1.0D) { - GLStateManager.glTranslatef((float) mc.entityRenderer.cameraYaw, (float) (-mc.entityRenderer.cameraPitch), 0.0F); - GLStateManager.glScaled(mc.entityRenderer.cameraZoom, mc.entityRenderer.cameraZoom, 1.0D); + GLSMMatrices.glTranslatef((float) mc.entityRenderer.cameraYaw, (float) (-mc.entityRenderer.cameraPitch), 0.0F); + GLSMMatrices.glScaled(mc.entityRenderer.cameraZoom, mc.entityRenderer.cameraZoom, 1.0D); } Project.gluPerspective(mc.entityRenderer.getFOVModifier(tickDelta, false), (float) mc.displayWidth / (float) mc.displayHeight, 0.05F, mc.entityRenderer.farPlaneDistance * 2.0F); if (mc.playerController.enableEverythingIsScrewedUpMode()) { - GLStateManager.glScalef(1.0F, 2 / 3f, 1.0F); + GLSMMatrices.glScalef(1.0F, 2 / 3f, 1.0F); } - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); // TODO: Anaglyph /*if (mc.gameSettings.anaglyph) { @@ -129,21 +132,21 @@ public class HandRenderer { ACTIVE = true; - final int stateDepth = GLStateManager.pushState(StateSet.HAND); + final int stateDepth = GLSMAttribStack.pushState(StateSet.HAND); try { GbufferPrograms.setCutoutDefaults(); - GLStateManager.disableBlend(); - GLStateManager.defaultBlendFunc(); + GLSMBlend.disableBlend(); + GLSMBlend.defaultBlendFunc(); pipeline.setPhase(WorldRenderingPhase.HAND_SOLID); boolean matrixPushed = false; boolean profilerSectionStarted = false; try { - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); matrixPushed = true; - GLStateManager.glDepthMask(true); // actually write to the depth buffer, it's normally disabled at this point + GLSMDepthStencilAlpha.glDepthMask(true); // actually write to the depth buffer, it's normally disabled at this point mc.mcProfiler.startSection("iris_hand"); profilerSectionStarted = true; @@ -164,12 +167,12 @@ public class HandRenderer { } } finally { if (matrixPushed) { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); resetProjectionMatrix(); } } } finally { - GLStateManager.popStateTo(stateDepth); + GLSMAttribStack.popStateTo(stateDepth); pipeline.setPhase(WorldRenderingPhase.NONE); @@ -185,21 +188,21 @@ public class HandRenderer { ACTIVE = true; - final int stateDepth = GLStateManager.pushState(StateSet.HAND); + final int stateDepth = GLSMAttribStack.pushState(StateSet.HAND); try { GbufferPrograms.setCutoutDefaults(); - GLStateManager.enableBlend(); - GLStateManager.defaultBlendFunc(); + GLSMBlend.enableBlend(); + GLSMBlend.defaultBlendFunc(); pipeline.setPhase(WorldRenderingPhase.HAND_TRANSLUCENT); boolean matrixPushed = false; boolean profilerSectionStarted = false; try { - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); matrixPushed = true; - GLStateManager.glDepthMask(false); + GLSMDepthStencilAlpha.glDepthMask(false); mc.mcProfiler.startSection("iris_hand_translucent"); profilerSectionStarted = true; @@ -216,12 +219,12 @@ public class HandRenderer { } } finally { if (matrixPushed) { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); resetProjectionMatrix(); } } } finally { - GLStateManager.popStateTo(stateDepth); + GLSMAttribStack.popStateTo(stateDepth); pipeline.setPhase(WorldRenderingPhase.NONE); @@ -230,10 +233,10 @@ public class HandRenderer { } private void resetProjectionMatrix() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMultMatrix(RenderingState.INSTANCE.getProjectionBuffer()); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMultMatrix(RenderingState.INSTANCE.getProjectionBuffer()); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } public boolean isActive() { diff --git a/src/main/java/net/coderbot/iris/pipeline/HorizonRenderer.java b/src/main/java/net/coderbot/iris/pipeline/HorizonRenderer.java index ed490cb85..8287150f3 100644 --- a/src/main/java/net/coderbot/iris/pipeline/HorizonRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/HorizonRenderer.java @@ -5,7 +5,7 @@ import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; import com.gtnewhorizon.gtnhlib.client.renderer.vao.IVertexArrayObject; import com.gtnewhorizon.gtnhlib.client.renderer.vao.VertexBufferType; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; @@ -155,15 +155,15 @@ public class HorizonRenderer { rebuildBuffer(); } - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glMultMatrix(matrix); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMultMatrix(matrix); vao.bind(); vao.draw(); vao.unbind(); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } public void destroy() { diff --git a/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java b/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java index aef902d19..d754f308f 100644 --- a/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java +++ b/src/main/java/net/coderbot/iris/pipeline/PipelineManager.java @@ -1,6 +1,6 @@ package net.coderbot.iris.pipeline; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import lombok.Getter; import net.coderbot.iris.Iris; @@ -105,13 +105,13 @@ public class PipelineManager { // // Without this code, there will be weird issues when reloading certain shaderpacks. for (int i = 0; i < 16; i++) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } // Set the active texture unit to unit 0 // // This seems to be what most code expects. It's a sane default in any case. - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } } diff --git a/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java b/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java index 266653cc9..3d5e822f4 100644 --- a/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java +++ b/src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java @@ -6,7 +6,12 @@ import com.gtnewhorizons.angelica.compat.mojang.GameModeUtil; import com.gtnewhorizons.angelica.compat.toremove.MatrixStack; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.GLDebug; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.profiling.RenderClassTimings; import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay; @@ -329,7 +334,7 @@ public class ShadowRenderer { final ImmutableList colorSamplingSettings = shadowDirectives.getColorSamplingSettings(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE4); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE4); configureDepthSampler(targets.getDepthTexture().getTextureId(), depthSamplingSettings.get(0)); @@ -342,7 +347,7 @@ public class ShadowRenderer { configureSampler(glTextureId, colorSamplingSettings.get(i)); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private final IntBuffer swizzleBuf = BufferUtils.createIntBuffer(4); @@ -379,13 +384,13 @@ public class ShadowRenderer { } private void generateMipmaps() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE4); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE4); for (MipmapPass mipmapPass : mipmapPasses) { setupMipmappingForTexture(mipmapPass.getTexture(), mipmapPass.getTargetFilteringMode()); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private void setupMipmappingForTexture(int texture, int filteringMode) { @@ -520,7 +525,7 @@ public class ShadowRenderer { } private void setupGlState(Matrix4f projMatrix) { - GLStateManager.glViewport(0, 0, resolution, resolution); + GLSMRasterizer.glViewport(0, 0, resolution, resolution); // Set up our projection matrix and load it into the legacy matrix stack RenderSystem.setupProjectionMatrix(projMatrix); @@ -532,23 +537,23 @@ public class ShadowRenderer { // However, it only partially resolves issues of light leaking into caves. // // TODO: Better way of preventing light from leaking into places where it shouldn't - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); } private void restoreGlState() { // Restore backface culling - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); // Make sure to unload the projection matrix RenderSystem.restoreProjectionMatrix(); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glClearDepth(1.0); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glClearDepth(1.0); // Restore main framebuffer and viewport Minecraft mc = Minecraft.getMinecraft(); mc.getFramebuffer().bindFramebuffer(false); - GLStateManager.glViewport(0, 0, mc.displayWidth, mc.displayHeight); + GLSMRasterizer.glViewport(0, 0, mc.displayWidth, mc.displayHeight); } private void copyPreTranslucentDepth() { @@ -663,7 +668,7 @@ public class ShadowRenderer { } // Reset viewport in case terrain rendering changed it - GLStateManager.glViewport(0, 0, resolution, resolution); + GLSMRasterizer.glViewport(0, 0, resolution, resolution); } // Saved RenderManager position for shadow pass @@ -689,20 +694,20 @@ public class ShadowRenderer { RenderManager.renderPosY = cameraY; RenderManager.renderPosZ = cameraZ; - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(1.0f, 1.0f); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(1.0f, 1.0f); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); MODELVIEW_BUFFER.clear().rewind(); modelView.peek().getModel().get(MODELVIEW_BUFFER); - GLStateManager.glLoadMatrix(MODELVIEW_BUFFER); + GLSMMatrices.glLoadMatrix(MODELVIEW_BUFFER); } private void teardownEntityShadowState() { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(0.0f, 0.0f); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(0.0f, 0.0f); RenderManager.renderPosX = savedRenderPosX; RenderManager.renderPosY = savedRenderPosY; @@ -784,8 +789,8 @@ public class ShadowRenderer { final World world = tile.getWorldObj(); int brightness = TileEntityLight.packedLight(world, tile.xCoord, tile.yCoord, tile.zCoord, world.getLightBrightnessForSkyBlocks(tile.xCoord, tile.yCoord, tile.zCoord, 0)); PendingTesrDraws.beforeTileEntity(tile); - GLStateManager.setLightmapTextureCoords(GL13.GL_TEXTURE1, (float) brightness % 65536, (float) brightness / 65536); - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMCurrentAttribs.setLightmapTextureCoords(GL13.GL_TEXTURE1, (float) brightness % 65536, (float) brightness / 65536); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); TileEntityRendererDispatcher.instance.renderTileEntityAt(tile, (double)tile.xCoord - cameraX, (double)tile.yCoord - cameraY, @@ -809,10 +814,10 @@ public class ShadowRenderer { culler.setPosition(cameraX, cameraY, cameraZ); } - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); MODELVIEW_BUFFER.clear().rewind(); modelView.peek().getModel().get(MODELVIEW_BUFFER); - GLStateManager.glLoadMatrix(MODELVIEW_BUFFER); + GLSMMatrices.glLoadMatrix(MODELVIEW_BUFFER); TesrBatchRenderer.INSTANCE.beginPass(TesrBatchRenderer.PASS_SHADOW, modelView.peek().getModel(), cameraX, cameraY, cameraZ); @@ -857,7 +862,7 @@ public class ShadowRenderer { TesrBatchRenderer.INSTANCE.flush(); GbufferPrograms.endBlockEntities(); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); renderedShadowTileEntities = shadowTileEntities; diff --git a/src/main/java/net/coderbot/iris/pipeline/transform/PreRasterComputeDispatcher.java b/src/main/java/net/coderbot/iris/pipeline/transform/PreRasterComputeDispatcher.java index a7950472a..9ee23f438 100644 --- a/src/main/java/net/coderbot/iris/pipeline/transform/PreRasterComputeDispatcher.java +++ b/src/main/java/net/coderbot/iris/pipeline/transform/PreRasterComputeDispatcher.java @@ -1,6 +1,7 @@ package net.coderbot.iris.pipeline.transform; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import com.gtnewhorizons.angelica.glsm.RenderSystem; import net.coderbot.iris.gl.program.ComputeProgram; import net.coderbot.iris.postprocess.FullScreenQuadRenderer; @@ -14,17 +15,17 @@ public final class PreRasterComputeDispatcher { private PreRasterComputeDispatcher() {} public static int dispatch(ComputeProgram compute, RwImageStoreExtractor.RwExtractMode mode, int cachedTargetSizeLoc, int width, int height, CustomUniforms uniforms) { - final int prevProgram = GLStateManager.glGetInteger(GL20.GL_CURRENT_PROGRAM); + final int prevProgram = GLSMQueries.glGetInteger(GL20.GL_CURRENT_PROGRAM); compute.use(); uniforms.push(compute); if (mode == RwImageStoreExtractor.RwExtractMode.COMPOSITE_VSH) FullScreenQuadRenderer.uploadCompositeMatrices(); int targetSizeLoc = cachedTargetSizeLoc; if (mode == RwImageStoreExtractor.RwExtractMode.COMPOSITE_FSH) { if (targetSizeLoc == LOC_UNRESOLVED) { - targetSizeLoc = GLStateManager.glGetUniformLocation(compute.getProgramId(), "_vg_target_size"); + targetSizeLoc = GLSMPrograms.glGetUniformLocation(compute.getProgramId(), "_vg_target_size"); } if (targetSizeLoc >= 0) { - GLStateManager.glUniform2i(targetSizeLoc, width, height); + GLSMPrograms.glUniform2i(targetSizeLoc, width, height); } } final int gx, gy, gz; @@ -33,9 +34,9 @@ public final class PreRasterComputeDispatcher { case COMPOSITE_FSH -> { gx = (width + 7) / 8; gy = (height + 7) / 8; gz = 1; } default -> { gx = 1; gy = 1; gz = 1; } } - GLStateManager.glDispatchCompute(gx, gy, gz); + GLSMPrograms.glDispatchCompute(gx, gy, gz); RenderSystem.memoryBarrier(GL42.GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); - if (prevProgram != 0) GLStateManager.glUseProgram(prevProgram); + if (prevProgram != 0) GLSMPrograms.glUseProgram(prevProgram); return targetSizeLoc; } } diff --git a/src/main/java/net/coderbot/iris/postprocess/CenterDepthSampler.java b/src/main/java/net/coderbot/iris/postprocess/CenterDepthSampler.java index 4a05cc1df..557406ca7 100644 --- a/src/main/java/net/coderbot/iris/postprocess/CenterDepthSampler.java +++ b/src/main/java/net/coderbot/iris/postprocess/CenterDepthSampler.java @@ -1,6 +1,8 @@ package net.coderbot.iris.postprocess; import com.google.common.collect.ImmutableSet; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import net.coderbot.iris.gl.framebuffer.GlFramebuffer; @@ -31,15 +33,15 @@ public class CenterDepthSampler { private boolean destroyed; public CenterDepthSampler(IntSupplier depthSupplier, float halfLife) { - this.texture = GLStateManager.glGenTextures(); - this.altTexture = GLStateManager.glGenTextures(); + this.texture = GLSMTextures.glGenTextures(); + this.altTexture = GLSMTextures.glGenTextures(); this.framebuffer = new GlFramebuffer(); // Fall back to a less precise format if the system doesn't support OpenGL 3 InternalTextureFormat format = GLStateManager.capabilities.OpenGL32 ? InternalTextureFormat.R32F : InternalTextureFormat.RGB16; setupColorTexture(texture, format); setupColorTexture(altTexture, format); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); this.framebuffer.addColorAttachment(0, texture); String vsh = ShaderLoader.getShaderSource("angelica:centerDepth.vsh"); @@ -65,7 +67,7 @@ public class CenterDepthSampler { this.framebuffer.bind(); this.program.use(); - GLStateManager.glViewport(0, 0, 1, 1); + GLSMRasterizer.glViewport(0, 0, 1, 1); FullScreenQuadRenderer.INSTANCE.render(); @@ -97,8 +99,8 @@ public class CenterDepthSampler { } public void destroy() { - GLStateManager.glDeleteTextures(texture); - GLStateManager.glDeleteTextures(altTexture); + GLSMTextures.glDeleteTextures(texture); + GLSMTextures.glDeleteTextures(altTexture); framebuffer.destroy(); program.destroy(); destroyed = true; diff --git a/src/main/java/net/coderbot/iris/postprocess/CompositeRenderer.java b/src/main/java/net/coderbot/iris/postprocess/CompositeRenderer.java index 0bb75dd04..5b3c2ec6f 100644 --- a/src/main/java/net/coderbot/iris/postprocess/CompositeRenderer.java +++ b/src/main/java/net/coderbot/iris/postprocess/CompositeRenderer.java @@ -4,7 +4,11 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.gtnewhorizons.angelica.glsm.GLDebug; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; @@ -298,8 +302,8 @@ public class CompositeRenderer { } public void renderAll() { - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); FullScreenQuadRenderer.INSTANCE.begin(); @@ -336,7 +340,7 @@ public class CompositeRenderer { final ImmutableSet readsFromAlt = renderTargets.parityResolve(renderPass.stageReadsFromAlt); if (!renderPass.mipmappedBuffers.isEmpty()) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); for (int index : renderPass.mipmappedBuffers) { setupMipmapping(CompositeRenderer.this.renderTargets.get(index), readsFromAlt.contains(index)); @@ -347,7 +351,7 @@ public class CompositeRenderer { final float scaledHeight = renderPass.viewHeight * renderPass.viewportScale.scale(); final float viewportX = renderPass.viewWidth * renderPass.viewportScale.viewportX(); final float viewportY = renderPass.viewHeight * renderPass.viewportScale.viewportY(); - GLStateManager.glViewport((int) viewportX, (int) viewportY, (int) scaledWidth, (int) scaledHeight); + GLSMRasterizer.glViewport((int) viewportX, (int) viewportY, (int) scaledWidth, (int) scaledHeight); if (renderPass.preRasterCompute != null && renderPass.preRasterMode != null) { dispatchPreRasterCompute(renderPass); @@ -378,18 +382,18 @@ public class CompositeRenderer { Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(true); ProgramUniforms.clearActiveUniforms(); ProgramSamplers.clearActiveSamplers(); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); // NB: Unbinding all of these textures is necessary for proper shaderpack reloading. - final int maxUnit = Math.min(SamplerLimits.get().getMaxTextureUnits() - 1, GLStateManager.getMaxBoundTextureUnit()); + final int maxUnit = Math.min(SamplerLimits.get().getMaxTextureUnits() - 1, GLSMTextures.getMaxBoundTextureUnit()); for (int i = 0; i <= maxUnit; i++) { // Unbind all textures that we may have used. // NB: This is necessary for shader pack reloading to work propely - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private void dispatchPreRasterCompute(Pass pass) { diff --git a/src/main/java/net/coderbot/iris/postprocess/FinalPassRenderer.java b/src/main/java/net/coderbot/iris/postprocess/FinalPassRenderer.java index 5c95926b9..4c5346b97 100644 --- a/src/main/java/net/coderbot/iris/postprocess/FinalPassRenderer.java +++ b/src/main/java/net/coderbot/iris/postprocess/FinalPassRenderer.java @@ -2,7 +2,11 @@ package net.coderbot.iris.postprocess; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import it.unimi.dsi.fastutil.ints.IntList; @@ -156,7 +160,7 @@ public class FinalPassRenderer { this.swapPasses = swapPasses.build(); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0); } private Map getTransformed(ProgramSource source, CompletableFuture> precomputedTransformFuture, String stageName) { @@ -200,9 +204,9 @@ public class FinalPassRenderer { } public void renderFinalPass() { - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); - GLStateManager.glDepthMask(false); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glDepthMask(false); final Framebuffer main = Minecraft.getMinecraft().getFramebuffer(); final int baseWidth = main.framebufferWidth; @@ -255,7 +259,7 @@ public class FinalPassRenderer { } if (!finalPass.mipmappedBuffers.isEmpty()) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); final ImmutableSet readsFromAlt = renderTargets.parityResolve(finalPass.stageReadsFromAlt); for (int index : finalPass.mipmappedBuffers) { @@ -288,7 +292,7 @@ public class FinalPassRenderer { } profiler.endSection(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); for (int i = 0; i < renderTargets.getRenderTargetCount(); i++) { // Reset mipmapping states at the end of the frame. @@ -308,8 +312,8 @@ public class FinalPassRenderer { // Also note that RenderTargets already calls readBuffer(0) for us. swapPass.from.bind(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, swapPass.targetTexture); - GLStateManager.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, swapPass.width, swapPass.height); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, swapPass.targetTexture); + GLSMTextures.glCopyTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, 0, 0, swapPass.width, swapPass.height); } profiler.endSection(); @@ -318,17 +322,17 @@ public class FinalPassRenderer { main.bindFramebuffer(true); ProgramUniforms.clearActiveUniforms(); ProgramSamplers.clearActiveSamplers(); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); - final int maxUnit = Math.min(SamplerLimits.get().getMaxTextureUnits() - 1, GLStateManager.getMaxBoundTextureUnit()); + final int maxUnit = Math.min(SamplerLimits.get().getMaxTextureUnits() - 1, GLSMTextures.getMaxBoundTextureUnit()); for (int i = 0; i <= maxUnit; i++) { // Unbind all textures that we may have used. // NB: This is necessary for shader pack reloading to work properly - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + i); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + i); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } public void recalculateSwapPassSize() { @@ -379,7 +383,7 @@ public class FinalPassRenderer { RenderSystem.texParameteri(target.getMainTexture(), GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter); RenderSystem.texParameteri(target.getAltTexture(), GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } // TODO: Don't just copy this from DeferredWorldRenderingPipeline diff --git a/src/main/java/net/coderbot/iris/postprocess/FullScreenQuadRenderer.java b/src/main/java/net/coderbot/iris/postprocess/FullScreenQuadRenderer.java index fd918d526..21a454cf4 100644 --- a/src/main/java/net/coderbot/iris/postprocess/FullScreenQuadRenderer.java +++ b/src/main/java/net/coderbot/iris/postprocess/FullScreenQuadRenderer.java @@ -2,7 +2,14 @@ package net.coderbot.iris.postprocess; import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.RenderSystem; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.lwjgl.BufferUtils; @@ -22,13 +29,13 @@ public class FullScreenQuadRenderer { public static final FullScreenQuadRenderer INSTANCE = new FullScreenQuadRenderer(); private FullScreenQuadRenderer() { - this.vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); + this.vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); this.quadBuffer = createQuad(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, quadBuffer); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, quadBuffer); DefaultVertexFormat.POSITION_TEXTURE.setupBufferState(0L); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); } public void render() { @@ -40,37 +47,37 @@ public class FullScreenQuadRenderer { } public void begin() { - GLStateManager.disableDepthTest(); + GLSMDepthStencilAlpha.disableDepthTest(); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); // scale the quad from [0, 1] to [-1, 1] - GLStateManager.glTranslatef(-1.0F, -1.0F, 0.0F); - GLStateManager.glScalef(2.0F, 2.0F, 1.0F); + GLSMMatrices.glTranslatef(-1.0F, -1.0F, 0.0F); + GLSMMatrices.glScalef(2.0F, 2.0F, 1.0F); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GLStateManager.glBindVertexArray(vao); + GLSMVertexInput.glBindVertexArray(vao); } public void renderQuad() { - GLStateManager.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, 4); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, 4); } public static void end() { - GLStateManager.glBindVertexArray(0); + GLSMVertexInput.glBindVertexArray(0); - GLStateManager.enableDepthTest(); + GLSMDepthStencilAlpha.enableDepthTest(); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); } private static final FloatBuffer matBuf = BufferUtils.createFloatBuffer(16); @@ -84,28 +91,28 @@ public class FullScreenQuadRenderer { } public static void uploadCompositeMatrices() { - final int program = GLStateManager.glGetInteger(GL20.GL_CURRENT_PROGRAM); + final int program = GLSMQueries.glGetInteger(GL20.GL_CURRENT_PROGRAM); if (program == 0) return; int[] locs = compositeLocCache.get(program); if (locs == null) { locs = new int[] { - GLStateManager.glGetUniformLocation(program, "iris_ModelViewMatrix"), - GLStateManager.glGetUniformLocation(program, "iris_ProjectionMatrix") + GLSMPrograms.glGetUniformLocation(program, "iris_ModelViewMatrix"), + GLSMPrograms.glGetUniformLocation(program, "iris_ProjectionMatrix") }; compositeLocCache.put(program, locs); } if (locs[0] != -1) { - GLStateManager.getModelViewMatrix().get(matBuf); + GLSMMatrices.getModelViewMatrix().get(matBuf); matBuf.rewind(); - GLStateManager.glUniformMatrix4(locs[0], false, matBuf); + GLSMPrograms.glUniformMatrix4(locs[0], false, matBuf); } if (locs[1] != -1) { - GLStateManager.getProjectionMatrix().get(matBuf); + GLSMMatrices.getProjectionMatrix().get(matBuf); matBuf.rewind(); - GLStateManager.glUniformMatrix4(locs[1], false, matBuf); + GLSMPrograms.glUniformMatrix4(locs[1], false, matBuf); } } diff --git a/src/main/java/net/coderbot/iris/rendertarget/ColorTexture.java b/src/main/java/net/coderbot/iris/rendertarget/ColorTexture.java index 53f8702d7..3603049f5 100644 --- a/src/main/java/net/coderbot/iris/rendertarget/ColorTexture.java +++ b/src/main/java/net/coderbot/iris/rendertarget/ColorTexture.java @@ -1,6 +1,7 @@ package net.coderbot.iris.rendertarget; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import net.coderbot.iris.gl.GlResource; import net.coderbot.iris.gl.texture.TextureUploadHelper; @@ -23,7 +24,7 @@ public class ColorTexture extends GlResource { TextureUploadHelper.resetTextureUploadState(); RenderSystem.texImage2D(texture, GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, width, height, 0, GL11.GL_RGBA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, (ByteBuffer) null); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 0); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, texture, 0); } public int getTextureId() { @@ -32,6 +33,6 @@ public class ColorTexture extends GlResource { @Override protected void destroyInternal() { - GLStateManager.glDeleteTextures(getGlId()); + GLSMTextures.glDeleteTextures(getGlId()); } } diff --git a/src/main/java/net/coderbot/iris/rendertarget/DepthTexture.java b/src/main/java/net/coderbot/iris/rendertarget/DepthTexture.java index a9d93e185..a9d0953e8 100644 --- a/src/main/java/net/coderbot/iris/rendertarget/DepthTexture.java +++ b/src/main/java/net/coderbot/iris/rendertarget/DepthTexture.java @@ -1,6 +1,6 @@ package net.coderbot.iris.rendertarget; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import net.coderbot.iris.gl.GlResource; import com.gtnewhorizons.angelica.glsm.texture.DepthBufferFormat; @@ -19,7 +19,7 @@ public class DepthTexture extends GlResource { RenderSystem.texParameteri(texture, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE); RenderSystem.texParameteri(texture, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } void resize(int width, int height, DepthBufferFormat format) { @@ -33,6 +33,6 @@ public class DepthTexture extends GlResource { @Override protected void destroyInternal() { - GLStateManager.glDeleteTextures(getGlId()); + GLSMTextures.glDeleteTextures(getGlId()); } } diff --git a/src/main/java/net/coderbot/iris/rendertarget/NoiseTexture.java b/src/main/java/net/coderbot/iris/rendertarget/NoiseTexture.java index f6cbe8674..fa6b14fd6 100644 --- a/src/main/java/net/coderbot/iris/rendertarget/NoiseTexture.java +++ b/src/main/java/net/coderbot/iris/rendertarget/NoiseTexture.java @@ -1,6 +1,6 @@ package net.coderbot.iris.rendertarget; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import net.coderbot.iris.gl.GlResource; import net.coderbot.iris.gl.texture.TextureUploadHelper; @@ -34,7 +34,7 @@ public class NoiseTexture extends GlResource { RenderSystem.texParameterf(texture, GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0F); resize(texture, width, height); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } void resize(int texture, int width, int height) { @@ -46,10 +46,10 @@ public class NoiseTexture extends GlResource { TextureUploadHelper.resetTextureUploadState(); // Since we're using tightly-packed RGB data, we must use an alignment of 1 byte instead of the usual 4 bytes. - GLStateManager.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); + GLSMTextures.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1); RenderSystem.texImage2D(texture, GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, width, height, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixels); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } private ByteBuffer generateNoise() { @@ -71,6 +71,6 @@ public class NoiseTexture extends GlResource { @Override protected void destroyInternal() { - GLStateManager.glDeleteTextures(getGlId()); + GLSMTextures.glDeleteTextures(getGlId()); } } diff --git a/src/main/java/net/coderbot/iris/rendertarget/RenderTarget.java b/src/main/java/net/coderbot/iris/rendertarget/RenderTarget.java index 2a091d2c0..8137f8721 100644 --- a/src/main/java/net/coderbot/iris/rendertarget/RenderTarget.java +++ b/src/main/java/net/coderbot/iris/rendertarget/RenderTarget.java @@ -3,7 +3,7 @@ package net.coderbot.iris.rendertarget; import static com.gtnewhorizon.gtnhlib.bytebuf.MemoryStack.*; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryStack; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import lombok.Getter; import com.gtnewhorizons.angelica.glsm.texture.InternalTextureFormat; @@ -47,7 +47,7 @@ public class RenderTarget { try (MemoryStack stack = stackPush()) { IntBuffer textures = stack.mallocInt(2); - GLStateManager.glGenTextures(textures); + GLSMTextures.glGenTextures(textures); this.mainTexture = textures.get(0); this.altTexture = textures.get(1); @@ -59,7 +59,7 @@ public class RenderTarget { // Clean up after ourselves // This is strictly defensive to ensure that other buggy code doesn't tamper with our textures - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } private void setupTexture(int texture, int width, int height, boolean allowsLinear) { @@ -129,7 +129,7 @@ public class RenderTarget { isValid = false; deleteBuffer.put(0, mainTexture); deleteBuffer.put(1, altTexture); - GLStateManager.glDeleteTextures(deleteBuffer); + GLSMTextures.glDeleteTextures(deleteBuffer); } private void requireValid() { diff --git a/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java b/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java index f5cddc69f..e0304af74 100644 --- a/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java +++ b/src/main/java/net/coderbot/iris/rendertarget/RenderTargets.java @@ -1,6 +1,8 @@ package net.coderbot.iris.rendertarget; import com.google.common.collect.ImmutableSet; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; @@ -193,7 +195,7 @@ public class RenderTargets { translucentDepthDirty = false; final Profiler profiler = Minecraft.getMinecraft().mcProfiler; profiler.startSection("iris_depth_realloc"); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, noTranslucents.getTextureId()); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, noTranslucents.getTextureId()); depthSourceFb.bindAsReadBuffer(); RenderSystem.copyTexImage2D(GL11.GL_TEXTURE_2D, 0, copyDepthFormat().getGlInternalFormat(), 0, 0, cachedWidth, cachedHeight, 0); profiler.endSection(); @@ -207,7 +209,7 @@ public class RenderTargets { handDepthDirty = false; final Profiler profiler = Minecraft.getMinecraft().mcProfiler; profiler.startSection("iris_depth_realloc"); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, noHand.getTextureId()); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, noHand.getTextureId()); depthSourceFb.bindAsReadBuffer(); RenderSystem.copyTexImage2D(GL11.GL_TEXTURE_2D, 0, copyDepthFormat().getGlInternalFormat(), 0, 0, cachedWidth, cachedHeight, 0); profiler.endSection(); @@ -359,7 +361,7 @@ public class RenderTargets { framebuffer.drawBuffers(actualDrawBuffers); framebuffer.readBuffer(0); - if (GLStateManager.framebufferCompletenessIsMeaningful()) { + if (GLSMFramebuffer.framebufferCompletenessIsMeaningful()) { final int status = framebuffer.getStatus(); if (status != GL30.GL_FRAMEBUFFER_COMPLETE) { throw new IllegalStateException(String.format("Unexpected error while creating framebuffer: glCheckFramebufferStatus=0x%X, size=%dx%d, drawBuffers=%d", status, cachedWidth, cachedHeight, drawBuffers.length)); diff --git a/src/main/java/net/coderbot/iris/rendertarget/SingleColorTexture.java b/src/main/java/net/coderbot/iris/rendertarget/SingleColorTexture.java index e22d8914c..e896bb381 100644 --- a/src/main/java/net/coderbot/iris/rendertarget/SingleColorTexture.java +++ b/src/main/java/net/coderbot/iris/rendertarget/SingleColorTexture.java @@ -1,6 +1,6 @@ package net.coderbot.iris.rendertarget; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import net.coderbot.iris.gl.GlResource; import net.coderbot.iris.gl.texture.TextureUploadHelper; @@ -36,6 +36,6 @@ public class SingleColorTexture extends GlResource { @Override protected void destroyInternal() { - GLStateManager.glDeleteTextures(getGlId()); + GLSMTextures.glDeleteTextures(getGlId()); } } diff --git a/src/main/java/net/coderbot/iris/shadows/ShadowCompositeRenderer.java b/src/main/java/net/coderbot/iris/shadows/ShadowCompositeRenderer.java index fa8b9fcc3..fe58a7674 100644 --- a/src/main/java/net/coderbot/iris/shadows/ShadowCompositeRenderer.java +++ b/src/main/java/net/coderbot/iris/shadows/ShadowCompositeRenderer.java @@ -4,7 +4,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.gtnewhorizons.angelica.glsm.GLDebug; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; @@ -179,7 +182,7 @@ public class ShadowCompositeRenderer { this.passes = passes.build(); this.flippedAtLeastOnceFinal = flippedAtLeastOnce.build(); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0); } private static void setupMipmapping(RenderTarget target, boolean readFromAlt) { @@ -230,7 +233,7 @@ public class ShadowCompositeRenderer { } public void renderAll() { - GLStateManager.disableBlend(); + GLSMBlend.disableBlend(); FullScreenQuadRenderer.INSTANCE.begin(); @@ -264,7 +267,7 @@ public class ShadowCompositeRenderer { } if (!renderPass.mipmappedBuffers.isEmpty()) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); for (int index : renderPass.mipmappedBuffers) { setupMipmapping(renderTargets.get(index), renderPass.stageReadsFromAlt.contains(index)); @@ -275,7 +278,7 @@ public class ShadowCompositeRenderer { float scaledHeight = renderTargets.getResolution() * renderPass.viewportScale.scale(); int beginWidth = (int) (renderTargets.getResolution() * renderPass.viewportScale.viewportX()); int beginHeight = (int) (renderTargets.getResolution() * renderPass.viewportScale.viewportY()); - GLStateManager.glViewport(beginWidth, beginHeight, (int) scaledWidth, (int) scaledHeight); + GLSMRasterizer.glViewport(beginWidth, beginHeight, (int) scaledWidth, (int) scaledHeight); if (renderPass.preRasterCompute != null && renderPass.preRasterMode != null) { dispatchPreRasterCompute(renderPass, (int) scaledWidth, (int) scaledHeight); @@ -303,7 +306,7 @@ public class ShadowCompositeRenderer { } } - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } // TODO: Don't just copy this from DeferredWorldRenderingPipeline diff --git a/src/main/java/net/coderbot/iris/shadows/ShadowRenderTargets.java b/src/main/java/net/coderbot/iris/shadows/ShadowRenderTargets.java index 30f5f3d82..4625404d2 100644 --- a/src/main/java/net/coderbot/iris/shadows/ShadowRenderTargets.java +++ b/src/main/java/net/coderbot/iris/shadows/ShadowRenderTargets.java @@ -1,7 +1,8 @@ package net.coderbot.iris.shadows; import com.google.common.collect.ImmutableSet; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; @@ -147,7 +148,7 @@ public class ShadowRenderTargets { } if (terrainColorCache != null) { for (int tex : terrainColorCache) { - if (tex != 0) GLStateManager.glDeleteTextures(tex); + if (tex != 0) GLSMTextures.glDeleteTextures(tex); } terrainColorCache = null; } @@ -236,7 +237,7 @@ public class ShadowRenderTargets { } private int createCacheTexture(InternalTextureFormat format) { - final int tex = GLStateManager.glGenTextures(); + final int tex = GLSMTextures.glGenTextures(); RenderSystem.texImage2D(tex, GL11.GL_TEXTURE_2D, 0, format.getGlFormat(), resolution, resolution, 0, format.getPixelFormat().getGlFormat(), PixelType.UNSIGNED_BYTE.getGlFormat(), (ByteBuffer) null); RenderSystem.texParameteri(tex, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); RenderSystem.texParameteri(tex, GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); @@ -364,7 +365,7 @@ public class ShadowRenderTargets { framebuffer.drawBuffers(actualDrawBuffers); framebuffer.readBuffer(0); - if (GLStateManager.framebufferCompletenessIsMeaningful()) { + if (GLSMFramebuffer.framebufferCompletenessIsMeaningful()) { final int status = framebuffer.getStatus(); if (status != GL30.GL_FRAMEBUFFER_COMPLETE) { throw new IllegalStateException(String.format("Unexpected error while creating shadow framebuffer: glCheckFramebufferStatus=0x%X, resolution=%d, drawBuffers=%d", status, resolution, drawBuffers.length)); diff --git a/src/main/java/net/coderbot/iris/texture/pbr/PBRTextureManager.java b/src/main/java/net/coderbot/iris/texture/pbr/PBRTextureManager.java index 82f1a9ac6..ed215bf3c 100644 --- a/src/main/java/net/coderbot/iris/texture/pbr/PBRTextureManager.java +++ b/src/main/java/net/coderbot/iris/texture/pbr/PBRTextureManager.java @@ -1,6 +1,7 @@ package net.coderbot.iris.texture.pbr; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.client.rendering.TextureTracker; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -87,7 +88,7 @@ public class PBRTextureManager { Class clazz = texture.getClass(); PBRTextureLoader loader = PBRTextureLoaderRegistry.INSTANCE.getLoader(clazz); if (loader != null) { - int previousTextureBinding = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + int previousTextureBinding = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); consumer.clear(); try { loader.load(texture, Minecraft.getMinecraft().getResourceManager(), consumer); @@ -95,7 +96,7 @@ public class PBRTextureManager { } catch (Exception e) { Iris.logger.error("Failed to load PBR textures for texture " + id, e); } finally { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previousTextureBinding); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previousTextureBinding); } } } diff --git a/src/main/java/net/coderbot/iris/texture/util/TextureExporter.java b/src/main/java/net/coderbot/iris/texture/util/TextureExporter.java index 5404b2143..8f638080d 100644 --- a/src/main/java/net/coderbot/iris/texture/util/TextureExporter.java +++ b/src/main/java/net/coderbot/iris/texture/util/TextureExporter.java @@ -1,6 +1,6 @@ package net.coderbot.iris.texture.util; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.compat.mojang.NativeImage; import net.coderbot.iris.Iris; @@ -21,7 +21,7 @@ public class TextureExporter { public static void exportTexture(String directory, String filename, int textureId, int level, int width, int height) { NativeImage nativeImage = new NativeImage(width, height, false); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textureId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textureId); nativeImage.downloadTexture(level, false); File dir = new File(Minecraft.getMinecraft().mcDataDir, directory); diff --git a/src/main/java/net/coderbot/iris/texture/util/TextureManipulationUtil.java b/src/main/java/net/coderbot/iris/texture/util/TextureManipulationUtil.java index aa78ee1c9..ca5ce8bf5 100644 --- a/src/main/java/net/coderbot/iris/texture/util/TextureManipulationUtil.java +++ b/src/main/java/net/coderbot/iris/texture/util/TextureManipulationUtil.java @@ -1,7 +1,11 @@ package net.coderbot.iris.texture.util; import com.gtnewhorizon.gtnhlib.bytebuf.MemoryStack; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import net.minecraft.client.renderer.OpenGlHelper; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL30; @@ -20,33 +24,33 @@ public class TextureManipulationUtil { colorFillFBO = OpenGlHelper.func_153165_e/*glGenFramebuffers*/(); } - final int previousFramebufferId = GLStateManager.glGetInteger(GL30.GL_FRAMEBUFFER_BINDING); + final int previousFramebufferId = GLSMQueries.glGetInteger(GL30.GL_FRAMEBUFFER_BINDING); final FloatBuffer previousClearColorBuffer = stack.mallocFloat(4); - GLStateManager.glGetFloat(GL11.GL_COLOR_CLEAR_VALUE, previousClearColorBuffer); - final int previousTextureId = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + GLSMQueries.glGetFloat(GL11.GL_COLOR_CLEAR_VALUE, previousClearColorBuffer); + final int previousTextureId = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); final IntBuffer previousViewportBuffer = stack.mallocInt(4); - GLStateManager.glGetInteger(GL11.GL_VIEWPORT, previousViewportBuffer); + GLSMQueries.glGetInteger(GL11.GL_VIEWPORT, previousViewportBuffer); OpenGlHelper.func_153171_g/*glBindFramebuffer*/(GL30.GL_FRAMEBUFFER, colorFillFBO); - GLStateManager.glClearColor( + GLSMBlend.glClearColor( (rgba >> 24 & 0xFF) / 255.0f, (rgba >> 16 & 0xFF) / 255.0f, (rgba >> 8 & 0xFF) / 255.0f, (rgba & 0xFF) / 255.0f); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textureId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textureId); for (int level = 0; level <= maxLevel; ++level) { - final int width = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_WIDTH); - final int height = GLStateManager.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT); - GLStateManager.glViewport(0, 0, width, height); - GLStateManager.glFramebufferTexture2D( + final int width = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_WIDTH); + final int height = GLSMTextures.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, level, GL11.GL_TEXTURE_HEIGHT); + GLSMRasterizer.glViewport(0, 0, width, height); + GLSMFramebuffer.glFramebufferTexture2D( GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, textureId, level); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glFramebufferTexture2D( + GLSMFramebuffer.glFramebufferTexture2D( GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, @@ -55,13 +59,13 @@ public class TextureManipulationUtil { } OpenGlHelper.func_153171_g/*glBindFramebuffer*/(GL30.GL_FRAMEBUFFER, previousFramebufferId); - GLStateManager.glClearColor( + GLSMBlend.glClearColor( previousClearColorBuffer.get(0), previousClearColorBuffer.get(1), previousClearColorBuffer.get(2), previousClearColorBuffer.get(3)); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, previousTextureId); - GLStateManager.glViewport( + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, previousTextureId); + GLSMRasterizer.glViewport( previousViewportBuffer.get(0), previousViewportBuffer.get(1), previousViewportBuffer.get(2), diff --git a/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java b/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java index adda75ef4..eb6de7a7d 100644 --- a/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java +++ b/src/main/java/net/coderbot/iris/uniforms/CommonUniforms.java @@ -1,6 +1,8 @@ package net.coderbot.iris.uniforms; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.states.BlendState; import com.gtnewhorizons.angelica.glsm.texture.TextureInfo; import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache; @@ -78,7 +80,7 @@ public final class CommonUniforms { IrisInternalUniforms.addWeatherUniforms(uniforms); uniforms.uniform2i("atlasSize", () -> { - final int glId = GLStateManager.getBoundTextureForServerState(0); + final int glId = GLSMTextures.getBoundTextureForServerState(0); final AbstractTexture texture = TextureTracker.INSTANCE.getTexture(glId); if (texture instanceof TextureMap) { @@ -90,22 +92,22 @@ public final class CommonUniforms { }, StateUpdateNotifiers.bindTextureNotifier); uniforms.uniform2i("gtextureSize", () -> { - final int glId = GLStateManager.getBoundTextureForServerState(0); + final int glId = GLSMTextures.getBoundTextureForServerState(0); final TextureInfo info = TextureInfoCache.INSTANCE.getInfo(glId); return scratch2i.set(info.getWidth(), info.getHeight()); }, StateUpdateNotifiers.bindTextureNotifier); - uniforms.uniform1i("gtextureId", () -> GLStateManager.getBoundTextureForServerState(0), + uniforms.uniform1i("gtextureId", () -> GLSMTextures.getBoundTextureForServerState(0), StateUpdateNotifiers.bindTextureNotifier); uniforms.uniform1i("textureReloadCount", CapturedRenderingState.INSTANCE::getTextureReloadCount, CapturedRenderingState.INSTANCE.getTextureReloadNotifier()); uniforms.uniform4i("blendFunc", () -> { - if(GLStateManager.getBlendMode().isEnabled()) { - final BlendState blend = GLStateManager.getBlendState(); + if(GLSMBlend.getBlendMode().isEnabled()) { + final BlendState blend = GLSMBlend.getBlendState(); return scratch4i.set(blend.getSrcRgb(), blend.getDstRgb(), blend.getSrcAlpha(), blend.getDstAlpha()); } return scratch4i.set(0, 0, 0, 0); @@ -150,7 +152,7 @@ public final class CommonUniforms { .uniform1f(PER_TICK, "rainStrength", CommonUniforms::getRainStrength) .uniform1f(PER_TICK, "wetness", new SmoothedFloat(directives.getWetnessHalfLife(), directives.getDrynessHalfLife(), CommonUniforms::getRainStrength, updateNotifier)) .uniform3d(PER_FRAME, "skyColor", CommonUniforms::getSkyColor) - .uniform3d(PER_FRAME, "fogColor", GLStateManager::getFogColor) + .uniform3d(PER_FRAME, "fogColor", GLSMFog::getFogColor) .uniform1f(PER_FRAME, "dhFarPlane", DHCompat::getFarPlane) .uniform1f(PER_FRAME, "dhNearPlane", DHCompat::getNearPlane) .uniform1i(PER_FRAME, "dhRenderDistance", DHCompat::getRenderDistance); diff --git a/src/main/java/net/coderbot/iris/uniforms/FogUniforms.java b/src/main/java/net/coderbot/iris/uniforms/FogUniforms.java index 8c3271602..0962d4df1 100644 --- a/src/main/java/net/coderbot/iris/uniforms/FogUniforms.java +++ b/src/main/java/net/coderbot/iris/uniforms/FogUniforms.java @@ -1,6 +1,6 @@ package net.coderbot.iris.uniforms; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFog; import net.coderbot.iris.gl.state.FogMode; import net.coderbot.iris.gl.state.StateUpdateNotifiers; import net.coderbot.iris.gl.state.ValueUpdateNotifier; @@ -18,14 +18,14 @@ public class FogUniforms { uniforms.uniform1i(UniformUpdateFrequency.ONCE, "fogShape", () -> -1); } else { uniforms.uniform1i("fogMode", () -> { - if (!GLStateManager.getFogMode().isEnabled()) return 0; - return GLStateManager.getFogState().getFogMode(); + if (!GLSMFog.getFogMode().isEnabled()) return 0; + return GLSMFog.getFogState().getFogMode(); }, StateUpdateNotifiers.fogModeNotifier); uniforms.uniform1i("fogShape", () -> 0, ValueUpdateNotifier.NONE); } - uniforms.uniform1f("fogDensity", () -> GLStateManager.getFogState().getDensity(), StateUpdateNotifiers.fogDensityNotifier); - uniforms.uniform1f("fogStart", () -> GLStateManager.getFogState().getStart(), StateUpdateNotifiers.fogStartNotifier); - uniforms.uniform1f("fogEnd", () -> GLStateManager.getFogState().getEnd(), StateUpdateNotifiers.fogEndNotifier); + uniforms.uniform1f("fogDensity", () -> GLSMFog.getFogState().getDensity(), StateUpdateNotifiers.fogDensityNotifier); + uniforms.uniform1f("fogStart", () -> GLSMFog.getFogState().getStart(), StateUpdateNotifiers.fogStartNotifier); + uniforms.uniform1f("fogEnd", () -> GLSMFog.getFogState().getEnd(), StateUpdateNotifiers.fogEndNotifier); } } diff --git a/src/main/java/net/coderbot/iris/uniforms/IrisInternalUniforms.java b/src/main/java/net/coderbot/iris/uniforms/IrisInternalUniforms.java index c8a33a08d..f4796659a 100644 --- a/src/main/java/net/coderbot/iris/uniforms/IrisInternalUniforms.java +++ b/src/main/java/net/coderbot/iris/uniforms/IrisInternalUniforms.java @@ -1,6 +1,8 @@ package net.coderbot.iris.uniforms; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMFog; import com.gtnewhorizons.angelica.glsm.ffp.WeatherParams; import net.coderbot.iris.gl.state.FogMode; import net.coderbot.iris.gl.state.StateUpdateNotifiers; @@ -20,22 +22,22 @@ public class IrisInternalUniforms { private static Vector4f getColorModulator() { return COLOR_MODULATOR.set( - GLStateManager.getShaderColorR(), - GLStateManager.getShaderColorG(), - GLStateManager.getShaderColorB(), - GLStateManager.getShaderColorA()); + GLSMCurrentAttribs.getShaderColorR(), + GLSMCurrentAttribs.getShaderColorG(), + GLSMCurrentAttribs.getShaderColorB(), + GLSMCurrentAttribs.getShaderColorA()); } private static float getEffectiveAlphaRef() { - if (!GLStateManager.getAlphaTest().isEnabled() || GLStateManager.getAlphaState().getFunction() == GL11.GL_ALWAYS) { + if (!GLSMDepthStencilAlpha.getAlphaTest().isEnabled() || GLSMDepthStencilAlpha.getAlphaState().getFunction() == GL11.GL_ALWAYS) { return -1.0f; } - return GLStateManager.getAlphaState().getReference(); + return GLSMDepthStencilAlpha.getAlphaState().getReference(); } private static int getEffectiveAlphaFunc() { - if (!GLStateManager.getAlphaTest().isEnabled()) return 7; - final int func = GLStateManager.getAlphaState().getFunction(); + if (!GLSMDepthStencilAlpha.getAlphaTest().isEnabled()) return 7; + final int func = GLSMDepthStencilAlpha.getAlphaState().getFunction(); return func & 0x7; } @@ -54,14 +56,14 @@ public class IrisInternalUniforms { public static void addFogUniforms(DynamicUniformHolder uniforms, FogMode fogMode) { uniforms.uniform4f(PER_FRAME, "iris_FogColor", () -> { - final Vector3d color = GLStateManager.getFogState().getFogColor(); - return FOG_COLOR.set((float) color.x, (float) color.y, (float) color.z, GLStateManager.getFogState().getFogAlpha()); + final Vector3d color = GLSMFog.getFogState().getFogColor(); + return FOG_COLOR.set((float) color.x, (float) color.y, (float) color.z, GLSMFog.getFogState().getFogAlpha()); }); uniforms - .uniform1f(PER_FRAME, "iris_FogStart", () -> GLStateManager.getFogState().getStart()) - .uniform1f(PER_FRAME, "iris_FogEnd", () -> GLStateManager.getFogState().getEnd()) - .uniform1f(PER_FRAME, "iris_FogDensity", () -> Math.max(0.0F, GLStateManager.getFogState().getDensity())); + .uniform1f(PER_FRAME, "iris_FogStart", () -> GLSMFog.getFogState().getStart()) + .uniform1f(PER_FRAME, "iris_FogEnd", () -> GLSMFog.getFogState().getEnd()) + .uniform1f(PER_FRAME, "iris_FogDensity", () -> Math.max(0.0F, GLSMFog.getFogState().getDensity())); uniforms .uniform1f("iris_currentAlphaTest", IrisInternalUniforms::getEffectiveAlphaRef, StateUpdateNotifiers.alphaTestNotifier) diff --git a/src/main/java/net/coderbot/iris/uniforms/ItemIdManager.java b/src/main/java/net/coderbot/iris/uniforms/ItemIdManager.java index dfce86386..87b9133f3 100644 --- a/src/main/java/net/coderbot/iris/uniforms/ItemIdManager.java +++ b/src/main/java/net/coderbot/iris/uniforms/ItemIdManager.java @@ -1,6 +1,6 @@ package net.coderbot.iris.uniforms; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; import com.gtnewhorizons.angelica.glsm.StateSet; import net.coderbot.iris.Iris; import net.coderbot.iris.layer.GbufferPrograms; @@ -23,7 +23,7 @@ public class ItemIdManager { public static int beginCutout(ItemStack stack) { pushItemId(); - final int depth = GLStateManager.pushState(StateSet.CUTOUT); + final int depth = GLSMAttribStack.pushState(StateSet.CUTOUT); try { GbufferPrograms.setCutoutDefaults(); setItemId(stack); @@ -36,7 +36,7 @@ public class ItemIdManager { public static void endCutout(int depth) { popItemId(); - GLStateManager.popStateTo(depth); + GLSMAttribStack.popStateTo(depth); } /** diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/BooleanCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/BooleanCachedUniform.java index ced66badc..34250cda0 100644 --- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/BooleanCachedUniform.java +++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/BooleanCachedUniform.java @@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached; import kroppeb.stareval.function.FunctionReturn; import kroppeb.stareval.function.Type; import net.coderbot.iris.gl.uniform.UniformUpdateFrequency; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import java.util.function.BooleanSupplier; @@ -26,7 +26,7 @@ public class BooleanCachedUniform extends CachedUniform { @Override public void push(int location) { - GLStateManager.glUniform1i(location, this.cached ? 1 : 0); + GLSMPrograms.glUniform1i(location, this.cached ? 1 : 0); } @Override diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float2VectorCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float2VectorCachedUniform.java index 8b7f8a686..06a1cebaf 100644 --- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float2VectorCachedUniform.java +++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float2VectorCachedUniform.java @@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached; import net.coderbot.iris.gl.uniform.UniformUpdateFrequency; import net.coderbot.iris.parsing.VectorType; import org.joml.Vector2f; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import java.util.function.Supplier; @@ -20,7 +20,7 @@ public class Float2VectorCachedUniform extends VectorCachedUniform { @Override public void push(int location) { - GLStateManager.glUniform2f(location, this.cached.x, this.cached.y); + GLSMPrograms.glUniform2f(location, this.cached.x, this.cached.y); } @Override diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float3VectorCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float3VectorCachedUniform.java index 2c8e1dab8..572fe362a 100644 --- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float3VectorCachedUniform.java +++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float3VectorCachedUniform.java @@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached; import net.coderbot.iris.gl.uniform.UniformUpdateFrequency; import net.coderbot.iris.parsing.VectorType; import org.joml.Vector3f; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import org.joml.Vector3fc; import java.util.function.Supplier; @@ -21,7 +21,7 @@ public class Float3VectorCachedUniform extends VectorCachedUniform { @Override public void push(int location) { - GLStateManager.glUniform3f(location, this.cached.x(), this.cached.y(), this.cached.z()); + GLSMPrograms.glUniform3f(location, this.cached.x(), this.cached.y(), this.cached.z()); } @Override diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4MatrixCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4MatrixCachedUniform.java index 83e73b5a9..4c93eb4e2 100644 --- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4MatrixCachedUniform.java +++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4MatrixCachedUniform.java @@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached; import net.coderbot.iris.gl.uniform.UniformUpdateFrequency; import net.coderbot.iris.parsing.MatrixType; import org.joml.Matrix4f; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import org.joml.Matrix4fc; import java.nio.ByteBuffer; @@ -27,7 +27,7 @@ public class Float4MatrixCachedUniform extends VectorCachedUniform { public void push(int location) { // `gets` the values from the matrix and put's them into a buffer this.cached.get(buffer); - GLStateManager.glUniformMatrix4(location, false, buffer); + GLSMPrograms.glUniformMatrix4(location, false, buffer); } @Override diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4VectorCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4VectorCachedUniform.java index 987f29630..40ab8a42f 100644 --- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4VectorCachedUniform.java +++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Float4VectorCachedUniform.java @@ -4,7 +4,7 @@ import net.coderbot.iris.gl.uniform.UniformUpdateFrequency; import net.coderbot.iris.parsing.VectorType; import org.joml.Vector4f; import org.joml.Vector4fc; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import java.util.function.Supplier; @@ -29,7 +29,7 @@ public class Float4VectorCachedUniform extends VectorCachedUniform { @Override public void push(int location) { - GLStateManager.glUniform4f(location, this.cached.x, this.cached.y, this.cached.z, this.cached.w); + GLSMPrograms.glUniform4f(location, this.cached.x, this.cached.y, this.cached.z, this.cached.w); } @Override diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/FloatCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/FloatCachedUniform.java index e1dfb421d..3fb3810da 100644 --- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/FloatCachedUniform.java +++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/FloatCachedUniform.java @@ -4,7 +4,7 @@ import kroppeb.stareval.function.FunctionReturn; import kroppeb.stareval.function.Type; import net.coderbot.iris.gl.uniform.FloatSupplier; import net.coderbot.iris.gl.uniform.UniformUpdateFrequency; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; public class FloatCachedUniform extends CachedUniform { @@ -25,7 +25,7 @@ public class FloatCachedUniform extends CachedUniform { @Override public void push(int location) { - GLStateManager.glUniform1f(location, this.cached); + GLSMPrograms.glUniform1f(location, this.cached); } @Override diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int2VectorCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int2VectorCachedUniform.java index c3f158247..ed0cb9c78 100644 --- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int2VectorCachedUniform.java +++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int2VectorCachedUniform.java @@ -5,7 +5,7 @@ import net.coderbot.iris.gl.uniform.UniformUpdateFrequency; import net.coderbot.iris.parsing.VectorType; import org.joml.Vector2i; import org.joml.Vector2ic; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import java.util.function.Supplier; @@ -30,7 +30,7 @@ public class Int2VectorCachedUniform extends VectorCachedUniform { @Override public void push(int location) { - GLStateManager.glUniform2i(location, this.cached.x, this.cached.y); + GLSMPrograms.glUniform2i(location, this.cached.x, this.cached.y); } @Override diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int3VectorCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int3VectorCachedUniform.java index 32f61ad10..c84ee6f92 100644 --- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int3VectorCachedUniform.java +++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/Int3VectorCachedUniform.java @@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached; import net.coderbot.iris.gl.uniform.UniformUpdateFrequency; import net.coderbot.iris.parsing.VectorType; import org.joml.Vector3i; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import org.joml.Vector3ic; import java.util.function.Supplier; @@ -21,7 +21,7 @@ public class Int3VectorCachedUniform extends VectorCachedUniform { @Override public void push(int location) { - GLStateManager.glUniform3i(location, this.cached.x(), this.cached.y(), this.cached.z()); + GLSMPrograms.glUniform3i(location, this.cached.x(), this.cached.y(), this.cached.z()); } @Override diff --git a/src/main/java/net/coderbot/iris/uniforms/custom/cached/IntCachedUniform.java b/src/main/java/net/coderbot/iris/uniforms/custom/cached/IntCachedUniform.java index 331d03b61..5c56eb745 100644 --- a/src/main/java/net/coderbot/iris/uniforms/custom/cached/IntCachedUniform.java +++ b/src/main/java/net/coderbot/iris/uniforms/custom/cached/IntCachedUniform.java @@ -3,7 +3,7 @@ package net.coderbot.iris.uniforms.custom.cached; import kroppeb.stareval.function.FunctionReturn; import kroppeb.stareval.function.Type; import net.coderbot.iris.gl.uniform.UniformUpdateFrequency; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import java.util.function.IntSupplier; @@ -26,7 +26,7 @@ public class IntCachedUniform extends CachedUniform { @Override public void push(int location) { - GLStateManager.glUniform1i(location, this.cached); + GLSMPrograms.glUniform1i(location, this.cached); } @Override diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinForgeHooksClient_CoreProfile.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinForgeHooksClient_CoreProfile.java index c48ce6b09..31e9cb5e7 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinForgeHooksClient_CoreProfile.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinForgeHooksClient_CoreProfile.java @@ -5,7 +5,7 @@ import com.gtnewhorizons.angelica.AngelicaMod; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.config.GLVersionChoice; import com.gtnewhorizons.angelica.glsm.RenderSystem; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import net.minecraftforge.client.ForgeHooksClient; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -189,13 +189,13 @@ public abstract class MixinForgeHooksClient_CoreProfile { @Unique private static int angelica$validateContext(int major, int minor) { - final String glVersion = GLStateManager.glGetString(GL11.GL_VERSION); + final String glVersion = GLSMQueries.glGetString(GL11.GL_VERSION); final int actual = RenderSystem.parseMajorMinor(glVersion); - final boolean core = (GLStateManager.glGetInteger(GL32.GL_CONTEXT_PROFILE_MASK) & GL32.GL_CONTEXT_CORE_PROFILE_BIT) != 0; + final boolean core = (GLSMQueries.glGetInteger(GL32.GL_CONTEXT_PROFILE_MASK) & GL32.GL_CONTEXT_CORE_PROFILE_BIT) != 0; if (RenderSystem.isContextValid(major, minor, actual, core)) { return 0; } - final String renderer = GLStateManager.glGetString(GL11.GL_RENDERER); + final String renderer = GLSMQueries.glGetString(GL11.GL_RENDERER); LOGGER.warn("Requested GL {}.{} core context but driver returned \"{}\" (core profile: {}, GPU: {}); falling back to a lower version", major, minor, glVersion, core, renderer); angelica$lastRejection = "requested GL " + major + "." + minor + " core, driver returned \"" + glVersion + "\" (core profile: " + core + ", GPU: " + renderer + ")"; try { Display.destroy(); } catch (Exception ignored) {} @@ -218,7 +218,7 @@ public abstract class MixinForgeHooksClient_CoreProfile { LOGGER.error("FATAL: {}", message); if (Display.isCreated()) { try { - LOGGER.error("GPU: {}, Driver: {}", GLStateManager.glGetString(GL11.GL_RENDERER), GLStateManager.glGetString(GL11.GL_VERSION)); + LOGGER.error("GPU: {}, Driver: {}", GLSMQueries.glGetString(GL11.GL_RENDERER), GLSMQueries.glGetString(GL11.GL_VERSION)); } catch (Exception ignored) {} } else { LOGGER.error("GPU info: not available (no GL context)"); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java index ebda5f411..03bcb4fc4 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/MixinMinecraft.java @@ -20,6 +20,7 @@ import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.settings.GameSettings; import org.embeddedt.embeddium.impl.render.frame.RenderAheadManager; import org.lwjgl.input.Keyboard; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import com.gtnewhorizons.angelica.glsm.GLStateManager; import org.lwjgl.opengl.GL11; import org.objectweb.asm.Opcodes; @@ -55,7 +56,7 @@ public abstract class MixinMinecraft { at = @At(value = "INVOKE", target = "Lcpw/mods/fml/common/FMLCommonHandler;onRenderTickEnd(F)V", shift = At.Shift.AFTER, remap = false) ) private void angelica$injectLightingFixPostRenderTick(CallbackInfo ci) { - GLStateManager.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_LIGHTING); } @Unique diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureMap.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureMap.java index 262d0ebe4..23454ee1b 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureMap.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/animation/MixinTextureMap.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.animation; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.mixins.interfaces.IPatchedTextureAtlasSprite; import com.gtnewhorizons.angelica.proxy.ClientProxy; import net.minecraft.client.Minecraft; @@ -32,7 +32,7 @@ public abstract class MixinTextureMap extends AbstractTexture { final boolean renderVisible = ClientProxy.options().performance.animateOnlyVisibleTextures; Minecraft.getMinecraft().mcProfiler.startSection("updateAnimations"); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, this.getGlTextureId()); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, this.getGlTextureId()); final int size = listAnimatedSprites.size(); for (int i = 0; i < size; i++) { diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/archaic/MixinSplashProgress$3.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/archaic/MixinSplashProgress$3.java index 92d3b9749..0f61d6c87 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/archaic/MixinSplashProgress$3.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/archaic/MixinSplashProgress$3.java @@ -18,12 +18,12 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import static com.gtnewhorizons.angelica.glsm.GLStateManager.glDisable; -import static com.gtnewhorizons.angelica.glsm.GLStateManager.glEnable; -import static com.gtnewhorizons.angelica.glsm.GLStateManager.glPopMatrix; -import static com.gtnewhorizons.angelica.glsm.GLStateManager.glPushMatrix; -import static com.gtnewhorizons.angelica.glsm.GLStateManager.glScalef; -import static com.gtnewhorizons.angelica.glsm.GLStateManager.glTranslatef; +import static com.gtnewhorizons.angelica.glsm.GLSMEnable.glDisable; +import static com.gtnewhorizons.angelica.glsm.GLSMEnable.glEnable; +import static com.gtnewhorizons.angelica.glsm.GLSMMatrices.glPopMatrix; +import static com.gtnewhorizons.angelica.glsm.GLSMMatrices.glPushMatrix; +import static com.gtnewhorizons.angelica.glsm.GLSMMatrices.glScalef; +import static com.gtnewhorizons.angelica.glsm.GLSMMatrices.glTranslatef; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; @SuppressWarnings("deprecation") diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinItemRenderer_EdgeDepth.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinItemRenderer_EdgeDepth.java index afd00bbde..25dc9442b 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinItemRenderer_EdgeDepth.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinItemRenderer_EdgeDepth.java @@ -2,6 +2,10 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.bugfixes; import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; import com.gtnewhorizons.angelica.experimental.surround.Surround; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.ffp.CombinedGlint; import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard; @@ -61,16 +65,16 @@ public class MixinItemRenderer_EdgeDepth { @Surround.Carry final boolean preparing = !ShadowRenderer.ACTIVE && !GLStateManager.isRecordingDisplayList() && !TessellatorManager.isCurrentlyCapturing() && !TessellatorManager.shouldInterceptDraw(tess) - && GLStateManager.getDepthTest().isEnabled() && GLStateManager.getDepthState().isEnabled() + && GLSMDepthStencilAlpha.getDepthTest().isEnabled() && GLSMDepthStencilAlpha.getDepthState().isEnabled() && ItemGlint.canResetStencil() && ItemGlint.eligible() && ItemGlint.needsImmediateBase(stack, pass); if (preparing) { BatchStateGuard.suspend(); try { - GLStateManager.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.glStencilMask(1); - GLStateManager.glStencilFunc(GL11.GL_ALWAYS, 0, 1); - GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE); + GLSMAttribStack.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.glStencilMask(1); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_ALWAYS, 0, 1); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_REPLACE); } finally { BatchStateGuard.resume(); } @@ -82,7 +86,7 @@ public class MixinItemRenderer_EdgeDepth { if (preparing) { BatchStateGuard.suspend(); try { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } finally { BatchStateGuard.resume(); } @@ -127,26 +131,26 @@ public class MixinItemRenderer_EdgeDepth { final boolean combined = !secondLayer && ItemGlint.begin(); // Depth selects the surface, stencil limits it to one blend. // The base draw's stencil reset or the first layer's marks avoid a masked full-screen clear. - GLStateManager.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMAttribStack.glPushAttrib(GL11.GL_STENCIL_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); try { - GLStateManager.glDepthMask(false); - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.glStencilMask(1); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.glStencilMask(1); if (secondLayer) { // Same pixels as the first layer, so removing its marks leaves the stencil reset. - GLStateManager.glStencilFunc(GL11.GL_EQUAL, 1, 1); - GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_DECR); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 1, 1); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_DECR); } else { if (!angelica$stencilPrepared) { - GLStateManager.glClearStencil(0); - GLStateManager.glClear(GL11.GL_STENCIL_BUFFER_BIT); + GLSMDepthStencilAlpha.glClearStencil(0); + GLSMFramebuffer.glClear(GL11.GL_STENCIL_BUFFER_BIT); } - GLStateManager.glStencilFunc(GL11.GL_EQUAL, 0, 1); - GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_INCR); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 0, 1); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_INCR); } angelica$drawGlint(tess, iconWidth, iconHeight, thickness); } finally { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); if (combined) CombinedGlint.end(); } angelica$combinedGlint = combined; diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderGlobal_DestroyBlock.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderGlobal_DestroyBlock.java index c9c5bcd4b..1b888cf43 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderGlobal_DestroyBlock.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderGlobal_DestroyBlock.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.bugfixes; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.texture.TextureInfo; import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache; import com.llamalad7.mixinextras.sugar.Share; @@ -21,11 +21,11 @@ public class MixinRenderGlobal_DestroyBlock { at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Tessellator;startDrawingQuads()V") ) private void iris$beginDrawBlockDamageTexture(Tessellator tessellator, EntityLivingBase entity, float partialTicks, CallbackInfo ci, @Share("lastMin") LocalIntRef lastMin, @Share("lastMag") LocalIntRef lastMag) { - TextureInfo info = TextureInfoCache.INSTANCE.getInfo(GLStateManager.getBoundTextureForServerState()); + TextureInfo info = TextureInfoCache.INSTANCE.getInfo(GLSMTextures.getBoundTextureForServerState()); lastMin.set(info.getMinFilter()); lastMag.set(info.getMagFilter()); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); } @Inject( @@ -34,7 +34,7 @@ public class MixinRenderGlobal_DestroyBlock { remap = false ) private void iris$endDrawBlockDamageTexture(Tessellator tessellator, EntityLivingBase entity, float partialTicks, CallbackInfo ci, @Share("lastMin") LocalIntRef lastMin, @Share("lastMag") LocalIntRef lastMag) { - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, lastMin.get()); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, lastMag.get()); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, lastMin.get()); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, lastMag.get()); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderMooshroom_MushroomTint.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderMooshroom_MushroomTint.java index 221db4c1f..0e90ec445 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderMooshroom_MushroomTint.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRenderMooshroom_MushroomTint.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.bugfixes; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import net.coderbot.iris.Iris; import net.coderbot.iris.pipeline.FixedFunctionWorldRenderingPipeline; import net.coderbot.iris.pipeline.WorldRenderingPipeline; @@ -38,7 +38,7 @@ public class MixinRenderMooshroom_MushroomTint { if (angelica$mushroomTintShaderPath) { CapturedRenderingState.INSTANCE.setCurrentEntityColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX); } else { - GLStateManager.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX); + GLSMCurrentAttribs.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX); } angelica$mushroomTintActive = true; } @@ -56,7 +56,7 @@ public class MixinRenderMooshroom_MushroomTint { if (angelica$mushroomTintShaderPath) { CapturedRenderingState.INSTANCE.setCurrentEntityColor(0.0F, 0.0F, 0.0F, 0.0F); } else { - GLStateManager.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F); + GLSMCurrentAttribs.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F); } angelica$mushroomTintActive = false; } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_EyeDepth.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_EyeDepth.java index 13b1339dc..22a4a3986 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_EyeDepth.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_EyeDepth.java @@ -1,7 +1,8 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.bugfixes; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.helpers.RendererLivingEntityHelper; import net.minecraft.client.renderer.entity.RendererLivingEntity; import org.lwjgl.opengl.GL11; @@ -24,15 +25,15 @@ public class MixinRendererLivingEntity_EyeDepth { @Surround.Carry boolean eyes = RendererLivingEntityHelper.hasEyePass(this); if (eyes) { - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(-1.0f, -1.0f); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(-1.0f, -1.0f); } } @Surround.Finally private void angelica$eyePassPolygonOffsetEnd(@Surround.Carry boolean eyes) { if (!eyes) return; - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(0.0f, 0.0f); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(0.0f, 0.0f); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_OverlayTint.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_OverlayTint.java index 36056790d..33561e5d4 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_OverlayTint.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/bugfixes/MixinRendererLivingEntity_OverlayTint.java @@ -2,7 +2,10 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.bugfixes; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import net.coderbot.iris.Iris; import net.coderbot.iris.pipeline.FixedFunctionWorldRenderingPipeline; @@ -41,10 +44,10 @@ public class MixinRendererLivingEntity_OverlayTint { ) private void angelica$setupOverlay(EntityLivingBase entity, double x, double y, double z, float yaw, float partialTick, CallbackInfo ci) { - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); if (entity.hurtTime <= 0 && entity.deathTime <= 0) return; if (angelica$isShaderPackActive()) { @@ -53,7 +56,7 @@ public class MixinRendererLivingEntity_OverlayTint { angelica$shaderEntityColorActive = true; } else { // FFP path - GLStateManager.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX); + GLSMCurrentAttribs.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX); angelica$ffpOverlayActive = true; } angelica$skipReRender = true; @@ -68,7 +71,7 @@ public class MixinRendererLivingEntity_OverlayTint { private void angelica$teardownOverlay(EntityLivingBase entity, double x, double y, double z, float yaw, float partialTick, CallbackInfo ci) { if (angelica$ffpOverlayActive) { - GLStateManager.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F); + GLSMCurrentAttribs.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F); angelica$ffpOverlayActive = false; } if (angelica$shaderEntityColorActive) { @@ -110,7 +113,7 @@ public class MixinRendererLivingEntity_OverlayTint { boolean untint = false; if (angelica$skipReRender && angelica$isAdditivePass()) { if (angelica$ffpOverlayActive) { - GLStateManager.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F); + GLSMCurrentAttribs.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F); untint = true; } else if (angelica$shaderEntityColorActive) { CapturedRenderingState.INSTANCE.setCurrentEntityColor(0.0F, 0.0F, 0.0F, 0.0F); @@ -123,7 +126,7 @@ public class MixinRendererLivingEntity_OverlayTint { private void angelica$retintAfterAdditivePass(@Surround.Carry boolean untint) { if (!untint) return; if (angelica$ffpOverlayActive) { - GLStateManager.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX); + GLSMCurrentAttribs.setOverlayColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX); } else if (angelica$shaderEntityColorActive) { CapturedRenderingState.INSTANCE.setCurrentEntityColor(1.0F, 0.0F, 0.0F, ANGELICA$RED_MIX); } @@ -135,7 +138,7 @@ public class MixinRendererLivingEntity_OverlayTint { ) private void angelica$reset(CallbackInfo ci) { if (angelica$ffpOverlayActive) { - GLStateManager.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F); + GLSMCurrentAttribs.setOverlayColor(0.0F, 0.0F, 0.0F, 0.0F); angelica$ffpOverlayActive = false; } if (angelica$shaderEntityColorActive) { @@ -147,9 +150,9 @@ public class MixinRendererLivingEntity_OverlayTint { @Unique private static boolean angelica$isAdditivePass() { - if (!GLStateManager.glIsEnabled(GL11.GL_BLEND)) return false; - if (GLStateManager.glGetInteger(GL14.GL_BLEND_DST_RGB) != GL11.GL_ONE) return false; - final int src = GLStateManager.glGetInteger(GL14.GL_BLEND_SRC_RGB); + if (!GLSMEnable.glIsEnabled(GL11.GL_BLEND)) return false; + if (GLSMQueries.glGetInteger(GL14.GL_BLEND_DST_RGB) != GL11.GL_ONE) return false; + final int src = GLSMQueries.glGetInteger(GL14.GL_BLEND_SRC_RGB); return src == GL11.GL_ONE || src == GL11.GL_SRC_COLOR; } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/debug/MixinTextureManager.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/debug/MixinTextureManager.java index 367015507..219f23079 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/debug/MixinTextureManager.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/debug/MixinTextureManager.java @@ -1,6 +1,8 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.debug; import com.gtnewhorizons.angelica.glsm.GLDebug; +import com.gtnewhorizons.angelica.glsm.GLSMQueries; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import net.minecraft.client.renderer.texture.ITextureObject; import net.minecraft.client.renderer.texture.TextureManager; @@ -17,10 +19,10 @@ public class MixinTextureManager { @Inject(method = "loadTexture", at = @At("RETURN")) private void onTextureLoad(ResourceLocation resource, ITextureObject texture, CallbackInfoReturnable cir) { if(texture != null && texture != TextureUtil.missingTexture && !GLStateManager.isRecordingDisplayList()) { - final int curId = GLStateManager.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture.getGlTextureId()); + final int curId = GLSMQueries.glGetInteger(GL11.GL_TEXTURE_BINDING_2D); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture.getGlTextureId()); GLDebug.nameObject(GL11.GL_TEXTURE, texture.getGlTextureId(), resource.toString()); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, curId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, curId); } } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinModelRenderer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinModelRenderer.java index d7a742ec7..be0cf3655 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinModelRenderer.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinModelRenderer.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.entity; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility; import com.gtnewhorizons.angelica.rendering.tesr.ModelPartBatcher; import net.minecraft.client.model.ModelRenderer; @@ -14,9 +14,9 @@ public abstract class MixinModelRenderer { @Redirect(method = {"render", "renderWithRotation"}, at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glCallList(I)V", remap = false)) private void angelica$batchPart(int list, float scale) { if (!ModelPartBatcher.partDraw((ModelRenderer) (Object) this, scale, null)) { - final long drawsBefore = GLStateManager.drawCalls; - GLStateManager.glCallList(list); - BatchEligibility.onPartFallback(drawsBefore, GLStateManager.drawCalls); + final long drawsBefore = GLSMDraws.drawCalls; + GLSMDraws.glCallList(list); + BatchEligibility.onPartFallback(drawsBefore, GLSMDraws.drawCalls); } } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderItem_Instanced.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderItem_Instanced.java index de32eefda..6a580b109 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderItem_Instanced.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderItem_Instanced.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.entity; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.rendering.GlintClock; import com.gtnewhorizons.angelica.rendering.SkippedGlintBlock; import com.gtnewhorizons.angelica.rendering.items.DroppedItemInstancer; @@ -159,12 +159,12 @@ public abstract class MixinRenderItem_Instanced { id = "customDraws" ) private void angelica$beginCustomItemDraws() { - BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls); + BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls); } @Surround.Finally("customDraws") private void angelica$endCustomItemDraws() { - BatchEligibility.endExpectedDraws(GLStateManager.drawCalls); + BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls); } @Surround( diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderManager_BatchEligibility.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderManager_BatchEligibility.java index 1571869d9..8f07cea2d 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderManager_BatchEligibility.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRenderManager_BatchEligibility.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.entity; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.mixins.interfaces.IBatchEligibility; import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility; import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay; @@ -20,13 +20,13 @@ public class MixinRenderManager_BatchEligibility { final IBatchEligibility holder = (IBatchEligibility) render; final byte state = holder.angelica$batchState(); final boolean recording = AngelicaConfig.entityShadowReplayEnabled() && EntityShadowReplay.beginRenderer(render, entity, partialTicks, state); - BatchEligibility.begin(state, GLStateManager.drawCalls); + BatchEligibility.begin(state, GLSMDraws.drawCalls); boolean completed = false; try { render.doRender(entity, x, y, z, yaw, partialTicks); completed = true; } finally { - final byte next = BatchEligibility.end(state, GLStateManager.drawCalls); + final byte next = BatchEligibility.end(state, GLSMDraws.drawCalls); if (recording) EntityShadowReplay.endRenderer(completed, next); if (next != state) { holder.angelica$setBatchState(next); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRender_NameTagDraws.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRender_NameTagDraws.java index b4e36d542..3c669bcbe 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRender_NameTagDraws.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRender_NameTagDraws.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.entity; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility; import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay; import net.minecraft.client.renderer.entity.Render; @@ -14,11 +14,11 @@ public abstract class MixinRender_NameTagDraws { @Surround(method = "func_147906_a") private void angelica$countNameTagDraws() { EntityShadowReplay.rejectForeignDraw(); - BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls); + BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls); } @Surround.Finally private void angelica$endNameTagDraws() { - BatchEligibility.endExpectedDraws(GLStateManager.drawCalls); + BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_EquippedDraws.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_EquippedDraws.java index cc6170ccc..a275eaae5 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_EquippedDraws.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_EquippedDraws.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.entity; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility; import net.minecraft.client.renderer.entity.RendererLivingEntity; import org.spongepowered.asm.mixin.Mixin; @@ -15,11 +15,11 @@ public abstract class MixinRendererLivingEntity_EquippedDraws { at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/RendererLivingEntity;renderEquippedItems(Lnet/minecraft/entity/EntityLivingBase;F)V") ) private void angelica$countEquippedDraws() { - BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls); + BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls); } @Surround.Finally private void angelica$endEquippedDraws() { - BatchEligibility.endExpectedDraws(GLStateManager.drawCalls); + BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_GlintClock.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_GlintClock.java index bcfb7dbfe..967c8d3d0 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_GlintClock.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_GlintClock.java @@ -3,7 +3,8 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.entity; import com.gtnewhorizons.angelica.rendering.SkippedGlintBlock; import com.gtnewhorizons.angelica.helpers.RendererLivingEntityHelper; import com.gtnewhorizons.angelica.rendering.GlintClock; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay; import com.gtnewhorizons.angelica.rendering.tesr.GlintCapture; @@ -59,7 +60,7 @@ public abstract class MixinRendererLivingEntity_GlintClock { final ModelBase model = ((RendererLivingEntity) (Object) this).renderPassModel; if ((angelica$armorPassFlags & 15) != 15) return mask; angelica$nextGlintLayer = 0; - if (model != angelica$baseModel || GLStateManager.getOverlayA() != 0.0F || RendererLivingEntityHelper.hasEyePass(this) + if (model != angelica$baseModel || GLSMCurrentAttribs.getOverlayA() != 0.0F || RendererLivingEntityHelper.hasEyePass(this) || !ModelPartBatcher.INSTANCE.queueSkippedArmorGlint(angelica$armorBase, RES_ITEM_GLINT)) return mask; SkippedGlintBlock.applyArmorExitState(); return 0; @@ -84,7 +85,7 @@ public abstract class MixinRendererLivingEntity_GlintClock { } angelica$baseModel = null; angelica$capturingBase = (angelica$armorPassFlags & 15) == 15 && ModelPartBatcher.INSTANCE.beginArmorCapture(angelica$armorBase); - if (angelica$capturingBase) GLStateManager.glPushMatrix(); + if (angelica$capturingBase) GLSMMatrices.glPushMatrix(); } @Inject(method = "doRender(Lnet/minecraft/entity/EntityLivingBase;DDDFF)V", @@ -95,7 +96,7 @@ public abstract class MixinRendererLivingEntity_GlintClock { private void angelica$endArmorBase(CallbackInfo ci) { if (angelica$capturingBase) { angelica$capturingBase = false; - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); angelica$armorBase.endWithRestoredPose(); angelica$baseModel = ((RendererLivingEntity) (Object) this).renderPassModel; } @@ -121,7 +122,7 @@ public abstract class MixinRendererLivingEntity_GlintClock { } if (layer == 1 && batcher.replayGlint(angelica$armorGlint)) return false; angelica$glintLayer = layer == 0 && batcher.beginGlintCapture(angelica$armorGlint) ? GLINT_LAYER_CAPTURED : GLINT_LAYER_DRAWN; - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); return true; } @@ -130,7 +131,7 @@ public abstract class MixinRendererLivingEntity_GlintClock { at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/ModelBase;render(Lnet/minecraft/entity/Entity;FFFFFF)V", ordinal = 0, shift = At.Shift.AFTER)) private void angelica$endArmorGlintLayer(CallbackInfo ci) { if (angelica$glintLayer != GLINT_LAYER_QUEUED) { - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); if (angelica$glintLayer == GLINT_LAYER_CAPTURED) { angelica$armorGlint.endWithRestoredPose(); angelica$secondArmorQueued = ModelPartBatcher.INSTANCE.queueSecondArmorGlint(angelica$armorGlint); @@ -146,12 +147,12 @@ public abstract class MixinRendererLivingEntity_GlintClock { EntityShadowReplay.rejectRenderFailed(); if (angelica$capturingBase) { angelica$capturingBase = false; - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); angelica$armorBase.reset(); } if (angelica$glintLayer != GLINT_LAYER_QUEUED) { angelica$glintLayer = GLINT_LAYER_QUEUED; - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); angelica$armorGlint.reset(); } angelica$endZone(); @@ -180,7 +181,7 @@ public abstract class MixinRendererLivingEntity_GlintClock { method = "doRender(Lnet/minecraft/entity/EntityLivingBase;DDDFF)V", at = @At( value = "INVOKE", - target = "Lcom/gtnewhorizons/angelica/glsm/GLStateManager;glTranslatef(FFF)V", + target = "Lcom/gtnewhorizons/angelica/glsm/GLSMMatrices;glTranslatef(FFF)V", ordinal = 1, remap = false ), diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_ModelPassDraws.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_ModelPassDraws.java index 43918438b..a893d567f 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_ModelPassDraws.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinRendererLivingEntity_ModelPassDraws.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.entity; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility; import net.minecraft.client.renderer.entity.RendererLivingEntity; import org.spongepowered.asm.mixin.Mixin; @@ -15,11 +15,11 @@ public abstract class MixinRendererLivingEntity_ModelPassDraws { at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/ModelBase;render(Lnet/minecraft/entity/Entity;FFFFFF)V") ) private void angelica$countModelPassDraws() { - BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls); + BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls); } @Surround.Finally private void angelica$endModelPassDraws() { - BatchEligibility.endExpectedDraws(GLStateManager.drawCalls); + BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinTextureManager.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinTextureManager.java index d4fed53df..11145c784 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinTextureManager.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/entity/MixinTextureManager.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.entity; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.rendering.tesr.ModelPartBatcher; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.util.ResourceLocation; @@ -14,6 +14,6 @@ public abstract class MixinTextureManager { @Inject(method = "bindTexture", at = @At("RETURN")) private void angelica$trackBind(ResourceLocation location, CallbackInfo ci) { - ModelPartBatcher.onTextureBind(location, GLStateManager.getBoundTextureForServerState()); + ModelPartBatcher.onTextureBind(location, GLSMTextures.getBoundTextureForServerState()); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinFontRenderer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinFontRenderer.java index 65a7de77f..6686b07d7 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinFontRenderer.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinFontRenderer.java @@ -10,7 +10,8 @@ import com.gtnewhorizons.angelica.client.font.ColorCodeUtils; import com.gtnewhorizons.angelica.client.font.FontEffectRegistry; import com.gtnewhorizons.angelica.compat.GTNHLibCompat; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.texture.TextureManager; @@ -140,7 +141,7 @@ public abstract class MixinFontRenderer implements FontRendererAccessor, IFontPa target = "Lnet/minecraft/client/gui/FontRenderer;enableAlpha()V", shift = At.Shift.AFTER, remap = false), cancellable = true) public void angelica$BatchedFontRendererDrawString(String text, int x, int y, int argb, boolean dropShadow, CallbackInfoReturnable cir) { - if (GLStateManager.getListMode() == 0) { + if (GLSMDraws.getListMode() == 0) { cir.setReturnValue(angelica$drawStringBatched(text, x, y, argb, dropShadow)); } } @@ -150,7 +151,7 @@ public abstract class MixinFontRenderer implements FontRendererAccessor, IFontPa */ @Inject(method = "renderString", at = @At("HEAD"), cancellable = true) public void angelica$BatchedFontRendererRenderString(String text, int x, int y, int argb, boolean dropShadow, CallbackInfoReturnable cir) { - if (GLStateManager.getListMode() == 0) { + if (GLSMDraws.getListMode() == 0) { cir.setReturnValue(angelica$drawStringBatched(text, x, y, argb, dropShadow)); } } @@ -179,7 +180,7 @@ public abstract class MixinFontRenderer implements FontRendererAccessor, IFontPa this.blue = (float)(argb >> 8 & 255) / 255.0F; this.green = (float)(argb & 255) / 255.0F; this.alpha = (float)(argb >> 24 & 255) / 255.0F; - GLStateManager.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + GLSMCurrentAttribs.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); this.posX = (float)x; this.posY = (float)y; return (int) angelica$batcher.drawString(x, y, argb, dropShadow, unicodeFlag, text, 0, text.length()); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinGuiIngameForge.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinGuiIngameForge.java index 4e4891b25..3714db56c 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinGuiIngameForge.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/fontrenderer/MixinGuiIngameForge.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.fontrenderer; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor; import net.minecraft.client.gui.FontRenderer; import net.minecraftforge.client.GuiIngameForge; @@ -35,11 +35,11 @@ public class MixinGuiIngameForge { private void angelica$endF3TextBatching(int width, int height, CallbackInfo ci) { FontRendererAccessor fra = (FontRendererAccessor) (Object) fontrenderer; - final boolean depthWasEnabled = GLStateManager.getDepthTest().isEnabled(); - GLStateManager.disableDepthTest(); + final boolean depthWasEnabled = GLSMDepthStencilAlpha.getDepthTest().isEnabled(); + GLSMDepthStencilAlpha.disableDepthTest(); fra.angelica$getBatcher().endBatch(); if (depthWasEnabled) { - GLStateManager.enableDepthTest(); + GLSMDepthStencilAlpha.enableDepthTest(); } } @@ -53,11 +53,11 @@ public class MixinGuiIngameForge { private void angelica$endHotbarTextBatching() { final FontRendererAccessor fra = (FontRendererAccessor) (Object) fontrenderer; - final boolean depthWasEnabled = GLStateManager.getDepthTest().isEnabled(); - GLStateManager.disableDepthTest(); + final boolean depthWasEnabled = GLSMDepthStencilAlpha.getDepthTest().isEnabled(); + GLSMDepthStencilAlpha.disableDepthTest(); fra.angelica$getBatcher().endBatch(); if (depthWasEnabled) { - GLStateManager.enableDepthTest(); + GLSMDepthStencilAlpha.enableDepthTest(); } } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/hudcaching/MixinRenderItem.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/hudcaching/MixinRenderItem.java index 8092cf03a..bfc84ddb4 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/hudcaching/MixinRenderItem.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/hudcaching/MixinRenderItem.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.hudcaching; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import com.gtnewhorizons.angelica.mixins.dummy.DummyTessellator; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import net.minecraft.client.renderer.Tessellator; @@ -32,7 +32,7 @@ public class MixinRenderItem { ) ) private void angelica$neuterGlDisable(int cap) { - if (cap == GL_LIGHTING) GLStateManager.glDisable(cap); + if (cap == GL_LIGHTING) GLSMEnable.glDisable(cap); } @Redirect( diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/optimizations/MixinGLAllocation.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/optimizations/MixinGLAllocation.java index 581ca0720..c064514bf 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/optimizations/MixinGLAllocation.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/optimizations/MixinGLAllocation.java @@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.optimizations; import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import net.minecraft.client.renderer.GLAllocation; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -31,7 +31,7 @@ public class MixinGLAllocation { */ @Overwrite public static synchronized int generateDisplayLists(int count) { - final int id = GLStateManager.glGenLists(count); + final int id = GLSMDraws.glGenLists(count); // Cast to Int2IntMap to use primitive put(int, int) instead of put(Integer, Integer) ((Int2IntMap) mapDisplayLists).put(id, count); return id; @@ -47,7 +47,7 @@ public class MixinGLAllocation { // This makes it null-safe even if called with unallocated ID (no NPE from unboxing null) final int count = ((Int2IntMap) mapDisplayLists).remove(id); if (count > 0) { - GLStateManager.glDeleteLists(id, count); + GLSMDraws.glDeleteLists(id, count); } } @@ -59,7 +59,7 @@ public class MixinGLAllocation { public static synchronized void deleteTexturesAndDisplayLists() { // Cast to Int2IntMap to use primitive iteration for (Int2IntMap.Entry entry : ((Int2IntMap) mapDisplayLists).int2IntEntrySet()) { - GLStateManager.glDeleteLists(entry.getIntKey(), entry.getIntValue()); + GLSMDraws.glDeleteLists(entry.getIntKey(), entry.getIntValue()); } mapDisplayLists.clear(); } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/tesr/MixinTileEntityRendererDispatcher.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/tesr/MixinTileEntityRendererDispatcher.java index 4ceaf212a..497368088 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/tesr/MixinTileEntityRendererDispatcher.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/tesr/MixinTileEntityRendererDispatcher.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.tesr; import com.gtnewhorizons.angelica.config.AngelicaConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.mixins.interfaces.IBatchEligibility; import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility; import com.gtnewhorizons.angelica.rendering.tesr.TesrProviderDispatch; @@ -28,11 +28,11 @@ public class MixinTileEntityRendererDispatcher { final IBatchEligibility holder = (IBatchEligibility) renderer; final byte state = holder.angelica$batchState(); - BatchEligibility.begin(state, GLStateManager.drawCalls); + BatchEligibility.begin(state, GLSMDraws.drawCalls); try { renderer.renderTileEntityAt(te, x, y, z, partialTicks); } finally { - final byte next = BatchEligibility.end(state, GLStateManager.drawCalls); + final byte next = BatchEligibility.end(state, GLSMDraws.drawCalls); if (next != state) { holder.angelica$setBatchState(next); BatchEligibility.onStateChange(renderer, next); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/textures/MixinRenderItem_GuiSampler.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/textures/MixinRenderItem_GuiSampler.java index 4f1a9404b..43a8eeb25 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/textures/MixinRenderItem_GuiSampler.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/textures/MixinRenderItem_GuiSampler.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.textures; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.rendering.RenderingState; import com.gtnewhorizons.angelica.rendering.TextureSamplers; @@ -22,7 +22,7 @@ public class MixinRenderItem_GuiSampler { ) private void angelica$beginGuiSampling() { @Surround.Carry("gui") final boolean gui = !RenderingState.INSTANCE.isRenderingWorld(); - @Surround.Carry("sampler") final int sampler = gui ? GLStateManager.getSamplerBinding(0) : 0; + @Surround.Carry("sampler") final int sampler = gui ? GLSMTextures.getSamplerBinding(0) : 0; if (gui) RenderSystem.bindSamplerToUnit(0, TextureSamplers.getGuiSampler().getId()); } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/vbo/MixinFramebuffer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/vbo/MixinFramebuffer.java index 9dff12f3f..412a8ee0a 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/vbo/MixinFramebuffer.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/angelica/vbo/MixinFramebuffer.java @@ -1,7 +1,13 @@ package com.gtnewhorizons.angelica.mixins.early.angelica.vbo; import com.gtnewhorizon.gtnhlib.client.renderer.postprocessing.PostProcessingHelper; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import net.minecraft.client.shader.Framebuffer; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Mixin; @@ -21,26 +27,26 @@ public abstract class MixinFramebuffer { */ @Overwrite public void framebufferRender(int width, int height) { - GLStateManager.glColorMask(true, true, true, false); - GLStateManager.disableDepthTest(); - GLStateManager.glDepthMask(false); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glViewport(0, 0, width, height); - GLStateManager.enableTexture(); - GLStateManager.disableLighting(); - GLStateManager.disableAlphaTest(); - GLStateManager.disableBlend(); - GLStateManager.disableCull(); - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, framebufferTexture); + GLSMBlend.glColorMask(true, true, true, false); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMRasterizer.glViewport(0, 0, width, height); + GLSMTextures.enableTexture(); + GLSMLighting.disableLighting(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMBlend.disableBlend(); + GLSMRasterizer.disableCull(); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, framebufferTexture); PostProcessingHelper.bindFullscreenVAO(); PostProcessingHelper.drawFullscreenQuad(); PostProcessingHelper.unbindVAO(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, true, true, true); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, true, true, true); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/features/textures/MixinTextureMap.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/features/textures/MixinTextureMap.java index 078e62651..ce77b2d3a 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/features/textures/MixinTextureMap.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/features/textures/MixinTextureMap.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.celeritas.features.textures; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.mixins.interfaces.TextureMetadataExtension; import com.gtnewhorizons.angelica.rendering.TextureAtlasType; import com.gtnewhorizons.angelica.rendering.celeritas.SpriteExtension; @@ -195,7 +195,7 @@ public class MixinTextureMap implements TextureMapExtension { @Inject(method = "loadTextureAtlas", at = @At("RETURN")) private void celeritas$generateQuadTree(CallbackInfo ci, @Local(ordinal = 0) Stitcher stitcher) { if (angelica$isBlockAtlas()) { - GLStateManager.markTextureAsAtlas(((TextureMap) (Object) this).getGlTextureId(), + GLSMTextures.markTextureAsAtlas(((TextureMap) (Object) this).getGlTextureId(), ((SpriteExtension) this.missingImage).angelica$getGutterWidth()); SodiumGameOptions.recordAtlasMipmapClamp(Minecraft.getMinecraft().gameSettings.mipmapLevels, this.mipmapLevels); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/terrain/MixinRenderGlobal.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/terrain/MixinRenderGlobal.java index b997f86ea..ea53028bc 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/terrain/MixinRenderGlobal.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/celeritas/terrain/MixinRenderGlobal.java @@ -5,7 +5,8 @@ import com.gtnewhorizons.angelica.compat.mojang.Camera; import com.gtnewhorizons.angelica.compat.mojang.GameModeUtil; import com.gtnewhorizons.angelica.event.RenderChunkEvent; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.profiling.Tracy; import com.gtnewhorizons.angelica.mixins.interfaces.IRenderGlobalExt; import com.gtnewhorizons.angelica.rendering.AngelicaRenderQueue; @@ -158,12 +159,12 @@ public class MixinRenderGlobal implements IRenderGlobalExt { RenderHelper.disableStandardItemLighting(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.getTextureMapBlocks().getGlTextureId()); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.getTextureMapBlocks().getGlTextureId()); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glEnable(GL11.GL_FOG); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMEnable.glEnable(GL11.GL_FOG); this.mc.entityRenderer.enableLightmap(partialTicks); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/dragonapi/MixinShaderRegistry_ParseError.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/dragonapi/MixinShaderRegistry_ParseError.java index b423a6a21..b44b0e3b9 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/dragonapi/MixinShaderRegistry_ParseError.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/dragonapi/MixinShaderRegistry_ParseError.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.dragonapi; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.injection.At; @@ -14,6 +14,6 @@ public class MixinShaderRegistry_ParseError { @Redirect(method = "parseError", at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL20;glGetShaderInfoLog(II)Ljava/lang/String;")) private static String angelica$routeInfoLogByType(int id, int maxLen) { - return GLStateManager.glIsProgram(id) ? GLStateManager.glGetProgramInfoLog(id, maxLen) : GLStateManager.glGetShaderInfoLog(id, maxLen); + return GLSMPrograms.glIsProgram(id) ? GLSMPrograms.glGetProgramInfoLog(id, maxLen) : GLSMPrograms.glGetShaderInfoLog(id, maxLen); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/base/MixinAbstractTexture.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/base/MixinAbstractTexture.java index 32c6e530c..94e138efa 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/base/MixinAbstractTexture.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/base/MixinAbstractTexture.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.mcpatcherforge.base; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import net.minecraft.client.renderer.texture.AbstractTexture; import org.spongepowered.asm.mixin.Mixin; @@ -16,7 +16,7 @@ public abstract class MixinAbstractTexture implements AbstractTextureExpansion { public void unloadGLTexture() { if (this.glTextureId >= 0) { - GLStateManager.glDeleteTextures(this.glTextureId); + GLSMTextures.glDeleteTextures(this.glTextureId); this.glTextureId = -1; } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cc/client/renderer/entity/MixinRenderWolf.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cc/client/renderer/entity/MixinRenderWolf.java index 3264490ae..915935b7b 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cc/client/renderer/entity/MixinRenderWolf.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cc/client/renderer/entity/MixinRenderWolf.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.mcpatcherforge.cc.client.renderer.entity; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; import net.minecraft.client.renderer.entity.RenderWolf; import net.minecraft.entity.passive.EntitySheep; import net.minecraft.entity.passive.EntityWolf; @@ -19,7 +19,7 @@ public class MixinRenderWolf { at = @At(value = "INVOKE", target = "Lorg/lwjgl/opengl/GL11;glColor3f(FFF)V", ordinal = 1, remap = false)) private void modifyShouldRenderPass2(float red, float green, float blue, EntityWolf entity) { int collarColor = entity.getCollarColor(); - GLStateManager.glColor3f( + GLSMCurrentAttribs.glColor3f( ColorizeEntity.getWolfCollarColor(EntitySheep.fleeceColorTable[collarColor], collarColor)[0], ColorizeEntity.getWolfCollarColor(EntitySheep.fleeceColorTable[collarColor], collarColor)[1], ColorizeEntity.getWolfCollarColor(EntitySheep.fleeceColorTable[collarColor], collarColor)[2]); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderEntityLiving.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderEntityLiving.java index dba1458dd..240845486 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderEntityLiving.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderEntityLiving.java @@ -1,6 +1,11 @@ package com.gtnewhorizons.angelica.mixins.early.mcpatcherforge.cit.client.renderer.entity; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import net.minecraft.client.model.ModelBase; import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.RendererLivingEntity; @@ -87,8 +92,8 @@ public abstract class MixinRenderEntityLiving extends Render { public void doRender(EntityLivingBase entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) { if (MinecraftForge.EVENT_BUS .post(new RenderLivingEvent.Pre(entity, (RendererLivingEntity) (Object) this, x, y, z))) return; - GLStateManager.glPushMatrix(); - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMMatrices.glPushMatrix(); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); this.mainModel.onGround = this.renderSwingProgress(entity, p_76986_9_); if (this.renderPassModel != null) { @@ -139,10 +144,10 @@ public abstract class MixinRenderEntityLiving extends Render { f4 = this.handleRotationFloat(entity, p_76986_9_); this.rotateCorpse(entity, f4, f2, p_76986_9_); float f5 = 0.0625F; - GLStateManager.glEnable(GL12.GL_RESCALE_NORMAL); - GLStateManager.glScalef(-1.0F, -1.0F, 1.0F); + GLSMEnable.glEnable(GL12.GL_RESCALE_NORMAL); + GLSMMatrices.glScalef(-1.0F, -1.0F, 1.0F); this.preRenderCallback(entity, p_76986_9_); - GLStateManager.glTranslatef(0.0F, -24.0F * f5 - 0.0078125F, 0.0F); + GLSMMatrices.glTranslatef(0.0F, -24.0F * f5 - 0.0078125F, 0.0F); float f6 = entity.prevLimbSwingAmount + (entity.limbSwingAmount - entity.prevLimbSwingAmount) * p_76986_9_; float f7 = entity.limbSwing - entity.limbSwingAmount * (1.0F - p_76986_9_); @@ -154,7 +159,7 @@ public abstract class MixinRenderEntityLiving extends Render { f6 = 1.0F; } - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); this.mainModel.setLivingAnimations(entity, f7, f6, p_76986_9_); this.renderModel(entity, f7, f6, f4, f3 - f2, f13, f5); int j; @@ -184,65 +189,65 @@ public abstract class MixinRenderEntityLiving extends Render { // patch end f8 = (float) entity.ticksExisted + p_76986_9_; this.bindTexture(RES_ITEM_GLINT); - GLStateManager.glEnable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_BLEND); f9 = 0.5F; - GLStateManager.glColor4f(f9, f9, f9, 1.0F); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); - GLStateManager.glDepthMask(false); + GLSMCurrentAttribs.glColor4f(f9, f9, f9, 1.0F); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); + GLSMDepthStencilAlpha.glDepthMask(false); for (int k = 0; k < 2; ++k) { - GLStateManager.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_LIGHTING); f10 = 0.76F; - GLStateManager.glColor4f(0.5F * f10, 0.25F * f10, 0.8F * f10, 1.0F); - GLStateManager.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); + GLSMCurrentAttribs.glColor4f(0.5F * f10, 0.25F * f10, 0.8F * f10, 1.0F); + GLSMBlend.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); float f11 = f8 * (0.001F + (float) k * 0.003F) * 20.0F; float f12 = 0.33333334F; - GLStateManager.glScalef(f12, f12, f12); - GLStateManager.glRotatef(30.0F - (float) k * 60.0F, 0.0F, 0.0F, 1.0F); - GLStateManager.glTranslatef(0.0F, f11, 0.0F); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glScalef(f12, f12, f12); + GLSMMatrices.glRotatef(30.0F - (float) k * 60.0F, 0.0F, 0.0F, 1.0F); + GLSMMatrices.glTranslatef(0.0F, f11, 0.0F); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); } - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glDepthMask(true); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); } - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); } } - GLStateManager.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthMask(true); this.renderEquippedItems(entity, p_76986_9_); float f14 = entity.getBrightness(p_76986_9_); j = this.getColorMultiplier(entity, f14, p_76986_9_); - GLStateManager.setActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.setActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.setActiveTexture(GL13.GL_TEXTURE1); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMTextures.setActiveTexture(GL13.GL_TEXTURE0); if ((j >> 24 & 255) > 0 || entity.hurtTime > 0 || entity.deathTime > 0) { - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); if (entity.hurtTime > 0 || entity.deathTime > 0) { - GLStateManager.glColor4f(f14, 0.0F, 0.0F, 0.4F); + GLSMCurrentAttribs.glColor4f(f14, 0.0F, 0.0F, 0.4F); this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); for (int l = 0; l < 4; ++l) { if (this.inheritRenderPass(entity, l, p_76986_9_) >= 0) { - GLStateManager.glColor4f(f14, 0.0F, 0.0F, 0.4F); + GLSMCurrentAttribs.glColor4f(f14, 0.0F, 0.0F, 0.4F); this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); } } @@ -253,33 +258,33 @@ public abstract class MixinRenderEntityLiving extends Render { f9 = (float) (j >> 8 & 255) / 255.0F; float f15 = (float) (j & 255) / 255.0F; f10 = (float) (j >> 24 & 255) / 255.0F; - GLStateManager.glColor4f(f8, f9, f15, f10); + GLSMCurrentAttribs.glColor4f(f8, f9, f15, f10); this.mainModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); for (int i1 = 0; i1 < 4; ++i1) { if (this.inheritRenderPass(entity, i1, p_76986_9_) >= 0) { - GLStateManager.glColor4f(f8, f9, f15, f10); + GLSMCurrentAttribs.glColor4f(f8, f9, f15, f10); this.renderPassModel.render(entity, f7, f6, f4, f3 - f2, f13, f5); } } } - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); } - GLStateManager.glDisable(GL12.GL_RESCALE_NORMAL); + GLSMEnable.glDisable(GL12.GL_RESCALE_NORMAL); } catch (Exception exception) { logger.error("Couldn't render entity", exception); } - GLStateManager.setActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.setActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glEnable(GL11.GL_CULL_FACE); - GLStateManager.glPopMatrix(); + GLSMTextures.setActiveTexture(GL13.GL_TEXTURE1); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.setActiveTexture(GL13.GL_TEXTURE0); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); + GLSMMatrices.glPopMatrix(); this.passSpecialRender(entity, x, y, z); MinecraftForge.EVENT_BUS .post(new RenderLivingEvent.Post(entity, (RendererLivingEntity) (Object) this, x, y, z)); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderItem.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderItem.java index e74de9d13..adcdd93f4 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderItem.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/cit/client/renderer/entity/MixinRenderItem.java @@ -1,6 +1,8 @@ package com.gtnewhorizons.angelica.mixins.early.mcpatcherforge.cit.client.renderer.entity; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.entity.Render; @@ -53,7 +55,7 @@ public abstract class MixinRenderItem extends Render { remap = false) private void modifyRenderItemIntoGUI1(FontRenderer fontRenderer, TextureManager manager, ItemStack itemStack, int x, int y, boolean renderEffect, CallbackInfo ci) { - GLStateManager.glDepthMask(false); + GLSMDepthStencilAlpha.glDepthMask(false); } @Inject( @@ -62,7 +64,7 @@ public abstract class MixinRenderItem extends Render { remap = false) private void modifyRenderItemIntoGUI2(FontRenderer fontRenderer, TextureManager manager, ItemStack itemStack, int x, int y, boolean renderEffect, CallbackInfo ci) { - GLStateManager.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthMask(true); } @Redirect( @@ -104,8 +106,8 @@ public abstract class MixinRenderItem extends Render { private void modifyRenderItemAndEffectIntoGUI1(FontRenderer fontRenderer, TextureManager manager, ItemStack itemStack, int x, int y, CallbackInfo ci) { // Moved to before call, will not trigger with forge event - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.01f); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.01f); } /** @@ -119,18 +121,18 @@ public abstract class MixinRenderItem extends Render { private void modifyRenderItemAndEffectIntoGUI2(FontRenderer fontRenderer, TextureManager manager, ItemStack itemStack, int x, int y, CallbackInfo ci) { if (!CITUtils.renderEnchantmentGUI(itemStack, x, y, this.zLevel) && itemStack.hasEffect(0)) { - GLStateManager.glDepthFunc(GL11.GL_EQUAL); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glDepthMask(false); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMDepthStencilAlpha.glDepthMask(false); manager.bindTexture(RES_ITEM_GLINT); - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glColor4f(0.5F, 0.25F, 0.8F, 1.0F); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMCurrentAttribs.glColor4f(0.5F, 0.25F, 0.8F, 1.0F); this.renderGlint(x * 431278612 + y * 32178161, x - 2, y - 2, 20, 20); OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GLStateManager.glDepthMask(true); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); } } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderFish.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderFish.java index 66356e758..4d77788e0 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderFish.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderFish.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.mcpatcherforge.mob; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.Render; @@ -26,10 +27,10 @@ public abstract class MixinRenderFish extends Render { @SuppressWarnings({ "DuplicatedCode", "ExtractMethodRecommender" }) @Overwrite public void doRender(EntityFishHook entity, double x, double y, double z, float p_76986_8_, float p_76986_9_) { - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef((float) x, (float) y, (float) z); - GLStateManager.glEnable(GL12.GL_RESCALE_NORMAL); - GLStateManager.glScalef(0.5F, 0.5F, 0.5F); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef((float) x, (float) y, (float) z); + GLSMEnable.glEnable(GL12.GL_RESCALE_NORMAL); + GLSMMatrices.glScalef(0.5F, 0.5F, 0.5F); this.bindEntityTexture(entity); Tessellator tessellator = Tessellator.instance; byte b0 = 1; @@ -41,8 +42,8 @@ public abstract class MixinRenderFish extends Render { float f6 = 1.0F; float f7 = 0.5F; float f8 = 0.5F; - GLStateManager.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); - GLStateManager.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); + GLSMMatrices.glRotatef(180.0F - this.renderManager.playerViewY, 0.0F, 1.0F, 0.0F); + GLSMMatrices.glRotatef(-this.renderManager.playerViewX, 1.0F, 0.0F, 0.0F); tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, 1.0F, 0.0F); tessellator.addVertexWithUV(0.0F - f7, 0.0F - f8, 0.0D, f2, f5); @@ -50,8 +51,8 @@ public abstract class MixinRenderFish extends Render { tessellator.addVertexWithUV(f6 - f7, 1.0F - f8, 0.0D, f3, f4); tessellator.addVertexWithUV(0.0F - f7, 1.0F - f8, 0.0D, f2, f4); tessellator.draw(); - GLStateManager.glDisable(GL12.GL_RESCALE_NORMAL); - GLStateManager.glPopMatrix(); + GLSMEnable.glDisable(GL12.GL_RESCALE_NORMAL); + GLSMMatrices.glPopMatrix(); if (entity.field_146042_b != null) { float f9 = entity.field_146042_b.getSwingProgress(p_76986_9_); @@ -110,8 +111,8 @@ public abstract class MixinRenderFish extends Render { double d13 = (float) (d5 - d10); // patch start (= if statement) if (!LineRenderer.renderLine(0, x, y, z, d11, d12, d13)) { - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMEnable.glDisable(GL11.GL_LIGHTING); tessellator.startDrawing(3); tessellator.setColorOpaque_I(0); byte b2 = 16; @@ -125,8 +126,8 @@ public abstract class MixinRenderFish extends Render { } tessellator.draw(); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); } } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderLiving.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderLiving.java index 49e446495..87bd23ddb 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderLiving.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/mcpatcherforge/mob/MixinRenderLiving.java @@ -8,7 +8,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityHanging; import net.minecraft.entity.EntityLiving; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; @@ -73,9 +73,9 @@ public abstract class MixinRenderLiving extends RendererLivingEntity { double d18 = (float) (d11 - d15); // patch start (only change is if-wrapper) if (!LineRenderer.renderLine(1, x, y, z, d16, d17, d18)) { - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); tessellator.startDrawing(5); int i; float f2; @@ -124,11 +124,11 @@ public abstract class MixinRenderLiving extends RendererLivingEntity { } tessellator.draw(); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); } // patch end - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); } } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/notfine/clouds/MixinRenderGlobal.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/notfine/clouds/MixinRenderGlobal.java index df1c36786..a71d5ce35 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/notfine/clouds/MixinRenderGlobal.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/notfine/clouds/MixinRenderGlobal.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.mixins.early.notfine.clouds; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import jss.notfine.core.Settings; import jss.notfine.gui.options.named.GraphicsQualityOff; import net.minecraft.client.Minecraft; @@ -51,8 +54,8 @@ public abstract class MixinRenderGlobal { @Overwrite public void renderCloudsFancy(float partialTicks) { Tessellator tessellator = Tessellator.instance; - GLStateManager.glDisable(GL11.GL_CULL_FACE); - GLStateManager.glEnable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 1, 0); renderEngine.bindTexture(locationCloudsPng); @@ -90,19 +93,19 @@ public abstract class MixinRenderGlobal { float cloudWidth = 8f; int renderRadius = (int)((int)Settings.RENDER_DISTANCE_CLOUDS.option.getStore() / (cloudScale * 2f)); float edgeOverlap = 0.0001f;//0.001F; - GLStateManager.glScalef(cloudInteriorWidth, 1.0F, cloudInteriorWidth); + GLSMMatrices.glScalef(cloudInteriorWidth, 1.0F, cloudInteriorWidth); for (int loop = 0; loop < 2; ++loop) { if (loop == 0) { - GLStateManager.glColorMask(false, false, false, false); + GLSMBlend.glColorMask(false, false, false, false); } else if (mc.gameSettings.anaglyph) { if (EntityRenderer.anaglyphField == 0) { - GLStateManager.glColorMask(false, true, true, true); + GLSMBlend.glColorMask(false, true, true, true); } else { - GLStateManager.glColorMask(true, false, false, true); + GLSMBlend.glColorMask(true, false, false, true); } } else { - GLStateManager.glColorMask(true, true, true, true); + GLSMBlend.glColorMask(true, true, true, true); } for(int chunkX = -renderRadius + 1; chunkX <= renderRadius; ++chunkX) { @@ -185,15 +188,15 @@ public abstract class MixinRenderGlobal { } } - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); } public void renderCloudsFast(float partialTicks) { Tessellator tessellator = Tessellator.instance; - GLStateManager.glDisable(GL11.GL_CULL_FACE); - GLStateManager.glEnable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_CULL_FACE); + GLSMEnable.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 1, 0); renderEngine.bindTexture(locationCloudsPng); @@ -239,9 +242,9 @@ public abstract class MixinRenderGlobal { tessellator.addVertexWithUV(neg, cameraRelativeY, neg, startXUv, startZUv); tessellator.draw(); - GLStateManager.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glEnable(GL11.GL_CULL_FACE); + GLSMCurrentAttribs.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glEnable(GL11.GL_CULL_FACE); } @Shadow @Final diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinEntityRenderer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinEntityRenderer.java index 3d3e2655f..b5ecd1a46 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinEntityRenderer.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinEntityRenderer.java @@ -3,7 +3,9 @@ package com.gtnewhorizons.angelica.mixins.early.shaders; import com.gtnewhorizons.angelica.compat.mojang.Camera; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; import com.gtnewhorizons.angelica.rendering.celeritas.CeleritasWorldRenderer; import com.gtnewhorizons.angelica.rendering.tesr.EntityShadowReplay; import com.llamalad7.mixinextras.sugar.Local; @@ -58,7 +60,7 @@ public abstract class MixinEntityRenderer implements IResourceManagerReloadListe final WorldRenderingPipeline pipeline = Iris.getPipelineManager().preparePipeline(Iris.getCurrentDimensionName()); mc.mcProfiler.endSection(); - GLStateManager.setShaderColor(1f, 1f, 1f, 1f); + GLSMCurrentAttribs.setShaderColor(1f, 1f, 1f, 1f); pipeline.beginLevelRendering(); } @@ -72,10 +74,10 @@ public abstract class MixinEntityRenderer implements IResourceManagerReloadListe Minecraft.getMinecraft().mcProfiler.endStartSection("iris_final"); pipeline.finalizeLevelRendering(); Program.unbind(); - GLStateManager.glDepthMask(true); - GLStateManager.disableBlend(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1F); - GLStateManager.enableAlphaTest(); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1F); + GLSMDepthStencilAlpha.enableAlphaTest(); } @Surround(id = "disableVanillaRenderHand", method = "renderHand", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ItemRenderer;renderItemInFirstPerson(F)V")) @@ -141,7 +143,7 @@ public abstract class MixinEntityRenderer implements IResourceManagerReloadListe WorldRenderingPipeline pipeline = Iris.getPipelineManager().getPipelineNullable(); pipeline.setPhase(WorldRenderingPhase.RAIN_SNOW); if (pipeline.shouldWriteRainAndSnowToDepthBuffer()) { - GLStateManager.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthMask(true); } @Surround.Skip boolean skip = !pipeline.shouldRenderWeather(); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinFramebuffer.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinFramebuffer.java index b64b86460..a8f26c792 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinFramebuffer.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinFramebuffer.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.shaders; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import net.coderbot.iris.rendertarget.IRenderTargetExt; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.shader.Framebuffer; @@ -54,7 +54,7 @@ public class MixinFramebuffer implements IRenderTargetExt { @Inject(method="deleteFramebuffer()V", at=@At(value="FIELD", target="Lnet/minecraft/client/shader/Framebuffer;depthBuffer:I", shift = At.Shift.BEFORE, ordinal = 0), require = 1) private void iris$deleteDepthBuffer(CallbackInfo ci) { if(this.iris$depthTextureId > -1 ) { - GLStateManager.glDeleteTextures(this.iris$depthTextureId); + GLSMTextures.glDeleteTextures(this.iris$depthTextureId); this.iris$depthTextureId = -1; } } @@ -69,19 +69,19 @@ public class MixinFramebuffer implements IRenderTargetExt { @Inject(method = "createFramebuffer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/shader/Framebuffer;framebufferClear()V", shift = At.Shift.BEFORE, ordinal = 1), require = 1) private void iris$createDepthTexture(int width, int height, CallbackInfo ci) { if(this.useDepth) { - this.iris$depthTextureId = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, this.iris$depthTextureId); + this.iris$depthTextureId = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, this.iris$depthTextureId); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_COMPARE_MODE, 0); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_COMPARE_MODE, 0); final boolean stencil = MinecraftForgeClient.getStencilBits() != 0; if (stencil) { - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH24_STENCIL8, width, height, 0, GL30.GL_DEPTH_STENCIL, GL30.GL_UNSIGNED_INT_24_8, (IntBuffer) null); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH24_STENCIL8, width, height, 0, GL30.GL_DEPTH_STENCIL, GL30.GL_UNSIGNED_INT_24_8, (IntBuffer) null); } else { - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_DEPTH_COMPONENT, width, height, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (IntBuffer) null); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_DEPTH_COMPONENT, width, height, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (IntBuffer) null); } OpenGlHelper.func_153188_a(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, this.iris$depthTextureId, 0); if (stencil) { diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGuiIngameForge.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGuiIngameForge.java index 4d50cd323..69354e0ac 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGuiIngameForge.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinGuiIngameForge.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.shaders; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import net.minecraftforge.client.GuiIngameForge; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Mixin; @@ -13,6 +13,6 @@ public class MixinGuiIngameForge { @Inject(method="renderCrosshairs", at= @At(value = "INVOKE", target = "Lnet/minecraftforge/client/GuiIngameForge;bind(Lnet/minecraft/util/ResourceLocation;)V", shift = At.Shift.AFTER)) private void renderCrosshairs(CallbackInfo ci) { // Set the same state as vanilla so we don't break with textures that set a color value on transparent pixels for the crosshairs - GLStateManager.glEnable(GL11.GL_ALPHA_TEST); + GLSMEnable.glEnable(GL11.GL_ALPHA_TEST); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderDragon.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderDragon.java index be119631b..01b4eb43e 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderDragon.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderDragon.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.shaders; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; import com.gtnewhorizons.angelica.api.EnderDragonBeams; import net.minecraft.client.renderer.entity.RenderDragon; import net.minecraft.entity.boss.EntityDragon; @@ -51,14 +51,14 @@ public abstract class MixinRenderDragon { EnderDragonBeams.beginDeathRays(); angelica$depthPassReplay++; - GLStateManager.glColorMask(false, false, false, false); + GLSMBlend.glColorMask(false, false, false, false); try { angelica$invokeRenderEquippedItems(dragon, partialTicks); } catch (Throwable t) { angelica$endDeathBeamsLighting(true); throw t; } finally { - GLStateManager.glColorMask(true, true, true, true); + GLSMBlend.glColorMask(true, true, true, true); angelica$depthPassReplay--; } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderEndPortal.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderEndPortal.java index 481d00751..efef42d16 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderEndPortal.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderEndPortal.java @@ -1,6 +1,6 @@ package com.gtnewhorizons.angelica.mixins.early.shaders; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import net.coderbot.iris.Iris; import net.coderbot.iris.uniforms.SystemTimeUniforms; import net.minecraft.client.Minecraft; @@ -41,7 +41,7 @@ public class MixinRenderEndPortal { float bottom = (float) y + iris$BOTTOM; Minecraft.getMinecraft().getTextureManager().bindTexture(iris$END_PORTAL_TEXTURE); - GLStateManager.enableTexture(); + GLSMTextures.enableTexture(); Tessellator tess = Tessellator.instance; tess.startDrawingQuads(); diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderGlobal.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderGlobal.java index 485e53d70..576fab19c 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderGlobal.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinRenderGlobal.java @@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.mixins.early.shaders; import com.gtnewhorizon.gtnhlib.client.renderer.ITessellatorInstance; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import net.coderbot.iris.Iris; import net.coderbot.iris.layer.GbufferPrograms; import net.coderbot.iris.pipeline.WorldRenderingPhase; @@ -60,7 +60,7 @@ public class MixinRenderGlobal { @Inject(method = "renderSky", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/WorldClient;getCelestialAngle(F)F"), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/WorldClient;getRainStrength(F)F"))) private void iris$renderSky$tiltSun(float p_72714_1_, CallbackInfo ci) { - GLStateManager.glRotatef(Iris.getPipelineManager().getPipelineNullable().getSunPathRotation(), 0.0F, 0.0F, 1.0F); + GLSMMatrices.glRotatef(Iris.getPipelineManager().getPipelineNullable().getSunPathRotation(), 0.0F, 0.0F, 1.0F); } // Sky disc: wrap the glCallList(glSkyList) call — the first glCallList in the surface world branch diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java index bbc2d4afe..c89bd1152 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/early/shaders/MixinTileEntityRendererDispatcher.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.early.shaders; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.rendering.tesr.PassRebindGate; import com.gtnewhorizons.angelica.rendering.tesr.TesrAttribution; @@ -29,7 +29,7 @@ public class MixinTileEntityRendererDispatcher { @Surround(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDF)V") private void iris$beginBlockEntity(TileEntity te, double x, double y, double z, float partialTicks) { RenderRecovery.throwIfCrashTestArmed(); - @Surround.Carry final int blendDepth = GLStateManager.pushState(StateSet.BLEND); + @Surround.Carry final int blendDepth = GLSMAttribStack.pushState(StateSet.BLEND); CTMUtils.clearCurrentCompact(); CapturedRenderingState.INSTANCE.pushCurrentBlockEntity(); CapturedRenderingState.INSTANCE.setCurrentBlockEntity(te == null ? null : te.getBlockType(), TesrProviderDispatch.blockMetadata(te)); @@ -43,7 +43,7 @@ public class MixinTileEntityRendererDispatcher { CTMUtils.clearCurrentCompact(); CapturedRenderingState.INSTANCE.popCurrentBlockEntity(); TesrAttribution.currentRenderable = prevRenderable; - GLStateManager.popStateTo(blendDepth); + GLSMAttribStack.popStateTo(blendDepth); } @ModifyExpressionValue(method = "renderTileEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getLightBrightnessForSkyBlocks(IIII)I")) diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/chisel/MixinRenderCarvableBeacon.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/chisel/MixinRenderCarvableBeacon.java index 58b5ce7b9..e111c8463 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/chisel/MixinRenderCarvableBeacon.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/chisel/MixinRenderCarvableBeacon.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.late.chisel; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; import com.gtnewhorizons.angelica.glsm.StateSet; import net.coderbot.iris.gbuffer_overrides.matching.SpecialCondition; import net.coderbot.iris.layer.GbufferPrograms; @@ -25,14 +25,14 @@ public class MixinRenderCarvableBeacon { @Surround(method = "renderBeam(FLnet/minecraft/world/World;DDDIF)V", require = 1) private void angelica$wrapBeaconBeam(float f1, World world, double x, double y, double z, int meta, float partialTicks) { @Surround.Carry - final int stateDepth = GLStateManager.pushState(StateSet.CULL); + final int stateDepth = GLSMAttribStack.pushState(StateSet.CULL); GbufferPrograms.setupSpecialRenderCondition(SpecialCondition.BEACON_BEAM); } @Surround.Finally private void angelica$wrapBeaconBeamRestore(@Surround.Carry int stateDepth) { GbufferPrograms.teardownSpecialRenderCondition(); - GLStateManager.popStateTo(stateDepth); + GLSMAttribStack.popStateTo(stateDepth); } @Redirect( diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderCelestial.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderCelestial.java index d7cc84bfb..222698bb2 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderCelestial.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderCelestial.java @@ -1,7 +1,8 @@ package com.gtnewhorizons.angelica.mixins.late.client.ntmSpace; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.utils.WorkaroundUtils; import com.hbm.dim.SkyProviderCelestial; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; @@ -72,26 +73,26 @@ public class MixinSkyProviderCelestial { , target = "Lnet/minecraft/client/renderer/RenderHelper;disableStandardItemLighting()V" , remap = true)) public void iris$main$renderInDefaultProgram(CallbackInfo ci) { - angelica$previousProgram = GLStateManager.getActiveProgram(); - GLStateManager.glUseProgram(0); + angelica$previousProgram = GLSMPrograms.getActiveProgram(); + GLSMPrograms.glUseProgram(0); } @Surround(method = "render" , at = @At(value = "INVOKE" , target = "Lcom/hbm/dim/SkyProviderCelestial;renderSun(FLnet/minecraft/client/multiplayer/WorldClient;Lnet/minecraft/client/Minecraft;Lcom/hbm/dim/CelestialBody;DDFF)V")) private void iris$main$renderSunInShaderProgram(){ - GLStateManager.glUseProgram(angelica$previousProgram); + GLSMPrograms.glUseProgram(angelica$previousProgram); } @Surround.Finally private void iris$main$renderSunInShaderProgramEnd() { - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); } @Inject(method = "render" , at = @At(value = "TAIL")) public void iris$main$restorePreviousProgram(CallbackInfo ci) { - GLStateManager.glUseProgram(angelica$previousProgram); + GLSMPrograms.glUseProgram(angelica$previousProgram); } @Inject(method = "renderSun" @@ -156,7 +157,7 @@ public class MixinSkyProviderCelestial { , ordinal = 2)) private void iris$renderSky$tiltSun(CallbackInfo ci) { Iris.getPipelineManager().getPipeline().ifPresent( - p -> GLStateManager.glRotatef(p.getSunPathRotation(), 0.0F, 0.0F, 1.0F) + p -> GLSMMatrices.glRotatef(p.getSunPathRotation(), 0.0F, 0.0F, 1.0F) ); } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderOrbit.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderOrbit.java index de72ed4dc..4bf99612a 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderOrbit.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/client/ntmSpace/MixinSkyProviderOrbit.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.late.client.ntmSpace; import com.gtnewhorizons.angelica.experimental.surround.Surround; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.utils.WorkaroundUtils; import com.hbm.dim.orbit.SkyProviderOrbit; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; @@ -41,26 +41,26 @@ public class MixinSkyProviderOrbit { , target = "Lnet/minecraft/client/renderer/RenderHelper;disableStandardItemLighting()V" , remap = true)) public void iris$main$renderInDefaultProgram(CallbackInfo ci) { - angelica$previousProgram = GLStateManager.getActiveProgram(); - GLStateManager.glUseProgram(0); + angelica$previousProgram = GLSMPrograms.getActiveProgram(); + GLSMPrograms.glUseProgram(0); } @Surround(method = "render" , at = @At(value = "INVOKE" , target = "Lcom/hbm/dim/orbit/SkyProviderOrbit;renderSun(FLnet/minecraft/client/multiplayer/WorldClient;Lnet/minecraft/client/Minecraft;Lcom/hbm/dim/CelestialBody;DDFF)V")) private void iris$main$renderSunInShaderProgram(){ - GLStateManager.glUseProgram(angelica$previousProgram); + GLSMPrograms.glUseProgram(angelica$previousProgram); } @Surround.Finally private void iris$main$renderSunInShaderProgramEnd() { - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); } @Inject(method = "render" , at = @At(value = "TAIL")) public void iris$main$restorePreviousProgram(CallbackInfo ci) { - GLStateManager.glUseProgram(angelica$previousProgram); + GLSMPrograms.glUseProgram(angelica$previousProgram); } } diff --git a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/notfine/toggle/biomesoplenty/MixinFogHandler.java b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/notfine/toggle/biomesoplenty/MixinFogHandler.java index 67a9c6493..7fc5e12a1 100644 --- a/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/notfine/toggle/biomesoplenty/MixinFogHandler.java +++ b/src/mixin/java/com/gtnewhorizons/angelica/mixins/late/notfine/toggle/biomesoplenty/MixinFogHandler.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.mixins.late.notfine.toggle.biomesoplenty; import biomesoplenty.client.fog.FogHandler; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMFog; import jss.notfine.core.Settings; import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Mixin; @@ -16,19 +16,19 @@ public class MixinFogHandler { private static void notFine$modifyBoPFog(int fogMode, float farPlane, float nearFactor, CallbackInfo ci) { if (!(Boolean) Settings.TERRAIN_FOG.option.getStore()) { // same values from notfine.toggle.MixinEntityRenderer - GLStateManager.glFogf(GL11.GL_FOG_START, 1024 * 1024 * 15); - GLStateManager.glFogf(GL11.GL_FOG_END, 1024 * 1024 * 16); + GLSMFog.glFogf(GL11.GL_FOG_START, 1024 * 1024 * 15); + GLSMFog.glFogf(GL11.GL_FOG_END, 1024 * 1024 * 16); ci.cancel(); return; } if (fogMode < 0) { - GLStateManager.glFogf(GL11.GL_FOG_START, 0.0F); - GLStateManager.glFogf(GL11.GL_FOG_END, farPlane); + GLSMFog.glFogf(GL11.GL_FOG_START, 0.0F); + GLSMFog.glFogf(GL11.GL_FOG_END, farPlane); } else { float nearDistPercent = (int) Settings.FOG_NEAR_DISTANCE.option.getStore() * 0.01F; - GLStateManager.glFogf(GL11.GL_FOG_START, farPlane * nearFactor * nearDistPercent); - GLStateManager.glFogf(GL11.GL_FOG_END, farPlane); + GLSMFog.glFogf(GL11.GL_FOG_START, farPlane * nearFactor * nearDistPercent); + GLSMFog.glFogf(GL11.GL_FOG_END, farPlane); } ci.cancel(); } diff --git a/src/test/java/com/gtnewhorizons/angelica/api/GLRedirectsTest.java b/src/test/java/com/gtnewhorizons/angelica/api/GLRedirectsTest.java index deaaec5d6..7db2e44ae 100644 --- a/src/test/java/com/gtnewhorizons/angelica/api/GLRedirectsTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/api/GLRedirectsTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; class GLRedirectsTest { @@ -151,12 +152,55 @@ class GLRedirectsTest { String script = "GL11.glPushMatrix();\nGL11.glTranslatef(1,2,3);\nGL11.glEnable(GL11.GL_BLEND);"; String result = GLRedirects.getMethodRedirectPattern().matcher(script).replaceAll(mr -> { - String target = GLRedirects.getTargetMethodName(mr.group(0)); - return target != null ? "GLStateManager." + target : mr.group(0); + String ref = GLRedirects.getTargetReference(mr.group(0)); + return ref != null ? ref : mr.group(0); }); - assertTrue(result.contains("GLStateManager.glPushMatrix()"), "glPushMatrix not redirected: " + result); - assertTrue(result.contains("GLStateManager.glTranslatef(1,2,3)"), "glTranslatef not redirected: " + result); - assertTrue(result.contains("GLStateManager.glEnable(GL11.GL_BLEND)"), "glEnable not redirected or GL_BLEND mangled: " + result); + assertTrue(result.contains("GLSMMatrices.glPushMatrix()"), "glPushMatrix not redirected: " + result); + assertTrue(result.contains("GLSMMatrices.glTranslatef(1,2,3)"), "glTranslatef not redirected: " + result); + assertTrue(result.contains("GLSMEnable.glEnable(GL11.GL_BLEND)"), "glEnable not redirected or GL_BLEND mangled: " + result); + } + + private static final String IMPORT = "importPackage(Packages.com.gtnewhorizons.angelica.glsm)"; + + @Test + void redirectScriptRewritesGlCallAndAddsImportOnce() { + final String result = GLRedirects.redirectScript("GL11.glPushMatrix();"); + assertTrue(result.contains("GLSMMatrices.glPushMatrix();"), result); + assertEquals(result.indexOf(IMPORT), result.lastIndexOf(IMPORT), result); + assertTrue(result.startsWith(IMPORT), result); + } + + @Test + void redirectScriptRewritesMovedGlStateManagerMember() { + assertTrue(GLRedirects.redirectScript("GLStateManager.glPushMatrix();").contains("GLSMMatrices.glPushMatrix();")); + } + + @Test + void redirectScriptLeavesUnmovedMemberAndWordPrefixed() { + final String unmoved = "GLStateManager.ctx();"; + assertSame(unmoved, GLRedirects.redirectScript(unmoved)); + final String prefixed = "xGLStateManager.glPushMatrix();"; + assertSame(prefixed, GLRedirects.redirectScript(prefixed)); + } + + @Test + void redirectScriptLeavesDottedAndAlreadyMovedReferences() { + final String dotted = "Packages.org.lwjgl.opengl.GL11.glPushMatrix();"; + assertSame(dotted, GLRedirects.redirectScript(dotted)); + final String moved = "GLSMMatrices.glPushMatrix();"; + assertSame(moved, GLRedirects.redirectScript(moved)); + } + + @Test + void redirectScriptIsIdempotent() { + final String once = GLRedirects.redirectScript("GL11.glPushMatrix();\nGLStateManager.glPopMatrix();"); + assertEquals(once, GLRedirects.redirectScript(once)); + } + + @Test + void redirectScriptKeepsExistingImport() { + final String result = GLRedirects.redirectScript(IMPORT + ";\nGL11.glPushMatrix();"); + assertEquals(result.indexOf(IMPORT), result.lastIndexOf(IMPORT), result); } } diff --git a/src/test/java/com/gtnewhorizons/angelica/api/glstate/GLState_GLTest.java b/src/test/java/com/gtnewhorizons/angelica/api/glstate/GLState_GLTest.java new file mode 100644 index 000000000..d9e159e19 --- /dev/null +++ b/src/test/java/com/gtnewhorizons/angelica/api/glstate/GLState_GLTest.java @@ -0,0 +1,109 @@ +package com.gtnewhorizons.angelica.api.glstate; + +import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import org.joml.Matrix4f; +import org.joml.Vector3d; +import org.joml.Vector4f; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; + +import java.nio.FloatBuffer; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@GLCoreTest +class GLState_GLTest { + + @BeforeEach + void saveState() { + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + } + + @AfterEach + void restoreState() { + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMAttribStack.glPopAttrib(); + } + + @ParameterizedTest + @ValueSource(ints = {GL11.GL_LINEAR, GL11.GL_EXP, GL11.GL_EXP2}) + void fogMirrorsGlsmState(int mode) { + GLSMEnable.glEnable(GL11.GL_FOG); + GLSMFog.glFogi(GL11.GL_FOG_MODE, mode); + GLSMFog.glFogf(GL11.GL_FOG_START, 12.5f); + GLSMFog.glFogf(GL11.GL_FOG_END, 99.25f); + GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.375f); + final FloatBuffer color = BufferUtils.createFloatBuffer(4); + color.put(new float[] {0.25f, 0.5f, 0.75f, 0.125f}).flip(); + GLSMFog.glFog(GL11.GL_FOG_COLOR, color); + + assertTrue(GLState.isFogEnabled()); + assertEquals(mode, GLState.getFogMode()); + assertEquals(12.5f, GLState.getFogStart()); + assertEquals(99.25f, GLState.getFogEnd()); + assertEquals(0.375f, GLState.getFogDensity()); + + final Vector4f rgba = GLState.getFogColor(new Vector4f()); + assertEquals(new Vector4f(0.25f, 0.5f, 0.75f, 0.125f), rgba); + + assertEquals(new Vector3d(0.25, 0.5, 0.75), GLState.getFogColor(new Vector3d())); + + final FloatBuffer out = BufferUtils.createFloatBuffer(6); + out.position(1); + GLState.getFogColor(out); + assertEquals(1, out.position()); + assertEquals(0.25f, out.get(1)); + assertEquals(0.5f, out.get(2)); + assertEquals(0.75f, out.get(3)); + assertEquals(0.125f, out.get(4)); + + GLSMEnable.glDisable(GL11.GL_FOG); + assertFalse(GLState.isFogEnabled()); + } + + @Test + void matricesAreCopies() { + final Matrix4f modelView = new Matrix4f().translation(1, 2, 3).rotateX(0.5f); + final Matrix4f projection = new Matrix4f().perspective(1.2f, 1.5f, 0.1f, 200f); + loadMatrix(GL11.GL_MODELVIEW, modelView); + loadMatrix(GL11.GL_PROJECTION, projection); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + + final Matrix4f dest = new Matrix4f(); + assertSame(GLState.getModelViewMatrix(dest), dest); + assertEquals(modelView, dest, "modelview"); + + assertSame(GLState.getProjectionMatrix(dest), dest); + assertEquals(projection, dest, "projection"); + + dest.zero(); + assertEquals(modelView, GLState.getModelViewMatrix(new Matrix4f())); + } + + private static void loadMatrix(int mode, Matrix4f m) { + final FloatBuffer buf = BufferUtils.createFloatBuffer(16); + m.get(buf); + GLSMMatrices.glMatrixMode(mode); + GLSMMatrices.glLoadMatrix(buf); + } +} diff --git a/src/test/java/com/gtnewhorizons/angelica/client/font/FontFilterLightmapGLTest.java b/src/test/java/com/gtnewhorizons/angelica/client/font/FontFilterLightmapGLTest.java index 8bb1c1526..4a7a86498 100644 --- a/src/test/java/com/gtnewhorizons/angelica/client/font/FontFilterLightmapGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/client/font/FontFilterLightmapGLTest.java @@ -1,7 +1,16 @@ package com.gtnewhorizons.angelica.client.font; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.testutil.TestPaths; import net.coderbot.iris.uniforms.builtin.BuiltinReplacementUniforms; @@ -43,15 +52,15 @@ class FontFilterLightmapGLTest { @AfterEach void cleanup() { - GLStateManager.glUseProgram(0); - GLStateManager.glBindVertexArray(0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMPrograms.glUseProgram(0); + GLSMVertexInput.glBindVertexArray(0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); if (lightmapTexture != 0) { GL11.glDeleteTextures(lightmapTexture); lightmapTexture = 0; } - if (vbo != 0) { GLStateManager.glDeleteBuffers(vbo); vbo = 0; } - if (vao != 0) { GLStateManager.glDeleteVertexArrays(vao); vao = 0; } - if (program != 0) { GLStateManager.glDeleteProgram(program); program = 0; } + if (vbo != 0) { GLSMBuffers.glDeleteBuffers(vbo); vbo = 0; } + if (vao != 0) { GLSMVertexInput.glDeleteVertexArrays(vao); vao = 0; } + if (program != 0) { GLSMPrograms.glDeleteProgram(program); program = 0; } } private void buildProgram() { @@ -73,17 +82,17 @@ class FontFilterLightmapGLTest { } lightmapTexture = GL11.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmapTexture); GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, LIGHTMAP_SIZE, LIGHTMAP_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private void buildQuad() { - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); final ByteBuffer data = BufferUtils.createByteBuffer(3 * VERTEX_SIZE); putVertex(data, -0.9f, -0.9f); @@ -91,17 +100,17 @@ class FontFilterLightmapGLTest { putVertex(data, 0.0f, 0.9f); data.flip(); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); - GLStateManager.glEnableVertexAttribArray(0); - GLStateManager.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, 0L); - GLStateManager.glEnableVertexAttribArray(1); - GLStateManager.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, 8L); - GLStateManager.glEnableVertexAttribArray(2); - GLStateManager.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, VERTEX_SIZE, 16L); - GLStateManager.glEnableVertexAttribArray(3); - GLStateManager.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, VERTEX_SIZE, 20L); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); + GLSMVertexInput.glEnableVertexAttribArray(0); + GLSMVertexInput.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, 0L); + GLSMVertexInput.glEnableVertexAttribArray(1); + GLSMVertexInput.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, VERTEX_SIZE, 8L); + GLSMVertexInput.glEnableVertexAttribArray(2); + GLSMVertexInput.glVertexAttribPointer(2, 4, GL11.GL_UNSIGNED_BYTE, true, VERTEX_SIZE, 16L); + GLSMVertexInput.glEnableVertexAttribArray(3); + GLSMVertexInput.glVertexAttribPointer(3, 4, GL11.GL_FLOAT, false, VERTEX_SIZE, 20L); } private static void putVertex(ByteBuffer buf, float x, float y) { @@ -115,13 +124,13 @@ class FontFilterLightmapGLTest { } private static void applyVanillaLightmapMatrix() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glScalef(0.00390625f, 0.00390625f, 0.00390625f); - GLStateManager.glTranslatef(8.0f, 8.0f, 8.0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + LIGHTMAP_TEX_UNIT); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glScalef(0.00390625f, 0.00390625f, 0.00390625f); + GLSMMatrices.glTranslatef(8.0f, 8.0f, 8.0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private float[] draw(boolean lightmapEnabled) { @@ -130,28 +139,28 @@ class FontFilterLightmapGLTest { buildQuad(); applyVanillaLightmapMatrix(); - assertEquals(BuiltinReplacementUniforms.lightmapTextureMatrix, new Matrix4f(GLStateManager.getTextures().getTextureUnitMatrix(LIGHTMAP_TEX_UNIT)), "EntityRenderer#enableLightmap must reproduce the lightmap texture matrix Iris documents"); + assertEquals(BuiltinReplacementUniforms.lightmapTextureMatrix, new Matrix4f(GLSMTextures.getTextures().getTextureUnitMatrix(LIGHTMAP_TEX_UNIT)), "EntityRenderer#enableLightmap must reproduce the lightmap texture matrix Iris documents"); - final Vector4f uv = new Vector4f(BRIGHTNESS_X, BRIGHTNESS_Y, 0.0f, 1.0f).mul(GLStateManager.getTextures().getTextureUnitMatrix(LIGHTMAP_TEX_UNIT)); + final Vector4f uv = new Vector4f(BRIGHTNESS_X, BRIGHTNESS_Y, 0.0f, 1.0f).mul(GLSMTextures.getTextures().getTextureUnitMatrix(LIGHTMAP_TEX_UNIT)); - GLStateManager.glViewport(0, 0, 800, 600); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); - GLStateManager.disableBlend(); + GLSMRasterizer.glViewport(0, 0, 800, 600); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); + GLSMBlend.disableBlend(); - GLStateManager.glUseProgram(program); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "sampler"), 0); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "lightmap"), LIGHTMAP_TEX_UNIT); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "aaMode"), 0); - GLStateManager.glUniform1f(GLStateManager.glGetUniformLocation(program, "strength"), 1.0f); - GLStateManager.glUniform1f(GLStateManager.glGetUniformLocation(program, "alphaTestRef"), 0.0f); - GLStateManager.glUniform3f(GLStateManager.glGetUniformLocation(program, "u_Lightmap"), uv.x, uv.y, lightmapEnabled ? 1.0f : 0.0f); + GLSMPrograms.glUseProgram(program); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "sampler"), 0); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "lightmap"), LIGHTMAP_TEX_UNIT); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "aaMode"), 0); + GLSMPrograms.glUniform1f(GLSMPrograms.glGetUniformLocation(program, "strength"), 1.0f); + GLSMPrograms.glUniform1f(GLSMPrograms.glGetUniformLocation(program, "alphaTestRef"), 0.0f); + GLSMPrograms.glUniform3f(GLSMPrograms.glGetUniformLocation(program, "u_Lightmap"), uv.x, uv.y, lightmapEnabled ? 1.0f : 0.0f); - GLStateManager.glUniformMatrix4(GLStateManager.glGetUniformLocation(program, "u_MVPMatrix"), false, new Matrix4f().get(BufferUtils.createFloatBuffer(16))); + GLSMPrograms.glUniformMatrix4(GLSMPrograms.glGetUniformLocation(program, "u_MVPMatrix"), false, new Matrix4f().get(BufferUtils.createFloatBuffer(16))); - GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "fontFilter draw must not raise a GL error"); final ByteBuffer pixel = BufferUtils.createByteBuffer(4); diff --git a/src/test/java/com/gtnewhorizons/angelica/client/font/FontProviderCustomGLTest.java b/src/test/java/com/gtnewhorizons/angelica/client/font/FontProviderCustomGLTest.java index 0fddb58c8..8009ec2e6 100644 --- a/src/test/java/com/gtnewhorizons/angelica/client/font/FontProviderCustomGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/client/font/FontProviderCustomGLTest.java @@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.client.font; import com.gtnewhorizons.angelica.config.FontConfig; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.glsm.testutil.TestThreads; import org.junit.jupiter.api.AfterEach; @@ -87,11 +87,11 @@ class FontProviderCustomGLTest { @Test void glyphInkLandsInsideMeasuredRects() { assertTrue(provider.isGlyphAvailable('A')); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, provider.getTexture('A')); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, provider.getTexture('A')); final int width = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_WIDTH); final int height = GL11.glGetTexLevelParameteri(GL11.GL_TEXTURE_2D, 0, GL11.GL_TEXTURE_HEIGHT); final IntBuffer pixels = BufferUtils.createIntBuffer(width * height); - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixels); + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixels); final int margin = QUALITY / 6; final boolean[] covered = new boolean[width * height]; diff --git a/src/test/java/com/gtnewhorizons/angelica/client/font/FontTestFixture.java b/src/test/java/com/gtnewhorizons/angelica/client/font/FontTestFixture.java index 1307b9c9b..041d2aeae 100644 --- a/src/test/java/com/gtnewhorizons/angelica/client/font/FontTestFixture.java +++ b/src/test/java/com/gtnewhorizons/angelica/client/font/FontTestFixture.java @@ -3,7 +3,7 @@ package com.gtnewhorizons.angelica.client.font; import com.gtnewhorizon.gtnhlib.util.font.FontRendering; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.config.FontConfig; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.glsm.testutil.TestPaths; import com.gtnewhorizons.angelica.mixins.interfaces.FontRendererAccessor; @@ -54,7 +54,7 @@ public final class FontTestFixture implements AutoCloseable { @Override public void angelica$bindTexture(ResourceLocation location) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); } } @@ -124,14 +124,14 @@ public final class FontTestFixture implements AutoCloseable { if (font.batcher == null) font.batcher = new BatchingFontRenderer(font, charWidths(), new int[32], ASCII); if (font.texture == 0) { font.texture = GL11.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, font.texture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, font.texture); final ByteBuffer pixels = BufferUtils.createByteBuffer(4 * 4 * 4); while (pixels.hasRemaining()) pixels.put((byte) 0xFF); pixels.flip(); GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 4, 4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } return font.batcher; } diff --git a/src/test/java/com/gtnewhorizons/angelica/client/font/TextDrawStateGLTest.java b/src/test/java/com/gtnewhorizons/angelica/client/font/TextDrawStateGLTest.java index e6cbd9610..8adf9dc3d 100644 --- a/src/test/java/com/gtnewhorizons/angelica/client/font/TextDrawStateGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/client/font/TextDrawStateGLTest.java @@ -1,6 +1,11 @@ package com.gtnewhorizons.angelica.client.font; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.StateSet; import org.junit.jupiter.api.AfterEach; @@ -32,29 +37,29 @@ class TextDrawStateGLTest { } private static void setDefaults() { - GLStateManager.disableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_LESS); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.disableCull(); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.glFrontFace(GL11.GL_CCW); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(0.0f, 0.0f); - GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, true, true, true); + GLSMRasterizer.disableCull(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMRasterizer.glFrontFace(GL11.GL_CCW); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(0.0f, 0.0f); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); } private static void setNonDefaults() { - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_GEQUAL); - GLStateManager.glDepthMask(false); - GLStateManager.glColorMask(false, false, false, false); - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.glFrontFace(GL11.GL_CW); - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(-10.0f, -10.0f); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_GEQUAL); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMBlend.glColorMask(false, false, false, false); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMRasterizer.glFrontFace(GL11.GL_CW); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(-10.0f, -10.0f); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); } private static TextDrawState capture() { @@ -134,9 +139,9 @@ class TextDrawStateGLTest { setDefaults(); final TextDrawState before = capture(); - final int depth = GLStateManager.pushState(set); + final int depth = GLSMAttribStack.pushState(set); moved.apply(); - GLStateManager.popStateTo(depth); + GLSMAttribStack.popStateTo(depth); final ByteBuffer driverColorMask = BufferUtils.createByteBuffer(16); GL11.glGetBoolean(GL11.GL_COLOR_WRITEMASK, driverColorMask); diff --git a/src/test/java/com/gtnewhorizons/angelica/client/font/TextMeshGLTest.java b/src/test/java/com/gtnewhorizons/angelica/client/font/TextMeshGLTest.java index b10fbed00..256949d27 100644 --- a/src/test/java/com/gtnewhorizons/angelica/client/font/TextMeshGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/client/font/TextMeshGLTest.java @@ -2,7 +2,13 @@ package com.gtnewhorizons.angelica.client.font; import com.gtnewhorizons.angelica.config.FontConfig; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.backend.RenderBackend; import com.gtnewhorizons.angelica.glsm.ffp.FFPVertexLighting; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; @@ -68,12 +74,12 @@ class TextMeshGLTest { @BeforeEach void projection() { shadow = false; - GLStateManager.glViewport(0, 0, VIEW_W, VIEW_H); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glOrtho(0.0, VIEW_W, VIEW_H, 0.0, -1.0, 1.0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMRasterizer.glViewport(0, 0, VIEW_W, VIEW_H); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glOrtho(0.0, VIEW_W, VIEW_H, 0.0, -1.0, 1.0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); } @AfterEach @@ -85,15 +91,15 @@ class TextMeshGLTest { endFrames(); BatchingFontRenderer.exitButtonSection(false); BatchingFontRenderer.exitRecolorSection(false); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.disableDepthTest(); - GLStateManager.disableLighting(); - GLStateManager.disableColorMaterial(); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMLighting.disableLighting(); + GLSMLighting.disableColorMaterial(); + GLSMBlend.glColorMask(true, true, true, true); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); } private static void draw(String s, float y) { @@ -130,8 +136,8 @@ class TextMeshGLTest { } private static byte[] frame(Runnable body) { - GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); body.run(); final ByteBuffer pixels = BufferUtils.createByteBuffer(VIEW_W * VIEW_H * 4); GL11.glReadPixels(0, 0, VIEW_W, VIEW_H, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); @@ -243,12 +249,12 @@ class TextMeshGLTest { Named.of("plain lines", TextMeshGLTest::drawLines), Named.of("matrix change seals a segment", () -> { draw("before", 2.0f); - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); draw("after", 11.0f); }), Named.of("draw state change seals a segment", () -> { draw("before", 2.0f); - GLStateManager.glColorMask(false, false, false, false); + GLSMBlend.glColorMask(false, false, false, false); draw("after", 11.0f); })); } @@ -294,11 +300,11 @@ class TextMeshGLTest { return List.of( refused("matrix change mid-capture", false, () -> { draw("before", 2.0f); - GLStateManager.glTranslatef(1.0f, 0.0f, 0.0f); + GLSMMatrices.glTranslatef(1.0f, 0.0f, 0.0f); draw("after", 11.0f); }), refused("draw state change before the first glyph", false, () -> { - GLStateManager.enableDepthTest(); + GLSMDepthStencilAlpha.enableDepthTest(); draw("depth", 2.0f); }), refused("another renderer flushes mid-capture", false, () -> { @@ -340,17 +346,17 @@ class TextMeshGLTest { @ParameterizedTest(name = "{0} fillRect={1}") @CsvSource({ "none, false", "lit, false", "lit, true", "button, false", "darkMode, false" }) void replayIsRefusedWhereADirectDrawWouldDiffer(String context, boolean rect) { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); final Runnable body = rect ? () -> batcher.fillRect(0.0f, 0.0f, 4.0f, 4.0f, 0xFF00FF00) : () -> draw("text", 2.0f); final TextMesh outside = capture(body); assertTrue(outside.isValid(GlyphSettings.current())); switch (context) { case "lit" -> { - GLStateManager.enableLighting(); - GLStateManager.enableColorMaterial(); + GLSMLighting.enableLighting(); + GLSMLighting.enableColorMaterial(); assertTrue(FFPVertexLighting.modulatesVertexColor(new Vector3f())); assertTrue(capture(body).isAnimated()); } diff --git a/src/test/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompatTest.java b/src/test/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompatTest.java index 61d216f29..652a85fab 100644 --- a/src/test/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompatTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/compat/draconicevolution/PlacedItemRenderCompatTest.java @@ -1,7 +1,9 @@ package com.gtnewhorizons.angelica.compat.draconicevolution; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.rendering.tesr.BatchEligibility; import net.minecraft.client.renderer.entity.RenderItem; import org.joml.Matrix4f; @@ -14,61 +16,61 @@ import static org.junit.jupiter.api.Assertions.*; class PlacedItemRenderCompatTest { @Test void customAnimationRunsEveryFrameAndRestoresEligibilityAfterFailure() { - final Matrix4f original = new Matrix4f(GLStateManager.getModelViewMatrix()); + final Matrix4f original = new Matrix4f(GLSMMatrices.getModelViewMatrix()); final int[] frames = { 0 }; - BatchEligibility.begin(BatchEligibility.SAFE, GLStateManager.drawCalls); + BatchEligibility.begin(BatchEligibility.SAFE, GLSMDraws.drawCalls); try { BatchEligibility.onPartQueued(); for (int frame = 0; frame < 3; frame++) { assertEquals(BatchEligibility.DENIED, PlacedItemRenderCompat.renderWithBatchState(1, 2, 3, BatchEligibility.DENIED, () -> { assertFalse(BatchEligibility.batchingAllowed()); - GLStateManager.glRotatef(frames[0]++ * 30, 0, 1, 0); - final long before = GLStateManager.drawCalls; - GLStateManager.drawCalls += 2; - BatchEligibility.onPartFallback(before, GLStateManager.drawCalls); - GLStateManager.drawCalls++; + GLSMMatrices.glRotatef(frames[0]++ * 30, 0, 1, 0); + final long before = GLSMDraws.drawCalls; + GLSMDraws.drawCalls += 2; + BatchEligibility.onPartFallback(before, GLSMDraws.drawCalls); + GLSMDraws.drawCalls++; })); assertTrue(BatchEligibility.batchingAllowed()); - assertTrue(original.equals(GLStateManager.getModelViewMatrix(), 1e-5f)); + assertTrue(original.equals(GLSMMatrices.getModelViewMatrix(), 1e-5f)); } assertEquals(3, frames[0]); assertThrows(IllegalStateException.class, () -> PlacedItemRenderCompat.renderWithBatchState(1, 2, 3, BatchEligibility.DENIED, () -> { - GLStateManager.drawCalls++; + GLSMDraws.drawCalls++; throw new IllegalStateException("renderer failed"); })); assertTrue(BatchEligibility.batchingAllowed()); - assertTrue(original.equals(GLStateManager.getModelViewMatrix(), 1e-5f)); + assertTrue(original.equals(GLSMMatrices.getModelViewMatrix(), 1e-5f)); } finally { - assertEquals(BatchEligibility.SAFE, BatchEligibility.end(BatchEligibility.SAFE, GLStateManager.drawCalls)); + assertEquals(BatchEligibility.SAFE, BatchEligibility.end(BatchEligibility.SAFE, GLSMDraws.drawCalls)); } assertFalse(BatchEligibility.batchingAllowed()); } @Test void eachFrameRunsTheAnimationAndRestoresPlacementStateEvenOnFailure() { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - final Matrix4f original = new Matrix4f(GLStateManager.getModelViewMatrix()); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + final Matrix4f original = new Matrix4f(GLSMMatrices.getModelViewMatrix()); final boolean originalFrame = RenderItem.renderInFrame; - final boolean originalDepth = GLStateManager.getDepthTest().isEnabled(); + final boolean originalDepth = GLSMDepthStencilAlpha.getDepthTest().isEnabled(); final int[] calls = { 0 }; try { - GLStateManager.glLoadIdentity(); - GLStateManager.enableDepthTest(); + GLSMMatrices.glLoadIdentity(); + GLSMDepthStencilAlpha.enableDepthTest(); RenderItem.renderInFrame = true; for (int frame = 0; frame < 3; frame++) { final int tick = frame; PlacedItemRenderCompat.render(1, 2, 3, () -> { calls[0]++; - GLStateManager.glRotatef(tick * 30, 0, 1, 0); + GLSMMatrices.glRotatef(tick * 30, 0, 1, 0); assertTrue(new Matrix4f().translation(1, 2, 3).rotateY((float) Math.toRadians(tick * 30)) - .equals(GLStateManager.getModelViewMatrix(), 1e-5f)); - GLStateManager.disableDepthTest(); + .equals(GLSMMatrices.getModelViewMatrix(), 1e-5f)); + GLSMDepthStencilAlpha.disableDepthTest(); RenderItem.renderInFrame = false; }); assertEquals(frame + 1, calls[0]); - assertTrue(new Matrix4f().equals(GLStateManager.getModelViewMatrix(), 1e-5f)); + assertTrue(new Matrix4f().equals(GLSMMatrices.getModelViewMatrix(), 1e-5f)); assertTrue(GL11.glIsEnabled(GL11.GL_DEPTH_TEST)); assertTrue(RenderItem.renderInFrame); } @@ -76,11 +78,11 @@ class PlacedItemRenderCompatTest { RenderItem.renderInFrame = false; throw new IllegalStateException("renderer failed"); })); - assertTrue(new Matrix4f().equals(GLStateManager.getModelViewMatrix(), 1e-5f)); + assertTrue(new Matrix4f().equals(GLSMMatrices.getModelViewMatrix(), 1e-5f)); assertTrue(RenderItem.renderInFrame); } finally { - GLStateManager.setModelViewMatrix(original); - GLStateManager.getDepthTest().setEnabled(originalDepth); + GLSMMatrices.setModelViewMatrix(original); + GLSMDepthStencilAlpha.getDepthTest().setEnabled(originalDepth); RenderItem.renderInFrame = originalFrame; } } diff --git a/src/test/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawerTest.java b/src/test/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawerTest.java index f69d0ca21..ed7b4743e 100644 --- a/src/test/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawerTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/compat/thaumcraft/PortalDrawerTest.java @@ -1,7 +1,20 @@ package com.gtnewhorizons.angelica.compat.thaumcraft; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTexEnvGen; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.ffp.FfpFixture; import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; import net.coderbot.iris.gl.framebuffer.GlFramebuffer; @@ -59,37 +72,37 @@ class PortalDrawerTest { vertices.putShort((short) 180).putShort((short) 0); } vertices.flip(); - final int vao = GLStateManager.glGenVertexArrays(); - final int vbo = GLStateManager.glGenBuffers(); + final int vao = GLSMVertexInput.glGenVertexArrays(); + final int vbo = GLSMBuffers.glGenBuffers(); try { - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW); - GLStateManager.glVertexPointer(3, GL11.GL_FLOAT, 20, 0L); - GLStateManager.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 20, 12L); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glTexCoordPointer(2, GL11.GL_SHORT, 20, 16L); - GLStateManager.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); - GLStateManager.glEnableClientState(GL11.GL_COLOR_ARRAY); - GLStateManager.glDrawArrays(GL11.GL_QUADS, 0, 4); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW); + GLSMVertexInput.glVertexPointer(3, GL11.GL_FLOAT, 20, 0L); + GLSMVertexInput.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 20, 12L); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); + GLSMVertexInput.glTexCoordPointer(2, GL11.GL_SHORT, 20, 16L); + GLSMVertexInput.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GLSMVertexInput.glEnableClientState(GL11.GL_COLOR_ARRAY); + GLSMDraws.glDrawArrays(GL11.GL_QUADS, 0, 4); } finally { - GLStateManager.glDisableClientState(GL11.GL_COLOR_ARRAY); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); - GLStateManager.glClientActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDeleteBuffers(vbo); - GLStateManager.glDeleteVertexArrays(vao); + GLSMVertexInput.glDisableClientState(GL11.GL_COLOR_ARRAY); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE1); + GLSMVertexInput.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); + GLSMTextures.glClientActiveTexture(GL13.GL_TEXTURE0); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glDeleteBuffers(vbo); + GLSMVertexInput.glDeleteVertexArrays(vao); } } private static void clear() { - GLStateManager.glClearColor(10 / 255.0F, 20 / 255.0F, 30 / 255.0F, 1.0F); - GLStateManager.glClearDepth(1.0); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + GLSMBlend.glClearColor(10 / 255.0F, 20 / 255.0F, 30 / 255.0F, 1.0F); + GLSMDepthStencilAlpha.glClearDepth(1.0); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); } private static int channelDifference(int a, int b) { @@ -114,8 +127,8 @@ class PortalDrawerTest { } texels.flip(); final int id = texture(width, height, GL11.GL_RGBA8, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); return id; } catch (IOException e) { throw new RuntimeException(e); @@ -130,21 +143,21 @@ class PortalDrawerTest { } texels.flip(); final int id = texture(size, size, GL11.GL_RGBA8, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter); final int wrap = filter == GL11.GL_LINEAR ? GL12.GL_CLAMP_TO_EDGE : GL11.GL_REPEAT; - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, wrap); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, wrap); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, wrap); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, wrap); return id; } private static int texture(int width, int height, int internalFormat, int format, int type, ByteBuffer data) { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, data); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, data); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); return id; } @@ -157,15 +170,15 @@ class PortalDrawerTest { @BeforeEach void setup() { FfpFixture.resetFfpState(); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); ShaderManager.enable(); - GLStateManager.disableFog(); - GLStateManager.disableLighting(); - GLStateManager.disableCull(); - GLStateManager.disableBlend(); - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); + GLSMFog.disableFog(); + GLSMLighting.disableLighting(); + GLSMRasterizer.disableCull(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); color = texture(SIZE, SIZE, GL11.GL_RGBA8, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, null); depth = texture(SIZE, SIZE, GL14.GL_DEPTH_COMPONENT24, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, null); @@ -175,23 +188,23 @@ class PortalDrawerTest { framebuffer.drawBuffers(new int[]{0}); framebuffer.readBuffer(0); framebuffer.bind(); - GLStateManager.glViewport(0, 0, SIZE, SIZE); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); lightmap = noiseTexture(16, 3, GL11.GL_LINEAR); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, lightmap); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, lightmap); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); // EntityRenderer.enableLightmap's texture matrix - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glScalef(0.00390625F, 0.00390625F, 0.00390625F); - GLStateManager.glTranslatef(8.0F, 8.0F, 8.0F); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.enableTexture(); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glScalef(0.00390625F, 0.00390625F, 0.00390625F); + GLSMMatrices.glTranslatef(8.0F, 8.0F, 8.0F); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.enableTexture(); - GLStateManager.setProjectionMatrix(new Matrix4f().perspective((float) Math.toRadians(70), 1.0F, 0.05F, 256.0F)); - GLStateManager.setModelViewMatrix(new Matrix4f().rotateX(0.2F).rotateY(0.25F)); + GLSMMatrices.setProjectionMatrix(new Matrix4f().perspective((float) Math.toRadians(70), 1.0F, 0.05F, 256.0F)); + GLSMMatrices.setModelViewMatrix(new Matrix4f().rotateX(0.2F).rotateY(0.25F)); addFaces(); } @@ -199,12 +212,12 @@ class PortalDrawerTest { void cleanup() { drawer.destroy(); framebuffer.destroy(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteTextures(color); - GLStateManager.glDeleteTextures(depth); - if (tunnel != 0) GLStateManager.glDeleteTextures(tunnel); - if (field != 0) GLStateManager.glDeleteTextures(field); - GLStateManager.glDeleteTextures(lightmap); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMTextures.glDeleteTextures(color); + GLSMTextures.glDeleteTextures(depth); + if (tunnel != 0) GLSMTextures.glDeleteTextures(tunnel); + if (field != 0) GLSMTextures.glDeleteTextures(field); + GLSMTextures.glDeleteTextures(lightmap); FfpFixture.resetFfpState(); } @@ -229,16 +242,16 @@ class PortalDrawerTest { void fogsEachLayerLikeTheMirror() { tunnel = noiseTexture(64, 1, GL11.GL_NEAREST); field = noiseTexture(256, 2, GL11.GL_NEAREST); - GLStateManager.enableFog(); - GLStateManager.glFog(GL11.GL_FOG_COLOR, floats(0.05F, 0.08F, 0.15F, 1.0F)); + GLSMFog.enableFog(); + GLSMFog.glFog(GL11.GL_FOG_COLOR, floats(0.05F, 0.08F, 0.15F, 1.0F)); // Minecraft's distance fog, then its underwater fog - GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); - GLStateManager.glFogf(GL11.GL_FOG_START, 2.0F); - GLStateManager.glFogf(GL11.GL_FOG_END, 40.0F); + GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); + GLSMFog.glFogf(GL11.GL_FOG_START, 2.0F); + GLSMFog.glFogf(GL11.GL_FOG_END, 40.0F); final Parity linear = compare(true); assertTrue(linear.withinOne >= linear.covered * 0.97, "linear fog drifts from TC's layers: " + linear); - GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP); - GLStateManager.glFogf(GL11.GL_FOG_DENSITY, 0.02F); + GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP); + GLSMFog.glFogf(GL11.GL_FOG_DENSITY, 0.02F); final Parity exp = compare(true); assertTrue(exp.withinOne >= exp.covered * 0.97, "exp fog drifts from TC's layers: " + exp); } @@ -254,8 +267,8 @@ class PortalDrawerTest { clear(); final PortalDrawer.Frame frame = new PortalDrawer.Frame(); - GLStateManager.getProjectionMatrix().mul(GLStateManager.getModelViewMatrix(), frame.modelViewProjection); - frame.modelView.set(GLStateManager.getModelViewMatrix()); + GLSMMatrices.getProjectionMatrix().mul(GLSMMatrices.getModelViewMatrix(), frame.modelViewProjection); + frame.modelView.set(GLSMMatrices.getModelViewMatrix()); frame.cameraX = CAMERA_X; frame.cameraY = CAMERA_Y; frame.cameraZ = CAMERA_Z; @@ -328,22 +341,22 @@ class PortalDrawerTest { final float view = axis == AXIS_X ? VIEW_X : axis == AXIS_Y ? VIEW_Y : VIEW_Z; final Random random = new Random(31100L); for (int i = 0; i < 16; ++i) { - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); float f5 = (float) (16 - i); float f6 = 0.0625F; float f7 = 1.0F / (f5 + 1.0F); if (i == 0) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tunnel); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tunnel); f7 = 0.1F; f5 = 65.0F; f6 = 0.125F; - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(770, 771); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(770, 771); } if (i == 1) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, field); - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(1, 1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, field); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(1, 1); f6 = 0.5F; } final float f8 = (float) (negative ? -plane : plane); @@ -352,59 +365,59 @@ class PortalDrawerTest { float f11 = f9 / f10; f11 += (float) plane; switch (axis) { - case AXIS_X -> GLStateManager.glTranslatef(f11, py, pz); - case AXIS_Y -> GLStateManager.glTranslatef(px, f11, pz); - default -> GLStateManager.glTranslatef(px, py, f11); + case AXIS_X -> GLSMMatrices.glTranslatef(f11, py, pz); + case AXIS_Y -> GLSMMatrices.glTranslatef(px, f11, pz); + default -> GLSMMatrices.glTranslatef(px, py, f11); } - GLStateManager.glTexGeni(GL11.GL_S, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); - GLStateManager.glTexGeni(GL11.GL_T, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); - GLStateManager.glTexGeni(GL11.GL_R, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); - GLStateManager.glTexGeni(GL11.GL_Q, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_EYE_LINEAR); + GLSMTexEnvGen.glTexGeni(GL11.GL_S, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); + GLSMTexEnvGen.glTexGeni(GL11.GL_T, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); + GLSMTexEnvGen.glTexGeni(GL11.GL_R, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_OBJECT_LINEAR); + GLSMTexEnvGen.glTexGeni(GL11.GL_Q, GL11.GL_TEXTURE_GEN_MODE, GL11.GL_EYE_LINEAR); switch (axis) { case AXIS_X -> { - GLStateManager.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 1, 0, 0)); - GLStateManager.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(0, 0, 1, 0)); - GLStateManager.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1)); - GLStateManager.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(1, 0, 0, 0)); + GLSMTexEnvGen.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 1, 0, 0)); + GLSMTexEnvGen.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(0, 0, 1, 0)); + GLSMTexEnvGen.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1)); + GLSMTexEnvGen.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(1, 0, 0, 0)); } case AXIS_Y -> { - GLStateManager.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1, 0, 0, 0)); - GLStateManager.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 0, 1, 0)); - GLStateManager.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1)); - GLStateManager.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(0, 1, 0, 0)); + GLSMTexEnvGen.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1, 0, 0, 0)); + GLSMTexEnvGen.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 0, 1, 0)); + GLSMTexEnvGen.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1)); + GLSMTexEnvGen.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(0, 1, 0, 0)); } default -> { - GLStateManager.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1, 0, 0, 0)); - GLStateManager.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 1, 0, 0)); - GLStateManager.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1)); - GLStateManager.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(0, 0, 1, 0)); + GLSMTexEnvGen.glTexGen(GL11.GL_S, GL11.GL_OBJECT_PLANE, floats(1, 0, 0, 0)); + GLSMTexEnvGen.glTexGen(GL11.GL_T, GL11.GL_OBJECT_PLANE, floats(0, 1, 0, 0)); + GLSMTexEnvGen.glTexGen(GL11.GL_R, GL11.GL_OBJECT_PLANE, floats(0, 0, 0, 1)); + GLSMTexEnvGen.glTexGen(GL11.GL_Q, GL11.GL_EYE_PLANE, floats(0, 0, 1, 0)); } } - GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_S); - GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_T); - GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_R); - GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_Q); - GLStateManager.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glTranslatef(0.0F, TIME, 0.0F); - GLStateManager.glScalef(f6, f6, f6); - GLStateManager.glTranslatef(0.5F, 0.5F, 0.0F); - GLStateManager.glRotatef((float) (i * i * 4321 + i * 9) * 2.0F, 0.0F, 0.0F, 1.0F); - GLStateManager.glTranslatef(-0.5F, -0.5F, 0.0F); + GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_S); + GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_T); + GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_R); + GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_Q); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glTranslatef(0.0F, TIME, 0.0F); + GLSMMatrices.glScalef(f6, f6, f6); + GLSMMatrices.glTranslatef(0.5F, 0.5F, 0.0F); + GLSMMatrices.glRotatef((float) (i * i * 4321 + i * 9) * 2.0F, 0.0F, 0.0F, 1.0F); + GLSMMatrices.glTranslatef(-0.5F, -0.5F, 0.0F); switch (axis) { case AXIS_X -> { - GLStateManager.glTranslatef(-pz, -py, -px); - GLStateManager.glTranslatef(VIEW_Z * f5 / f9, VIEW_Y * f5 / f9, -px); + GLSMMatrices.glTranslatef(-pz, -py, -px); + GLSMMatrices.glTranslatef(VIEW_Z * f5 / f9, VIEW_Y * f5 / f9, -px); } case AXIS_Y -> { - GLStateManager.glTranslatef(-px, -pz, -py); - GLStateManager.glTranslatef(VIEW_X * f5 / f9, VIEW_Z * f5 / f9, -py); + GLSMMatrices.glTranslatef(-px, -pz, -py); + GLSMMatrices.glTranslatef(VIEW_X * f5 / f9, VIEW_Z * f5 / f9, -py); } default -> { - GLStateManager.glTranslatef(-px, -py, -pz); - GLStateManager.glTranslatef(VIEW_X * f5 / f9, VIEW_Y * f5 / f9, -pz); + GLSMMatrices.glTranslatef(-px, -py, -pz); + GLSMMatrices.glTranslatef(VIEW_X * f5 / f9, VIEW_Y * f5 / f9, -pz); } } float red = random.nextFloat() * 0.5F + 0.1F; @@ -413,14 +426,14 @@ class PortalDrawerTest { if (i == 0) red = green = blue = 1.0F; // Tessellator.setColorRGBA_F stores bytes, and its brightness 180 becomes the lightmap coordinate quad(f, (int) (red * f7 * 255.0F), (int) (green * f7 * 255.0F), (int) (blue * f7 * 255.0F)); - GLStateManager.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } - GLStateManager.disableBlend(); - GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_S); - GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_T); - GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_R); - GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_Q); + GLSMBlend.disableBlend(); + GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_S); + GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_T); + GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_R); + GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_Q); } private record Parity(int covered, int exact, int withinOne, int worst) { diff --git a/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreenGLTest.java b/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreenGLTest.java index df6d71b99..02c750ee5 100644 --- a/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreenGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOptionsScreenGLTest.java @@ -4,7 +4,8 @@ import com.gtnewhorizons.angelica.api.debug.DebugScreenEntryStatus; import com.gtnewhorizons.angelica.client.font.FontTestFixture; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.mixins.interfaces.IGameSettingsExt; import net.minecraft.client.audio.SoundHandler; @@ -220,22 +221,22 @@ class DebugOptionsScreenGLTest { final int viewTop = Reflect.get(screen, "viewTop"); final int nameX = Reflect.get(screen, "nameX"); final int rowH = Reflect.getStatic(DebugOptionsScreen.class, "ROW_H"); - final boolean blend = GLStateManager.getBlendMode().isEnabled(); - final boolean depth = GLStateManager.getDepthTest().isEnabled(); - GLStateManager.enableDepthTest(); + final boolean blend = GLSMBlend.getBlendMode().isEnabled(); + final boolean depth = GLSMDepthStencilAlpha.getDepthTest().isEnabled(); + GLSMDepthStencilAlpha.enableDepthTest(); try { GL11.glGetError(); screen.drawScreen(nameX + 1, viewTop + (hovered - first) * rowH + rowH / 2, 0.0f); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); - assertTrue(GLStateManager.getDepthTest().isEnabled()); - assertEquals(blend, GLStateManager.getBlendMode().isEnabled()); + assertTrue(GLSMDepthStencilAlpha.getDepthTest().isEnabled()); + assertEquals(blend, GLSMBlend.getBlendMode().isEnabled()); final Object batcher = Reflect.get(screen, "batcher"); assertEquals(0, (int) Reflect.get(batcher, "batchDepth")); assertNotNull(Reflect.get(screen, "measuredTooltip")); } finally { - if (!depth) GLStateManager.disableDepthTest(); + if (!depth) GLSMDepthStencilAlpha.disableDepthTest(); } } } diff --git a/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOverlayFallbackGLTest.java b/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOverlayFallbackGLTest.java index 6cd655824..71b9955ab 100644 --- a/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOverlayFallbackGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/debug/screen/DebugOverlayFallbackGLTest.java @@ -5,7 +5,10 @@ import com.gtnewhorizons.angelica.client.font.FontTestFixture; import com.gtnewhorizons.angelica.client.font.TextMesh; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.mixins.interfaces.IGameSettingsExt; import net.minecraft.client.gui.FontRenderer; @@ -114,14 +117,14 @@ class DebugOverlayFallbackGLTest { } private static boolean anyLitAfterDirectDraw() { - GLStateManager.glViewport(0, 0, 128, 32); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glOrtho(0.0, 128, 32, 0.0, -1.0, 1.0); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMRasterizer.glViewport(0, 0, 128, 32); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glOrtho(0.0, 128, 32, 0.0, -1.0, 1.0); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMBlend.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); batcher.drawString(2.0f, 2.0f, 0xFFFFFFFF, false, false, "balanced", 0, 8); final ByteBuffer pixels = BufferUtils.createByteBuffer(128 * 32 * 4); GL11.glReadPixels(0, 0, 128, 32, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels); diff --git a/src/test/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMeshGLTest.java b/src/test/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMeshGLTest.java index 6136e006c..7870f81ac 100644 --- a/src/test/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMeshGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/debug/screen/renderers/DebugMeshGLTest.java @@ -11,7 +11,15 @@ import com.gtnewhorizons.angelica.debug.render.DebugPrograms; import com.gtnewhorizons.angelica.debug.render.NativeScratch; import com.gtnewhorizons.angelica.debug.screen.renderers.DebugMeshData.LineWidth; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.ffp.FfpFixture; import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; @@ -60,22 +68,22 @@ class DebugMeshGLTest { FfpFixture.resetFfpState(); ShaderManager.enable(); ShaderManager.getInstance().activate(); - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); } @AfterEach void tearDown() { - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); mesh.delete(); data.free(); uploadScratch.free(); - if (vbo != 0) GLStateManager.glDeleteBuffers(vbo); - if (vao != 0) GLStateManager.glDeleteVertexArrays(vao); + if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo); + if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao); FfpFixture.resetFfpState(); } @@ -191,80 +199,80 @@ class DebugMeshGLTest { mesh.upload(data, uploadScratch); final int program = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS); - final int ambient = GLStateManager.glGenTextures(); - final int glyphs = GLStateManager.glGenTextures(); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + final int ambient = GLSMTextures.glGenTextures(); + final int glyphs = GLSMTextures.glGenTextures(); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + vbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, ambient); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_ALWAYS); - GLStateManager.glDepthMask(true); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE); - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.glFrontFace(GL11.GL_CW); - GLStateManager.enableScissorTest(); - GLStateManager.glScissor(0, 0, SIZE, SIZE); - GLStateManager.glPolygonMode(GL11.GL_FRONT, GL11.GL_FILL); - GLStateManager.glPolygonMode(GL11.GL_BACK, GL11.GL_LINE); - GLStateManager.glLineWidth(3.0F); - GLStateManager.glUseProgram(program); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, ambient); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_ALWAYS); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMRasterizer.glFrontFace(GL11.GL_CW); + GLSMRasterizer.enableScissorTest(); + GLSMRasterizer.glScissor(0, 0, SIZE, SIZE); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT, GL11.GL_FILL); + GLSMRasterizer.glPolygonMode(GL11.GL_BACK, GL11.GL_LINE); + GLSMRasterizer.glLineWidth(3.0F); + GLSMPrograms.glUseProgram(program); - final long drawCalls = GLStateManager.drawCalls; + final long drawCalls = GLSMDraws.drawCalls; scope.beginWorld(); try { drawMeshPasses(false, 0.0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, glyphs); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, glyphs); } finally { scope.end(); } - assertTrue(GLStateManager.drawCalls > drawCalls); - assertTrue(GLStateManager.getDepthTest().isEnabled()); - assertEquals(GL11.GL_ALWAYS, GLStateManager.getDepthState().getFunc()); - assertTrue(GLStateManager.getDepthState().isEnabled()); - assertFalse(GLStateManager.getBlendMode().isEnabled()); - final BlendState blend = GLStateManager.getBlendState(); + assertTrue(GLSMDraws.drawCalls > drawCalls); + assertTrue(GLSMDepthStencilAlpha.getDepthTest().isEnabled()); + assertEquals(GL11.GL_ALWAYS, GLSMDepthStencilAlpha.getDepthState().getFunc()); + assertTrue(GLSMDepthStencilAlpha.getDepthState().isEnabled()); + assertFalse(GLSMBlend.getBlendMode().isEnabled()); + final BlendState blend = GLSMBlend.getBlendState(); assertEquals(GL11.GL_ONE, blend.getSrcRgb()); assertEquals(GL11.GL_ONE, blend.getDstRgb()); assertEquals(GL11.GL_ZERO, blend.getSrcAlpha()); assertEquals(GL11.GL_ONE, blend.getDstAlpha()); - assertTrue(GLStateManager.getCullState().isEnabled()); - assertEquals(GL11.GL_FRONT, GLStateManager.getPolygonState().getCullFaceMode()); - assertEquals(GL11.GL_CW, GLStateManager.getPolygonState().getFrontFace()); - assertTrue(GLStateManager.getScissorTest().isEnabled()); - assertEquals(GL11.GL_FILL, GLStateManager.getPolygonState().getFrontMode()); - assertEquals(GL11.GL_LINE, GLStateManager.getPolygonState().getBackMode()); - assertEquals(3.0F, GLStateManager.getLineState().getWidth()); - assertEquals(1, GLStateManager.getActiveTextureUnit()); - assertEquals(ambient, GLStateManager.getTextures().getTextureUnitBindings(0).getBinding()); + assertTrue(GLSMRasterizer.getCullState().isEnabled()); + assertEquals(GL11.GL_FRONT, GLSMRasterizer.getPolygonState().getCullFaceMode()); + assertEquals(GL11.GL_CW, GLSMRasterizer.getPolygonState().getFrontFace()); + assertTrue(GLSMRasterizer.getScissorTest().isEnabled()); + assertEquals(GL11.GL_FILL, GLSMRasterizer.getPolygonState().getFrontMode()); + assertEquals(GL11.GL_LINE, GLSMRasterizer.getPolygonState().getBackMode()); + assertEquals(3.0F, GLSMRasterizer.getLineState().getWidth()); + assertEquals(1, GLSMTextures.getActiveTextureUnit()); + assertEquals(ambient, GLSMTextures.getTextures().getTextureUnitBindings(0).getBinding()); assertEquals(ambient, GlTestSupport.driverTextureBinding(0)); - assertEquals(program, GLStateManager.getActiveProgram()); + assertEquals(program, GLSMPrograms.getActiveProgram()); assertEquals(program, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM)); - assertEquals(vao, GLStateManager.getBoundVAO()); - assertEquals(vbo, GLStateManager.getBoundVBO()); + assertEquals(vao, GLSMVertexInput.getBoundVAO()); + assertEquals(vbo, GLSMBuffers.getBoundVBO()); assertEquals(vao, GL11.glGetInteger(GL30.GL_VERTEX_ARRAY_BINDING)); assertEquals(vbo, GL11.glGetInteger(GL15.GL_ARRAY_BUFFER_BINDING)); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } finally { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(program); - GLStateManager.glLineWidth(1.0F); - GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); - GLStateManager.disableScissorTest(); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.glFrontFace(GL11.GL_CCW); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(ambient); - GLStateManager.glDeleteTextures(glyphs); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(program); + GLSMRasterizer.glLineWidth(1.0F); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL); + GLSMRasterizer.disableScissorTest(); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMRasterizer.glFrontFace(GL11.GL_CCW); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(ambient); + GLSMTextures.glDeleteTextures(glyphs); } } @@ -277,14 +285,14 @@ class DebugMeshGLTest { final int colorOffset = DebugGeometry.offsetOf(format, VertexFormatElement.Usage.COLOR); final ByteBuffer texels = BufferUtils.createByteBuffer(2 * 2 * 4); texels.put(new byte[] { (byte) 255, 0, 0, (byte) 255, 0, (byte) 255, 0, (byte) 255, 0, 0, (byte) 255, (byte) 255, (byte) 255, (byte) 255, 0, (byte) 255 }).flip(); - final int texture = GLStateManager.glGenTextures(); + final int texture = GLSMTextures.glGenTextures(); final NativeScratch vertices = new NativeScratch(4 * stride); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 2, 2, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); vertices.ensure(4 * stride); final long p = vertices.address(); texturedVertex(p, -1.0F, -1.0F, 0.0F, 0.0F, uvOffset, colorOffset); @@ -310,8 +318,8 @@ class DebugMeshGLTest { assertEquals(GL11.GL_NO_ERROR, GL11.glGetError()); } finally { vertices.free(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(texture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(texture); } } diff --git a/src/test/java/com/gtnewhorizons/angelica/iris/IrisDisplayListStateTest.java b/src/test/java/com/gtnewhorizons/angelica/iris/IrisDisplayListStateTest.java index 0515cf9fc..bac90c24d 100644 --- a/src/test/java/com/gtnewhorizons/angelica/iris/IrisDisplayListStateTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/iris/IrisDisplayListStateTest.java @@ -2,7 +2,13 @@ package com.gtnewhorizons.angelica.iris; import com.gtnewhorizons.angelica.glsm.DisplayListManager; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.recording.GLCommand; @@ -53,14 +59,14 @@ class IrisDisplayListStateTest { @AfterEach void cleanup() { ProgramUniforms.clearActiveUniforms(); - if (DisplayListManager.isRecording()) GLStateManager.glEndList(); - GLStateManager.glUseProgram(0); - for (int list : lists) GLStateManager.glDeleteLists(list, 1); - for (int program : programs) GLStateManager.glDeleteProgram(program); + if (DisplayListManager.isRecording()) GLSMDraws.glEndList(); + GLSMPrograms.glUseProgram(0); + for (int list : lists) GLSMDraws.glDeleteLists(list, 1); + for (int program : programs) GLSMPrograms.glDeleteProgram(program); } private int newList() { - int list = GLStateManager.glGenLists(1); + int list = GLSMDraws.glGenLists(1); lists.add(list); return list; } @@ -73,121 +79,121 @@ class IrisDisplayListStateTest { } private void selectProgram() { - IrisDisplayListState.runProgramTransition(() -> GLStateManager.glUseProgram(selectedProgram)); + IrisDisplayListState.runProgramTransition(() -> GLSMPrograms.glUseProgram(selectedProgram)); } @Test void cutoutScopesRestorePlaybackAlphaAndLightmapWithoutChangingItsActiveUnit() { - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); try { for (int mode : new int[] {GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE}) { - GLStateManager.disableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.2f); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE3); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.2f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3); final int list = newList(); - GLStateManager.glNewList(list, mode); - final int outer = GLStateManager.pushState(StateSet.CUTOUT); + GLSMDraws.glNewList(list, mode); + final int outer = GLSMAttribStack.pushState(StateSet.CUTOUT); GbufferPrograms.setCutoutDefaults(); - final int inner = GLStateManager.pushState(StateSet.CUTOUT); + final int inner = GLSMAttribStack.pushState(StateSet.CUTOUT); GbufferPrograms.setCutoutDefaults(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.popStateTo(inner); - DisplayListManager.recordStateCommand(() -> assertTrue(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled())); - GLStateManager.popStateTo(outer); - GLStateManager.glEndList(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); + GLSMAttribStack.popStateTo(inner); + DisplayListManager.recordStateCommand(() -> assertTrue(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled())); + GLSMAttribStack.popStateTo(outer); + GLSMDraws.glEndList(); for (boolean lightmap : new boolean[] {true, false}) { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GEQUAL, 0.7f); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - if (lightmap) GLStateManager.enableTexture(); else GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glCallList(list); - assertTrue(GLStateManager.isEffectiveAlphaTestEnabled()); - assertEquals(GL11.GL_GEQUAL, GLStateManager.getAlphaState().getFunction()); - assertEquals(0.7f, GLStateManager.getAlphaState().getReference()); - assertEquals(lightmap, GLStateManager.getTextures().getTextureUnitStates(1).isEnabled()); - assertEquals(2, GLStateManager.getActiveTextureUnit(), "scope restores must preserve the list's explicit unit selection"); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GEQUAL, 0.7f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + if (lightmap) GLSMTextures.enableTexture(); else GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMDraws.glCallList(list); + assertTrue(GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled()); + assertEquals(GL11.GL_GEQUAL, GLSMDepthStencilAlpha.getAlphaState().getFunction()); + assertEquals(0.7f, GLSMDepthStencilAlpha.getAlphaState().getReference()); + assertEquals(lightmap, GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled()); + assertEquals(2, GLSMTextures.getActiveTextureUnit(), "scope restores must preserve the list's explicit unit selection"); } } } finally { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } } @Test void cutoutDefaultsOutsideListEnableLightmapWithoutSwitchingUnit() { - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); try { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.disableTexture(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE3); - final int d = GLStateManager.pushState(StateSet.CUTOUT); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.disableTexture(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE3); + final int d = GLSMAttribStack.pushState(StateSet.CUTOUT); try { - final long savedBefore = GLStateManager.attribSlotsSaved; + final long savedBefore = GLSMAttribStack.attribSlotsSaved; GbufferPrograms.setCutoutDefaults(); - assertEquals(1, GLStateManager.attribSlotsSaved - savedBefore); - assertTrue(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled()); - assertEquals(3, GLStateManager.getActiveTextureUnit()); + assertEquals(1, GLSMAttribStack.attribSlotsSaved - savedBefore); + assertTrue(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled()); + assertEquals(3, GLSMTextures.getActiveTextureUnit()); } finally { - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); } - assertFalse(GLStateManager.getTextures().getTextureUnitStates(1).isEnabled()); + assertFalse(GLSMTextures.getTextures().getTextureUnitStates(1).isEnabled()); } finally { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } } @Test void nestedBlendScopesRestorePlaybackValuesEvenIfCompileTimePopWasANoop() { - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); try { for (int mode : new int[] {GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE}) { - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); final int child = newList(); - GLStateManager.glNewList(child, mode); - final int scope = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.popStateTo(scope); - GLStateManager.glEndList(); + GLSMDraws.glNewList(child, mode); + final int scope = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMAttribStack.popStateTo(scope); + GLSMDraws.glEndList(); final int parent = newList(); - GLStateManager.glNewList(parent, mode); - final int parentScope = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.glCallList(child); - GLStateManager.popStateTo(parentScope); - GLStateManager.glEndList(); + GLSMDraws.glNewList(parent, mode); + final int parentScope = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMDraws.glCallList(child); + GLSMAttribStack.popStateTo(parentScope); + GLSMDraws.glEndList(); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ZERO, GL11.GL_ONE); - final int caller = GLStateManager.pushState(StateSet.BLEND); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ZERO, GL11.GL_ONE); + final int caller = GLSMAttribStack.pushState(StateSet.BLEND); try { - GLStateManager.glCallList(parent); - assertTrue(GLStateManager.isEffectiveBlendEnabled()); + GLSMDraws.glCallList(parent); + assertTrue(GLSMBlend.isEffectiveBlendEnabled()); assertTrue(GL11.glIsEnabled(GL11.GL_BLEND), "driver blend enable"); assertEquals(GL11.GL_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend src rgb"); assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.glGetInteger(GL14.GL_BLEND_DST_RGB), "driver blend dst rgb"); assertEquals(GL11.GL_ZERO, GL11.glGetInteger(GL14.GL_BLEND_SRC_ALPHA), "driver blend src alpha"); assertEquals(GL11.GL_ONE, GL11.glGetInteger(GL14.GL_BLEND_DST_ALPHA), "driver blend dst alpha"); - final var blend = GLStateManager.getEffectiveBlendState(new com.gtnewhorizons.angelica.glsm.states.BlendState()); + final var blend = GLSMBlend.getEffectiveBlendState(new com.gtnewhorizons.angelica.glsm.states.BlendState()); assertEquals(GL11.GL_SRC_ALPHA, blend.getSrcRgb()); assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, blend.getDstRgb()); assertEquals(GL11.GL_ZERO, blend.getSrcAlpha()); assertEquals(GL11.GL_ONE, blend.getDstAlpha()); - assertEquals(caller + 1, GLStateManager.getAttribDepth()); + assertEquals(caller + 1, GLSMAttribStack.getAttribDepth()); } finally { - GLStateManager.popStateTo(caller); + GLSMAttribStack.popStateTo(caller); } } } finally { - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); } } @@ -200,7 +206,7 @@ class IrisDisplayListStateTest { state.setCurrentBlockEntity(12); state.setCurrentEntityColor(1, 0, 0, 0.5f); final int child = newList(); - GLStateManager.glNewList(child, mode); + GLSMDraws.glNewList(child, mode); try (CapturedStateScope nestedIgnored = new CapturedStateScope()) { state.setCurrentEntityAndItem(45010, 45011); state.setCurrentBlockEntity(45012); @@ -212,22 +218,22 @@ class IrisDisplayListStateTest { assertTrue(state.getCurrentEntityColor().equals(0, 1, 0, 0.25f)); }); } - GLStateManager.glEndList(); + GLSMDraws.glEndList(); final int parent = newList(); - GLStateManager.glNewList(parent, mode); + GLSMDraws.glNewList(parent, mode); state.pushCurrentBlockEntity(); state.setCurrentBlockEntity(99); - GLStateManager.glCallList(child); + GLSMDraws.glCallList(child); DisplayListManager.recordStateCommand(() -> assertEquals(99, state.getCurrentRenderedBlockEntity())); state.popCurrentBlockEntity(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); for (int caller : new int[] {33, 44}) { state.setCurrentEntityAndItem(caller, caller + 1); state.setCurrentBlockEntity(caller + 2); state.setCurrentEntityColor(0, 0, 1, 0.75f); - GLStateManager.glCallList(parent); + GLSMDraws.glCallList(parent); assertEquals(caller, state.getCurrentRenderedEntity()); assertEquals(caller + 1, state.getCurrentRenderedItem()); assertEquals(caller + 2, state.getCurrentRenderedBlockEntity()); @@ -245,16 +251,16 @@ class IrisDisplayListStateTest { state.setCurrentBlockEntity(9); state.setCurrentEntityColor(1, 0, 0, 0.5f); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); for (int i = 0; i < 100; i++) state.setCurrentEntityAndItem(7, 8); for (int i = 0; i < 100; i++) state.setCurrentBlockEntity(9); for (int i = 0; i < 100; i++) state.setCurrentEntityColor(1, 0, 0, 0.5f); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(3, DisplayListManager.getDisplayList(list).getCommandCounts().get(GLCommand.COMPLEX_REF)); state.setCurrentEntityAndItem(70, 80); state.setCurrentBlockEntity(90); state.setCurrentEntityColor(0, 1, 0, 1); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(7, state.getCurrentRenderedEntity()); assertEquals(8, state.getCurrentRenderedItem()); assertEquals(9, state.getCurrentRenderedBlockEntity()); @@ -274,14 +280,14 @@ class IrisDisplayListStateTest { settings.setEntityIds(null); settings.setItemIds(null); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); state.setCurrentNamedEntity(name); state.setCurrentNamedItem(name); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); for (int id : new int[] {45001, 45002, -1}) { settings.setEntityIds(key -> name.equals(key) ? id : -1); settings.setItemIds(key -> name.equals(key) ? id + 4 : 0); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(id, state.getCurrentRenderedEntity()); assertEquals(id + 4, state.getCurrentRenderedItem()); } @@ -300,7 +306,7 @@ class IrisDisplayListStateTest { final var state = CapturedRenderingState.INSTANCE; state.pushCurrentBlockEntity(); final int program = program(); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); state.setCurrentBlockEntity(111); final var builder = ProgramUniforms.builder("block identity", program); builder.uniform1i("itemId", state::getCurrentRenderedBlockEntity, state.getBlockEntityIdNotifier()); @@ -310,11 +316,11 @@ class IrisDisplayListStateTest { try { settings.setBlockMetaMatches(null); final int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); state.setCurrentBlockEntity(block, 3); uniforms.update(); assertEquals(111, itemUniform(program), "compile-only notifications must not change the live uniform"); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); for (int id : new int[] {45020, 45021}) { final var meta = new it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap(); meta.put(3, id); @@ -322,7 +328,7 @@ class IrisDisplayListStateTest { matches.put(block, meta); settings.setBlockMetaMatches(matches); state.setCurrentBlockEntity(222); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(id, state.getCurrentRenderedBlockEntity()); assertEquals(id, itemUniform(program)); } @@ -339,15 +345,15 @@ class IrisDisplayListStateTest { final var values = BufferUtils.createFloatBuffer(4); try { for (int mode : new int[] {GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE}) { - GLStateManager.glVertexAttrib4f(index, 1, 2, 3, 4); + GLSMCurrentAttribs.glVertexAttrib4f(index, 1, 2, 3, 4); final int list = newList(); - GLStateManager.glNewList(list, mode); - GLStateManager.glVertexAttrib2s(index, (short) -1, (short) 7); + GLSMDraws.glNewList(list, mode); + GLSMCurrentAttribs.glVertexAttrib2s(index, (short) -1, (short) 7); GL20.glGetVertexAttrib(index, GL20.GL_CURRENT_VERTEX_ATTRIB, values); assertEquals(mode == GL11.GL_COMPILE ? 1f : -1f, values.get(0)); - GLStateManager.glEndList(); - GLStateManager.glVertexAttrib4f(index, 9, 9, 9, 9); - GLStateManager.glCallList(list); + GLSMDraws.glEndList(); + GLSMCurrentAttribs.glVertexAttrib4f(index, 9, 9, 9, 9); + GLSMDraws.glCallList(list); GL20.glGetVertexAttrib(index, GL20.GL_CURRENT_VERTEX_ATTRIB, values); assertEquals(-1f, values.get(0)); assertEquals(7f, values.get(1)); @@ -356,7 +362,7 @@ class IrisDisplayListStateTest { assertEquals(1, DisplayListManager.getDisplayList(list).getCommandCounts().get(GLCommand.VERTEX_ATTRIB)); } } finally { - GLStateManager.glVertexAttrib4f(index, 0, 0, 0, 1); + GLSMCurrentAttribs.glVertexAttrib4f(index, 0, 0, 0, 1); } } @@ -366,19 +372,19 @@ class IrisDisplayListStateTest { int compileProgram = program(); int playbackProgram = program(); for (int mode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) { - GLStateManager.glUseProgram(caller); + GLSMPrograms.glUseProgram(caller); selectedProgram = compileProgram; int list = newList(); - GLStateManager.glNewList(list, mode); + GLSMDraws.glNewList(list, mode); DisplayListManager.recordStateCommand(this::selectProgram); selectProgram(); assertEquals(mode == GL11.GL_COMPILE ? caller : compileProgram, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM)); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(0, DisplayListManager.getDisplayList(list).getCommandCounts().get(GLCommand.USE_PROGRAM)); selectedProgram = playbackProgram; - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(playbackProgram, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM)); - assertEquals(playbackProgram, GLStateManager.getActiveProgram()); + assertEquals(playbackProgram, GLSMPrograms.getActiveProgram()); } } @@ -386,25 +392,25 @@ class IrisDisplayListStateTest { void explicitForeignProgramBindsStillRecord() { int explicit = program(); int caller = program(); - GLStateManager.glUseProgram(caller); + GLSMPrograms.glUseProgram(caller); int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glUseProgram(explicit); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMPrograms.glUseProgram(explicit); + GLSMDraws.glEndList(); assertEquals(caller, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM)); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(explicit, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM)); } @Test void transitionFailureResumesRecording() { int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE_AND_EXECUTE); assertThrows(IllegalStateException.class, () -> IrisDisplayListState.runProgramTransition(() -> { throw new IllegalStateException("test"); })); assertTrue(DisplayListManager.isRecording()); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); } @Test @@ -412,21 +418,21 @@ class IrisDisplayListStateTest { final int original = ItemIdManager.getItemId(); try { final int child = newList(); - GLStateManager.glNewList(child, GL11.GL_COMPILE); + GLSMDraws.glNewList(child, GL11.GL_COMPILE); ItemIdManager.setItemIdRaw(19); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); ItemIdManager.setItemIdRaw(42); final int parent = newList(); - GLStateManager.glNewList(parent, GL11.GL_COMPILE); + GLSMDraws.glNewList(parent, GL11.GL_COMPILE); ItemIdManager.setItemIdRaw(42); ItemIdManager.setItemIdRaw(42); - GLStateManager.glCallList(child); + GLSMDraws.glCallList(child); ItemIdManager.setItemIdRaw(42); ItemIdManager.setItemIdRaw(42); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(2, DisplayListManager.getDisplayList(parent).getCommandCounts().get(GLCommand.COMPLEX_REF)); ItemIdManager.setItemIdRaw(77); - GLStateManager.glCallList(parent); + GLSMDraws.glCallList(parent); assertEquals(42, ItemIdManager.getItemId()); } finally { ItemIdManager.setItemIdRaw(original); @@ -439,23 +445,23 @@ class IrisDisplayListStateTest { try { ItemIdManager.setItemIdRaw(111); int child = newList(); - GLStateManager.glNewList(child, GL11.GL_COMPILE); + GLSMDraws.glNewList(child, GL11.GL_COMPILE); ItemIdManager.pushItemId(); ItemIdManager.setItemIdRaw(9); ItemIdManager.popItemId(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); int parent = newList(); - GLStateManager.glNewList(parent, GL11.GL_COMPILE); + GLSMDraws.glNewList(parent, GL11.GL_COMPILE); ItemIdManager.pushItemId(); ItemIdManager.setItemIdRaw(42); - GLStateManager.glCallList(child); + GLSMDraws.glCallList(child); DisplayListManager.recordStateCommand(() -> assertEquals(42, ItemIdManager.getItemId())); ItemIdManager.popItemId(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(111, ItemIdManager.getItemId()); for (int caller : new int[] {222, 333}) { ItemIdManager.setItemIdRaw(caller); - GLStateManager.glCallList(parent); + GLSMDraws.glCallList(parent); assertEquals(caller, ItemIdManager.getItemId()); } } finally { @@ -468,19 +474,19 @@ class IrisDisplayListStateTest { WorldRenderingPhase originalPhase = GbufferPrograms.getOverridePhase(); Boolean originalTranslucency = GbufferPrograms.getDeclaredTranslucency(); int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); GbufferPrograms.pushOverridePhase(WorldRenderingPhase.ENTITIES); GbufferPrograms.setupSpecialRenderCondition(SpecialCondition.GLINT); Boolean previous = GbufferPrograms.beginTranslucencyDeclaration(false); GbufferPrograms.endTranslucencyDeclaration(previous); GbufferPrograms.teardownSpecialRenderCondition(); GbufferPrograms.popOverridePhase(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); GbufferPrograms.setOverridePhase(WorldRenderingPhase.HAND_SOLID); GbufferPrograms.setTranslucencyDeclaration(true); GbufferPrograms.setupSpecialRenderCondition(SpecialCondition.ENTITY_EYES); try { - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(WorldRenderingPhase.HAND_SOLID, GbufferPrograms.getOverridePhase()); assertEquals(SpecialCondition.ENTITY_EYES, GbufferPrograms.getSpecialCondition()); assertEquals(Boolean.TRUE, GbufferPrograms.getDeclaredTranslucency()); @@ -505,7 +511,7 @@ class IrisDisplayListStateTest { for (WorldRenderingPhase compiling : new WorldRenderingPhase[] { WorldRenderingPhase.NONE, WorldRenderingPhase.BLOCK_ENTITIES }) { pipeline.phase = compiling; int child = newList(); - GLStateManager.glNewList(child, mode); + GLSMDraws.glNewList(child, mode); boolean childScope = GbufferPrograms.beginNestedEntityPhase(); DisplayListManager.recordStateCommand(() -> { assertEquals(expected[0], GbufferPrograms.getCurrentPhase()); @@ -513,23 +519,23 @@ class IrisDisplayListStateTest { GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM)); }); GbufferPrograms.endNestedEntityPhase(childScope); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); int parent = newList(); - GLStateManager.glNewList(parent, mode); + GLSMDraws.glNewList(parent, mode); boolean parentScope = GbufferPrograms.beginNestedEntityPhase(); // COMPILE_AND_EXECUTE also replays the child now. expected[0] = GbufferPrograms.getCurrentPhase(); pipeline.bind(); - GLStateManager.glCallList(child); + GLSMDraws.glCallList(child); GbufferPrograms.endNestedEntityPhase(parentScope); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); for (WorldRenderingPhase playback : new WorldRenderingPhase[] { WorldRenderingPhase.BLOCK_ENTITIES, WorldRenderingPhase.HAND_SOLID, WorldRenderingPhase.ENTITIES }) { pipeline.phase = playback; GbufferPrograms.setOverridePhase(null); expected[0] = playback == WorldRenderingPhase.BLOCK_ENTITIES ? WorldRenderingPhase.ENTITIES : playback; - GLStateManager.glCallList(parent); + GLSMDraws.glCallList(parent); assertEquals(playback, GbufferPrograms.getCurrentPhase()); assertNull(GbufferPrograms.getOverridePhase()); assertEquals(playback == WorldRenderingPhase.ENTITIES ? pipeline.entityProgram : pipeline.blockProgram, @@ -538,7 +544,7 @@ class IrisDisplayListStateTest { } } } finally { - if (DisplayListManager.isRecording()) GLStateManager.glEndList(); + if (DisplayListManager.isRecording()) GLSMDraws.glEndList(); GbufferPrograms.setOverridePhase(previousOverride); Reflect.set(manager, "pipeline", previousPipeline); } @@ -567,14 +573,14 @@ class IrisDisplayListStateTest { } private void bind() { - IrisDisplayListState.runProgramTransition(() -> GLStateManager.glUseProgram( + IrisDisplayListState.runProgramTransition(() -> GLSMPrograms.glUseProgram( getPhase() == WorldRenderingPhase.ENTITIES ? entityProgram : blockProgram)); } } private static int itemUniform(int program) { IntBuffer result = BufferUtils.createIntBuffer(1); - GL20.glGetUniform(program, GLStateManager.glGetUniformLocation(program, "itemId"), result); + GL20.glGetUniform(program, GLSMPrograms.glGetUniformLocation(program, "itemId"), result); return result.get(0); } @@ -591,7 +597,7 @@ class IrisDisplayListStateTest { final String registered = EntityList.getEntityString(entity); final NamespacedId name = new NamespacedId(registered == null ? entity.getClass().getSimpleName() : registered); final int program = program(); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); final ProgramUniforms.Builder builder = ProgramUniforms.builder("cached entity", program); // The fixture's active int uniform carries the entity ID here. builder.uniform1i("itemId", state::getCurrentRenderedEntity, state.getEntityIdNotifier()); @@ -607,7 +613,7 @@ class IrisDisplayListStateTest { expected[0] = -1; state.setCurrentEntityAndItem(111, 112); final int child = newList(); - GLStateManager.glNewList(child, mode); + GLSMDraws.glNewList(child, mode); state.pushCurrentEntityAndItem(); state.setCurrentRenderedEntity(entity); DisplayListManager.recordStateCommand(() -> { @@ -617,30 +623,30 @@ class IrisDisplayListStateTest { assertEquals(52, state.getCurrentRenderedBlockEntity(), "the cage keeps its block ID"); }); state.popCurrentEntityAndItem(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(111, state.getCurrentRenderedEntity()); assertEquals(112, state.getCurrentRenderedItem()); final int parent = newList(); - GLStateManager.glNewList(parent, mode); + GLSMDraws.glNewList(parent, mode); state.pushCurrentEntityAndItem(); state.setCurrentRenderedEntity(entity); ItemIdManager.pushItemId(); ItemIdManager.setItemIdRaw(73); - GLStateManager.glCallList(child); + GLSMDraws.glCallList(child); DisplayListManager.recordStateCommand(() -> { assertEquals(expected[0], state.getCurrentRenderedEntity()); assertEquals(73, state.getCurrentRenderedItem(), "nested entity restores outer item ID"); }); ItemIdManager.popItemId(); state.popCurrentEntityAndItem(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); for (int id : new int[] { 45010, 45011, -1 }) { settings.setEntityIds(key -> name.equals(key) ? id : -1); expected[0] = id; state.setCurrentEntityAndItem(222, 223); - GLStateManager.glCallList(parent); + GLSMDraws.glCallList(parent); assertEquals(222, state.getCurrentRenderedEntity()); assertEquals(222, itemUniform(program)); assertEquals(223, state.getCurrentRenderedItem()); @@ -648,7 +654,7 @@ class IrisDisplayListStateTest { } } } finally { - if (DisplayListManager.isRecording()) GLStateManager.glEndList(); + if (DisplayListManager.isRecording()) GLSMDraws.glEndList(); ProgramUniforms.clearActiveUniforms(); settings.setEntityIds(previousIds); settings.setEntityNbtMap(previousNbt); @@ -666,7 +672,7 @@ class IrisDisplayListStateTest { Item item = new Item(); NamespacedId name = new NamespacedId("angelica", "cached_item_test"); int program = program(); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); ProgramUniforms.Builder builder = ProgramUniforms.builder("cached item", program); builder.uniform1i("itemId", ItemIdManager::getItemId, CapturedRenderingState.INSTANCE.getItemIdNotifier()); ProgramUniforms uniforms = builder.buildUniforms(); @@ -681,7 +687,7 @@ class IrisDisplayListStateTest { ItemIdManager.setItemIdRaw(111); ItemStack stack = new ItemStack(item); int list = newList(); - GLStateManager.glNewList(list, mode); + GLSMDraws.glNewList(list, mode); ItemIdManager.pushItemId(); ItemIdManager.setItemId(stack); DisplayListManager.recordStateCommand(() -> { @@ -689,7 +695,7 @@ class IrisDisplayListStateTest { assertEquals(expected[0], itemUniform(program)); }); ItemIdManager.popItemId(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(111, ItemIdManager.getItemId()); // A renderer may reuse its ItemStack after compiling a list. stack.func_150996_a(new Item()); @@ -700,13 +706,13 @@ class IrisDisplayListStateTest { Reflect.>getStatic(ItemMaterialHelper.class, "ITEM_NAME_CACHE").put(item, name); expected[0] = id; ItemIdManager.setItemIdRaw(222); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(222, ItemIdManager.getItemId()); assertEquals(222, itemUniform(program)); } } } finally { - if (DisplayListManager.isRecording()) GLStateManager.glEndList(); + if (DisplayListManager.isRecording()) GLSMDraws.glEndList(); ProgramUniforms.clearActiveUniforms(); settings.setItemIds(previousIds); settings.setItemNbtMap(previousNbt); @@ -719,7 +725,7 @@ class IrisDisplayListStateTest { void compileOnlyItemNotificationsDoNotUploadToLiveProgram() { int program = program(); int original = ItemIdManager.getItemId(); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); ItemIdManager.setItemIdRaw(111); ProgramUniforms.Builder builder = ProgramUniforms.builder("review", program); builder.uniform1i("itemId", ItemIdManager::getItemId, CapturedRenderingState.INSTANCE.getItemIdNotifier()); @@ -729,16 +735,16 @@ class IrisDisplayListStateTest { dynamic.get(0).update(); try { int list = newList(); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); ItemIdManager.pushItemId(); ItemIdManager.setItemIdRaw(42); uniforms.update(); assertEquals(111, itemUniform(program)); ItemIdManager.popItemId(); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); ItemIdManager.setItemIdRaw(222); assertEquals(222, itemUniform(program)); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(222, itemUniform(program)); } finally { ProgramUniforms.clearActiveUniforms(); diff --git a/src/test/java/com/gtnewhorizons/angelica/loading/GLSMApiRedirectsTest.java b/src/test/java/com/gtnewhorizons/angelica/loading/GLSMApiRedirectsTest.java new file mode 100644 index 000000000..0ea5d032e --- /dev/null +++ b/src/test/java/com/gtnewhorizons/angelica/loading/GLSMApiRedirectsTest.java @@ -0,0 +1,130 @@ +package com.gtnewhorizons.angelica.loading; + +import com.gtnewhorizons.angelica.glsm.testutil.DefiningClassLoader; +import com.gtnewhorizons.angelica.loading.shared.transformers.AngelicaRedirector; +import org.junit.jupiter.api.Test; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.InsnNode; +import org.objectweb.asm.tree.LabelNode; +import org.objectweb.asm.tree.LineNumberNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.TypeInsnNode; +import org.objectweb.asm.tree.VarInsnNode; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; + +class GLSMApiRedirectsTest { + + private static final String CLASS_NAME = "com/example/OutsideMod"; + private static final String GLSM = "com/gtnewhorizons/angelica/glsm/GLStateManager"; + private static final String FOG_STATE_STACK = "com/gtnewhorizons/angelica/glsm/stacks/FogStateStack"; + private static final String GL_STATE = "com/gtnewhorizons/angelica/api/glstate/GLState"; + private static final String VECTOR3D = "org/joml/Vector3d"; + private static final String GLSM_FOG = "com/gtnewhorizons/angelica/glsm/GLSMFog"; + + private static ClassNode outsideClass() { + final ClassNode cn = new ClassNode(); + cn.version = Opcodes.V1_8; + cn.access = Opcodes.ACC_PUBLIC; + cn.name = CLASS_NAME; + cn.superName = "java/lang/Object"; + + final MethodNode fogBuffer = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "fogRed", "()F", null, null); + final LabelNode line = new LabelNode(); + fogBuffer.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, GLSM, "getFogState", "()L" + FOG_STATE_STACK + ";", false)); + fogBuffer.instructions.add(line); + fogBuffer.instructions.add(new LineNumberNode(7, line)); + fogBuffer.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, FOG_STATE_STACK, "getFogColorBuffer", "()Ljava/nio/FloatBuffer;", false)); + fogBuffer.instructions.add(new InsnNode(Opcodes.ICONST_0)); + fogBuffer.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/nio/FloatBuffer", "get", "(I)F", false)); + fogBuffer.instructions.add(new InsnNode(Opcodes.FRETURN)); + cn.methods.add(fogBuffer); + + final MethodNode fogColor = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "fogColorX", "()D", null, null); + fogColor.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, GLSM, "getFogColor", "()L" + VECTOR3D + ";", false)); + fogColor.instructions.add(new FieldInsnNode(Opcodes.GETFIELD, VECTOR3D, "x", "D")); + fogColor.instructions.add(new InsnNode(Opcodes.DRETURN)); + cn.methods.add(fogColor); + + final MethodNode fogMode = new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "fogMode", "()I", null, null); + fogMode.instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, GLSM, "getFogState", "()L" + FOG_STATE_STACK + ";", false)); + fogMode.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, FOG_STATE_STACK, "getFogMode", "()I", false)); + fogMode.instructions.add(new InsnNode(Opcodes.IRETURN)); + cn.methods.add(fogMode); + + final MethodNode ctor = new MethodNode(Opcodes.ACC_PUBLIC, "", "()V", null, null); + ctor.instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); + ctor.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, "java/lang/Object", "", "()V", false)); + ctor.instructions.add(new InsnNode(Opcodes.RETURN)); + cn.methods.add(ctor); + return cn; + } + + private static List code(ClassNode cn, String name) { + final MethodNode mn = cn.methods.stream().filter(m -> m.name.equals(name)).findFirst().orElseThrow(); + final List out = new ArrayList<>(); + for (AbstractInsnNode node : mn.instructions.toArray()) { + if (node.getOpcode() < 0) continue; + if (node instanceof MethodInsnNode m) { + out.add(op(m.getOpcode(), m.owner + "." + m.name + m.desc)); + } else if (node instanceof FieldInsnNode f) { + out.add(op(f.getOpcode(), f.owner + "." + f.name)); + } else if (node instanceof TypeInsnNode t) { + out.add(op(t.getOpcode(), t.desc)); + } else { + out.add(op(node.getOpcode())); + } + } + return out; + } + + private static String op(int opcode) { + return String.valueOf(opcode); + } + + private static String op(int opcode, String operand) { + return opcode + " " + operand; + } + + @Test + void fogCallsBecomeGLStateCalls() { + final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); + outsideClass().accept(cw); + final byte[] original = cw.toByteArray(); + final byte[] bytes = AngelicaRedirector.create().transform(CLASS_NAME.replace('/', '.'), original, null); + assertNotSame(original, bytes, "redirector left the class untouched"); + DefiningClassLoader.define(CLASS_NAME.replace('/', '.'), bytes); + + final ClassNode cn = new ClassNode(); + new ClassReader(bytes).accept(cn, 0); + assertEquals(List.of( + op(Opcodes.ICONST_4), + op(Opcodes.INVOKESTATIC, "java/nio/FloatBuffer.allocate(I)Ljava/nio/FloatBuffer;"), + op(Opcodes.DUP), + op(Opcodes.INVOKESTATIC, GL_STATE + ".getFogColor(Ljava/nio/FloatBuffer;)V"), + op(Opcodes.ICONST_0), + op(Opcodes.INVOKEVIRTUAL, "java/nio/FloatBuffer.get(I)F"), + op(Opcodes.FRETURN)), code(cn, "fogRed")); + assertEquals(List.of( + op(Opcodes.NEW, VECTOR3D), + op(Opcodes.DUP), + op(Opcodes.INVOKESPECIAL, VECTOR3D + ".()V"), + op(Opcodes.INVOKESTATIC, GL_STATE + ".getFogColor(L" + VECTOR3D + ";)L" + VECTOR3D + ";"), + op(Opcodes.GETFIELD, VECTOR3D + ".x"), + op(Opcodes.DRETURN)), code(cn, "fogColorX")); + assertEquals(List.of( + op(Opcodes.INVOKESTATIC, GLSM_FOG + ".getFogState()L" + FOG_STATE_STACK + ";"), + op(Opcodes.INVOKEVIRTUAL, FOG_STATE_STACK + ".getFogMode()I"), + op(Opcodes.IRETURN)), code(cn, "fogMode")); + } +} diff --git a/src/test/java/com/gtnewhorizons/angelica/loading/fml/compat/KaizPatchXTransformerTest.java b/src/test/java/com/gtnewhorizons/angelica/loading/fml/compat/KaizPatchXTransformerTest.java new file mode 100644 index 000000000..cbec90c0f --- /dev/null +++ b/src/test/java/com/gtnewhorizons/angelica/loading/fml/compat/KaizPatchXTransformerTest.java @@ -0,0 +1,69 @@ +package com.gtnewhorizons.angelica.loading.fml.compat; + +import com.gtnewhorizons.angelica.glsm.testutil.DefiningClassLoader; +import com.gtnewhorizons.angelica.loading.fml.compat.transformers.specific.KaizPatchXTransformer; +import org.junit.jupiter.api.Test; +import org.spongepowered.asm.lib.ClassWriter; +import org.spongepowered.asm.lib.Label; +import org.spongepowered.asm.lib.MethodVisitor; +import org.spongepowered.asm.lib.Opcodes; + +import java.lang.reflect.Method; + +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class KaizPatchXTransformerTest { + + private static final String INTERNAL = "jp/kaiz/kaizpatch/compat/AngelicaCompat"; + private static final String DOTTED = "jp.kaiz.kaizpatch.compat.AngelicaCompat"; + private static final String DESC = "(Ljava/lang/String;)Ljava/lang/String;"; + + private static ClassWriter angelicaCompat() { + final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); + cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, INTERNAL, null, "java/lang/Object", null); + final MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "transformScript", DESC, null, null); + mv.visitCode(); + final Label nonEmpty = new Label(); + mv.visitVarInsn(Opcodes.ALOAD, 0); + mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "isEmpty", "()Z", false); + mv.visitJumpInsn(Opcodes.IFEQ, nonEmpty); + mv.visitLdcInsn("GL11.glPushMatrix();"); + mv.visitInsn(Opcodes.ARETURN); + mv.visitLabel(nonEmpty); + mv.visitVarInsn(Opcodes.ALOAD, 0); + mv.visitLdcInsn(""); + mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/String", "concat", DESC, false); + mv.visitInsn(Opcodes.ARETURN); + mv.visitMaxs(0, 0); + mv.visitEnd(); + return cw; + } + + @Test + void redirectsEveryReturn() throws ReflectiveOperationException { + final ClassWriter cw = angelicaCompat(); + cw.visitEnd(); + final byte[] out = new KaizPatchXTransformer().transform(DOTTED, DOTTED, cw.toByteArray()); + final Method transformScript = DefiningClassLoader.define(DOTTED, out).getMethod("transformScript", String.class); + for (String script : new String[] {"", "GLStateManager.glPopMatrix();"}) { + final String result = (String) transformScript.invoke(null, script); + assertTrue(result.contains("GLSMMatrices."), result); + } + } + + @Test + void adoptedClassPassesThrough() { + final ClassWriter cw = angelicaCompat(); + final MethodVisitor init = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "init", "()V", null, null); + init.visitCode(); + init.visitLdcInsn("redirectScript"); + init.visitInsn(Opcodes.POP); + init.visitInsn(Opcodes.RETURN); + init.visitMaxs(0, 0); + init.visitEnd(); + cw.visitEnd(); + final byte[] original = cw.toByteArray(); + assertSame(original, new KaizPatchXTransformer().transform(DOTTED, DOTTED, original)); + } +} diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionSsboMappingTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionSsboMappingTest.java index 6ec5e85c3..f52af7431 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionSsboMappingTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/PlayerReflectionSsboMappingTest.java @@ -1,6 +1,9 @@ package com.gtnewhorizons.angelica.rendering; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.QuadConverter; import com.gtnewhorizons.angelica.glsm.RenderSystem; @@ -69,13 +72,13 @@ class PlayerReflectionSsboMappingTest { @AfterEach void cleanup() { - GLStateManager.glUseProgram(0); - GLStateManager.glBindVertexArray(0); - if (program != 0) GLStateManager.glDeleteProgram(program); - if (vbo != 0) GLStateManager.glDeleteBuffers(vbo); - if (ssbo != 0) GLStateManager.glDeleteBuffers(ssbo); - if (visitedSsbo != 0) GLStateManager.glDeleteBuffers(visitedSsbo); - if (vao != 0) GLStateManager.glDeleteVertexArrays(vao); + GLSMPrograms.glUseProgram(0); + GLSMVertexInput.glBindVertexArray(0); + if (program != 0) GLSMPrograms.glDeleteProgram(program); + if (vbo != 0) GLSMBuffers.glDeleteBuffers(vbo); + if (ssbo != 0) GLSMBuffers.glDeleteBuffers(ssbo); + if (visitedSsbo != 0) GLSMBuffers.glDeleteBuffers(visitedSsbo); + if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao); program = vao = vbo = ssbo = visitedSsbo = 0; } @@ -103,38 +106,38 @@ class PlayerReflectionSsboMappingTest { final FloatBuffer verts = BufferUtils.createFloatBuffer(xyzuv.length); verts.put(xyzuv).flip(); - vao = GLStateManager.glGenVertexArrays(); - vbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW); + vao = GLSMVertexInput.glGenVertexArrays(); + vbo = GLSMBuffers.glGenBuffers(); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, verts, GL15.GL_STATIC_DRAW); final int stride = PlayerReflectionTestSupport.FLOATS * 4; GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, stride, 0L); GL20.glEnableVertexAttribArray(0); GL20.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, stride, 12L); GL20.glEnableVertexAttribArray(1); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); } private void allocateSsbo() { - ssbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo); - GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, ByteBuffer.allocateDirect(SSBO_BYTES).order(ByteOrder.nativeOrder()), GL15.GL_DYNAMIC_DRAW); + ssbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo); + GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, ByteBuffer.allocateDirect(SSBO_BYTES).order(ByteOrder.nativeOrder()), GL15.GL_DYNAMIC_DRAW); GL30.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, BINDING, ssbo); - visitedSsbo = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visitedSsbo); - GLStateManager.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, ByteBuffer.allocateDirect(VISITED_BYTES).order(ByteOrder.nativeOrder()), GL15.GL_DYNAMIC_DRAW); + visitedSsbo = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, visitedSsbo); + GLSMBuffers.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, ByteBuffer.allocateDirect(VISITED_BYTES).order(ByteOrder.nativeOrder()), GL15.GL_DYNAMIC_DRAW); GL30.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, VISITED_BINDING, visitedSsbo); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); } private ByteBuffer readback(int buffer, int bytes) { GL42.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT | GL42.GL_BUFFER_UPDATE_BARRIER_BIT); final ByteBuffer out = BufferUtils.createByteBuffer(bytes); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, buffer); - GLStateManager.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, out); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, buffer); + GLSMBuffers.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, out); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); return out; } @@ -146,8 +149,8 @@ class PlayerReflectionSsboMappingTest { uploadVertices(xyzuv); allocateSsbo(); - GLStateManager.glUseProgram(program); - GLStateManager.glBindVertexArray(vao); + GLSMPrograms.glUseProgram(program); + GLSMVertexInput.glBindVertexArray(vao); QuadConverter.drawQuadsAsTriangles(GLStateManager.ctx(), 0, PlayerReflectionCapture.VERTEX_COUNT); return xyzuv; } diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/celeritas/TerrainShaderLinkTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/celeritas/TerrainShaderLinkTest.java index d4336c329..78fd63c32 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/celeritas/TerrainShaderLinkTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/celeritas/TerrainShaderLinkTest.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.rendering.celeritas; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import org.embeddedt.embeddium.impl.gl.attribute.GlVertexAttribute; import org.embeddedt.embeddium.impl.gl.shader.ShaderConstants; @@ -96,22 +96,22 @@ class TerrainShaderLinkTest { int program = 0; try { fsh = compile(GL20.GL_FRAGMENT_SHADER, FSH, constants); - program = GLStateManager.glCreateProgram(); - GLStateManager.glAttachShader(program, vsh); - GLStateManager.glAttachShader(program, fsh); + program = GLSMPrograms.glCreateProgram(); + GLSMPrograms.glAttachShader(program, vsh); + GLSMPrograms.glAttachShader(program, fsh); int i = 0; for (GlVertexAttribute attr : vertexType.getVertexFormat().getAttributes()) { - GLStateManager.glBindAttribLocation(program, i++, attr.getName()); + GLSMPrograms.glBindAttribLocation(program, i++, attr.getName()); } - GLStateManager.glBindFragDataLocation(program, ChunkShaderBindingPoints.FRAG_COLOR, "fragColor"); - GLStateManager.glLinkProgram(program); + GLSMPrograms.glBindFragDataLocation(program, ChunkShaderBindingPoints.FRAG_COLOR, "fragColor"); + GLSMPrograms.glLinkProgram(program); final int linked = program; - assertEquals(GL11.GL_TRUE, GLStateManager.glGetProgrami(program, GL20.GL_LINK_STATUS), - () -> "terrain program failed to link with " + constants.getDefineStrings() + ":\n" + GLStateManager.glGetProgramInfoLog(linked, 8192)); + assertEquals(GL11.GL_TRUE, GLSMPrograms.glGetProgrami(program, GL20.GL_LINK_STATUS), + () -> "terrain program failed to link with " + constants.getDefineStrings() + ":\n" + GLSMPrograms.glGetProgramInfoLog(linked, 8192)); } finally { - if (program != 0) GLStateManager.glDeleteProgram(program); - if (fsh != 0) GLStateManager.glDeleteShader(fsh); - GLStateManager.glDeleteShader(vsh); + if (program != 0) GLSMPrograms.glDeleteProgram(program); + if (fsh != 0) GLSMPrograms.glDeleteShader(fsh); + GLSMPrograms.glDeleteShader(vsh); } } } diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/CullingShaderCompileTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/CullingShaderCompileTest.java index f3ed7fc93..6dce5ac9c 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/CullingShaderCompileTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/CullingShaderCompileTest.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.rendering.culling; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.RenderSystem; import org.junit.jupiter.api.Test; @@ -26,7 +26,7 @@ class CullingShaderCompileTest { private static void assertCompiles(String name) throws IOException { assumeTrue(RenderSystem.supportsCompute(), "compute shaders unsupported"); - GLStateManager.glDeleteShader(GlTestSupport.compile(GL43.GL_COMPUTE_SHADER, source(name))); + GLSMPrograms.glDeleteShader(GlTestSupport.compile(GL43.GL_COMPUTE_SHADER, source(name))); } @Test diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/IndirectCullDrawParityTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/IndirectCullDrawParityTest.java index 53738cefb..9e087161c 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/IndirectCullDrawParityTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/IndirectCullDrawParityTest.java @@ -8,7 +8,14 @@ import org.embeddedt.embeddium.impl.render.chunk.compile.sorting.QuadPrimitiveTy import com.gtnewhorizon.gtnhlib.bytebuf.MemoryUtilities; import com.gtnewhorizons.angelica.config.GpuCullingMode; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.rendering.RenderRegionKeys; import com.gtnewhorizons.angelica.rendering.celeritas.IndividualDrawBatch; @@ -151,22 +158,22 @@ class IndirectCullDrawParityTest { Fbo() { try { - textures[0] = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[0]); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH_COMPONENT32F, FBO_SIZE, FBO_SIZE, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + textures[0] = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[0]); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL30.GL_DEPTH_COMPONENT32F, FBO_SIZE, FBO_SIZE, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - textures[1] = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, textures[1]); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, FBO_SIZE, FBO_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + textures[1] = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, textures[1]); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, FBO_SIZE, FBO_SIZE, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); - id = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, id); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, textures[0], 0); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, textures[1], 0); - assertEquals(GL30.GL_FRAMEBUFFER_COMPLETE, GLStateManager.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER), "parity FBO incomplete"); + id = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, id); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, textures[0], 0); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, textures[1], 0); + assertEquals(GL30.GL_FRAMEBUFFER_COMPLETE, GLSMFramebuffer.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER), "parity FBO incomplete"); } catch (RuntimeException | Error e) { close(); throw e; @@ -175,10 +182,10 @@ class IndirectCullDrawParityTest { @Override public void close() { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - if (id != 0) GLStateManager.glDeleteFramebuffers(id); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + if (id != 0) GLSMFramebuffer.glDeleteFramebuffers(id); for (int tex : textures) { - if (tex != 0) GLStateManager.glDeleteTextures(tex); + if (tex != 0) GLSMTextures.glDeleteTextures(tex); } } } @@ -192,16 +199,16 @@ class IndirectCullDrawParityTest { @AfterAll static void tearDownDevice() { - if (program != 0) GLStateManager.glDeleteProgram(program); + if (program != 0) GLSMPrograms.glDeleteProgram(program); RenderDevice.exitManagedCode(); } @AfterEach void resetGlState() { - GLStateManager.glUseProgram(0); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); - GLStateManager.glViewport(0, 0, 800, 600); + GLSMPrograms.glUseProgram(0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); + GLSMRasterizer.glViewport(0, 0, 800, 600); } private static final String FLAT_VS = "#version 330 core\n" @@ -323,22 +330,22 @@ class IndirectCullDrawParityTest { } private static void beginDrawing(int fbo) { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glViewport(0, 0, FBO_SIZE, FBO_SIZE); - GLStateManager.glEnable(GL11.GL_DEPTH_TEST); - GLStateManager.glDepthFunc(GL11.GL_LESS); - GLStateManager.glDepthMask(true); - GLStateManager.disableCull(); - GLStateManager.glClearDepth(1.0); - GLStateManager.glClearColor(0f, 0f, 0f, 0f); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glUseProgram(program); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMRasterizer.glViewport(0, 0, FBO_SIZE, FBO_SIZE); + GLSMEnable.glEnable(GL11.GL_DEPTH_TEST); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMRasterizer.disableCull(); + GLSMDepthStencilAlpha.glClearDepth(1.0); + GLSMBlend.glClearColor(0f, 0f, 0f, 0f); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT); + GLSMPrograms.glUseProgram(program); } private static FloatBuffer readDepth(int fbo) { - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo); final FloatBuffer depth = BufferUtils.createFloatBuffer(FBO_SIZE * FBO_SIZE); - GLStateManager.glReadPixels(0, 0, FBO_SIZE, FBO_SIZE, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, depth); + GLSMFramebuffer.glReadPixels(0, 0, FBO_SIZE, FBO_SIZE, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, depth); return depth; } @@ -557,9 +564,9 @@ class IndirectCullDrawParityTest { private static void assertIndirectBufferMatches(int bufferId, List expected, String label) { assertNotEquals(0, bufferId, label + ": no indirect buffer was created"); final ByteBuffer readback = BufferUtils.createByteBuffer(expected.size() * CMD_INTS * 4).order(ByteOrder.nativeOrder()); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, bufferId); - GLStateManager.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, readback); - GLStateManager.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, bufferId); + GLSMBuffers.glGetBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, 0L, readback); + GLSMBuffers.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); final String[] fieldNames = { "count", "instanceCount", "firstIndex", "baseVertex", "baseInstance" }; for (int c = 0; c < expected.size(); c++) { for (int i = 0; i < CMD_INTS; i++) { diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/MultiDrawCompatStompTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/MultiDrawCompatStompTest.java index c2288f952..eda3cee92 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/MultiDrawCompatStompTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/MultiDrawCompatStompTest.java @@ -2,7 +2,11 @@ package com.gtnewhorizons.angelica.rendering.culling; import com.gtnewhorizons.angelica.glsm.CompatUniformManager; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.RenderSystem; import org.joml.Matrix4f; @@ -48,7 +52,7 @@ class MultiDrawCompatStompTest { private static Matrix4f readUniform(int program, int location) { final FloatBuffer buf = BufferUtils.createFloatBuffer(16); - GLStateManager.glGetUniform(program, location, buf); + GLSMPrograms.glGetUniform(program, location, buf); return new Matrix4f(buf); } @@ -56,60 +60,60 @@ class MultiDrawCompatStompTest { void armSentinel() { program = GlTestSupport.program(IRIS_MVM_VS, GlTestSupport.TRIVIAL_FS); assertTrue(CompatUniformManager.hasProgram(program), "program with iris_ModelViewMatrix was not registered by CompatUniformManager at link"); - location = GLStateManager.glGetUniformLocation(program, "iris_ModelViewMatrix"); + location = GLSMPrograms.glGetUniformLocation(program, "iris_ModelViewMatrix"); assertTrue(location >= 0, "iris_ModelViewMatrix location not found"); - vao = GLStateManager.glGenVertexArrays(); - GLStateManager.glBindVertexArray(vao); - elementBuffer = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, elementBuffer); - GLStateManager.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, BufferUtils.createByteBuffer(12), GL15.GL_STATIC_DRAW); - indirectBuffer = GLStateManager.glGenBuffers(); - GLStateManager.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, indirectBuffer); + vao = GLSMVertexInput.glGenVertexArrays(); + GLSMVertexInput.glBindVertexArray(vao); + elementBuffer = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, elementBuffer); + GLSMBuffers.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, BufferUtils.createByteBuffer(12), GL15.GL_STATIC_DRAW); + indirectBuffer = GLSMBuffers.glGenBuffers(); + GLSMBuffers.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, indirectBuffer); final ByteBuffer zeroCommand = BufferUtils.createByteBuffer(20).order(ByteOrder.nativeOrder()); - GLStateManager.glBufferData(GL40.GL_DRAW_INDIRECT_BUFFER, zeroCommand, GL15.GL_STATIC_DRAW); + GLSMBuffers.glBufferData(GL40.GL_DRAW_INDIRECT_BUFFER, zeroCommand, GL15.GL_STATIC_DRAW); final FloatBuffer matBuf = BufferUtils.createFloatBuffer(16); - GLStateManager.glUseProgram(program); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMPrograms.glUseProgram(program); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); putMatrix(LEGACY_CAMERA, matBuf); - GLStateManager.glLoadMatrix(matBuf); + GLSMMatrices.glLoadMatrix(matBuf); putMatrix(SENTINEL, matBuf); - GLStateManager.glUniformMatrix4(location, false, matBuf); + GLSMPrograms.glUniformMatrix4(location, false, matBuf); assertEquals(SENTINEL, readUniform(program, location), "sentinel upload did not take"); } @AfterEach void tearDown() { - GLStateManager.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0); - GLStateManager.glBindVertexArray(0); - GLStateManager.glUseProgram(0); - if (vao != 0) GLStateManager.glDeleteVertexArrays(vao); - if (indirectBuffer != 0) GLStateManager.glDeleteBuffers(indirectBuffer); - if (elementBuffer != 0) GLStateManager.glDeleteBuffers(elementBuffer); - GLStateManager.glDeleteProgram(program); + GLSMBuffers.glBindBuffer(GL40.GL_DRAW_INDIRECT_BUFFER, 0); + GLSMVertexInput.glBindVertexArray(0); + GLSMPrograms.glUseProgram(0); + if (vao != 0) GLSMVertexInput.glDeleteVertexArrays(vao); + if (indirectBuffer != 0) GLSMBuffers.glDeleteBuffers(indirectBuffer); + if (elementBuffer != 0) GLSMBuffers.glDeleteBuffers(elementBuffer); + GLSMPrograms.glDeleteProgram(program); final FloatBuffer identity = BufferUtils.createFloatBuffer(16); new Matrix4f().get(identity); - GLStateManager.glLoadMatrix(identity); + GLSMMatrices.glLoadMatrix(identity); } @Test void multiDrawIndirectDoesNotStompIrisMatrix() { assumeTrue(RenderSystem.supportsMultiDrawIndirect(), "glMultiDrawElementsIndirect needs GL 4.3 / ARB_multi_draw_indirect; macOS core profile caps at 4.1"); - GLStateManager.glMultiDrawElementsIndirect(GL11.GL_TRIANGLES, GL11.GL_UNSIGNED_INT, 0L, 1, 0); + GLSMDraws.glMultiDrawElementsIndirect(GL11.GL_TRIANGLES, GL11.GL_UNSIGNED_INT, 0L, 1, 0); assertEquals(SENTINEL, readUniform(program, location), "glMultiDrawElementsIndirect stomped iris_ModelViewMatrix from the legacy matrix stack; celeritas-managed programs own this uniform and the shadow pass renders with the camera view if it is overwritten"); } @Test void baseVertexDrawsDoNotStompIrisMatrixButRegularDrawDoes() { - GLStateManager.glDrawElementsBaseVertex(GL11.GL_TRIANGLES, 0, GL11.GL_UNSIGNED_INT, 0L, 0); + GLSMDraws.glDrawElementsBaseVertex(GL11.GL_TRIANGLES, 0, GL11.GL_UNSIGNED_INT, 0L, 0); assertEquals(SENTINEL, readUniform(program, location), "glDrawElementsBaseVertex stomped iris_ModelViewMatrix; the Individual draw emitter renders shadows with the camera view if it is overwritten"); - GLStateManager.glDrawRangeElementsBaseVertex(GL11.GL_TRIANGLES, 0, 0, 0, GL11.GL_UNSIGNED_INT, 0L, 0); + GLSMDraws.glDrawRangeElementsBaseVertex(GL11.GL_TRIANGLES, 0, 0, 0, GL11.GL_UNSIGNED_INT, 0L, 0); assertEquals(SENTINEL, readUniform(program, location), "glDrawRangeElementsBaseVertex stomped iris_ModelViewMatrix"); - GLStateManager.glDrawElements(GL11.GL_TRIANGLES, 0, GL11.GL_UNSIGNED_INT, 0L); + GLSMDraws.glDrawElements(GL11.GL_TRIANGLES, 0, GL11.GL_UNSIGNED_INT, 0L); final Matrix4f afterRegularDraw = readUniform(program, location); assertNotEquals(SENTINEL, afterRegularDraw, "regular glDrawElements no longer refreshes compat uniforms; entity/hand programs rely on the legacy-stack upload"); assertTrue(afterRegularDraw.equals(LEGACY_CAMERA, 1e-6f), "regular draw refreshed iris_ModelViewMatrix but not from the legacy modelview stack"); diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/ShadowSnapshotBlitTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/ShadowSnapshotBlitTest.java index fc816a35a..5fa8d8a23 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/culling/ShadowSnapshotBlitTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/culling/ShadowSnapshotBlitTest.java @@ -1,7 +1,11 @@ package com.gtnewhorizons.angelica.rendering.culling; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.RenderSystem; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -36,48 +40,48 @@ class ShadowSnapshotBlitTest { @AfterEach void deleteTargets() { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(srcFbo); - GLStateManager.glDeleteFramebuffers(cacheFbo); - GLStateManager.glDeleteTextures(srcTex); - GLStateManager.glDeleteTextures(cacheTex); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(srcFbo); + GLSMFramebuffer.glDeleteFramebuffers(cacheFbo); + GLSMTextures.glDeleteTextures(srcTex); + GLSMTextures.glDeleteTextures(cacheTex); } private static int newDepthTexture() { - final int tex = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, tex); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_DEPTH_COMPONENT, SIZE, SIZE, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (java.nio.ByteBuffer) null); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + final int tex = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, tex); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_DEPTH_COMPONENT, SIZE, SIZE, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (java.nio.ByteBuffer) null); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); return tex; } private static int newDepthFbo(int tex) { - final int fbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, tex, 0); - assertEquals(GL30.GL_FRAMEBUFFER_COMPLETE, GLStateManager.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER), "depth-only FBO incomplete"); + final int fbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, tex, 0); + assertEquals(GL30.GL_FRAMEBUFFER_COMPLETE, GLSMFramebuffer.glCheckFramebufferStatus(GL30.GL_FRAMEBUFFER), "depth-only FBO incomplete"); return fbo; } private static void fillPattern(int fbo) { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); - GLStateManager.glDepthMask(true); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); - GLStateManager.glClearDepth(FAR); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, SIZE / 2, SIZE / 2); - GLStateManager.glClearDepth(NEAR_PATCH); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, fbo); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); + GLSMDepthStencilAlpha.glClearDepth(FAR); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, SIZE / 2, SIZE / 2); + GLSMDepthStencilAlpha.glClearDepth(NEAR_PATCH); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); } private static float readDepth(int fbo, int x, int y) { - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, fbo); final FloatBuffer buf = BufferUtils.createFloatBuffer(1); - GLStateManager.glReadPixels(x, y, 1, 1, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, buf); + GLSMFramebuffer.glReadPixels(x, y, 1, 1, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, buf); return buf.get(0); } @@ -91,10 +95,10 @@ class ShadowSnapshotBlitTest { assertEquals(NEAR_PATCH, readDepth(cacheFbo, 10, 10), 1e-4f, "capture blit did not copy the near patch into the cache"); assertEquals(FAR, readDepth(cacheFbo, SIZE - 10, SIZE - 10), 1e-4f, "capture blit did not copy the far background into the cache"); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, srcFbo); - GLStateManager.glDepthMask(true); - GLStateManager.glClearDepth(FAR); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, srcFbo); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glClearDepth(FAR); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); assertEquals(FAR, readDepth(srcFbo, 10, 10), 1e-4f, "source not cleared before restore"); RenderSystem.blitFramebuffer(cacheFbo, srcFbo, 0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT, GL11.GL_NEAREST); @@ -105,14 +109,14 @@ class ShadowSnapshotBlitTest { @Test void depthBlitIsNotAffectedByScissorState() { fillPattern(srcFbo); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, cacheFbo); - GLStateManager.glClearDepth(FAR); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, cacheFbo); + GLSMDepthStencilAlpha.glClearDepth(FAR); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, 4, 4); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, 4, 4); RenderSystem.blitFramebuffer(srcFbo, cacheFbo, 0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT, GL11.GL_NEAREST); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); assertEquals(NEAR_PATCH, readDepth(cacheFbo, 100, 100), 1e-4f, "scissor clipped the snapshot blit; the cache only received the scissor box"); } @@ -120,16 +124,16 @@ class ShadowSnapshotBlitTest { @Test void rawBlitStaysScissorClipped() { fillPattern(srcFbo); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, cacheFbo); - GLStateManager.glClearDepth(FAR); - GLStateManager.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, cacheFbo); + GLSMDepthStencilAlpha.glClearDepth(FAR); + GLSMFramebuffer.glClear(GL11.GL_DEPTH_BUFFER_BIT); - GLStateManager.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, srcFbo); - GLStateManager.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, cacheFbo); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); - GLStateManager.glScissor(0, 0, 4, 4); - GLStateManager.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT, GL11.GL_NEAREST); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, srcFbo); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, cacheFbo); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); + GLSMRasterizer.glScissor(0, 0, 4, 4); + GLSMFramebuffer.glBlitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, GL11.GL_DEPTH_BUFFER_BIT, GL11.GL_NEAREST); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); assertEquals(NEAR_PATCH, readDepth(cacheFbo, 1, 1), 1e-4f, "raw blit copied nothing inside the scissor box"); assertEquals(FAR, readDepth(cacheFbo, 100, 100), 1e-4f, "raw glBlitFramebuffer ignored scissor"); diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/items/ItemTemplateCaptureGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/items/ItemTemplateCaptureGLTest.java index cc80e6bd2..60aeed4c8 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/items/ItemTemplateCaptureGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/items/ItemTemplateCaptureGLTest.java @@ -5,7 +5,9 @@ import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; import com.gtnewhorizons.angelica.compat.draconicevolution.PlacedItemRenderCompat; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.rendering.tesr.AngelicaTesrMeshCache; @@ -162,7 +164,7 @@ class ItemTemplateCaptureGLTest { final ShaderManager shaders = ShaderManager.getInstance(); final boolean ffp = shaders.isEnabled(); final ModelPartBatcher batcher = ModelPartBatcher.INSTANCE; - final Matrix4f originalMatrix = new Matrix4f(GLStateManager.getModelViewMatrix()); + final Matrix4f originalMatrix = new Matrix4f(GLSMMatrices.getModelViewMatrix()); final ItemPropCache icons = Reflect.getStatic(DroppedItemInstancer.class, "icons"); final Object[] templates = new Object[2]; try { @@ -172,39 +174,39 @@ class ItemTemplateCaptureGLTest { testMinecraft.thePlayer = mock(EntityClientPlayerMP.class); Reflect.setStatic(Minecraft.class, "theMinecraft", testMinecraft); shaders.enable(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); batcher.begin(ModelPartBatcher.Mode.BLOCK_ENTITIES); assertTrue(batcher.isActive()); - ModelPartBatcher.onTextureBind(new ResourceLocation("test", "placed-items"), GLStateManager.getBoundTextureForServerState()); + ModelPartBatcher.onTextureBind(new ResourceLocation("test", "placed-items"), GLSMTextures.getBoundTextureForServerState()); final long parts = batcher.statParts(); final long instances = DroppedItemInstancer.statInstanced(); - BatchEligibility.begin(BatchEligibility.DENIED, GLStateManager.drawCalls); + BatchEligibility.begin(BatchEligibility.DENIED, GLSMDraws.drawCalls); try { for (int item = 0; item < 2; item++) { final int rotation = item * 90; assertEquals(SAFE, PlacedItemRenderCompat.renderWithBatchState(item, 0, 0, SAFE, () -> { - GLStateManager.glRotatef(rotation, 0, 1, 0); + GLSMMatrices.glRotatef(rotation, 0, 1, 0); DroppedItemInstancer.batchIcon(EntityMaterials.DROPPED_ITEM_CUTOUT, false, 1f, 0f, 0f, 1f, 16, 16, 0.0625f); })); templates[item] = Reflect.get(icons.get(1f, 0f, 0f, 1f, 16, 16, 0.0625f), "template"); PlacedItemRenderCompat.renderWithBatchState(0, 0, 0, BatchEligibility.DENIED, () -> { - final long before = GLStateManager.drawCalls; - GLStateManager.drawCalls++; - BatchEligibility.onPartFallback(before, GLStateManager.drawCalls); + final long before = GLSMDraws.drawCalls; + GLSMDraws.drawCalls++; + BatchEligibility.onPartFallback(before, GLSMDraws.drawCalls); }); } } finally { - BatchEligibility.end(BatchEligibility.DENIED, GLStateManager.drawCalls); + BatchEligibility.end(BatchEligibility.DENIED, GLSMDraws.drawCalls); } assertNotNull(templates[0]); assertSame(templates[0], templates[1], "the second placement must reuse the icon mesh"); assertEquals(2, batcher.statParts() - parts, "both transforms reach the shared batcher"); assertEquals(2, DroppedItemInstancer.statInstanced() - instances); - assertTrue(new Matrix4f().equals(GLStateManager.getModelViewMatrix(), 1e-5f)); + assertTrue(new Matrix4f().equals(GLSMMatrices.getModelViewMatrix(), 1e-5f)); } finally { batcher.clear(); - GLStateManager.setModelViewMatrix(originalMatrix); + GLSMMatrices.setModelViewMatrix(originalMatrix); AngelicaConfig.enableEntityBatching = batching; AngelicaConfig.itemRendererCacheSize = capacity; Reflect.setStatic(Minecraft.class, "theMinecraft", minecraft); @@ -219,14 +221,14 @@ class ItemTemplateCaptureGLTest { final RenderBlocks rb = new RenderBlocks() { @Override public void renderBlockAsItem(Block b, int meta, float brightness) { - if (calls[0]++ > 0) GLStateManager.drawCalls++; + if (calls[0]++ > 0) GLSMDraws.drawCalls++; } }; - BatchEligibility.begin(SAFE, GLStateManager.drawCalls); + BatchEligibility.begin(SAFE, GLSMDraws.drawCalls); drawBlock(rb, block); drawBlock(rb, block); - assertEquals(SAFE, BatchEligibility.end(SAFE, GLStateManager.drawCalls), "a block with no cached template draws vanilla and reports no part"); + assertEquals(SAFE, BatchEligibility.end(SAFE, GLSMDraws.drawCalls), "a block with no cached template draws vanilla and reports no part"); assertEquals(3, calls[0], "one capture, then a vanilla draw on the miss and on the cached null template"); } diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancingGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancingGLTest.java index 32a4a5067..f4d83dd63 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancingGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleInstancingGLTest.java @@ -1,7 +1,7 @@ package com.gtnewhorizons.angelica.rendering.particles; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import com.gtnewhorizons.angelica.glsm.ffp.ParticleParityFixture.Rotation; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; @@ -264,7 +264,7 @@ class ParticleInstancingGLTest { private static ParticleRenderState checkFrame(ParticleDescriptor descriptor, EntityFX reference, EntityFX candidate, float partialTicks, Rotation r, int startBrightness) { final NoOpTessellator run = new NoOpTessellator(); final ParticleCaptureTessellator capture = new ParticleCaptureTessellator(); - capture.begin(startBrightness, run, GLStateManager.getModelViewMatrix()); + capture.begin(startBrightness, run, GLSMMatrices.getModelViewMatrix()); reference.renderParticle(capture, partialTicks, r.x(), r.xz(), r.z(), r.yz(), r.xy()); assertFalse(capture.spilled()); @@ -518,7 +518,7 @@ class ParticleInstancingGLTest { final EntityFireworkSparkFX reference = twinklingSpark(age); final EntityFireworkSparkFX candidate = twinklingSpark(age); final ParticleCaptureTessellator capture = new ParticleCaptureTessellator(); - capture.begin(100, new NoOpTessellator(), GLStateManager.getModelViewMatrix()); + capture.begin(100, new NoOpTessellator(), GLSMMatrices.getModelViewMatrix()); reference.renderParticle(capture, 0.4f, r.x(), r.xz(), r.z(), r.yz(), r.xy()); assertFalse(capture.spilled()); if (capture.captured() == 0) { @@ -607,7 +607,7 @@ class ParticleInstancingGLTest { private static ParticleCaptureTessellator capturedQuad(RecordingTessellator run) { final ParticleCaptureTessellator capture = new ParticleCaptureTessellator(); - capture.begin(100, run, GLStateManager.getModelViewMatrix()); + capture.begin(100, run, GLSMMatrices.getModelViewMatrix()); capture.setColorRGBA(5, 6, 7, 8); feedQuad(capture); return capture; @@ -680,7 +680,7 @@ class ParticleInstancingGLTest { final RecordingTessellator run = new RecordingTessellator(); final ParticleCaptureTessellator capture = new ParticleCaptureTessellator(); - capture.begin(0, run, GLStateManager.getModelViewMatrix()); + capture.begin(0, run, GLSMMatrices.getModelViewMatrix()); capture.setColorRGBA(1, 1, 1, 1); capture.addVertexWithUV(0.0, 0.0, 0.0, 0.0, 0.0); capture.addVertexWithUV(0.0, 1.0, 0.0, 0.0, 1.0); @@ -700,7 +700,7 @@ class ParticleInstancingGLTest { final RecordingTessellator run = new RecordingTessellator(); final ParticleCaptureTessellator capture = new ParticleCaptureTessellator(); - capture.begin(0, run, GLStateManager.getModelViewMatrix()); + capture.begin(0, run, GLSMMatrices.getModelViewMatrix()); capture.addVertex(3.0, 4.0, 5.0); assertTrue(capture.spilled()); diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderStateGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderStateGLTest.java index 09122e0d0..f43962513 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderStateGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/particles/ParticleRenderStateGLTest.java @@ -1,7 +1,8 @@ package com.gtnewhorizons.angelica.rendering.particles; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; import com.gtnewhorizons.angelica.glsm.states.BlendState; import net.coderbot.iris.gl.blending.BlendModeStorage; import net.coderbot.iris.gl.blending.DepthColorStorage; @@ -20,20 +21,20 @@ class ParticleRenderStateGLTest { void restoreOverrides() { BlendModeStorage.restoreBlend(); DepthColorStorage.unlockDepthColor(); - GLStateManager.getBlendMode().setVanillaLayer(null); - GLStateManager.getBlendState().setVanillaLayer(null); - GLStateManager.getDepthState().setVanillaLayer(null); + GLSMBlend.getBlendMode().setVanillaLayer(null); + GLSMBlend.getBlendState().setVanillaLayer(null); + GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(null); } @Test void sampleUsesVanillaStateHiddenByPackOverrides() { - GLStateManager.getBlendMode().setVanillaLayer(BlendModeStorage.ENABLE_LAYER); - GLStateManager.getBlendState().setVanillaLayer(BlendModeStorage.FUNC_LAYER); - GLStateManager.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER); + GLSMBlend.getBlendMode().setVanillaLayer(BlendModeStorage.ENABLE_LAYER); + GLSMBlend.getBlendState().setVanillaLayer(BlendModeStorage.FUNC_LAYER); + GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER); - GLStateManager.enableBlend(); - GLStateManager.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.glDepthMask(true); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.glDepthMask(true); final BlendState packBlend = new BlendState(); packBlend.setAll(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE); @@ -49,6 +50,6 @@ class ParticleRenderStateGLTest { assertEquals(GL11.GL_ONE, sampled.blendSrcAlpha); assertEquals(GL11.GL_ZERO, sampled.blendDstAlpha); assertTrue(sampled.depthMask); - assertFalse(GLStateManager.getDepthState().isEnabled(), "the pack override remains active at the raw layer"); + assertFalse(GLSMDepthStencilAlpha.getDepthState().isEnabled(), "the pack override remains active at the raw layer"); } } diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateGuardGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateGuardGLTest.java index bf31092e3..8ab87f10e 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateGuardGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/BatchStateGuardGLTest.java @@ -1,6 +1,18 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.hooks.BatchStateGuard; @@ -30,19 +42,19 @@ class BatchStateGuardGLTest { void saveState() { previousFlush = BatchStateGuard.flush; BatchStateGuard.flush = null; - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } @AfterEach void restoreState() { BatchStateGuard.flush = null; - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glPopMatrix(); - GLStateManager.glPopAttrib(); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glPopMatrix(); + GLSMAttribStack.glPopAttrib(); BatchStateGuard.flush = previousFlush; } @@ -65,82 +77,82 @@ class BatchStateGuardGLTest { } finally { BatchStateGuard.flush = null; cleanup.run(); - GLStateManager.glDrawBuffer(drawBuffer); + GLSMFramebuffer.glDrawBuffer(drawBuffer); } } static Stream flushCases() { return Stream.of( - Arguments.of("fog", (Runnable) () -> GLStateManager.glFogf(GL11.GL_FOG_START, 17), - (Runnable) () -> assertEquals(17f, GLStateManager.getFogState().getStart()), + Arguments.of("fog", (Runnable) () -> GLSMFog.glFogf(GL11.GL_FOG_START, 17), + (Runnable) () -> assertEquals(17f, GLSMFog.getFogState().getStart()), (Runnable) () -> { - GLStateManager.glFogf(GL11.GL_FOG_START, 29); - assertEquals(29f, GLStateManager.getFogState().getStart()); + GLSMFog.glFogf(GL11.GL_FOG_START, 29); + assertEquals(29f, GLSMFog.getFogState().getStart()); }, 1, NOTHING), - Arguments.of("stencil", (Runnable) () -> GLStateManager.glDisable(GL11.GL_STENCIL_TEST), - (Runnable) () -> assertFalse(GLStateManager.glIsEnabled(GL11.GL_STENCIL_TEST)), - (Runnable) () -> GLStateManager.glEnable(GL11.GL_STENCIL_TEST), 1, NOTHING), + Arguments.of("stencil", (Runnable) () -> GLSMEnable.glDisable(GL11.GL_STENCIL_TEST), + (Runnable) () -> assertFalse(GLSMEnable.glIsEnabled(GL11.GL_STENCIL_TEST)), + (Runnable) () -> GLSMEnable.glEnable(GL11.GL_STENCIL_TEST), 1, NOTHING), Arguments.of("polygon mode", NOTHING, - (Runnable) () -> assertEquals(GL11.GL_FILL, GLStateManager.getPolygonState().getFrontMode()), + (Runnable) () -> assertEquals(GL11.GL_FILL, GLSMRasterizer.getPolygonState().getFrontMode()), (Runnable) () -> { - GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); - GLStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); + GLSMRasterizer.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE); }, 1, NOTHING), Arguments.of("depth range", NOTHING, - (Runnable) () -> assertEquals(1.0, GLStateManager.getViewportState().depthRangeFar), + (Runnable) () -> assertEquals(1.0, GLSMRasterizer.getViewportState().depthRangeFar), (Runnable) () -> { - GLStateManager.glDepthRange(0.0, 0.5); - GLStateManager.glDepthRange(0.0, 0.5); + GLSMDepthStencilAlpha.glDepthRange(0.0, 0.5); + GLSMDepthStencilAlpha.glDepthRange(0.0, 0.5); }, 1, NOTHING), Arguments.of("logic op and color sum", NOTHING, NOTHING, (Runnable) () -> { - GLStateManager.glEnable(GL11.GL_COLOR_LOGIC_OP); - GLStateManager.glLogicOp(GL11.GL_XOR); - GLStateManager.glEnable(GL14.GL_COLOR_SUM); + GLSMEnable.glEnable(GL11.GL_COLOR_LOGIC_OP); + GLSMBlend.glLogicOp(GL11.GL_XOR); + GLSMEnable.glEnable(GL14.GL_COLOR_SUM); }, 3, NOTHING), Arguments.of("sample and discard state", NOTHING, NOTHING, (Runnable) () -> { - GLStateManager.glEnable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE); - GLStateManager.glDisable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE); - GLStateManager.glEnable(GL30.GL_RASTERIZER_DISCARD); - GLStateManager.glDisable(GL30.GL_RASTERIZER_DISCARD); - GLStateManager.glSampleCoverage(0.5f, false); - }, 5, (Runnable) () -> GLStateManager.glSampleCoverage(1.0f, false)), + GLSMEnable.glEnable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE); + GLSMEnable.glDisable(GL13.GL_SAMPLE_ALPHA_TO_COVERAGE); + GLSMEnable.glEnable(GL30.GL_RASTERIZER_DISCARD); + GLSMEnable.glDisable(GL30.GL_RASTERIZER_DISCARD); + GLSMRasterizer.glSampleCoverage(0.5f, false); + }, 5, (Runnable) () -> GLSMRasterizer.glSampleCoverage(1.0f, false)), Arguments.of("draw buffer", NOTHING, NOTHING, (Runnable) () -> { - GLStateManager.glDrawBuffer(GL11.GL_NONE); - GLStateManager.glDrawBuffer(GL11.GL_NONE); + GLSMFramebuffer.glDrawBuffer(GL11.GL_NONE); + GLSMFramebuffer.glDrawBuffer(GL11.GL_NONE); }, 1, NOTHING), - Arguments.of("draw buffers", NOTHING, NOTHING, (Runnable) () -> GLStateManager.glDrawBuffers(GL11.GL_NONE), 1, NOTHING), - Arguments.of("projection matrix", (Runnable) () -> GLStateManager.glMatrixMode(GL11.GL_PROJECTION), + Arguments.of("draw buffers", NOTHING, NOTHING, (Runnable) () -> GLSMFramebuffer.glDrawBuffers(GL11.GL_NONE), 1, NOTHING), + Arguments.of("projection matrix", (Runnable) () -> GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION), (Runnable) () -> { - assertEquals(1f, GLStateManager.getProjectionMatrix().m00()); - GLStateManager.glScissor(0, 0, 8, 8); + assertEquals(1f, GLSMMatrices.getProjectionMatrix().m00()); + GLSMRasterizer.glScissor(0, 0, 8, 8); }, (Runnable) () -> { - GLStateManager.glScalef(2, 3, 1); - assertEquals(2f, GLStateManager.getProjectionMatrix().m00()); + GLSMMatrices.glScalef(2, 3, 1); + assertEquals(2f, GLSMMatrices.getProjectionMatrix().m00()); }, 1, NOTHING), Arguments.of("texture matrix unit 2", (Runnable) () -> { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); }, - (Runnable) () -> assertEquals(0f, GLStateManager.getTextures().getTextureUnitMatrix(2).m30()), - (Runnable) () -> GLStateManager.glTranslatef(0.5f, 0, 0), 1, + (Runnable) () -> assertEquals(0f, GLSMTextures.getTextures().getTextureUnitMatrix(2).m30()), + (Runnable) () -> GLSMMatrices.glTranslatef(0.5f, 0, 0), 1, (Runnable) () -> { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.glPopMatrix(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); + GLSMMatrices.glPopMatrix(); }), Arguments.of("texture matrix unit 0 stays instanced", (Runnable) () -> { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); }, NOTHING, (Runnable) () -> { - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(0.5f, 0, 0); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(0.5f, 0, 0); + GLSMMatrices.glPopMatrix(); }, 0, NOTHING)); } @@ -153,26 +165,26 @@ class BatchStateGuardGLTest { static Stream undrainedCases() { return Stream.of( Arguments.of("matrices color and blend", (Runnable) () -> { - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glPushMatrix(); - GLStateManager.glTranslatef(1, 2, 3); - GLStateManager.glPopMatrix(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glColor4f(0.5f, 1, 1, 1); - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glTranslatef(1, 2, 3); + GLSMMatrices.glPopMatrix(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMCurrentAttribs.glColor4f(0.5f, 1, 1, 1); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); }), Arguments.of("managed pass setup", (Runnable) () -> IrisDisplayListState.runProgramTransition(() -> { - GLStateManager.glFogf(GL11.GL_FOG_START, 123); - GLStateManager.glViewport(0, 0, 8, 8); + GLSMFog.glFogf(GL11.GL_FOG_START, 123); + GLSMRasterizer.glViewport(0, 0, 8, 8); })), Arguments.of("lighting", (Runnable) () -> { - GLStateManager.glEnable(GL11.GL_LIGHT0); - GLStateManager.glDisable(GL11.GL_LIGHT0); - GLStateManager.glEnable(GL11.GL_COLOR_MATERIAL); - GLStateManager.glDisable(GL11.GL_COLOR_MATERIAL); - GLStateManager.glEnable(GL11.GL_NORMALIZE); - GLStateManager.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 2.0f); + GLSMEnable.glEnable(GL11.GL_LIGHT0); + GLSMEnable.glDisable(GL11.GL_LIGHT0); + GLSMEnable.glEnable(GL11.GL_COLOR_MATERIAL); + GLSMEnable.glDisable(GL11.GL_COLOR_MATERIAL); + GLSMEnable.glEnable(GL11.GL_NORMALIZE); + GLSMLighting.glLightf(GL11.GL_LIGHT0, GL11.GL_CONSTANT_ATTENUATION, 2.0f); })); } @@ -187,44 +199,44 @@ class BatchStateGuardGLTest { @Test void extraTextureBindingsAndAttributeRestoresCannotOvertakeQueuedDraws() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT); - final int texture = GLStateManager.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT); + final int texture = GLSMTextures.glGenTextures(); try { BatchStateGuard.flush = () -> { - assertEquals(0, GLStateManager.getBoundTextureForServerState(2)); + assertEquals(0, GLSMTextures.getBoundTextureForServerState(2)); flushes.incrementAndGet(); }; RenderSystem.bindTextureToUnit(GL11.GL_TEXTURE_2D, 2, texture); assertTrue(flushes.get() > 0); flushes.set(0); BatchStateGuard.flush = () -> { - assertEquals(texture, GLStateManager.getBoundTextureForServerState(2)); + assertEquals(texture, GLSMTextures.getBoundTextureForServerState(2)); flushes.incrementAndGet(); }; - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPopAttrib(); assertTrue(flushes.get() > 0); - assertEquals(0, GLStateManager.getBoundTextureForServerState(2)); + assertEquals(0, GLSMTextures.getBoundTextureForServerState(2)); } finally { BatchStateGuard.flush = null; - GLStateManager.glDeleteTextures(texture); + GLSMTextures.glDeleteTextures(texture); } } @Test void compileOnlyDefersTheBarrierUntilPlayback() { - final int list = GLStateManager.glGenLists(1); + final int list = GLSMDraws.glGenLists(1); countFlushes(); try { - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glScissor(1, 2, 3, 4); - GLStateManager.glEndList(); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMRasterizer.glScissor(1, 2, 3, 4); + GLSMDraws.glEndList(); assertEquals(0, flushes.get()); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); assertEquals(1, flushes.get()); } finally { - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glDeleteLists(list, 1); } } @@ -232,53 +244,53 @@ class BatchStateGuardGLTest { void perUnitCapsFlushExceptTheTexturesBatchLayersOwn() { countFlushes(); try { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); assertEquals(0, flushes.get(), "albedo and lightmap enables are stored with each layer"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); flushes.set(0); BatchStateGuard.flush = () -> { - assertFalse(GLStateManager.getTextures().getTextureUnitStates(2).isEnabled()); + assertFalse(GLSMTextures.getTextures().getTextureUnitStates(2).isEnabled()); flushes.incrementAndGet(); }; - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); assertEquals(1, flushes.get()); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); assertEquals(1, flushes.get(), "unchanged enable does not flush"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glDisable(GL11.GL_TEXTURE_GEN_S); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMEnable.glDisable(GL11.GL_TEXTURE_GEN_S); flushes.set(0); countFlushes(); - GLStateManager.glEnable(GL11.GL_TEXTURE_GEN_S); + GLSMEnable.glEnable(GL11.GL_TEXTURE_GEN_S); assertEquals(1, flushes.get()); } finally { BatchStateGuard.flush = null; - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } } @Test void secondaryColorFlushesOnlyWhileColorSumIsOn() { - GLStateManager.glSecondaryColor3f(0f, 0f, 0f); + GLSMCurrentAttribs.glSecondaryColor3f(0f, 0f, 0f); countFlushes(); try { - GLStateManager.glSecondaryColor3f(0.5f, 0f, 0f); + GLSMCurrentAttribs.glSecondaryColor3f(0.5f, 0f, 0f); assertEquals(0, flushes.get(), "secondary color is unused while color sum is off"); - GLStateManager.glEnable(GL14.GL_COLOR_SUM); + GLSMEnable.glEnable(GL14.GL_COLOR_SUM); flushes.set(0); - GLStateManager.glSecondaryColor3f(0.25f, 0f, 0f); + GLSMCurrentAttribs.glSecondaryColor3f(0.25f, 0f, 0f); assertEquals(1, flushes.get()); } finally { BatchStateGuard.flush = null; - GLStateManager.glDisable(GL14.GL_COLOR_SUM); - GLStateManager.glSecondaryColor3f(0f, 0f, 0f); + GLSMEnable.glDisable(GL14.GL_COLOR_SUM); + GLSMCurrentAttribs.glSecondaryColor3f(0f, 0f, 0f); } } } diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplayGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplayGLTest.java index df275e8f0..06f4236c9 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplayGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityShadowReplayGLTest.java @@ -4,7 +4,17 @@ import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; import com.gtnewhorizons.angelica.compat.mojang.RenderLayer; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.ffp.CubeParams; import com.gtnewhorizons.angelica.glsm.ffp.InstancedAttribs; @@ -281,14 +291,14 @@ class EntityShadowReplayGLTest { when(manager.getEntityRenderObject(entity)).thenReturn(renderer); EntityShadowReplay.clear(); EntityShadowReplay.beginFrame(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.enableTexture(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.setTextureMatrix(0, new Matrix4f()); - GLStateManager.glColor4f(1, 1, 1, 1); - GLStateManager.setOverlayColor(0, 0, 0, 0); - GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(true); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.enableTexture(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMMatrices.setTextureMatrix(0, new Matrix4f()); + GLSMCurrentAttribs.glColor4f(1, 1, 1, 1); + GLSMCurrentAttribs.setOverlayColor(0, 0, 0, 0); + GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(true); ModelPartBatcher.onTextureBind(new ResourceLocation("angelica", "test/replay"), 0); RenderManager.renderPosX = 1000000.25; RenderManager.renderPosY = 7.74; @@ -304,9 +314,9 @@ class EntityShadowReplayGLTest { target.beginPass(new Matrix4f(), 0, 0, 0, new InstancedTemplateRenderer(new InstanceRing()), new RetainedTesrTestSupport.CountingPipeline(true, true)); Reflect.set(batcher, "activeGroups", target); - GLStateManager.setModelViewMatrix(shadowView); - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(1, 1); + GLSMMatrices.setModelViewMatrix(shadowView); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(1, 1); ShadowRenderer.ACTIVE = true; EntityShadowReplay.beginPass(true, 0); } @@ -325,21 +335,21 @@ class EntityShadowReplayGLTest { } private void beginCapture(Entity captured) { - captureEntry.set(GLStateManager.getModelViewMatrix()); + captureEntry.set(GLSMMatrices.getModelViewMatrix()); captureOpen = !EntityShadowReplay.isExcluded(captured.getClass()) && !captured.shouldRenderInPass(1); assertEquals(captureOpen, EntityShadowReplay.beginEntity(captured, TICK_DELTA)); } private void setCapturePose(Matrix4f pose) { closeCapturePose(); - GLStateManager.glPushMatrix(); + GLSMMatrices.glPushMatrix(); capturePoseOpen = true; - GLStateManager.applyMultMatrix(pose); + GLSMMatrices.applyMultMatrix(pose); } private void closeCapturePose() { if (!capturePoseOpen) return; - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); capturePoseOpen = false; } @@ -352,8 +362,8 @@ class EntityShadowReplayGLTest { private void capture() { beginCapture(entity); assertEquals(captureOpen, EntityShadowReplay.beginRenderer(renderer, entity, TICK_DELTA, BatchEligibility.SAFE)); - GLStateManager.glColor4f(1, 1, 1, 1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMCurrentAttribs.glColor4f(1, 1, 1, 1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); setCapturePose(model); assertTrue(batcher.queueTemplate(template(), EntityMaterials.CUTOUT)); } @@ -378,9 +388,9 @@ class EntityShadowReplayGLTest { RenderManager.renderPosX -= 0.5; RenderManager.renderPosY -= 0.12; RenderManager.renderPosZ += 0.25; - GLStateManager.setModelViewMatrix(mainView); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(0, 0); + GLSMMatrices.setModelViewMatrix(mainView); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(0, 0); target = new RetainedTesrGroups(new AngelicaBufferSource()); final AngelicaBufferSource source = Reflect.get(target, "source"); source.setIdKind(AngelicaBufferSource.GroupIdKind.ENTITY); @@ -392,10 +402,10 @@ class EntityShadowReplayGLTest { @Test void replayUsesTheMainCameraAndInheritsMainEntryState() { - GLStateManager.glShadeModel(GL11.GL_SMOOTH); + GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH); capture(); endCaptureAndStartMainPass(); - GLStateManager.glShadeModel(GL11.GL_FLAT); + GLSMRasterizer.glShadeModel(GL11.GL_FLAT); assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); final RetainedTesrGroups.Group group = onlyGroup(target); final Matrix4f expected = new Matrix4f(mainView).translate(0.5f, 0.12f, -0.25f).mul(model); @@ -404,22 +414,22 @@ class EntityShadowReplayGLTest { assertEquals(0, group.layer.getState().getOffsetFactor()); assertEquals(0, group.layer.getState().getOffsetUnits()); assertTrue(group.layer.getState().isLightmap()); - assertEquals(GL11.GL_FLAT, GLStateManager.getShadeModelState().getValue()); + assertEquals(GL11.GL_FLAT, GLSMRasterizer.getShadeModelState().getValue()); } @ParameterizedTest @ValueSource(strings = {"inherited", "explicitNoOp", "popped"}) void bodyLightingUsesMainInheritanceWhileGlintRemainsUnlit(String kind) { prepareGlintCapture(); - GLStateManager.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_LIGHTING); final GlintCapture armor = new GlintCapture(); captureGlint(entity, renderer, () -> { if (kind.equals("explicitNoOp")) { - GLStateManager.glDisable(GL11.GL_LIGHTING); + GLSMEnable.glDisable(GL11.GL_LIGHTING); } else if (kind.equals("popped")) { - GLStateManager.glPushAttrib(GL11.GL_LIGHTING_BIT); - GLStateManager.glEnable(GL11.GL_LIGHTING); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_LIGHTING_BIT); + GLSMEnable.glEnable(GL11.GL_LIGHTING); + GLSMAttribStack.glPopAttrib(); } setCapturePose(model); assertTrue(batcher.beginArmorCapture(armor)); @@ -429,13 +439,13 @@ class EntityShadowReplayGLTest { }); assertFalse(onlyMaterialGroup(EntityMaterials.CUTOUT).layer.getState().isLit()); mainPass(); - GLStateManager.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_LIGHTING); assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); final boolean inherited = !kind.equals("explicitNoOp"); assertEquals(inherited, onlyMaterialGroup(EntityMaterials.CUTOUT).layer.getState().isLit()); assertFalse(onlyMaterialGroup(EntityMaterials.GLINT).layer.getState().isLit()); - assertEquals(inherited, GLStateManager.getLightingState().isEnabled(), + assertEquals(inherited, GLSMLighting.getLightingState().isEnabled(), "untouched or restored lighting must preserve main entry state; an explicit no-op disable must still apply"); } @@ -445,17 +455,17 @@ class EntityShadowReplayGLTest { final boolean scoped = kind.equals("scoped") || kind.equals("afterPop"); final boolean inheritedDraw = kind.equals("afterPop"); final boolean enabled = !kind.equals("explicitNoOp"); - final var lightmap = GLStateManager.getTextures().getTextureUnitStates(1); + final var lightmap = GLSMTextures.getTextures().getTextureUnitStates(1); lightmap.setEnabled(false); beginCapture(entity); assertTrue(EntityShadowReplay.beginRenderer(renderer, entity, TICK_DELTA, BatchEligibility.SAFE)); setCapturePose(model); - if (scoped) GLStateManager.glPushAttrib(GL11.GL_TEXTURE_BIT); + if (scoped) GLSMAttribStack.glPushAttrib(GL11.GL_TEXTURE_BIT); try { lightmap.setEnabled(enabled); assertTrue(batcher.queueTemplate(template(), EntityMaterials.CUTOUT)); } finally { - if (scoped) GLStateManager.glPopAttrib(); + if (scoped) GLSMAttribStack.glPopAttrib(); } if (inheritedDraw) assertTrue(batcher.queueTemplate(template(), EntityMaterials.CUTOUT)); endCaptureAndStartMainPass(); @@ -485,7 +495,7 @@ class EntityShadowReplayGLTest { assertFalse(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); assertEquals(0, target.groupCount()); assertEquals(1, rejections(EntityShadowReplay.Rejection.EXIT_STATE_UNSUPPORTED)); - assertTrue(mainView.equals(GLStateManager.getModelViewMatrix(), 0)); + assertTrue(mainView.equals(GLSMMatrices.getModelViewMatrix(), 0)); } @ParameterizedTest @@ -500,48 +510,48 @@ class EntityShadowReplayGLTest { applyGlintExit(kind); endCaptureAndStartMainPass(); - GLStateManager.glColor4f(0.2f, 0.3f, 0.4f, 0.5f); - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ZERO, GL11.GL_ONE); - GLStateManager.glDisable(GL11.GL_LIGHTING); - GLStateManager.glDepthFunc(GL11.GL_LESS); - GLStateManager.glDepthMask(false); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.63f); + GLSMCurrentAttribs.glColor4f(0.2f, 0.3f, 0.4f, 0.5f); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ZERO, GL11.GL_ONE); + GLSMEnable.glDisable(GL11.GL_LIGHTING); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.63f); assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); final boolean armor = kind.equals("armor"); final boolean held = kind.equals("held"); - assertEquals(armor ? 1 : 0.5f * 0.76f, GLStateManager.getColor().getRed()); - assertEquals(armor ? 1 : 0.25f * 0.76f, GLStateManager.getColor().getGreen()); - assertEquals(armor ? 1 : 0.8f * 0.76f, GLStateManager.getColor().getBlue()); - assertEquals(1, GLStateManager.getColor().getAlpha()); - assertFalse(GLStateManager.isEffectiveBlendEnabled()); - assertTrue(GLStateManager.getLightingState().isEnabled()); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc()); - assertEquals(armor, GLStateManager.isEffectiveDepthMaskEnabled()); - assertEquals(GL11.GL_SRC_COLOR, GLStateManager.getBlendState().getSrcRgb()); - assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getDstRgb()); - assertEquals(held ? GL11.GL_ONE : GL11.GL_SRC_COLOR, GLStateManager.getBlendState().getSrcAlpha()); - assertEquals(held ? GL11.GL_ZERO : GL11.GL_ONE, GLStateManager.getBlendState().getDstAlpha()); - assertEquals(0.63f, GLStateManager.getAlphaState().getReference(), "an untouched exit field must retain the main entry value"); - assertTrue(mainView.equals(GLStateManager.getModelViewMatrix(), 0)); + assertEquals(armor ? 1 : 0.5f * 0.76f, GLSMCurrentAttribs.getColor().getRed()); + assertEquals(armor ? 1 : 0.25f * 0.76f, GLSMCurrentAttribs.getColor().getGreen()); + assertEquals(armor ? 1 : 0.8f * 0.76f, GLSMCurrentAttribs.getColor().getBlue()); + assertEquals(1, GLSMCurrentAttribs.getColor().getAlpha()); + assertFalse(GLSMBlend.isEffectiveBlendEnabled()); + assertTrue(GLSMLighting.getLightingState().isEnabled()); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc()); + assertEquals(armor, GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled()); + assertEquals(GL11.GL_SRC_COLOR, GLSMBlend.getBlendState().getSrcRgb()); + assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getDstRgb()); + assertEquals(held ? GL11.GL_ONE : GL11.GL_SRC_COLOR, GLSMBlend.getBlendState().getSrcAlpha()); + assertEquals(held ? GL11.GL_ZERO : GL11.GL_ONE, GLSMBlend.getBlendState().getDstAlpha()); + assertEquals(0.63f, GLSMDepthStencilAlpha.getAlphaState().getReference(), "an untouched exit field must retain the main entry value"); + assertTrue(mainView.equals(GLSMMatrices.getModelViewMatrix(), 0)); } @Test void followingLiveModelInheritsTheFinalTextureBoundAfterCapturedGeometry() { final ResourceLocation finalTexture = new ResourceLocation("angelica", "test/final_binding"); final ResourceLocation liveTexture = new ResourceLocation("angelica", "test/preceding_live_binding"); - final int capturedId = GLStateManager.glGenTextures(); - final int liveId = GLStateManager.glGenTextures(); + final int capturedId = GLSMTextures.glGenTextures(); + final int liveId = GLSMTextures.glGenTextures(); try { capture(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, capturedId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, capturedId); ModelPartBatcher.onTextureBind(finalTexture, capturedId); endCaptureAndStartMainPass(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, liveId); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, liveId); ModelPartBatcher.onTextureBind(liveTexture, liveId); assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); - assertEquals(capturedId, GLStateManager.getBoundTextureForServerState(0)); + assertEquals(capturedId, GLSMTextures.getBoundTextureForServerState(0)); final TemplateBuffer following = template(); assertTrue(batcher.queueTemplate(following, EntityMaterials.CUTOUT), "the next live renderer must inherit matching texture metadata"); @@ -558,8 +568,8 @@ class EntityShadowReplayGLTest { } assertTrue(found, "the final texture can differ from every captured geometry command's texture"); } finally { - GLStateManager.glDeleteTextures(capturedId); - GLStateManager.glDeleteTextures(liveId); + GLSMTextures.glDeleteTextures(capturedId); + GLSMTextures.glDeleteTextures(liveId); } } @@ -568,37 +578,37 @@ class EntityShadowReplayGLTest { void polygonOffsetAndTextureMatrixKeepOnlyTheWritesTheCaptureMade(String operation) { final Matrix4f texture = new Matrix4f().translation(0.2f, 0.3f, 0); if (operation.equals("enableOnly") || operation.equals("valuesOnly")) { - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); } beginCapture(entity); assertTrue(EntityShadowReplay.beginRenderer(renderer, entity, TICK_DELTA, BatchEligibility.SAFE)); switch (operation) { case "explicitNoOp" -> { - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(1, 1); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(1, 1); } - case "enableOnly" -> GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - case "valuesOnly" -> GLStateManager.glPolygonOffset(-2, -3); + case "enableOnly" -> GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + case "valuesOnly" -> GLSMRasterizer.glPolygonOffset(-2, -3); case "explicit" -> { - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(-2, -3); - GLStateManager.setTextureMatrix(0, texture); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(-2, -3); + GLSMMatrices.setTextureMatrix(0, texture); } case "popped" -> { - GLStateManager.glPushAttrib(GL11.GL_POLYGON_BIT | GL11.GL_ENABLE_BIT); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(7, 8); - GLStateManager.glPopAttrib(); + GLSMAttribStack.glPushAttrib(GL11.GL_POLYGON_BIT | GL11.GL_ENABLE_BIT); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(7, 8); + GLSMAttribStack.glPopAttrib(); } default -> { } } assertTrue(batcher.queueTemplate(template(), EntityMaterials.CUTOUT)); endCaptureAndStartMainPass(); - GLStateManager.setTextureMatrix(0, new Matrix4f()); - GLStateManager.glPolygonOffset(-4, -5); + GLSMMatrices.setTextureMatrix(0, new Matrix4f()); + GLSMRasterizer.glPolygonOffset(-4, -5); if (!operation.equals("explicitNoOp") && !operation.equals("enableOnly")) { - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); } assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); @@ -616,8 +626,8 @@ class EntityShadowReplayGLTest { final TemplateBuffer second = template(); final Matrix4f secondModel = new Matrix4f(model).translate(2, 3, 4); setCapturePose(secondModel); - GLStateManager.glColor4f(0.25f, 0.5f, 0.75f, 1); - GLStateManager.setOverlayColor(1, 0, 0, 0.5f); + GLSMCurrentAttribs.glColor4f(0.25f, 0.5f, 0.75f, 1); + GLSMCurrentAttribs.setOverlayColor(1, 0, 0, 0.5f); assertTrue(batcher.queueTemplate(second, EntityMaterials.CUTOUT)); EntityShadowReplay.endRenderer(true, BatchEligibility.SAFE); final ObjectArrayList entries = commands(); @@ -626,7 +636,7 @@ class EntityShadowReplayGLTest { assertSame(shadow.templateColumns, captured.source); assertEquals(2, captured.end - captured.start); final float[] original = shadow.templateColumns.matrices.clone(); - GLStateManager.setOverlayColor(0, 0, 0, 0); + GLSMCurrentAttribs.setOverlayColor(0, 0, 0, 0); mainPass(); assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); final RetainedTesrGroups.InstanceColumns actual = onlyGroup(target).templateColumns; @@ -738,7 +748,7 @@ class EntityShadowReplayGLTest { final Matrix4f secondPose = new Matrix4f(model).rotateX(0.3f).translate(-0.5f, 1.25f, 0.75f); final Matrix4f otherPose = new Matrix4f(model).translate(5, 2, -3).rotateZ(0.4f); final GlintCapture capture = new GlintCapture(); - final long drawsBefore = GLStateManager.drawCalls; + final long drawsBefore = GLSMDraws.drawCalls; captureGlint(entity, renderer, () -> { setCapturePose(model); assertTrue(batcher.queueTemplate(body, EntityMaterials.CUTOUT)); @@ -761,7 +771,7 @@ class EntityShadowReplayGLTest { capture.reset(); assertEquals(4, onlyGroup(target).templateColumns.size, "the shadow pass must only queue base geometry"); mainPass(); - final Matrix4f callerMatrix = new Matrix4f(GLStateManager.getModelViewMatrix()); + final Matrix4f callerMatrix = new Matrix4f(GLSMMatrices.getModelViewMatrix()); assertTrue(EntityShadowReplay.replay(manager, other, TICK_DELTA, 0)); assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); assertEquals(List.of(otherArmor, body, firstArmor, secondArmor), onlyMaterialGroup(EntityMaterials.CUTOUT).templateColumns.templates); @@ -772,8 +782,8 @@ class EntityShadowReplayGLTest { new Matrix4f[]{mainPose(otherPose), mainPose(firstPose), mainPose(secondPose)}, 0L, 0); assertEquals(0, glint.layer.getState().getOffsetFactor()); assertEquals(0, glint.layer.getState().getOffsetUnits()); - assertEquals(drawsBefore, GLStateManager.drawCalls, "capture and replay must leave draws to the batch flush"); - assertTrue(callerMatrix.equals(GLStateManager.getModelViewMatrix(), 0)); + assertEquals(drawsBefore, GLSMDraws.drawCalls, "capture and replay must leave draws to the batch flush"); + assertTrue(callerMatrix.equals(GLSMMatrices.getModelViewMatrix(), 0)); } @ParameterizedTest @@ -799,7 +809,7 @@ class EntityShadowReplayGLTest { for (EntityRenderCommands.Model base : bases) assertEquals(sourceNull, base.source == null); final EntityRenderCommands.Glint capturedGlint = bases.getFirst().glint; mainPass(); - GLStateManager.setModelViewMatrix(mainPose(new Matrix4f(model).translate(-3, 0, 0))); + GLSMMatrices.setModelViewMatrix(mainPose(new Matrix4f(model).translate(-3, 0, 0))); queueCubes(unrelated, cube); assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); final RetainedTesrGroups.InstanceColumns mainBase = onlyMaterialGroup(EntityMaterials.CUTOUT).cubeColumns; @@ -929,7 +939,7 @@ class EntityShadowReplayGLTest { final int overlay = AngelicaBufferSource.packAbgr(0.25f, 0.5f, 0.75f, 1); final TemplateBuffer item = template(), laterLayer = template(); final Matrix4f pose = new Matrix4f(model).rotateXYZ(0.17f, -0.29f, 0.41f).translate(0.37f, -0.63f, 1.19f); - final long drawsBefore = GLStateManager.drawCalls; + final long drawsBefore = GLSMDraws.drawCalls; captureGlint(entity, renderer, () -> { setCapturePose(pose); assertTrue(batcher.queueTemplate(item, EntityMaterials.DROPPED_ITEM_CUTOUT)); @@ -941,7 +951,7 @@ class EntityShadowReplayGLTest { state.setCurrentEntityAndItem(89, 29); state.setCurrentBlockEntity(31); state.setCurrentEntityColor(1, 0, 0, 0.5f); - final Matrix4f callerMatrix = new Matrix4f(GLStateManager.getModelViewMatrix()); + final Matrix4f callerMatrix = new Matrix4f(GLSMMatrices.getModelViewMatrix()); assertTrue(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); final RetainedTesrGroups.Group glint = onlyMaterialGroup(glintMaterial); assertEquals(ItemGlint.texture(), glint.layer.getTextureId()); @@ -960,9 +970,9 @@ class EntityShadowReplayGLTest { assertGlintMatchesBase(glint, group.templateColumns); } } - assertEquals(drawsBefore, GLStateManager.drawCalls); - assertTrue(callerMatrix.equals(GLStateManager.getModelViewMatrix(), 0)); - assertTrue(new Matrix4f().equals(GLStateManager.getTextures().getTextureUnitMatrix(0), 0)); + assertEquals(drawsBefore, GLSMDraws.drawCalls); + assertTrue(callerMatrix.equals(GLSMMatrices.getModelViewMatrix(), 0)); + assertTrue(new Matrix4f().equals(GLSMTextures.getTextures().getTextureUnitMatrix(0), 0)); assertEquals(89, state.getCurrentRenderedEntity()); assertEquals(31, state.getCurrentRenderedBlockEntity()); assertEquals(29, state.getCurrentRenderedItem()); @@ -974,12 +984,12 @@ class EntityShadowReplayGLTest { @ValueSource(ints = {1, 2, 3, 4}) void droppedStackGlintKeepsEachCopyPoseWhenEntitiesReplayInReverseOrder(int copies) { prepareGlintCapture(); - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.glStencilFunc(GL11.GL_EQUAL, 3, 0xFF); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 3, 0xFF); final Entity other = mock(Entity.class); final TemplateBuffer[] items = {template(), template()}; final Matrix4f[][] poses = new Matrix4f[2][copies]; - final long drawsBefore = GLStateManager.drawCalls; + final long drawsBefore = GLSMDraws.drawCalls; for (int entityIndex = 0; entityIndex < 2; entityIndex++) { final int index = entityIndex; captureGlint(index == 0 ? entity : other, renderer, () -> { @@ -1010,8 +1020,8 @@ class EntityShadowReplayGLTest { assertGlintLayers(glint, ItemGlint.firstMatrix(), ItemGlint.secondMatrix(), expectedTemplates, expectedPoses, 0, 0); assertGlintMatchesBase(glint, base.templateColumns); assertTrue(materialGroups(EntityMaterials.ITEM_GLINT).isEmpty(), "dropped copies must not use held-item stencil deduplication"); - assertEquals(GL11.GL_EQUAL, GLStateManager.getStencilState().getFuncFront()); - assertEquals(drawsBefore, GLStateManager.drawCalls); + assertEquals(GL11.GL_EQUAL, GLSMDepthStencilAlpha.getStencilState().getFuncFront()); + assertEquals(drawsBefore, GLSMDraws.drawCalls); } @Test @@ -1024,7 +1034,7 @@ class EntityShadowReplayGLTest { assertTrue(batcher.queueSkippedItemGlint(item, EntityMaterials.GLINT)); }); EntityShadowReplay.beginFrame(); - GLStateManager.setModelViewMatrix(shadowView); + GLSMMatrices.setModelViewMatrix(shadowView); EntityShadowReplay.beginPass(true, 0); final TemplateBuffer first = template(), second = template(); final Matrix4f secondPose = new Matrix4f(model).translate(0.31f, 0.47f, -0.59f); @@ -1080,8 +1090,8 @@ class EntityShadowReplayGLTest { case "stale" -> laterSource.clear(); case "instancing" -> target.beginPass(new Matrix4f(), 0, 0, 0); case "stencil" -> { - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.glStencilFunc(GL11.GL_EQUAL, 3, 0xFF); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_EQUAL, 3, 0xFF); } } assertFalse(EntityShadowReplay.replay(manager, entity, TICK_DELTA, 0)); @@ -1140,7 +1150,7 @@ class EntityShadowReplayGLTest { assertTrue(batcher.queueSkippedItemGlint(held, EntityMaterials.ITEM_GLINT)); }); EntityShadowReplay.beginFrame(); - GLStateManager.setModelViewMatrix(shadowView); + GLSMMatrices.setModelViewMatrix(shadowView); EntityShadowReplay.beginPass(true, 0); captureGlint(entity, renderer, () -> { setCapturePose(model); @@ -1172,8 +1182,8 @@ class EntityShadowReplayGLTest { private void prepareGlintCapture() { Reflect.set(batcher, "instancedThisCycle", true); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); GlintClock.beginFrame(123456789L); } @@ -1181,13 +1191,13 @@ class EntityShadowReplayGLTest { when(manager.getEntityRenderObject(captured)).thenReturn(render); beginCapture(captured); assertTrue(EntityShadowReplay.beginRenderer(render, captured, TICK_DELTA, BatchEligibility.SAFE)); - assertTrue(BatchEligibility.begin(BatchEligibility.SAFE, GLStateManager.drawCalls)); + assertTrue(BatchEligibility.begin(BatchEligibility.SAFE, GLSMDraws.drawCalls)); boolean completed = false; try { queue.run(); completed = true; } finally { - EntityShadowReplay.endRenderer(completed, BatchEligibility.end(BatchEligibility.SAFE, GLStateManager.drawCalls)); + EntityShadowReplay.endRenderer(completed, BatchEligibility.end(BatchEligibility.SAFE, GLSMDraws.drawCalls)); finishCapture(completed); } } @@ -1215,13 +1225,13 @@ class EntityShadowReplayGLTest { void incompleteOrChangedRecordsNeverQueuePartialGeometry(String reason) { capture(); switch (reason) { - case "foreign" -> GLStateManager.drawCalls++; + case "foreign" -> GLSMDraws.drawCalls++; case "expected" -> { - BatchEligibility.begin(BatchEligibility.SAFE, GLStateManager.drawCalls); - BatchEligibility.beginExpectedDraws(GLStateManager.drawCalls); - GLStateManager.drawCalls++; - BatchEligibility.endExpectedDraws(GLStateManager.drawCalls); - BatchEligibility.end(BatchEligibility.SAFE, GLStateManager.drawCalls); + BatchEligibility.begin(BatchEligibility.SAFE, GLSMDraws.drawCalls); + BatchEligibility.beginExpectedDraws(GLSMDraws.drawCalls); + GLSMDraws.drawCalls++; + BatchEligibility.endExpectedDraws(GLSMDraws.drawCalls); + BatchEligibility.end(BatchEligibility.SAFE, GLSMDraws.drawCalls); } case "bail" -> BatchEligibility.onBail(ModelPartBatcher.BailReason.TEXTURE); case "shadowOnly" -> EntityShadowReplay.rejectShadowOnly(); @@ -1230,13 +1240,13 @@ class EntityShadowReplayGLTest { case "nestedEntity" -> assertFalse(EntityShadowReplay.beginEntity(mock(Entity.class), TICK_DELTA)); } EntityShadowReplay.endRenderer(!reason.equals("failed"), BatchEligibility.SAFE); - if (reason.equals("afterRenderer")) GLStateManager.drawCalls++; + if (reason.equals("afterRenderer")) GLSMDraws.drawCalls++; if (reason.equals("outerFailed")) finishCapture(false); if (reason.equals("nextFrame")) EntityShadowReplay.beginFrame(); mainPass(); switch (reason) { case "camera" -> RenderManager.instance.playerViewY = 0.2f; - case "lightmap" -> GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(false); + case "lightmap" -> GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(false); case "renderer" -> when(manager.getEntityRenderObject(entity)).thenReturn(mock(Render.class)); } assertFalse(EntityShadowReplay.replay(manager, entity, reason.equals("partialTicks") ? 0.5f : TICK_DELTA, reason.equals("passOne") ? 1 : 0)); @@ -1259,7 +1269,7 @@ class EntityShadowReplayGLTest { final RetainedTesrGroups.InstanceColumns columns = shadow.templateColumns; final TemplateBuffer extra = template(); final Matrix4f pose = new Matrix4f(shadowView).mul(model).translate(2, 0, 0); - final long draws = GLStateManager.drawCalls; + final long draws = GLSMDraws.drawCalls; switch (operation) { case "queue" -> target.queue(0, extra, shadow.layer, EntityMaterials.CUTOUT, pose, 0, -1, 0, 0L, 0, null); case "copyRange" -> target.copyInstances(columns, 0, 1, shadow.layer, EntityMaterials.CUTOUT, @@ -1278,7 +1288,7 @@ class EntityShadowReplayGLTest { } else { assertEquals(2, columns.size, "unrecorded submission must still reach shadow storage"); } - assertEquals(draws, GLStateManager.drawCalls, "rejection must not force an immediate shadow draw"); + assertEquals(draws, GLSMDraws.drawCalls, "rejection must not force an immediate shadow draw"); endCaptureAndStartMainPass(); resetBossStatus(); @@ -1349,27 +1359,27 @@ class EntityShadowReplayGLTest { } private void queueFire(int[] vertices, int vertexCount) { - GLStateManager.glEnable(GL11.GL_DEPTH_TEST); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); + GLSMEnable.glEnable(GL11.GL_DEPTH_TEST); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, true, true, true); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); final Tessellator tess = mock(Tessellator.class); tess.isDrawing = true; tess.drawMode = GL11.GL_QUADS; tess.rawBuffer = vertices; tess.vertexCount = vertexCount; tess.rawBufferIndex = tess.rawBuffer.length; - final long draws = GLStateManager.drawCalls; + final long draws = GLSMDraws.drawCalls; batcher.beginEntityFire(); try { ModelPartBatcher.drawTessellator(tess); } finally { batcher.endEntityFire(); } - assertEquals(draws, GLStateManager.drawCalls); + assertEquals(draws, GLSMDraws.drawCalls); } @Test @@ -1455,23 +1465,23 @@ class EntityShadowReplayGLTest { queueAura(callback, livingRenderer, rendered, new float[]{TICK_DELTA, 1, 2, 3, 4, 5, 0.0625f}, new Matrix4f(shadowView).mul(model)); if (reason.equals("dragonEyes")) { - final int depth = GLStateManager.pushState(StateSet.BATCH); + final int depth = GLSMAttribStack.pushState(StateSet.BATCH); try { - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.glEnable(GL11.GL_BLEND); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); - GLStateManager.glDepthMask(true); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMEnable.glEnable(GL11.GL_BLEND); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); assertFalse(batcher.queueTemplate(template(), null)); } finally { - GLStateManager.popStateTo(depth); + GLSMAttribStack.popStateTo(depth); } } endCaptureAndStartMainPass(); if (reason.equals("program")) { final DeferredWorldRenderingPipeline pipeline = mock(DeferredWorldRenderingPipeline.class); - when(pipeline.getActivePassProgramId()).thenReturn(GLStateManager.getActiveProgram() + 1); + when(pipeline.getActivePassProgramId()).thenReturn(GLSMPrograms.getActiveProgram() + 1); Reflect.set(batcher, "shaderPipeline", pipeline); assertTrue(batcher.entityPassActive(), "program ownership must not disable the active pass's fallback flushing"); } @@ -1497,7 +1507,7 @@ class EntityShadowReplayGLTest { observeBossStatus(first, true); endCapture(); EntityShadowReplay.beginFrame(); - GLStateManager.setModelViewMatrix(shadowView); + GLSMMatrices.setModelViewMatrix(shadowView); EntityShadowReplay.beginPass(true, 0); final Entity next; if (nextIsBoss) { @@ -1545,14 +1555,14 @@ class EntityShadowReplayGLTest { mainPass(); queueAura(liveCallback, creeperRenderer, live, liveArgs, liveAura); assertSame(recycled, deferred.getFirst(), "the live aura must overwrite a recycled shadow queue entry"); - final long draws = GLStateManager.drawCalls; + final long draws = GLSMDraws.drawCalls; assertTrue(EntityShadowReplay.replay(manager, second, TICK_DELTA, 0)); assertTrue(EntityShadowReplay.replay(manager, first, TICK_DELTA, 0)); assertEquals(2, onlyGroup(target).templateColumns.size, "both bodies must still replay"); assertEquals(3, deferred.size(), "replay must enqueue both captured auras after the live main aura"); - assertEquals(draws, GLStateManager.drawCalls, "replay must leave aura drawing to the deferred phase"); + assertEquals(draws, GLSMDraws.drawCalls, "replay must leave aura drawing to the deferred phase"); verifyNoInteractions(callback, liveCallback, creeperRenderer); - assertTrue(liveAura.equals(GLStateManager.getModelViewMatrix(), 0)); + assertTrue(liveAura.equals(GLSMMatrices.getModelViewMatrix(), 0)); EntityShadowReplay.beginFrame(); assertAura(deferred.get(0), liveCallback, creeperRenderer, live, liveArgs, liveAura); @@ -1574,19 +1584,19 @@ class EntityShadowReplayGLTest { new Matrix4f(shadowView).mul(model)); endCapture(); EntityShadowReplay.beginFrame(); - GLStateManager.setModelViewMatrix(shadowView); + GLSMMatrices.setModelViewMatrix(shadowView); EntityShadowReplay.beginPass(true, 0); captureLiving(creeper, creeperRenderer); assertTrue(batcher.queueTemplate(template(), EntityMaterials.TRANSLUCENT)); if (markOnly) DeferredEntityOverlay.markOverlayPass(callback, creeperRenderer, creeper, TICK_DELTA); DeferredEntityOverlay.clearStaleOverlayFlag(); endCaptureAndStartMainPass(); - final long draws = GLStateManager.drawCalls; + final long draws = GLSMDraws.drawCalls; assertTrue(EntityShadowReplay.replay(manager, creeper, TICK_DELTA, 0)); assertEquals(2, target.groupCount(), "the previous aura entry must be reusable as a model range"); final List deferred = Reflect.getStatic(DeferredEntityOverlay.class, "deferred"); assertTrue(deferred.isEmpty()); - assertEquals(draws, GLStateManager.drawCalls); + assertEquals(draws, GLSMDraws.drawCalls); verifyNoInteractions(callback, creeperRenderer); }); } @@ -1633,11 +1643,11 @@ class EntityShadowReplayGLTest { DeferredEntityOverlay.clearStaleOverlayFlag(); endCaptureAndStartMainPass(); resetBossStatus(); - final long draws = GLStateManager.drawCalls; + final long draws = GLSMDraws.drawCalls; assertTrue(EntityShadowReplay.replay(manager, wither, TICK_DELTA, 0)); assertBossStatus(wither, true); assertEquals(1, onlyGroup(target).templateColumns.size); - assertEquals(draws, GLStateManager.drawCalls); + assertEquals(draws, GLSMDraws.drawCalls); final List deferred = Reflect.getStatic(DeferredEntityOverlay.class, "deferred"); assertEquals(armor.equals("armored") ? 1 : 0, deferred.size()); verifyNoInteractions(callback, armorModel, witherRenderer); @@ -1662,7 +1672,7 @@ class EntityShadowReplayGLTest { assertTrue(deferred.isEmpty()); assertFalse(DeferredEntityOverlay.isOverlayPassActive()); assertFalse(DeferredEntityOverlay.isReplaying()); - assertTrue(mainView.equals(GLStateManager.getModelViewMatrix(), 0)); + assertTrue(mainView.equals(GLSMMatrices.getModelViewMatrix(), 0)); assertBossStatus(wither, true); })); } @@ -1678,7 +1688,7 @@ class EntityShadowReplayGLTest { private void queueAura(DeferredEntityOverlay.ShouldRenderPassFn callback, RendererLivingEntity renderer, EntityLivingBase entity, float[] args, Matrix4f matrix) { if (captureOpen) setCapturePose(new Matrix4f(captureEntry).invert().mul(matrix)); - else GLStateManager.setModelViewMatrix(matrix); + else GLSMMatrices.setModelViewMatrix(matrix); DeferredEntityOverlay.markOverlayPass(callback, renderer, entity, args[0]); DeferredEntityOverlay.deferRender(args[1], args[2], args[3], args[4], args[5], args[6]); } diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlasGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlasGLTest.java index 3093d9b60..4831814f6 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlasGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/EntityTextureAtlasGLTest.java @@ -3,6 +3,9 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.ExitState; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.testutil.Reflect; import com.gtnewhorizons.angelica.glsm.texture.TextureInfoCache; @@ -67,9 +70,9 @@ class EntityTextureAtlasGLTest { Reflect.setStatic(Minecraft.class, "theMinecraft", minecraft); passColor = texture(GL11.GL_NEAREST, 0); - passFbo = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, passFbo); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, passColor, 0); + passFbo = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, passFbo); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, passColor, 0); source = texture(GL11.GL_NEAREST, 0); } @@ -77,10 +80,10 @@ class EntityTextureAtlasGLTest { void tearDown() { GLStateManager.cancelExitCapture(); EntityTextureAtlas.INSTANCE.freePages(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(passFbo); - GLStateManager.glDeleteTextures(source); - GLStateManager.glDeleteTextures(passColor); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(passFbo); + GLSMTextures.glDeleteTextures(source); + GLSMTextures.glDeleteTextures(passColor); Reflect.setStatic(Minecraft.class, "theMinecraft", previous); } @@ -144,17 +147,17 @@ class EntityTextureAtlasGLTest { Reflect.set(batcher, "activeGroups", previousGroups); AngelicaConfig.enableEntityTextureAtlas = atlasEnabled; groups.clear(); - GLStateManager.glDeleteTextures(otherTexture); + GLSMTextures.glDeleteTextures(otherTexture); } } private static int texture(int filter, int seed) { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, WIDTH, HEIGHT, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels(seed)); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, WIDTH, HEIGHT, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels(seed)); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); return id; } @@ -172,9 +175,9 @@ class EntityTextureAtlasGLTest { private void assertSlotHolds(EntityTextureAtlas.Slot slot, int seed) { final ByteBuffer page = BufferUtils.createByteBuffer(PAGE * PAGE * 4); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, pages.get(0).getGlTextureId()); - GLStateManager.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, page); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, pages.get(0).getGlTextureId()); + GLSMTextures.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, page); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); for (int y = -1; y <= HEIGHT; y++) { for (int x = -1; x <= WIDTH; x++) { final int at = ((slot.y + 1 + y) * PAGE + slot.x + 1 + x) * 4; @@ -192,8 +195,8 @@ class EntityTextureAtlasGLTest { final EntityTextureAtlas.Slot slot = EntityTextureAtlas.INSTANCE.slotFor(source, false); assertTrue(GLStateManager.finishExitCapture(state), "first-use atlas resources are internal batch operations"); assertNotNull(slot); - assertEquals(passFbo, GLStateManager.getDrawFramebuffer(), "draw framebuffer restored"); - assertEquals(passFbo, GLStateManager.getReadFramebuffer(), "read framebuffer restored"); + assertEquals(passFbo, GLSMFramebuffer.getDrawFramebuffer(), "draw framebuffer restored"); + assertEquals(passFbo, GLSMFramebuffer.getReadFramebuffer(), "read framebuffer restored"); assertEquals((slot.x + 1) / (float) PAGE, slot.u); assertEquals(WIDTH / (float) PAGE, slot.w); assertSlotHolds(slot, 0); @@ -202,9 +205,9 @@ class EntityTextureAtlasGLTest { @Test void reuploadingTheTextureRefreshesItsSlot() { final EntityTextureAtlas.Slot slot = EntityTextureAtlas.INSTANCE.slotFor(source, false); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, source); - GLStateManager.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels(7)); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, source); + GLSMTextures.glTexSubImage2D(GL11.GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels(7)); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); assertSame(slot, EntityTextureAtlas.INSTANCE.slotFor(source, false)); assertSlotHolds(slot, 7); } @@ -215,7 +218,7 @@ class EntityTextureAtlasGLTest { try { assertNull(EntityTextureAtlas.INSTANCE.slotFor(filtered, false)); } finally { - GLStateManager.glDeleteTextures(filtered); + GLSMTextures.glDeleteTextures(filtered); } } @@ -223,28 +226,28 @@ class EntityTextureAtlasGLTest { void switchingToLinearFilteringDropsTheSlot() { final EntityTextureAtlas.Slot slot = EntityTextureAtlas.INSTANCE.slotFor(source, false); assertNotNull(slot); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, source); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, source); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); assertNull(EntityTextureAtlas.INSTANCE.slotFor(source, false), "integer filter change"); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); assertSame(slot, EntityTextureAtlas.INSTANCE.slotFor(source, false), "the kept slot comes back"); - GLStateManager.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); assertNull(EntityTextureAtlas.INSTANCE.slotFor(source, false), "float filter change"); } @Test void drawingIntoTheTextureDropsItsSlot() { assertNotNull(EntityTextureAtlas.INSTANCE.slotFor(source, false)); - final int target = GLStateManager.glGenFramebuffers(); + final int target = GLSMFramebuffer.glGenFramebuffers(); try { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target); - GLStateManager.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, source, 0); - GLStateManager.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, target); + GLSMFramebuffer.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0, GL11.GL_TEXTURE_2D, source, 0); + GLSMBlend.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); } finally { - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, passFbo); - GLStateManager.glDeleteFramebuffers(target); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, passFbo); + GLSMFramebuffer.glDeleteFramebuffers(target); } assertNull(EntityTextureAtlas.INSTANCE.slotFor(source, false)); } @@ -265,7 +268,7 @@ class EntityTextureAtlasGLTest { void aDeletedTexturesRegionIsReusedOnlyFromTheNextPass() { final EntityTextureAtlas.Slot first = EntityTextureAtlas.INSTANCE.slotFor(source, false); assertNotNull(first); - GLStateManager.glDeleteTextures(source); + GLSMTextures.glDeleteTextures(source); final int samePass = texture(GL11.GL_NEAREST, 3); try { final EntityTextureAtlas.Slot taken = EntityTextureAtlas.INSTANCE.slotFor(samePass, false); @@ -279,7 +282,7 @@ class EntityTextureAtlasGLTest { assertEquals(first.y, reused.y); assertSlotHolds(reused, 5); } finally { - GLStateManager.glDeleteTextures(samePass); + GLSMTextures.glDeleteTextures(samePass); } } @@ -294,18 +297,18 @@ class EntityTextureAtlasGLTest { assertNull(EntityTextureAtlas.INSTANCE.slotFor(filling[filling.length - 1], false), "no page has room for another 512"); assertNotNull(EntityTextureAtlas.INSTANCE.slotFor(small, false), "shelves still have room for a small texture"); } finally { - for (int id : filling) if (id != 0) GLStateManager.glDeleteTextures(id); - GLStateManager.glDeleteTextures(small); + for (int id : filling) if (id != 0) GLSMTextures.glDeleteTextures(id); + GLSMTextures.glDeleteTextures(small); } } private static int blankTexture(int size) { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, size, size, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (ByteBuffer) null); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); return id; } } diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroupsGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroupsGLTest.java index 0b0493245..179e80331 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroupsGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/RetainedTesrGroupsGLTest.java @@ -8,7 +8,21 @@ import com.gtnewhorizons.angelica.api.tesr.TesrShader; import com.gtnewhorizons.angelica.compat.mojang.RenderLayer; import com.gtnewhorizons.angelica.config.AngelicaConfig; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.ffp.CubeParams; @@ -116,16 +130,16 @@ class RetainedTesrGroupsGLTest { @BeforeEach void drawableState() { - GLStateManager.glMatrixMode(GL11.GL_PROJECTION); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glLoadIdentity(); - GLStateManager.glViewport(0, 0, 800, 600); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); - GLStateManager.disableFog(); - GLStateManager.disableLighting(); - GLStateManager.glColor4f(1f, 1f, 1f, 1f); + GLSMMatrices.glMatrixMode(GL11.GL_PROJECTION); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadIdentity(); + GLSMRasterizer.glViewport(0, 0, 800, 600); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); + GLSMFog.disableFog(); + GLSMLighting.disableLighting(); + GLSMCurrentAttribs.glColor4f(1f, 1f, 1f, 1f); final ShaderManager ffp = ShaderManager.getInstance(); ShaderManager.enable(); @@ -142,30 +156,30 @@ class RetainedTesrGroupsGLTest { void cleanup() { onBufferSetup = null; source.discard(); - GLStateManager.setFfpInstancing(Instancing.NONE); - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMPrograms.setFfpInstancing(Instancing.NONE); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); groups.clear(); instanced.clear(); ring.delete(); TesrShaderPrograms.invalidateAll(); final ShaderManager ffp = ShaderManager.getInstance(); if (ffp.isActive()) ffp.deactivate(); - if (baseTexture != 0) GLStateManager.glDeleteTextures(baseTexture); - if (glintTexture != 0) GLStateManager.glDeleteTextures(glintTexture); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); - GLStateManager.glDisable(GL11.GL_BLEND); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); - GLStateManager.disableFog(); - GLStateManager.glDepthMask(true); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDisable(GL11.GL_DEPTH_TEST); - GLStateManager.glDisable(GL11.GL_ALPHA_TEST); + if (baseTexture != 0) GLSMTextures.glDeleteTextures(baseTexture); + if (glintTexture != 0) GLSMTextures.glDeleteTextures(glintTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); + GLSMEnable.glDisable(GL11.GL_BLEND); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); + GLSMFog.disableFog(); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMEnable.glDisable(GL11.GL_DEPTH_TEST); + GLSMEnable.glDisable(GL11.GL_ALPHA_TEST); } private static TemplateBuffer template(float[] xyz, int colorABGR, int drawMode) { @@ -480,8 +494,8 @@ class RetainedTesrGroupsGLTest { assertEquals(4, groups.instancedDraws, "three texture-matrix template runs (A,B,A never merge non-adjacent) plus the single identity cube run"); assertEquals(3, groups.texMatrixRuns, "one non-identity glLoadMatrix per drawn template run, not per distinct matrix value"); - assertEquals(GL11.GL_MODELVIEW, GLStateManager.getMatrixMode().getMode(), "matrix mode must be restored after the texture-matrix runs"); - assertTrue(MatrixHelper.isIdentity(GLStateManager.getTextures().getTextureUnitMatrix(0)), "unit-0 texture matrix must be restored to identity"); + assertEquals(GL11.GL_MODELVIEW, GLSMMatrices.getMatrixMode().getMode(), "matrix mode must be restored after the texture-matrix runs"); + assertTrue(MatrixHelper.isIdentity(GLSMTextures.getTextures().getTextureUnitMatrix(0)), "unit-0 texture matrix must be restored to identity"); } @Test @@ -532,9 +546,9 @@ class RetainedTesrGroupsGLTest { @Test void drawTemplatesBakesThePerInstanceModelviewIntoScreenPosition() { - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); - GLStateManager.disableTexture(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMTextures.disableTexture(); final Matrix4f translated = new Matrix4f().translation(0.3f, -0.2f, 0f); final int tx = (int) ((translated.m30() * 0.5f + 0.5f) * 800); @@ -543,8 +557,8 @@ class RetainedTesrGroupsGLTest { final int originY = 300; final TemplateBuffer template = template(TRIANGLE, COLOR_ABGR, GL11.GL_TRIANGLES); - GLStateManager.glClearColor(0f, 0f, 0f, 1f); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMBlend.glClearColor(0f, 0f, 0f, 1f); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); drawSingleInstance(instanced, template, translated, COLOR_ABGR); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "instanced draw must not raise a GL error"); @@ -554,7 +568,7 @@ class RetainedTesrGroupsGLTest { final int[] atOrigin = FfpFixture.readPixel(originX, originY); assertTrue(atOrigin[0] < 50 && atOrigin[1] < 50 && atOrigin[2] < 50, "the untranslated origin must stay background, got " + atOrigin[0] + "," + atOrigin[1] + "," + atOrigin[2]); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); drawSingleInstance(instanced, template, new Matrix4f(), COLOR_ABGR); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "instanced draw must not raise a GL error"); @@ -563,10 +577,10 @@ class RetainedTesrGroupsGLTest { } private void queueTriangleOnClearedTarget() { - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); - GLStateManager.disableTexture(); - GLStateManager.glDisable(GL11.GL_SCISSOR_TEST); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMTextures.disableTexture(); + GLSMEnable.glDisable(GL11.GL_SCISSOR_TEST); FfpFixture.clear(); queueTriangle(groups, new Matrix4f()); } @@ -594,11 +608,11 @@ class RetainedTesrGroupsGLTest { @Test void scissorChangeDrainsQueuedGeometryBeforeClippingAndEndsModelBatching() { - GLStateManager.glScissor(0, 0, 0, 0); + GLSMRasterizer.glScissor(0, 0, 0, 0); queueTriangleOnClearedTarget(); final ModelPartBatcher models = ModelPartBatcher.INSTANCE; withBatcherFields(models, () -> { - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); assertTrue(models.isActive(), "batching must resume for the rest of the pass after the flush"); assertFalse(models.hasQueuedGeometry(), "the flush must drain what was queued before the change"); assertTrue(FfpFixture.readPixel(400, 300)[0] > 200, "queued geometry must draw before the zero-area scissor takes effect"); @@ -607,7 +621,7 @@ class RetainedTesrGroupsGLTest { @Test void heldEntityTranslucentsSurviveUncapturedStateChange() { - GLStateManager.glScissor(0, 0, 0, 0); + GLSMRasterizer.glScissor(0, 0, 0, 0); queueTriangleOnClearedTarget(); final AngelicaBufferSource blockEntitySource = new AngelicaBufferSource(); final RetainedTesrGroups blockEntityGroups = new RetainedTesrGroups(blockEntitySource, () -> clock[0]); @@ -616,7 +630,7 @@ class RetainedTesrGroupsGLTest { final ModelPartBatcher models = ModelPartBatcher.INSTANCE; withBatcherFields(models, () -> { assertTrue(models.hasQueuedGeometry(), "sanity: the block-entity pass has queued geometry to drain"); - GLStateManager.glEnable(GL11.GL_SCISSOR_TEST); + GLSMEnable.glEnable(GL11.GL_SCISSOR_TEST); assertTrue(FfpFixture.readPixel(600, 300)[0] > 200, "the active block-entity batch must draw before the zero-area scissor takes effect"); assertTrue(FfpFixture.readPixel(400, 300)[0] < 50, "held entity geometry must not draw before deferred"); assertTrue(models.hasHeldEntities(), "held entity translucents wait for the post-deferred flush"); @@ -637,7 +651,7 @@ class RetainedTesrGroupsGLTest { retained[0] = groups; try { withBatcherFields(renderer, () -> { - GLStateManager.enableFog(); + GLSMFog.enableFog(); assertFalse(renderer.hasPendingGeometry()); assertTrue(FfpFixture.readPixel(400, 300)[0] > 200, "provider geometry must reach the framebuffer before fog is enabled"); }, "bufferSource", source, "activePass", 0); @@ -652,12 +666,12 @@ class RetainedTesrGroupsGLTest { withBatcherFields(renderer, () -> { net.coderbot.iris.layer.GbufferPrograms.setBlockEntityDefaults(); assertTrue(renderer.hasActivePass(), "default attributes before the first renderer must not disable shadow batching"); - BatchEligibility.begin(BatchEligibility.SAFE, GLStateManager.drawCalls); + BatchEligibility.begin(BatchEligibility.SAFE, GLSMDraws.drawCalls); try { - GLStateManager.glScissor(0, 0, 8, 8); + GLSMRasterizer.glScissor(0, 0, 8, 8); assertFalse(renderer.hasActivePass(), "unsupported renderer state needs fallback even before its first model part"); } finally { - assertEquals(BatchEligibility.DENIED, BatchEligibility.end(BatchEligibility.SAFE, GLStateManager.drawCalls)); + assertEquals(BatchEligibility.DENIED, BatchEligibility.end(BatchEligibility.SAFE, GLSMDraws.drawCalls)); } }, "bufferSource", source, "activePass", TesrBatchRenderer.PASS_SHADOW); } @@ -673,10 +687,10 @@ class RetainedTesrGroupsGLTest { for (int i = 0; i < icon.vertexCount; i++) { icon.data[i * VERTEX_SIZE + COLOR_INDEX] = i < 8 ? 0xFF0000FF : 0xFF00FF00; } - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.glFrontFace(GL11.GL_CCW); - GLStateManager.disableCull(); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMRasterizer.glFrontFace(GL11.GL_CCW); + GLSMRasterizer.disableCull(); final RenderLayer base = RetainedTesrTestSupport.capturedLayer(EntityMaterials.DROPPED_ITEM_CUTOUT); final RenderLayer glint = RetainedTesrTestSupport.capturedLayer( TesrMaterial.builder().glint().depthEqual().noDepthWrite().unlit().stream().build()); @@ -692,25 +706,25 @@ class RetainedTesrGroupsGLTest { } private int[][] drawItemAndGlint(TemplateBuffer icon, Matrix4f mv, RenderLayer base, RenderLayer glint, boolean reference) { - GLStateManager.disableLighting(); - GLStateManager.glDepthMask(true); + GLSMLighting.disableLighting(); + GLSMDepthStencilAlpha.glDepthMask(true); FfpFixture.clear(); - GLStateManager.enableCull(); - final int depth = GLStateManager.pushState(StateSet.BATCH); + GLSMRasterizer.enableCull(); + final int depth = GLSMAttribStack.pushState(StateSet.BATCH); base.startDrawing(); - if (reference) GLStateManager.disableCull(); + if (reference) GLSMRasterizer.disableCull(); drawSingleInstance(instanced, icon, mv, 0xFF808080); final int[] basePixels = FfpFixture.readRegion(SIZE); base.endDrawing(); glint.startDrawing(); - if (reference) GLStateManager.disableCull(); + if (reference) GLSMRasterizer.disableCull(); assertTrue(GL11.glIsEnabled(GL11.GL_DEPTH_TEST)); assertEquals(GL11.GL_EQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC)); assertFalse(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK)); drawSingleInstance(instanced, icon, mv, 0xFF808080); final int[] glintPixels = FfpFixture.readRegion(SIZE); glint.endDrawing(); - GLStateManager.popStateTo(depth); + GLSMAttribStack.popStateTo(depth); assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE), "the batch bracket restores the flush caller's culling"); return new int[][] { basePixels, glintPixels }; } @@ -744,7 +758,7 @@ class RetainedTesrGroupsGLTest { } private void glintState() { - GLStateManager.glViewport(0, 0, SIZE, SIZE); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); layer = RenderLayer.tesr(GLINT_TEXTURE, TesrMaterial.CURRENT_STATE, PassOverride.NONE, 0f, 0f, ShaderGlint.NO_TINT, DrawState.DISABLED, false, true); GlintClock.beginFrame(123456789L); @@ -766,13 +780,13 @@ class RetainedTesrGroupsGLTest { } private static int createGlintTexture(boolean opaque) { - final int id = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, id); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); + final int id = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, id); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); final ByteBuffer texels = BufferUtils.createByteBuffer(4 * 4 * 4); for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { @@ -780,47 +794,47 @@ class RetainedTesrGroupsGLTest { } } texels.flip(); - GLStateManager.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 4, 4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); + GLSMTextures.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA8, 4, 4, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, texels); return id; } private void bindBase() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, baseTexture); - GLStateManager.enableTexture(); - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, baseTexture); + GLSMTextures.enableTexture(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); } private static void setGlintBlendState() { - GLStateManager.disableAlphaTest(); - GLStateManager.glDepthFunc(GL11.GL_EQUAL); - GLStateManager.glDepthMask(false); - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_EQUAL); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); } private void applyGlintTexMatrix(Matrix4f m) { bindGlint(); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); final FloatBuffer buf = BufferUtils.createFloatBuffer(16); m.get(buf); - GLStateManager.glLoadMatrix(buf); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glLoadMatrix(buf); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } private static void restoreTexMatrix() { - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); } private void bindGlint() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, glintTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, glintTexture); } private int[] drawBaseTemplates() { @@ -951,10 +965,10 @@ class RetainedTesrGroupsGLTest { capture.end(); applyGlintTexMatrix(glintMatrixB); if (!cubes) { - GLStateManager.glColor4f(0.5f, 1, 1, 1); + GLSMCurrentAttribs.glColor4f(0.5f, 1, 1, 1); assertFalse(capture.replay(groups), "changed layer color must retain the original render call"); - GLStateManager.glColor4f(1, 1, 1, 1); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMCurrentAttribs.glColor4f(1, 1, 1, 1); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); assertFalse(capture.replay(groups), "changed layer blending must retain the original render call"); setGlintBlendState(); } @@ -970,7 +984,7 @@ class RetainedTesrGroupsGLTest { glintState(); drawBaseTemplates(); setGlintBlendState(); - GLStateManager.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + GLSMBlend.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); applyGlintTexMatrix(glintMatrixA); drawSingleInstance(instanced, glintTemplate, templateE1, 0xFFFFFFFF); applyGlintTexMatrix(glintMatrixB); @@ -984,7 +998,7 @@ class RetainedTesrGroupsGLTest { groups.queue(SCOPE, glintTemplate, layer, EntityMaterials.CUTOUT, templateE1, 0, 0xFF123456, 0, 0L, 0, null); base.end(); setGlintBlendState(); - GLStateManager.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); + GLSMBlend.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE); applyGlintTexMatrix(glintMatrixA); ModelPartBatcher.onTextureBind(new ResourceLocation("angelica", "test/glint"), glintTexture); final ModelPartBatcher batcher = ModelPartBatcher.INSTANCE; @@ -993,9 +1007,9 @@ class RetainedTesrGroupsGLTest { try { final GlintCapture glint = new GlintCapture(); assertTrue(glint.begin(groups)); - GLStateManager.glTranslatef(0.1f, 0, 0); + GLSMMatrices.glTranslatef(0.1f, 0, 0); assertFalse(base.copyBase(batcher, groups), "a different parent pose must use the original model call"); - GLStateManager.glLoadIdentity(); + GLSMMatrices.glLoadIdentity(); assertTrue(base.copyBase(batcher, groups)); glint.end(); assertTrue(glint.replay(groups, glintMatrixB), "the second layer can be queued without rerunning legacy texture setup"); @@ -1015,7 +1029,7 @@ class RetainedTesrGroupsGLTest { @ValueSource(strings = {"armorTemplate", "armorCubes", "held", "heldMirrored", "dropped", "droppedStack"}) void shadowGlintReplayMatchesLiveMainPixels(String kind) { glintState(); - GLStateManager.glDeleteTextures(glintTexture); + GLSMTextures.glDeleteTextures(glintTexture); glintTexture = createGlintTexture(true); final boolean held = kind.startsWith("held"), dropped = kind.startsWith("dropped"), cubes = kind.equals("armorCubes"); final TemplateBuffer baseTemplate; @@ -1053,17 +1067,17 @@ class RetainedTesrGroupsGLTest { Reflect.set(batcher, "active", true); Reflect.set(batcher, "mode", ModelPartBatcher.Mode.ENTITIES); Reflect.set(batcher, "instancedThisCycle", true); - GLStateManager.getTextures().getTextureUnitStates(1).setEnabled(false); - GLStateManager.setOverlayColor(0, 0, 0, 0); - GLStateManager.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); + GLSMTextures.getTextures().getTextureUnitStates(1).setEnabled(false); + GLSMCurrentAttribs.setOverlayColor(0, 0, 0, 0); + GLSMEnable.glDisable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); RenderManager.renderPosX = 1000000; RenderManager.renderPosY = RenderManager.renderPosZ = 0; groups.beginPass(new Matrix4f(), 0, 0, 0, instanced); Reflect.set(batcher, "activeGroups", groups); Reflect.set(batcher, "shadow", false); ShadowRenderer.ACTIVE = false; - GLStateManager.setModelViewMatrix(mainView); + GLSMMatrices.setModelViewMatrix(mainView); queueEntityGlint(batcher, kind, baseTemplate, pose, true); final int[][] reference = drawEntityGlint(kind); @@ -1071,7 +1085,7 @@ class RetainedTesrGroupsGLTest { Reflect.set(batcher, "activeGroups", shadowGroups); Reflect.set(batcher, "shadow", true); ShadowRenderer.ACTIVE = true; - GLStateManager.setModelViewMatrix(shadowView); + GLSMMatrices.setModelViewMatrix(shadowView); EntityShadowReplay.beginPass(true, 0); BatchStateGuard.resume(); try { @@ -1089,7 +1103,7 @@ class RetainedTesrGroupsGLTest { Reflect.set(batcher, "activeGroups", groups); Reflect.set(batcher, "shadow", false); ShadowRenderer.ACTIVE = false; - GLStateManager.setModelViewMatrix(mainView); + GLSMMatrices.setModelViewMatrix(mainView); EntityShadowReplay.beginPass(false, 0); assertTrue(EntityShadowReplay.replay(manager, entity, 0.25f, 0)); final int[][] replayed = drawEntityGlint(kind); @@ -1109,7 +1123,7 @@ class RetainedTesrGroupsGLTest { RenderManager.renderPosX = previousX; RenderManager.renderPosY = previousY; RenderManager.renderPosZ = previousZ; - GLStateManager.glDisable(GL11.GL_STENCIL_TEST); + GLSMEnable.glDisable(GL11.GL_STENCIL_TEST); BatchStateGuard.resume(); } } @@ -1125,12 +1139,12 @@ class RetainedTesrGroupsGLTest { final boolean held = kind.startsWith("held"), dropped = kind.startsWith("dropped"), cubes = kind.equals("armorCubes"); bindBase(); restoreTexMatrix(); - GLStateManager.glPushMatrix(); - GLStateManager.applyMultMatrix(pose); - GLStateManager.glColor4f(0.4f, 0.6f, 0.8f, 1); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.applyMultMatrix(pose); + GLSMCurrentAttribs.glColor4f(0.4f, 0.6f, 0.8f, 1); ModelPartBatcher.onTextureBind(new ResourceLocation("angelica", "test/base"), baseTexture); final GlintCapture capture = new GlintCapture(); - assertTrue(BatchEligibility.begin(BatchEligibility.SAFE, GLStateManager.drawCalls)); + assertTrue(BatchEligibility.begin(BatchEligibility.SAFE, GLSMDraws.drawCalls)); try { if (!held && !dropped) assertTrue(batcher.beginArmorCapture(capture)); assertTrue(Reflect.invoke(batcher, "queueTemplate", @@ -1139,11 +1153,11 @@ class RetainedTesrGroupsGLTest { if (held) { assertTrue(batcher.queueSkippedItemGlint(glintTemplate, EntityMaterials.ITEM_GLINT)); } else if (dropped && legacyDropped) { - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, glintTexture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, glintTexture); ModelPartBatcher.onTextureBind(GLINT_TEXTURE, glintTexture); - GLStateManager.glColor4f(0.5f * 0.76f, 0.25f * 0.76f, 0.8f * 0.76f, 1); + GLSMCurrentAttribs.glColor4f(0.5f * 0.76f, 0.25f * 0.76f, 0.8f * 0.76f, 1); for (Matrix4f matrix : new Matrix4f[] {ItemGlint.firstMatrix(), ItemGlint.secondMatrix()}) { - GLStateManager.setTextureMatrix(0, matrix); + GLSMMatrices.setTextureMatrix(0, matrix); assertTrue(batcher.queueTemplate(glintTemplate, EntityMaterials.GLINT)); } restoreTexMatrix(); @@ -1154,16 +1168,16 @@ class RetainedTesrGroupsGLTest { assertTrue(batcher.queueSkippedArmorGlint(capture, GLINT_TEXTURE)); } } finally { - BatchEligibility.end(BatchEligibility.SAFE, GLStateManager.drawCalls); + BatchEligibility.end(BatchEligibility.SAFE, GLSMDraws.drawCalls); capture.reset(); - GLStateManager.glPopMatrix(); + GLSMMatrices.glPopMatrix(); } } private int[][] drawEntityGlint(String kind) { final boolean held = kind.startsWith("held"), dropped = kind.startsWith("dropped"); FfpFixture.clear(); - final int depth = GLStateManager.pushState(StateSet.BATCH); + final int depth = GLSMAttribStack.pushState(StateSet.BATCH); try { int[] base = null; for (TesrMaterial material : new TesrMaterial[] {held || dropped ? EntityMaterials.DROPPED_ITEM_CUTOUT : EntityMaterials.CUTOUT, @@ -1171,11 +1185,11 @@ class RetainedTesrGroupsGLTest { for (var layers : RetainedTesrTestSupport.byLayer(groups).values()) for (Group group : layers) { if (group.material != material) continue; group.layer.getState().apply(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, base == null ? baseTexture : glintTexture); - GLStateManager.enableTexture(); - GLStateManager.glEnable(GL11.GL_STENCIL_TEST); - GLStateManager.glStencilFunc(GL11.GL_ALWAYS, 3, 0xFF); - GLStateManager.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, base == null ? baseTexture : glintTexture); + GLSMTextures.enableTexture(); + GLSMEnable.glEnable(GL11.GL_STENCIL_TEST); + GLSMDepthStencilAlpha.glStencilFunc(GL11.GL_ALWAYS, 3, 0xFF); + GLSMDepthStencilAlpha.glStencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); groups.drawLayer(group.layer); assertEquals(GL11.GL_ALWAYS, GL11.glGetInteger(GL11.GL_STENCIL_FUNC)); assertEquals(3, GL11.glGetInteger(GL11.GL_STENCIL_REF)); @@ -1185,27 +1199,27 @@ class RetainedTesrGroupsGLTest { ring.endFrame(); return new int[][] {base, FfpFixture.readRegion(SIZE)}; } finally { - GLStateManager.popStateTo(depth); + GLSMAttribStack.popStateTo(depth); } } @Test void mirroredModelViewUnderCullFrontBatchesLikeTheImmediateDraw() { - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.disableTexture(); - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); - GLStateManager.glShadeModel(GL11.GL_SMOOTH); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMTextures.disableTexture(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMRasterizer.glShadeModel(GL11.GL_SMOOTH); final TemplateBuffer quad = capturedQuad(0.5); final Matrix4f mirrored = new Matrix4f().scaling(-1f, 1f, 1f); assertTrue(mirrored.determinant() < 0f, "the sky stone chest TESR matrix is mirrored, got determinant " + mirrored.determinant()); - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_FRONT); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); final int cullCode = DrawState.liveCull(); final int center = SIZE / 2 * SIZE + SIZE / 2; @@ -1220,7 +1234,7 @@ class RetainedTesrGroupsGLTest { FfpFixture.clear(); groups.beginPass(new Matrix4f(), 0, 0, 0, instanced); groups.queue(SCOPE, quad, culled, RetainedTesrTestSupport.STREAM, mirrored, 0, COLOR_ABGR, 0, 0L, 1, null); - GLStateManager.glCullFace(GL11.GL_BACK); + GLSMRasterizer.glCullFace(GL11.GL_BACK); source.endBatch(groups); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "the batched draw must not raise a GL error"); @@ -1231,34 +1245,34 @@ class RetainedTesrGroupsGLTest { @Test void flushRestoresCallerStateOnEveryGuardedAxis() { - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.disableTexture(); - GLStateManager.disableAlphaTest(); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMTextures.disableTexture(); + GLSMDepthStencilAlpha.disableAlphaTest(); - GLStateManager.enableCull(); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); - GLStateManager.glDepthMask(false); - GLStateManager.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GLStateManager.glPolygonOffset(1.0f, 1.0f); + GLSMRasterizer.enableCull(); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMEnable.glEnable(GL11.GL_POLYGON_OFFSET_FILL); + GLSMRasterizer.glPolygonOffset(1.0f, 1.0f); - final boolean cullEnabledBefore = GLStateManager.getCullState().isEnabled(); - final int cullFaceBefore = GLStateManager.getPolygonState().getCullFaceMode(); + final boolean cullEnabledBefore = GLSMRasterizer.getCullState().isEnabled(); + final int cullFaceBefore = GLSMRasterizer.getPolygonState().getCullFaceMode(); final boolean glCullEnabledBefore = GL11.glIsEnabled(GL11.GL_CULL_FACE); final int glCullFaceBefore = GL11.glGetInteger(GL11.GL_CULL_FACE_MODE); - final boolean blendEnabledBefore = GLStateManager.isEffectiveBlendEnabled(); + final boolean blendEnabledBefore = GLSMBlend.isEffectiveBlendEnabled(); final boolean glBlendEnabledBefore = GL11.glIsEnabled(GL11.GL_BLEND); - final int blendSrcBefore = GLStateManager.getEffectiveBlendState(new BlendState()).getSrcRgb(); + final int blendSrcBefore = GLSMBlend.getEffectiveBlendState(new BlendState()).getSrcRgb(); final int glBlendSrcBefore = GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB); - final boolean depthMaskBefore = GLStateManager.isEffectiveDepthMaskEnabled(); + final boolean depthMaskBefore = GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled(); final boolean glDepthMaskBefore = GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK); - final boolean offsetFillBefore = GLStateManager.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL); + final boolean offsetFillBefore = GLSMEnable.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL); final boolean glOffsetFillBefore = GL11.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL); - final float offsetFactorBefore = GLStateManager.getPolygonState().getOffsetFactor(); + final float offsetFactorBefore = GLSMRasterizer.getPolygonState().getOffsetFactor(); final float glOffsetFactorBefore = GL11.glGetFloat(GL11.GL_POLYGON_OFFSET_FACTOR); final TemplateBuffer quad = capturedQuad(0.5); @@ -1271,22 +1285,22 @@ class RetainedTesrGroupsGLTest { source.endBatch(groups); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "the flush must not raise a GL error"); - assertEquals(cullEnabledBefore, GLStateManager.getCullState().isEnabled(), "cache cull enable must be restored"); - assertEquals(cullFaceBefore, GLStateManager.getPolygonState().getCullFaceMode(), "cache cull face must be restored"); + assertEquals(cullEnabledBefore, GLSMRasterizer.getCullState().isEnabled(), "cache cull enable must be restored"); + assertEquals(cullFaceBefore, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cache cull face must be restored"); assertEquals(glCullEnabledBefore, GL11.glIsEnabled(GL11.GL_CULL_FACE), "driver cull enable must be restored"); assertEquals(glCullFaceBefore, GL11.glGetInteger(GL11.GL_CULL_FACE_MODE), "driver cull face must be restored"); - assertEquals(blendEnabledBefore, GLStateManager.isEffectiveBlendEnabled(), "cache blend enable must be restored"); + assertEquals(blendEnabledBefore, GLSMBlend.isEffectiveBlendEnabled(), "cache blend enable must be restored"); assertEquals(glBlendEnabledBefore, GL11.glIsEnabled(GL11.GL_BLEND), "driver blend enable must be restored"); - assertEquals(blendSrcBefore, GLStateManager.getEffectiveBlendState(new BlendState()).getSrcRgb(), "cache blend func must be restored"); + assertEquals(blendSrcBefore, GLSMBlend.getEffectiveBlendState(new BlendState()).getSrcRgb(), "cache blend func must be restored"); assertEquals(glBlendSrcBefore, GL11.glGetInteger(GL14.GL_BLEND_SRC_RGB), "driver blend func must be restored"); - assertEquals(depthMaskBefore, GLStateManager.isEffectiveDepthMaskEnabled(), "cache depth mask must be restored"); + assertEquals(depthMaskBefore, GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled(), "cache depth mask must be restored"); assertEquals(glDepthMaskBefore, GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), "driver depth mask must be restored"); - assertEquals(offsetFillBefore, GLStateManager.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL), "cache polygon offset fill must be restored"); + assertEquals(offsetFillBefore, GLSMEnable.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL), "cache polygon offset fill must be restored"); assertEquals(glOffsetFillBefore, GL11.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL), "driver polygon offset fill must be restored"); - assertEquals(offsetFactorBefore, GLStateManager.getPolygonState().getOffsetFactor(), 0.0001f, "cache polygon offset factor must be restored"); + assertEquals(offsetFactorBefore, GLSMRasterizer.getPolygonState().getOffsetFactor(), 0.0001f, "cache polygon offset factor must be restored"); assertEquals(glOffsetFactorBefore, GL11.glGetFloat(GL11.GL_POLYGON_OFFSET_FACTOR), 0.0001f, "driver polygon offset factor must be restored"); } @@ -1325,15 +1339,15 @@ class RetainedTesrGroupsGLTest { @Test void shaderLayerBindsTheInstancedProgramOnceAndMatchesTheRetainedDraw() { final TesrShader shader = RetainedTesrTestSupport.linkedSource("angelica:test_gl_source_shader").shader; - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); long bakedBinds = TesrShaderPrograms.bakedBinds; long instancedBinds = TesrShaderPrograms.instancedBinds; final int[][] instancedPixels = drawShaderLayer(queueShaderPair(TesrMaterial.builder().stream().shader(shader).build(), true)); assertEquals(1, TesrShaderPrograms.bakedBinds - bakedBinds, "the layer hook binds the baked variant once"); assertEquals(1, TesrShaderPrograms.instancedBinds - instancedBinds, "the instanced variant binds once for the layer"); - assertEquals(0, GLStateManager.getActiveProgram(), "release must restore the caller's program"); + assertEquals(0, GLSMPrograms.getActiveProgram(), "release must restore the caller's program"); assertEquals(1, groups.instancedDraws, "both instances share one template run"); assertEquals(2, groups.instancedInstances); @@ -1367,11 +1381,11 @@ class RetainedTesrGroupsGLTest { final TemplateBuffer template = capturedQuad(0.6); final String path = instancing ? "instanced" : "baked"; - final Matrix4f savedProjection = new Matrix4f(GLStateManager.getProjectionMatrix()); - GLStateManager.glViewport(0, 0, SIZE, SIZE); - GLStateManager.setProjectionMatrix(new Matrix4f().setPerspective(1.2217f, 1.3713f, 0.0517f, 173.31f)); - GLStateManager.disableTexture(); - GLStateManager.glDepthMask(true); + final Matrix4f savedProjection = new Matrix4f(GLSMMatrices.getProjectionMatrix()); + GLSMRasterizer.glViewport(0, 0, SIZE, SIZE); + GLSMMatrices.setProjectionMatrix(new Matrix4f().setPerspective(1.2217f, 1.3713f, 0.0517f, 173.31f)); + GLSMTextures.disableTexture(); + GLSMDepthStencilAlpha.glDepthMask(true); FfpFixture.clear(); try { final Matrix4f view = new Matrix4f().translation(0.0713f, -0.0291f, -2.3177f).rotateX(0.413f); @@ -1416,14 +1430,14 @@ class RetainedTesrGroupsGLTest { assertEquals(0, missed, path + ": depth-equal overlay missed " + missed + " of " + covered + " base pixels"); return new Group[] { RetainedTesrTestSupport.groupsOn(groups, baseLayer).get(0), RetainedTesrTestSupport.groupsOn(groups, overlayLayer).get(0) }; } finally { - GLStateManager.setProjectionMatrix(savedProjection); + GLSMMatrices.setProjectionMatrix(savedProjection); } } @Test void depthEqualSetMembersBakeAgainstOneAnchor() { - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); final double[] first = { 1000.3, 70.6, -2000.7 }; final double[] moved = { 1300.4, 75.8, -1750.4 }; final Group[] pair = drawDepthEqualPair(null, false, first, moved); @@ -1435,8 +1449,8 @@ class RetainedTesrGroupsGLTest { @Test void failedInstancedRelinkDrawsQueuedInstancesOnTheCpuPath() { final TesrShaderPrograms.Entry entry = RetainedTesrTestSupport.linkedSource("angelica:test_gl_relink_failure_shader"); - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); final RenderLayer shaderLayer = queueShaderPair(TesrMaterial.builder().stream().shader(entry.shader).build(), true); assertEquals(1, RetainedTesrTestSupport.onlyGroup(groups).templateColumns.runs.size(), "sanity: both parts queued as instances"); @@ -1455,8 +1469,8 @@ class RetainedTesrGroupsGLTest { @Test void shaderOverlayDepthEqualsItsEmulatedBaseOnBothPaths() { final TesrShader shader = RetainedTesrTestSupport.linkedSource("angelica:test_gl_depth_parity_shader").shader; - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); drawDepthEqualPair(shader, false); drawDepthEqualPair(shader, true); } diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/StateSetOverrideGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/StateSetOverrideGLTest.java index 55a48b7f2..117ca66b1 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/StateSetOverrideGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/StateSetOverrideGLTest.java @@ -1,7 +1,11 @@ package com.gtnewhorizons.angelica.rendering.tesr; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.hooks.GLSMHooks; @@ -67,16 +71,16 @@ class StateSetOverrideGLTest { AlphaTestStorage.restoreAlphaTest(); DepthColorStorage.unlockDepthColor(); VanillaLayerRig.clear(); - GLStateManager.disableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); - GLStateManager.disableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.disableCull(); - GLStateManager.glUseProgram(0); - if (program != 0) GLStateManager.glDeleteProgram(program); - if (otherProgram != 0) GLStateManager.glDeleteProgram(otherProgram); + GLSMBlend.disableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0.0f); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, true, true, true); + GLSMRasterizer.disableCull(); + GLSMPrograms.glUseProgram(0); + if (program != 0) GLSMPrograms.glDeleteProgram(program); + if (otherProgram != 0) GLSMPrograms.glDeleteProgram(otherProgram); } private static int[] driverBlendFunc() { @@ -94,8 +98,8 @@ class StateSetOverrideGLTest { private static void overrideVanillaBlend() { VanillaLayerRig.installBlend(); - GLStateManager.enableBlend(); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMBlend.enableBlend(); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); BlendModeStorage.overrideBlend(new BlendState(GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE)); } @@ -103,15 +107,15 @@ class StateSetOverrideGLTest { private static void overrideVanillaAlpha() { VanillaLayerRig.installAlpha(); - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); AlphaTestStorage.overrideAlphaTest(new AlphaTest(AlphaTestFunction.LEQUAL, 0.25f)); } static Stream blendFuncSetters() { return Stream.of( - Arguments.of("glBlendFunc", (Runnable) () -> GLStateManager.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO)), - Arguments.of("tryBlendFuncSeparate", (Runnable) () -> GLStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO))); + Arguments.of("glBlendFunc", (Runnable) () -> GLSMBlend.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ZERO)), + Arguments.of("tryBlendFuncSeparate", (Runnable) () -> GLSMBlend.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_ZERO, GL11.GL_DST_COLOR, GL11.GL_ZERO))); } @ParameterizedTest(name = "{0}") @@ -119,19 +123,19 @@ class StateSetOverrideGLTest { void blendBracketUnderOverrideRestoresVanillaShadowAndLeavesLiveStateUntouched(String name, Runnable setBlendFunc) { overrideVanillaBlend(); - final boolean liveEnabledBefore = GLStateManager.getBlendMode().isEnabled(); - final BlendState liveBefore = new BlendState().set(GLStateManager.getBlendState()); + final boolean liveEnabledBefore = GLSMBlend.getBlendMode().isEnabled(); + final BlendState liveBefore = new BlendState().set(GLSMBlend.getBlendState()); final boolean driverEnabledBefore = GL11.glIsEnabled(GL11.GL_BLEND); final int[] driverFuncBefore = driverBlendFunc(); assertTrue(driverEnabledBefore, "driver blend enable carries the override"); assertArrayEquals(new int[] {GL11.GL_ONE, GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE}, driverFuncBefore, "driver blend func carries the override"); - final int d = GLStateManager.pushState(StateSet.BLEND); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); final boolean vanillaEnabledBefore = BlendModeStorage.ENABLE_LAYER.getVanilla(); - GLStateManager.disableBlend(); + GLSMBlend.disableBlend(); assertNotEquals(vanillaEnabledBefore, BlendModeStorage.ENABLE_LAYER.getVanilla(), "the defer branch changes the vanilla shadow immediately"); setBlendFunc.run(); - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); assertEquals(driverEnabledBefore, GL11.glIsEnabled(GL11.GL_BLEND), "driver blend enable left untouched by the bracket"); assertArrayEquals(driverFuncBefore, driverBlendFunc(), "driver blend func left untouched by the bracket"); @@ -144,35 +148,35 @@ class StateSetOverrideGLTest { assertEquals(GL11.GL_ONE, vanillaAfter.getSrcAlpha(), "vanilla shadow src alpha restored"); assertEquals(GL11.GL_ZERO, vanillaAfter.getDstAlpha(), "vanilla shadow dst alpha restored"); - assertEquals(liveEnabledBefore, GLStateManager.getBlendMode().isEnabled(), "live overridden enable left untouched by the bracket"); - assertEquals(liveBefore.getSrcRgb(), GLStateManager.getBlendState().getSrcRgb(), "live overridden src rgb left untouched"); - assertEquals(liveBefore.getDstRgb(), GLStateManager.getBlendState().getDstRgb(), "live overridden dst rgb left untouched"); - assertEquals(liveBefore.getSrcAlpha(), GLStateManager.getBlendState().getSrcAlpha(), "live overridden src alpha left untouched"); - assertEquals(liveBefore.getDstAlpha(), GLStateManager.getBlendState().getDstAlpha(), "live overridden dst alpha left untouched"); + assertEquals(liveEnabledBefore, GLSMBlend.getBlendMode().isEnabled(), "live overridden enable left untouched by the bracket"); + assertEquals(liveBefore.getSrcRgb(), GLSMBlend.getBlendState().getSrcRgb(), "live overridden src rgb left untouched"); + assertEquals(liveBefore.getDstRgb(), GLSMBlend.getBlendState().getDstRgb(), "live overridden dst rgb left untouched"); + assertEquals(liveBefore.getSrcAlpha(), GLSMBlend.getBlendState().getSrcAlpha(), "live overridden src alpha left untouched"); + assertEquals(liveBefore.getDstAlpha(), GLSMBlend.getBlendState().getDstAlpha(), "live overridden dst alpha left untouched"); } @Test void alphaBracketUnderOverrideRestoresVanillaShadowAndLeavesLiveStateUntouched() { overrideVanillaAlpha(); - final boolean liveEnabledBefore = GLStateManager.getAlphaTest().isEnabled(); - final int liveFuncBefore = GLStateManager.getAlphaState().getFunction(); - final float liveRefBefore = GLStateManager.getAlphaState().getReference(); + final boolean liveEnabledBefore = GLSMDepthStencilAlpha.getAlphaTest().isEnabled(); + final int liveFuncBefore = GLSMDepthStencilAlpha.getAlphaState().getFunction(); + final float liveRefBefore = GLSMDepthStencilAlpha.getAlphaState().getReference(); - final int d = GLStateManager.pushState(StateSet.ALPHA); - GLStateManager.disableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.1f); + final int d = GLSMAttribStack.pushState(StateSet.ALPHA); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.1f); final int[] calls = { 0 }; final AlphaState shadow = new AlphaState(); listener = () -> { calls[0]++; - assertEquals(GL11.GL_LEQUAL, GLStateManager.getAlphaState().getFunction()); - assertEquals(0.25f, GLStateManager.getAlphaState().getReference()); - assertTrue(GLStateManager.isEffectiveAlphaTestEnabled()); - assertEquals(GL11.GL_GREATER, GLStateManager.getEffectiveAlphaState(shadow).getFunction()); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getAlphaState().getFunction()); + assertEquals(0.25f, GLSMDepthStencilAlpha.getAlphaState().getReference()); + assertTrue(GLSMDepthStencilAlpha.isEffectiveAlphaTestEnabled()); + assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getEffectiveAlphaState(shadow).getFunction()); assertEquals(0.5f, shadow.getReference()); }; - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); assertEquals(1, calls[0]); assertTrue(AlphaTestStorage.ENABLE_LAYER.getVanilla(), "vanilla shadow enable restored to the pre-bracket value"); @@ -181,31 +185,31 @@ class StateSetOverrideGLTest { assertEquals(GL11.GL_GREATER, vanillaAfter.getFunction(), "vanilla shadow func restored"); assertEquals(0.5f, vanillaAfter.getReference(), 0.0001f, "vanilla shadow ref restored"); - assertEquals(liveEnabledBefore, GLStateManager.getAlphaTest().isEnabled(), "live overridden enable left untouched by the bracket"); - assertEquals(liveFuncBefore, GLStateManager.getAlphaState().getFunction(), "live overridden func left untouched"); - assertEquals(liveRefBefore, GLStateManager.getAlphaState().getReference(), 0.0001f, "live overridden ref left untouched"); + assertEquals(liveEnabledBefore, GLSMDepthStencilAlpha.getAlphaTest().isEnabled(), "live overridden enable left untouched by the bracket"); + assertEquals(liveFuncBefore, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "live overridden func left untouched"); + assertEquals(liveRefBefore, GLSMDepthStencilAlpha.getAlphaState().getReference(), 0.0001f, "live overridden ref left untouched"); } @Test void masksBracketUnderOverrideRestoresVanillaShadowAndLeavesLiveStateUntouched() { VanillaLayerRig.installDepthColor(); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, false, true, false); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, false, true, false); DepthColorStorage.disableDepthColor(); - final boolean liveMaskBefore = GLStateManager.getDepthState().isEnabled(); - final ColorMask liveColorBefore = new ColorMask().set(GLStateManager.getColorMask()); + final boolean liveMaskBefore = GLSMDepthStencilAlpha.getDepthState().isEnabled(); + final ColorMask liveColorBefore = new ColorMask().set(GLSMBlend.getColorMask()); final boolean driverDepthBefore = GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK); final boolean[] driverColorBefore = driverColorMask(); assertFalse(driverDepthBefore, "driver depth mask carries the held-off value"); assertFalse(driverColorBefore[0] || driverColorBefore[1] || driverColorBefore[2] || driverColorBefore[3], "driver color mask carries the held-off value"); - final int d = GLStateManager.pushState(StateSet.MASKS); - GLStateManager.glDepthMask(false); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.MASKS); + GLSMDepthStencilAlpha.glDepthMask(false); + GLSMBlend.glColorMask(true, true, true, true); + GLSMAttribStack.popStateTo(d); assertEquals(driverDepthBefore, GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), "driver depth mask left untouched by the bracket"); assertArrayEquals(driverColorBefore, driverColorMask(), "driver color mask left untouched by the bracket"); @@ -221,11 +225,11 @@ class StateSetOverrideGLTest { assertTrue(vanillaColorAfter.blue, "vanilla shadow color blue restored"); assertFalse(vanillaColorAfter.alpha, "vanilla shadow color alpha restored"); - assertEquals(liveMaskBefore, GLStateManager.getDepthState().isEnabled(), "live overridden depth mask left untouched by the bracket"); - assertEquals(liveColorBefore.red, GLStateManager.getColorMask().red, "live overridden color red left untouched"); - assertEquals(liveColorBefore.green, GLStateManager.getColorMask().green, "live overridden color green left untouched"); - assertEquals(liveColorBefore.blue, GLStateManager.getColorMask().blue, "live overridden color blue left untouched"); - assertEquals(liveColorBefore.alpha, GLStateManager.getColorMask().alpha, "live overridden color alpha left untouched"); + assertEquals(liveMaskBefore, GLSMDepthStencilAlpha.getDepthState().isEnabled(), "live overridden depth mask left untouched by the bracket"); + assertEquals(liveColorBefore.red, GLSMBlend.getColorMask().red, "live overridden color red left untouched"); + assertEquals(liveColorBefore.green, GLSMBlend.getColorMask().green, "live overridden color green left untouched"); + assertEquals(liveColorBefore.blue, GLSMBlend.getColorMask().blue, "live overridden color blue left untouched"); + assertEquals(liveColorBefore.alpha, GLSMBlend.getColorMask().alpha, "live overridden color alpha left untouched"); } @Test @@ -235,35 +239,35 @@ class StateSetOverrideGLTest { final boolean vanillaEnabledBefore = BlendModeStorage.ENABLE_LAYER.getVanilla(); final BlendState vanillaBefore = new BlendState(); BlendModeStorage.FUNC_LAYER.readVanilla(vanillaBefore); - final boolean liveEnabledBefore = GLStateManager.getBlendMode().isEnabled(); - final BlendState liveBefore = new BlendState().set(GLStateManager.getBlendState()); + final boolean liveEnabledBefore = GLSMBlend.getBlendMode().isEnabled(); + final BlendState liveBefore = new BlendState().set(GLSMBlend.getBlendState()); - final int d = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.popStateTo(d); + final int d = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMAttribStack.popStateTo(d); assertEquals(vanillaEnabledBefore, BlendModeStorage.ENABLE_LAYER.getVanilla(), "untouched bracket leaves the vanilla enable shadow intact"); final BlendState vanillaAfter = new BlendState(); BlendModeStorage.FUNC_LAYER.readVanilla(vanillaAfter); assertEquals(vanillaBefore.getSrcRgb(), vanillaAfter.getSrcRgb(), "untouched bracket leaves the vanilla func shadow intact"); - assertEquals(liveEnabledBefore, GLStateManager.getBlendMode().isEnabled(), "untouched bracket leaves the live overridden enable intact"); - assertEquals(liveBefore.getSrcRgb(), GLStateManager.getBlendState().getSrcRgb(), "untouched bracket leaves the live overridden func intact"); + assertEquals(liveEnabledBefore, GLSMBlend.getBlendMode().isEnabled(), "untouched bracket leaves the live overridden enable intact"); + assertEquals(liveBefore.getSrcRgb(), GLSMBlend.getBlendState().getSrcRgb(), "untouched bracket leaves the live overridden func intact"); } @Test void overrideAcquiredMidBracket() { VanillaLayerRig.installAlpha(); - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); - final int d = GLStateManager.pushState(StateSet.ALPHA); + final int d = GLSMAttribStack.pushState(StateSet.ALPHA); AlphaTestStorage.overrideAlphaTest(new AlphaTest(AlphaTestFunction.LEQUAL, 0.25f)); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getAlphaState().getFunction(), "the override value is visible live immediately after acquiring mid-bracket"); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "the override value is visible live immediately after acquiring mid-bracket"); - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getAlphaState().getFunction(), "the live cache still shows the override value after pop: the vanilla-layer-aware restore writes the pre-bracket baseline into the vanilla shadow, not the live cache, while the override is held"); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "the live cache still shows the override value after pop: the vanilla-layer-aware restore writes the pre-bracket baseline into the vanilla shadow, not the live cache, while the override is held"); final AlphaState vanillaAfter = new AlphaState(); AlphaTestStorage.FUNC_LAYER.readVanilla(vanillaAfter); assertEquals(GL11.GL_GREATER, vanillaAfter.getFunction(), "the vanilla shadow is restored to the pre-bracket baseline by the bracket pop"); @@ -275,18 +279,18 @@ class StateSetOverrideGLTest { void overrideReleasedMidBracket() { overrideVanillaAlpha(); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getAlphaState().getFunction(), "the override value is visible live before the bracket opens"); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "the override value is visible live before the bracket opens"); - final int d = GLStateManager.pushState(StateSet.ALPHA); + final int d = GLSMAttribStack.pushState(StateSet.ALPHA); AlphaTestStorage.restoreAlphaTest(); - assertEquals(GL11.GL_GREATER, GLStateManager.getAlphaState().getFunction(), "releasing mid-bracket writes the vanilla value back through the live path immediately"); + assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "releasing mid-bracket writes the vanilla value back through the live path immediately"); - GLStateManager.glAlphaFunc(GL11.GL_NEVER, 0.9f); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_NEVER, 0.9f); - GLStateManager.popStateTo(d); + GLSMAttribStack.popStateTo(d); - assertEquals(GL11.GL_GREATER, GLStateManager.getAlphaState().getFunction(), "once released, the bracket pop restores the live cache to the vanilla baseline captured at push time through the vanilla-layer-aware slot, proving the pop actually acted rather than the assertion coincidentally already holding"); + assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getAlphaState().getFunction(), "once released, the bracket pop restores the live cache to the vanilla baseline captured at push time through the vanilla-layer-aware slot, proving the pop actually acted rather than the assertion coincidentally already holding"); } @Test @@ -295,41 +299,41 @@ class StateSetOverrideGLTest { final boolean vanillaBefore = BlendModeStorage.ENABLE_LAYER.getVanilla(); - final int outer = GLStateManager.pushState(StateSet.BLEND); - GLStateManager.pushState(StateSet.CULL); + final int outer = GLSMAttribStack.pushState(StateSet.BLEND); + GLSMAttribStack.pushState(StateSet.CULL); - GLStateManager.disableBlend(); + GLSMBlend.disableBlend(); assertNotEquals(vanillaBefore, BlendModeStorage.ENABLE_LAYER.getVanilla(), "the defer branch changes the vanilla shadow immediately"); - GLStateManager.popState(); + GLSMAttribStack.popState(); assertNotEquals(vanillaBefore, BlendModeStorage.ENABLE_LAYER.getVanilla(), "a non-member bracket pop does not restore the change, it carries to the parent"); - GLStateManager.popStateTo(outer); + GLSMAttribStack.popStateTo(outer); assertEquals(vanillaBefore, BlendModeStorage.ENABLE_LAYER.getVanilla(), "the enclosing member bracket pop restores the change that carried through the non-member pop"); } @Test void functionEnableAndCombinedRestorationPostExactlyOnce() { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); for (int changes = 1; changes <= 3; changes++) { - final int depth = GLStateManager.pushState(StateSet.ALPHA); - if ((changes & 1) != 0) GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.25f); - if ((changes & 2) != 0) GLStateManager.disableAlphaTest(); + final int depth = GLSMAttribStack.pushState(StateSet.ALPHA); + if ((changes & 1) != 0) GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.25f); + if ((changes & 2) != 0) GLSMDepthStencilAlpha.disableAlphaTest(); final int[] calls = { 0 }; listener = () -> { calls[0]++; - assertFalse(GLStateManager.isPoppingAttributes()); - assertEquals(depth, GLStateManager.getAttribDepth()); - assertTrue(GLStateManager.getAlphaTest().isEnabled()); - assertEquals(GL11.GL_GREATER, GLStateManager.getAlphaState().getFunction()); - assertEquals(0.5f, GLStateManager.getAlphaState().getReference()); - final int nested = GLStateManager.pushState(StateSet.ALPHA); - GLStateManager.popStateTo(nested); + assertFalse(GLSMAttribStack.isPoppingAttributes()); + assertEquals(depth, GLSMAttribStack.getAttribDepth()); + assertTrue(GLSMDepthStencilAlpha.getAlphaTest().isEnabled()); + assertEquals(GL11.GL_GREATER, GLSMDepthStencilAlpha.getAlphaState().getFunction()); + assertEquals(0.5f, GLSMDepthStencilAlpha.getAlphaState().getReference()); + final int nested = GLSMAttribStack.pushState(StateSet.ALPHA); + GLSMAttribStack.popStateTo(nested); }; - GLStateManager.popStateTo(depth); + GLSMAttribStack.popStateTo(depth); assertEquals(1, calls[0]); listener = null; } @@ -337,56 +341,56 @@ class StateSetOverrideGLTest { @Test void unchangedAndNonmemberPopsDoNotPostAndOuterMemberDoes() { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); final int[] calls = { 0 }; listener = () -> calls[0]++; - final int outer = GLStateManager.pushState(StateSet.ALPHA); - final int unchanged = GLStateManager.pushState(StateSet.ALPHA); - GLStateManager.popStateTo(unchanged); + final int outer = GLSMAttribStack.pushState(StateSet.ALPHA); + final int unchanged = GLSMAttribStack.pushState(StateSet.ALPHA); + GLSMAttribStack.popStateTo(unchanged); assertEquals(0, calls[0]); - final int inner = GLStateManager.pushState(StateSet.CULL); - GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.25f); + final int inner = GLSMAttribStack.pushState(StateSet.CULL); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.25f); calls[0] = 0; - GLStateManager.popStateTo(inner); + GLSMAttribStack.popStateTo(inner); assertEquals(0, calls[0]); - GLStateManager.popStateTo(outer); + GLSMAttribStack.popStateTo(outer); assertEquals(1, calls[0]); } @Test void dynamicUniformsUpdateWithoutRebindingAndAfterProgramRestoration() { - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.5f); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.5f); program = createProgram(); otherProgram = createProgram(); - GLStateManager.glUseProgram(program); - final int referenceLocation = GLStateManager.glGetUniformLocation(program, "alphaReference"); - final int functionLocation = GLStateManager.glGetUniformLocation(program, "alphaFunction"); + GLSMPrograms.glUseProgram(program); + final int referenceLocation = GLSMPrograms.glGetUniformLocation(program, "alphaReference"); + final int functionLocation = GLSMPrograms.glGetUniformLocation(program, "alphaFunction"); Reflect.setStatic(ProgramUniforms.class, "active", ProgramUniforms.builder("alpha", program).buildUniforms()); final Runnable[] updates = new Runnable[2]; - final FloatUniform reference = newFloatUniform(referenceLocation, () -> GLStateManager.getAlphaState().getReference(), update -> updates[0] = update); - final IntUniform function = newIntUniform(functionLocation, () -> GLStateManager.getAlphaState().getFunction(), update -> updates[1] = update); + final FloatUniform reference = newFloatUniform(referenceLocation, () -> GLSMDepthStencilAlpha.getAlphaState().getReference(), update -> updates[0] = update); + final IntUniform function = newIntUniform(functionLocation, () -> GLSMDepthStencilAlpha.getAlphaState().getFunction(), update -> updates[1] = update); reference.update(); function.update(); listener = () -> { - assertEquals(program, GLStateManager.getActiveProgram()); + assertEquals(program, GLSMPrograms.getActiveProgram()); assertEquals(program, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM)); - assertFalse(GLStateManager.isPoppingAttributes()); + assertFalse(GLSMAttribStack.isPoppingAttributes()); updates[0].run(); updates[1].run(); }; - final int depth = GLStateManager.pushState(StateSet.ALPHA); - GLStateManager.glAlphaFunc(GL11.GL_LESS, 0.25f); + final int depth = GLSMAttribStack.pushState(StateSet.ALPHA); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_LESS, 0.25f); assertUniforms(referenceLocation, functionLocation, 0.25f, GL11.GL_LESS); - GLStateManager.popStateTo(depth); + GLSMAttribStack.popStateTo(depth); assertUniforms(referenceLocation, functionLocation, 0.5f, GL11.GL_GREATER); - final int saved = GLStateManager.pushState(StateSet.FONT); - GLStateManager.disableAlphaTest(); - GLStateManager.glUseProgram(otherProgram); - GLStateManager.popStateTo(saved); - assertTrue(GLStateManager.getAlphaTest().isEnabled()); - assertEquals(program, GLStateManager.getActiveProgram()); + final int saved = GLSMAttribStack.pushState(StateSet.FONT); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMPrograms.glUseProgram(otherProgram); + GLSMAttribStack.popStateTo(saved); + assertTrue(GLSMDepthStencilAlpha.getAlphaTest().isEnabled()); + assertEquals(program, GLSMPrograms.getActiveProgram()); } private void assertUniforms(int referenceLocation, int functionLocation, float reference, int function) { diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrLayerStateTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrLayerStateTest.java index 5e82d52e6..7a84aed2e 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrLayerStateTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrLayerStateTest.java @@ -5,7 +5,17 @@ import com.gtnewhorizons.angelica.api.tesr.TesrMaterial; import com.gtnewhorizons.angelica.api.tesr.TesrShaders; import com.gtnewhorizons.angelica.compat.mojang.RenderLayer; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.StateSet; import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; @@ -65,16 +75,16 @@ class TesrLayerStateTest { @BeforeEach void liveState() { - GLStateManager.disableFog(); - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f); - GLStateManager.enableDepthTest(); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.disableBlend(); - GLStateManager.enableCull(); - GLStateManager.enableLighting(); + GLSMFog.disableFog(); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f); + GLSMDepthStencilAlpha.enableDepthTest(); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, true, true, true); + GLSMBlend.disableBlend(); + GLSMRasterizer.enableCull(); + GLSMLighting.enableLighting(); } @AfterEach @@ -85,22 +95,22 @@ class TesrLayerStateTest { ModelPartBatcher.INSTANCE.clear(); TesrShaderPrograms.invalidateAll(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); final ShaderManager ffp = ShaderManager.getInstance(); if (ffp.isActive()) ffp.deactivate(); - GLStateManager.disableBlend(); - GLStateManager.disableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_ALWAYS, 0f); - GLStateManager.glDepthFunc(GL11.GL_LESS); - GLStateManager.glDepthMask(true); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.glDisable(GL11.GL_TEXTURE_2D); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.disableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_ALWAYS, 0f); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LESS); + GLSMDepthStencilAlpha.glDepthMask(true); + GLSMBlend.glColorMask(true, true, true, true); + GLSMEnable.glDisable(GL11.GL_TEXTURE_2D); } private static void assertDriverColorMask(boolean expected) { @@ -117,9 +127,9 @@ class TesrLayerStateTest { @ValueSource(booleans = { false, true }) void batchBracketRestoresCallerDepthAfterGlint(boolean held) { for (boolean enabled : new boolean[] { true, false }) { - GLStateManager.getDepthTest().setEnabled(enabled); - GLStateManager.glDepthFunc(GL11.GL_GREATER); - final int depth = GLStateManager.pushState(StateSet.BATCH); + GLSMDepthStencilAlpha.getDepthTest().setEnabled(enabled); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_GREATER); + final int depth = GLSMAttribStack.pushState(StateSet.BATCH); final RenderLayer base = layer(EntityMaterials.DROPPED_ITEM_CUTOUT); final RenderLayer glint = layer(held ? EntityMaterials.ITEM_GLINT : EntityMaterials.GLINT); base.startDrawing(); @@ -130,15 +140,15 @@ class TesrLayerStateTest { assertSame(SpecialCondition.GLINT, GbufferPrograms.getSpecialCondition()); glint.endDrawing(); assertNull(GbufferPrograms.getSpecialCondition()); - GLStateManager.popStateTo(depth); + GLSMAttribStack.popStateTo(depth); assertDepth(enabled, GL11.GL_GREATER); } } private static void assertDepth(boolean enabled, int function) { - assertEquals(enabled, GLStateManager.getDepthTest().isEnabled(), "cached depth enable"); + assertEquals(enabled, GLSMDepthStencilAlpha.getDepthTest().isEnabled(), "cached depth enable"); assertEquals(enabled, GL11.glIsEnabled(GL11.GL_DEPTH_TEST), "driver depth enable"); - assertEquals(function, GLStateManager.getDepthState().getFunc(), "cached depth function"); + assertEquals(function, GLSMDepthStencilAlpha.getDepthState().getFunc(), "cached depth function"); assertEquals(function, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "driver depth function"); } @@ -146,16 +156,16 @@ class TesrLayerStateTest { @ValueSource(booleans = { false, true }) void skippedDroppedGlintPreservesDepthMaskAndTextureMatrix(boolean depthWrite) { final Matrix4f textureMatrix = new Matrix4f().translation(0.13f, 0.27f, 0); - GLStateManager.setTextureMatrix(0, textureMatrix); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glDepthMask(depthWrite); - GLStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GLSMMatrices.setTextureMatrix(0, textureMatrix); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMDepthStencilAlpha.glDepthMask(depthWrite); + GLSMBlend.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); SkippedGlintBlock.applyDroppedItemExitState(); - assertEquals(depthWrite, GLStateManager.isEffectiveDepthMaskEnabled()); - assertEquals(textureMatrix, GLStateManager.getTextures().getTextureUnitMatrix(0)); - assertEquals(GL11.GL_MODELVIEW, GLStateManager.getMatrixMode().getMode()); - assertEquals(GL11.GL_SRC_COLOR, GLStateManager.getBlendState().getSrcAlpha(), "dropped glint blends alpha like color, unlike held"); - assertEquals(GL11.GL_ONE, GLStateManager.getBlendState().getDstAlpha()); + assertEquals(depthWrite, GLSMDepthStencilAlpha.isEffectiveDepthMaskEnabled()); + assertEquals(textureMatrix, GLSMTextures.getTextures().getTextureUnitMatrix(0)); + assertEquals(GL11.GL_MODELVIEW, GLSMMatrices.getMatrixMode().getMode()); + assertEquals(GL11.GL_SRC_COLOR, GLSMBlend.getBlendState().getSrcAlpha(), "dropped glint blends alpha like color, unlike held"); + assertEquals(GL11.GL_ONE, GLSMBlend.getBlendState().getDstAlpha()); } @Test @@ -196,62 +206,62 @@ class TesrLayerStateTest { static Stream batchDrawCases() { return Stream.of( Arguments.of("texture matrix and iris override", (Supplier) () -> { - GLStateManager.setTextureMatrix(0, new Matrix4f().translation(0.25f, 0f, 0f)); + GLSMMatrices.setTextureMatrix(0, new Matrix4f().translation(0.25f, 0f, 0f)); GbufferPrograms.setupSpecialRenderCondition(SpecialCondition.GLINT); GbufferPrograms.pushOverridePhase(WorldRenderingPhase.TERRAIN_CUTOUT); return new BatchScenario( () -> { - assertTrue(MatrixHelper.isIdentity(GLStateManager.getTextures().getTextureUnitMatrix(0)), "unit 0 texture matrix during batch draw"); + assertTrue(MatrixHelper.isIdentity(GLSMTextures.getTextures().getTextureUnitMatrix(0)), "unit 0 texture matrix during batch draw"); assertNull(GbufferPrograms.getSpecialCondition(), "special condition during batch draw"); assertNull(GbufferPrograms.getOverridePhase(), "override phase during batch draw"); }, () -> { - assertEquals(0.25f, GLStateManager.getTextures().getTextureUnitMatrix(0).m30(), "caller texture matrix restored"); + assertEquals(0.25f, GLSMTextures.getTextures().getTextureUnitMatrix(0).m30(), "caller texture matrix restored"); assertEquals(SpecialCondition.GLINT, GbufferPrograms.getSpecialCondition(), "caller special condition restored"); assertEquals(WorldRenderingPhase.TERRAIN_CUTOUT, GbufferPrograms.getOverridePhase(), "caller override phase restored"); }, () -> { GbufferPrograms.popOverridePhase(); GbufferPrograms.teardownSpecialRenderCondition(); - GLStateManager.setTextureMatrix(0, new Matrix4f()); + GLSMMatrices.setTextureMatrix(0, new Matrix4f()); }); }), Arguments.of("foreign program and framebuffer", (Supplier) () -> { final int program = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS); - final int framebuffer = GLStateManager.glGenFramebuffers(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + final int framebuffer = GLSMFramebuffer.glGenFramebuffers(); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); BatchDrawDefaults.capturePassFramebuffer(); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer); - GLStateManager.glUseProgram(program); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer); + GLSMPrograms.glUseProgram(program); return new BatchScenario( () -> { - assertEquals(0, GLStateManager.getActiveProgram(), "program during batch draw"); - assertEquals(0, GLStateManager.getDrawFramebuffer(), "framebuffer during batch draw"); + assertEquals(0, GLSMPrograms.getActiveProgram(), "program during batch draw"); + assertEquals(0, GLSMFramebuffer.getDrawFramebuffer(), "framebuffer during batch draw"); assertEquals(0, GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING), "driver draw framebuffer during batch draw"); }, () -> { - assertEquals(program, GLStateManager.getActiveProgram(), "caller program restored"); - assertEquals(framebuffer, GLStateManager.getDrawFramebuffer(), "caller framebuffer restored"); + assertEquals(program, GLSMPrograms.getActiveProgram(), "caller program restored"); + assertEquals(framebuffer, GLSMFramebuffer.getDrawFramebuffer(), "caller framebuffer restored"); assertEquals(program, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM), "driver caller program restored"); assertEquals(framebuffer, GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING), "driver caller framebuffer restored"); }, () -> { - GLStateManager.glUseProgram(0); - GLStateManager.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); - GLStateManager.glDeleteFramebuffers(framebuffer); - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glUseProgram(0); + GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0); + GLSMFramebuffer.glDeleteFramebuffers(framebuffer); + GLSMPrograms.glDeleteProgram(program); }); }), Arguments.of("filter from before an item renderer's blur window", (Supplier) () -> { - final int texture = GLStateManager.glGenTextures(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); + final int texture = GLSMTextures.glGenTextures(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); // What TextureUtil.func_152777_a(false, false, 1) does around an item render. TextureUtilHooks.captureBoundFilterTexture(); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); return new BatchScenario( () -> { assertEquals(GL11.GL_LINEAR, TextureInfoCache.INSTANCE.getInfo(texture).getMinFilter(), "filter from before the window"); @@ -265,8 +275,8 @@ class TesrLayerStateTest { }, () -> { TextureUtilHooks.clearSavedFilterTexture(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(texture); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(texture); }); })); } @@ -305,23 +315,23 @@ class TesrLayerStateTest { @Test void clockwiseFrontFaceIsStoredWithTheLayer() { - GLStateManager.glCullFace(GL11.GL_BACK); - GLStateManager.glFrontFace(GL11.GL_CW); + GLSMRasterizer.glCullFace(GL11.GL_BACK); + GLSMRasterizer.glFrontFace(GL11.GL_CW); try { final int cull = DrawState.liveCull(); assertEquals(DrawState.CULL_BACK | DrawState.FRONT_FACE_CLOCKWISE, cull); final RenderLayer layer = RenderLayer.tesr(null, TesrMaterial.builder().build(), PassOverride.NONE, 0f, 0f, ShaderGlint.NO_TINT, cull, true, true); - GLStateManager.glFrontFace(GL11.GL_CCW); - final int depth = GLStateManager.pushState(StateSet.BATCH); + GLSMRasterizer.glFrontFace(GL11.GL_CCW); + final int depth = GLSMAttribStack.pushState(StateSet.BATCH); layer.startDrawing(); - assertEquals(GL11.GL_CW, GLStateManager.getPolygonState().getFrontFace(), "cached front face"); + assertEquals(GL11.GL_CW, GLSMRasterizer.getPolygonState().getFrontFace(), "cached front face"); assertEquals(GL11.GL_CW, GL11.glGetInteger(GL11.GL_FRONT_FACE), "driver front face"); assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE), "cull stays on"); layer.endDrawing(); - GLStateManager.popStateTo(depth); - assertEquals(GL11.GL_CCW, GLStateManager.getPolygonState().getFrontFace(), "front face restored by BATCH pop"); + GLSMAttribStack.popStateTo(depth); + assertEquals(GL11.GL_CCW, GLSMRasterizer.getPolygonState().getFrontFace(), "front face restored by BATCH pop"); } finally { - GLStateManager.glFrontFace(GL11.GL_CCW); + GLSMRasterizer.glFrontFace(GL11.GL_CCW); } } @@ -395,11 +405,11 @@ class TesrLayerStateTest { } private static void drawInBatch(RenderLayer layer, boolean culled) { - final int depth = GLStateManager.pushState(StateSet.BATCH); + final int depth = GLSMAttribStack.pushState(StateSet.BATCH); layer.startDrawing(); assertEquals(culled, GL11.glIsEnabled(GL11.GL_CULL_FACE)); layer.endDrawing(); - GLStateManager.popStateTo(depth); + GLSMAttribStack.popStateTo(depth); } static Stream layerCaches() { @@ -414,18 +424,18 @@ class TesrLayerStateTest { @MethodSource("layerCaches") void queuedCullingSplitsLayerCachesAndRestoresTheDrawCaller(String name, Function layerFor, TesrMaterial[] materials) { for (TesrMaterial material : materials) { - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); final RenderLayer twoSided = layerFor.apply(material); - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); final RenderLayer culled = layerFor.apply(material); assertNotSame(twoSided, culled, "the last-layer shortcut must include culling"); - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); assertSame(twoSided, layerFor.apply(material), "the layer map must retain both states"); } - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); final RenderLayer twoSided = layerFor.apply(materials[0]); - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); final RenderLayer culled = layerFor.apply(materials[0]); twoSided.startDrawing(); assertFalse(GL11.glIsEnabled(GL11.GL_CULL_FACE)); @@ -433,15 +443,15 @@ class TesrLayerStateTest { assertTrue(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK)); twoSided.endDrawing(); - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); drawInBatch(twoSided, false); assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE)); - GLStateManager.disableCull(); + GLSMRasterizer.disableCull(); drawInBatch(culled, true); assertFalse(GL11.glIsEnabled(GL11.GL_CULL_FACE)); - GLStateManager.enableCull(); + GLSMRasterizer.enableCull(); drawInBatch(layerFor.apply(TesrMaterial.builder().noCull().build()), false); assertTrue(GL11.glIsEnabled(GL11.GL_CULL_FACE)); } @@ -449,21 +459,21 @@ class TesrLayerStateTest { static Stream axisCases() { return Stream.of( Arguments.of("current state over a dirty caller", (Runnable) () -> { - GLStateManager.disableCull(); - GLStateManager.glCullFace(GL11.GL_FRONT); - GLStateManager.disableLighting(); - GLStateManager.glColorMask(false, false, false, false); + GLSMRasterizer.disableCull(); + GLSMRasterizer.glCullFace(GL11.GL_FRONT); + GLSMLighting.disableLighting(); + GLSMBlend.glColorMask(false, false, false, false); }, TesrMaterial.CURRENT_STATE, (Runnable) () -> { - assertFalse(GLStateManager.getAlphaTest().isEnabled(), "no cutout"); - assertTrue(GLStateManager.getDepthTest().isEnabled(), "depth test"); - assertEquals(GL11.GL_LEQUAL, GLStateManager.getDepthState().getFunc()); - assertTrue(GLStateManager.getDepthState().isEnabled(), "depth write"); - assertFalse(GLStateManager.getBlendMode().isEnabled(), "opaque"); - assertTrue(GLStateManager.getCullState().isEnabled(), "cull pinned on"); - assertEquals(GL11.GL_BACK, GLStateManager.getPolygonState().getCullFaceMode(), "cull face pinned to back"); - assertTrue(GLStateManager.getLightingState().isEnabled(), "lit"); - assertTrue(GLStateManager.getColorMask().red, "color mask pinned on"); - assertFalse(GLStateManager.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL), "no polygon offset"); + assertFalse(GLSMDepthStencilAlpha.getAlphaTest().isEnabled(), "no cutout"); + assertTrue(GLSMDepthStencilAlpha.getDepthTest().isEnabled(), "depth test"); + assertEquals(GL11.GL_LEQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc()); + assertTrue(GLSMDepthStencilAlpha.getDepthState().isEnabled(), "depth write"); + assertFalse(GLSMBlend.getBlendMode().isEnabled(), "opaque"); + assertTrue(GLSMRasterizer.getCullState().isEnabled(), "cull pinned on"); + assertEquals(GL11.GL_BACK, GLSMRasterizer.getPolygonState().getCullFaceMode(), "cull face pinned to back"); + assertTrue(GLSMLighting.getLightingState().isEnabled(), "lit"); + assertTrue(GLSMBlend.getColorMask().red, "color mask pinned on"); + assertFalse(GLSMEnable.glIsEnabled(GL11.GL_POLYGON_OFFSET_FILL), "no polygon offset"); assertTrue(GL11.glIsEnabled(GL11.GL_DEPTH_TEST), "driver depth test"); assertEquals(GL11.GL_LEQUAL, GL11.glGetInteger(GL11.GL_DEPTH_FUNC), "driver depth func"); assertTrue(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), "driver depth write"); @@ -475,15 +485,15 @@ class TesrLayerStateTest { }), Arguments.of("every material toggle", (Runnable) () -> { }, TesrMaterial.builder().noCull().unlit().noDepthWrite().cutout(0.5f).translucent().depthEqual().build(), (Runnable) () -> { - assertFalse(GLStateManager.getCullState().isEnabled(), "noCull"); - assertFalse(GLStateManager.getLightingState().isEnabled(), "unlit"); - assertFalse(GLStateManager.getDepthState().isEnabled(), "noDepthWrite"); - assertTrue(GLStateManager.getAlphaTest().isEnabled(), "cutout"); - assertEquals(0.5f, GLStateManager.getAlphaState().getReference(), "cutout threshold"); - assertTrue(GLStateManager.getBlendMode().isEnabled(), "translucent"); - assertEquals(GL11.GL_SRC_ALPHA, GLStateManager.getBlendState().getSrcRgb()); - assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GLStateManager.getBlendState().getDstRgb()); - assertEquals(GL11.GL_EQUAL, GLStateManager.getDepthState().getFunc(), "depthEqual"); + assertFalse(GLSMRasterizer.getCullState().isEnabled(), "noCull"); + assertFalse(GLSMLighting.getLightingState().isEnabled(), "unlit"); + assertFalse(GLSMDepthStencilAlpha.getDepthState().isEnabled(), "noDepthWrite"); + assertTrue(GLSMDepthStencilAlpha.getAlphaTest().isEnabled(), "cutout"); + assertEquals(0.5f, GLSMDepthStencilAlpha.getAlphaState().getReference(), "cutout threshold"); + assertTrue(GLSMBlend.getBlendMode().isEnabled(), "translucent"); + assertEquals(GL11.GL_SRC_ALPHA, GLSMBlend.getBlendState().getSrcRgb()); + assertEquals(GL11.GL_ONE_MINUS_SRC_ALPHA, GLSMBlend.getBlendState().getDstRgb()); + assertEquals(GL11.GL_EQUAL, GLSMDepthStencilAlpha.getDepthState().getFunc(), "depthEqual"); assertFalse(GL11.glIsEnabled(GL11.GL_CULL_FACE), "driver noCull"); assertFalse(GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK), "driver noDepthWrite"); assertTrue(GL11.glIsEnabled(GL11.GL_BLEND), "driver translucent"); @@ -504,15 +514,15 @@ class TesrLayerStateTest { static Stream effectiveStateCases() { return Stream.of( Arguments.of("alpha test", (Runnable) () -> { - GLStateManager.getAlphaTest().setVanillaLayer(AlphaTestStorage.ENABLE_LAYER); - GLStateManager.getAlphaState().setVanillaLayer(AlphaTestStorage.FUNC_LAYER); + GLSMDepthStencilAlpha.getAlphaTest().setVanillaLayer(AlphaTestStorage.ENABLE_LAYER); + GLSMDepthStencilAlpha.getAlphaState().setVanillaLayer(AlphaTestStorage.FUNC_LAYER); - GLStateManager.disableBlend(); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); + GLSMBlend.disableBlend(); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); AlphaTestStorage.overrideAlphaTest(null); @@ -520,29 +530,29 @@ class TesrLayerStateTest { assertSame(EntityMaterials.DROPPED_ITEM_CUTOUT, EntityMaterials.itemFromCurrentState(true)); }), Arguments.of("depth mask", (Runnable) () -> { - GLStateManager.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER); - GLStateManager.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER); + GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER); + GLSMBlend.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.enableBlend(); - GLStateManager.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMBlend.enableBlend(); + GLSMBlend.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); DepthColorStorage.disableDepthColor(); assertSame(EntityMaterials.TRANSLUCENT_DEPTH_WRITE, EntityMaterials.fromCurrentState(true), "raw depth mask held off by another pass; the effective vanilla mask must pick the depth-write variant"); }), Arguments.of("color mask", (Runnable) () -> { - GLStateManager.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER); - GLStateManager.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER); + GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER); + GLSMBlend.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER); - GLStateManager.glEnable(GL11.GL_TEXTURE_2D); - GLStateManager.disableBlend(); - GLStateManager.enableAlphaTest(); - GLStateManager.glAlphaFunc(GL11.GL_GREATER, 0.1f); - GLStateManager.glDepthFunc(GL11.GL_LEQUAL); - GLStateManager.glDepthMask(true); + GLSMEnable.glEnable(GL11.GL_TEXTURE_2D); + GLSMBlend.disableBlend(); + GLSMDepthStencilAlpha.enableAlphaTest(); + GLSMDepthStencilAlpha.glAlphaFunc(GL11.GL_GREATER, 0.1f); + GLSMDepthStencilAlpha.glDepthFunc(GL11.GL_LEQUAL); + GLSMDepthStencilAlpha.glDepthMask(true); DepthColorStorage.disableDepthColor(); assertSame(EntityMaterials.CUTOUT, EntityMaterials.fromCurrentState(true), "raw color mask held off by another pass is not a depth-only draw"); @@ -568,48 +578,48 @@ class TesrLayerStateTest { @Test void memoTracksTextureModeOperationsOnUnitZero() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); final ShaderManager ffp = ShaderManager.getInstance(); ShaderManager.enable(); ffp.activate(); assertTrue(unitTexIdentity(), "a freshly loaded identity unit-0 matrix must read as identity"); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glTranslatef(0.3f, 0.1f, 0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glTranslatef(0.3f, 0.1f, 0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); assertFalse(unitTexIdentity(), "a translate in texture mode must stop reading as identity"); assertEquals(new Matrix4f().translation(0.3f, 0.1f, 0f), texMatrixScratch(), "the scratch copy must hold the unit-0 matrix once it stops being identity"); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glPushMatrix(); - GLStateManager.glLoadIdentity(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glPushMatrix(); + GLSMMatrices.glLoadIdentity(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); assertTrue(unitTexIdentity(), "loadIdentity after a push must read as identity again"); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glPopMatrix(); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glPopMatrix(); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); assertFalse(unitTexIdentity(), "popping back to the earlier translate must stop reading as identity"); assertEquals(new Matrix4f().translation(0.3f, 0.1f, 0f), texMatrixScratch(), "pop must restore the memo to the popped matrix"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glTranslatef(0.5f, 0.5f, 0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glTranslatef(0.5f, 0.5f, 0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); assertFalse(unitTexIdentity(), "a unit-1 operation forces a recompute, but unit 0 itself is unchanged and stays non-identity"); assertEquals(new Matrix4f().translation(0.3f, 0.1f, 0f), texMatrixScratch(), "the recompute must copy unit 0, not the active unit 1"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glMatrixMode(GL11.GL_TEXTURE); - GLStateManager.glLoadIdentity(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glTranslatef(0.5f, 0.5f, 0f); - GLStateManager.glMatrixMode(GL11.GL_MODELVIEW); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMMatrices.glMatrixMode(GL11.GL_TEXTURE); + GLSMMatrices.glLoadIdentity(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMMatrices.glTranslatef(0.5f, 0.5f, 0f); + GLSMMatrices.glMatrixMode(GL11.GL_MODELVIEW); assertTrue(unitTexIdentity(), "an identity unit 0 must read as identity while a non-identity unit 1 is active"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } } diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderProgramsGLTest.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderProgramsGLTest.java index 50739c9d1..857371661 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderProgramsGLTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/TesrShaderProgramsGLTest.java @@ -5,6 +5,11 @@ import com.gtnewhorizons.angelica.api.tesr.TesrShaderUniforms; import com.gtnewhorizons.angelica.api.tesr.TesrShaders; import com.gtnewhorizons.angelica.glsm.CompatUniformManager; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMFog; +import com.gtnewhorizons.angelica.glsm.GLSMLighting; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.ffp.FfpFixture; import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; @@ -115,16 +120,16 @@ class TesrShaderProgramsGLTest { @AfterEach void cleanup() { - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); TesrShaderPrograms.invalidateAll(); Reflect.setStatic(Minecraft.class, "theMinecraft", savedMinecraft); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, 0); - GLStateManager.glDeleteTextures(lightmapTexture); - GLStateManager.glDeleteTextures(otherTexture); - GLStateManager.disableFog(); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, 0); + GLSMTextures.glDeleteTextures(lightmapTexture); + GLSMTextures.glDeleteTextures(otherTexture); + GLSMFog.disableFog(); final ShaderManager ffp = ShaderManager.getInstance(); if (ffp.isActive()) ffp.deactivate(); } @@ -165,12 +170,12 @@ class TesrShaderProgramsGLTest { assertNotEquals(0, entry.baked.program); assertNotEquals(0, entry.instanced.program, "the first layer bind links the instanced variant too"); assertTrue(TesrShaderPrograms.instancedAvailable(entry)); - assertEquals(entry.baked.program, GLStateManager.getActiveProgram()); + assertEquals(entry.baked.program, GLSMPrograms.getActiveProgram()); assertTrue(TesrShaderPrograms.bindInstanced(entry)); - assertEquals(entry.instanced.program, GLStateManager.getActiveProgram()); + assertEquals(entry.instanced.program, GLSMPrograms.getActiveProgram()); TesrShaderPrograms.release(entry); - assertEquals(0, GLStateManager.getActiveProgram(), "release restores the program bound before the layer"); + assertEquals(0, GLSMPrograms.getActiveProgram(), "release restores the program bound before the layer"); assertTrue(TesrShaderPrograms.bindBaked(entry, false)); TesrShaderPrograms.release(entry); @@ -181,14 +186,14 @@ class TesrShaderProgramsGLTest { void linkWaitsWhileADisplayListRecords() { final TesrShaderPrograms.Entry entry = entry(UNLIT_VERTEX, UNLIT_FRAGMENT, null); final long failures = TesrShaderPrograms.linkFailures; - final int list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); + final int list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); try { assertFalse(TesrShaderPrograms.bindBaked(entry, false), "a recording list would capture the link's program switches"); TesrShaderPrograms.release(entry); } finally { - GLStateManager.glEndList(); - GLStateManager.glDeleteLists(list, 1); + GLSMDraws.glEndList(); + GLSMDraws.glDeleteLists(list, 1); } assertEquals(0, reads); assertEquals(failures, TesrShaderPrograms.linkFailures, "the variants stay unlinked, not failed"); @@ -206,7 +211,7 @@ class TesrShaderProgramsGLTest { final long fallbacks = TesrShaderPrograms.fallbacks; assertFalse(TesrShaderPrograms.bindBaked(entry, false)); - assertEquals(0, GLStateManager.getActiveProgram(), "a failed bind leaves the emulation bound"); + assertEquals(0, GLSMPrograms.getActiveProgram(), "a failed bind leaves the emulation bound"); TesrShaderPrograms.release(entry); final int readsAfterFirstBind = reads; assertFalse(TesrShaderPrograms.bindBaked(entry, false)); @@ -216,7 +221,7 @@ class TesrShaderProgramsGLTest { assertEquals(2, TesrShaderPrograms.linkFailures - failures, "each variant reports its failure once, not per bind"); assertEquals(2, TesrShaderPrograms.fallbacks - fallbacks); assertEquals(readsAfterFirstBind, reads, "a failed variant is not retried"); - assertEquals(0, GLStateManager.getActiveProgram()); + assertEquals(0, GLSMPrograms.getActiveProgram()); } @Test @@ -225,11 +230,11 @@ class TesrShaderProgramsGLTest { final long failures = TesrShaderPrograms.linkFailures; assertTrue(TesrShaderPrograms.bindBaked(entry, false), "the baked variant still draws"); - assertEquals(entry.baked.program, GLStateManager.getActiveProgram()); + assertEquals(entry.baked.program, GLSMPrograms.getActiveProgram()); assertFalse(TesrShaderPrograms.instancedAvailable(entry), "the body names a uniform only the baked variant declares"); assertEquals(1, TesrShaderPrograms.linkFailures - failures); assertFalse(TesrShaderPrograms.bindInstanced(entry)); - assertEquals(entry.baked.program, GLStateManager.getActiveProgram(), "a failed instanced bind leaves the baked variant bound"); + assertEquals(entry.baked.program, GLSMPrograms.getActiveProgram(), "a failed instanced bind leaves the baked variant bound"); TesrShaderPrograms.release(entry); assertEquals(1, TesrShaderPrograms.linkFailures - failures, "a failed variant is not retried"); } @@ -241,7 +246,7 @@ class TesrShaderProgramsGLTest { final TesrShaderUniforms uniforms = new TesrShaderUniforms() { @Override public void angelica$linked(int program, boolean instanced) { - assertEquals(program, GLStateManager.getActiveProgram(), "the variant is bound while locations resolve"); + assertEquals(program, GLSMPrograms.getActiveProgram(), "the variant is bound while locations resolve"); linked[instanced ? 1 : 0]++; } @@ -277,26 +282,26 @@ class TesrShaderProgramsGLTest { @Test void lightmapBoundOnUnitOneAndRestored() { final TesrShaderPrograms.Entry entry = entry(LIT_VERTEX, LIT_FRAGMENT, null); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, otherTexture); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, otherTexture); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); assertTrue(TesrShaderPrograms.bindBaked(entry, false)); - assertEquals(otherTexture, GLStateManager.getBoundTextureForServerState(1), "a layer without the lightmap flag leaves unit 1 alone"); + assertEquals(otherTexture, GLSMTextures.getBoundTextureForServerState(1), "a layer without the lightmap flag leaves unit 1 alone"); TesrShaderPrograms.release(entry); assertTrue(TesrShaderPrograms.bindBaked(entry, true)); - assertEquals(lightmapTexture, GLStateManager.getBoundTextureForServerState(1)); - assertEquals(0, GLStateManager.getActiveTextureUnit(), "the bind must not move the active unit"); + assertEquals(lightmapTexture, GLSMTextures.getBoundTextureForServerState(1)); + assertEquals(0, GLSMTextures.getActiveTextureUnit(), "the bind must not move the active unit"); assertEquals(1, uniformInt(entry.baked.program, TesrShaderPrelude.LIGHTMAP_SAMPLER)); assertTrue(TesrShaderPrograms.bindInstanced(entry)); - assertEquals(lightmapTexture, GLStateManager.getBoundTextureForServerState(1)); + assertEquals(lightmapTexture, GLSMTextures.getBoundTextureForServerState(1)); TesrShaderPrograms.release(entry); - assertEquals(otherTexture, GLStateManager.getBoundTextureForServerState(1), "release restores the caller's unit-1 texture"); - assertEquals(0, GLStateManager.getActiveTextureUnit()); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE1); + assertEquals(otherTexture, GLSMTextures.getBoundTextureForServerState(1), "release restores the caller's unit-1 texture"); + assertEquals(0, GLSMTextures.getActiveTextureUnit()); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE1); assertEquals(otherTexture, GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D), "the driver binding is restored too"); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } @Test @@ -305,32 +310,32 @@ class TesrShaderProgramsGLTest { assertTrue(TesrShaderPrograms.bindBaked(entry, false)); final int program = entry.baked.program; - GLStateManager.disableFog(); - GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); + GLSMFog.disableFog(); + GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR); refresh(program); assertEquals(0, uniformInt(program, "angelica_FogMode"), "disabled fog is mode 0 whatever the fog function"); - GLStateManager.enableFog(); + GLSMFog.enableFog(); refresh(program); assertEquals(1, uniformInt(program, "angelica_FogMode")); - GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP); + GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP); refresh(program); assertEquals(2, uniformInt(program, "angelica_FogMode")); - GLStateManager.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP2); + GLSMFog.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP2); refresh(program); assertEquals(3, uniformInt(program, "angelica_FogMode")); - GLStateManager.disableFog(); + GLSMFog.disableFog(); refresh(program); assertEquals(0, uniformInt(program, "angelica_FogMode")); - GLStateManager.glFogf(GL11.GL_FOG_START, 2f); - GLStateManager.glFogf(GL11.GL_FOG_END, 10f); + GLSMFog.glFogf(GL11.GL_FOG_START, 2f); + GLSMFog.glFogf(GL11.GL_FOG_END, 10f); refresh(program); final FloatBuffer params = BufferUtils.createFloatBuffer(4); GL20.glGetUniform(program, GL20.glGetUniformLocation(program, "angelica_FogParams"), params); assertEquals(-1f / 8f, params.get(0), 1e-6f, "a fog range change re-uploads the params"); TesrShaderPrograms.release(entry); - GLStateManager.glFogf(GL11.GL_FOG_START, 0f); - GLStateManager.glFogf(GL11.GL_FOG_END, 1f); + GLSMFog.glFogf(GL11.GL_FOG_START, 0f); + GLSMFog.glFogf(GL11.GL_FOG_END, 1f); } @Test @@ -340,7 +345,7 @@ class TesrShaderProgramsGLTest { final int program = entry.baked.program; final FloatBuffer diffuse = BufferUtils.createFloatBuffer(4); diffuse.put(0.25f).put(0.5f).put(0.75f).put(1f).flip(); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, diffuse); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, diffuse); refresh(program); final int location = GL20.glGetUniformLocation(program, "angelica_LightSource[1].diffuse"); @@ -352,6 +357,6 @@ class TesrShaderProgramsGLTest { TesrShaderPrograms.release(entry); diffuse.clear(); diffuse.put(0f).put(0f).put(0f).put(1f).flip(); - GLStateManager.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, diffuse); + GLSMLighting.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, diffuse); } } diff --git a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaLayerRig.java b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaLayerRig.java index fb96c567e..71312fc2f 100644 --- a/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaLayerRig.java +++ b/src/test/java/com/gtnewhorizons/angelica/rendering/tesr/VanillaLayerRig.java @@ -1,6 +1,7 @@ package com.gtnewhorizons.angelica.rendering.tesr; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; import com.gtnewhorizons.angelica.glsm.hooks.DeferredAlphaHandler; import com.gtnewhorizons.angelica.glsm.hooks.DeferredBlendHandler; import com.gtnewhorizons.angelica.glsm.hooks.DeferredDepthColorHandler; @@ -88,20 +89,20 @@ public final class VanillaLayerRig { } public static void installBlend() { - GLStateManager.getBlendMode().setVanillaLayer(BlendModeStorage.ENABLE_LAYER); - GLStateManager.getBlendState().setVanillaLayer(BlendModeStorage.FUNC_LAYER); + GLSMBlend.getBlendMode().setVanillaLayer(BlendModeStorage.ENABLE_LAYER); + GLSMBlend.getBlendState().setVanillaLayer(BlendModeStorage.FUNC_LAYER); GLSMHooks.blendHandler = new RealBlendHandler(); } public static void installAlpha() { - GLStateManager.getAlphaTest().setVanillaLayer(AlphaTestStorage.ENABLE_LAYER); - GLStateManager.getAlphaState().setVanillaLayer(AlphaTestStorage.FUNC_LAYER); + GLSMDepthStencilAlpha.getAlphaTest().setVanillaLayer(AlphaTestStorage.ENABLE_LAYER); + GLSMDepthStencilAlpha.getAlphaState().setVanillaLayer(AlphaTestStorage.FUNC_LAYER); GLSMHooks.alphaHandler = new RealAlphaHandler(); } public static void installDepthColor() { - GLStateManager.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER); - GLStateManager.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER); + GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(DepthColorStorage.DEPTH_LAYER); + GLSMBlend.getColorMask().setVanillaLayer(DepthColorStorage.COLOR_LAYER); GLSMHooks.depthColorHandler = new RealDepthColorHandler(); } @@ -112,12 +113,12 @@ public final class VanillaLayerRig { } public static void clear() { - GLStateManager.getBlendMode().setVanillaLayer(null); - GLStateManager.getBlendState().setVanillaLayer(null); - GLStateManager.getAlphaTest().setVanillaLayer(null); - GLStateManager.getAlphaState().setVanillaLayer(null); - GLStateManager.getDepthState().setVanillaLayer(null); - GLStateManager.getColorMask().setVanillaLayer(null); + GLSMBlend.getBlendMode().setVanillaLayer(null); + GLSMBlend.getBlendState().setVanillaLayer(null); + GLSMDepthStencilAlpha.getAlphaTest().setVanillaLayer(null); + GLSMDepthStencilAlpha.getAlphaState().setVanillaLayer(null); + GLSMDepthStencilAlpha.getDepthState().setVanillaLayer(null); + GLSMBlend.getColorMask().setVanillaLayer(null); GLSMHooks.blendHandler = null; GLSMHooks.alphaHandler = null; GLSMHooks.depthColorHandler = null; diff --git a/src/test/java/com/gtnewhorizons/angelica/utils/DisplayListTextureAnimationTest.java b/src/test/java/com/gtnewhorizons/angelica/utils/DisplayListTextureAnimationTest.java index 9d389f761..b62c9c7d5 100644 --- a/src/test/java/com/gtnewhorizons/angelica/utils/DisplayListTextureAnimationTest.java +++ b/src/test/java/com/gtnewhorizons/angelica/utils/DisplayListTextureAnimationTest.java @@ -2,7 +2,7 @@ package com.gtnewhorizons.angelica.utils; import com.gtnewhorizons.angelica.glsm.DisplayListManager; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; import com.gtnewhorizons.angelica.glsm.recording.GLCommand; import com.gtnewhorizons.angelica.mixins.interfaces.IPatchedTextureAtlasSprite; import org.junit.jupiter.api.Test; @@ -60,21 +60,21 @@ class DisplayListTextureAnimationTest { void cachedDrawMarksItsSpriteEveryFrame() { final IPatchedTextureAtlasSprite sprite = mock(IPatchedTextureAtlasSprite.class); for (int mode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) { - final int list = GLStateManager.glGenLists(1); + final int list = GLSMDraws.glGenLists(1); try { - GLStateManager.glNewList(list, mode); + GLSMDraws.glNewList(list, mode); for (int vertex = 0; vertex < 1000; vertex++) AnimationsRenderUtils.recordSpriteUsage(sprite); - GLStateManager.glEndList(); + GLSMDraws.glEndList(); assertEquals(1, DisplayListManager.getDisplayList(list).getCommandCounts().get(GLCommand.COMPLEX_REF), "repeated UV accesses should record only one notification"); for (int frame = 0; frame < 3; frame++) { clearInvocations(sprite); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); verify(sprite).angelica$markNeedsAnimationUpdate(); } } finally { - if (DisplayListManager.isRecording()) GLStateManager.glEndList(); - GLStateManager.glDeleteLists(list, 1); + if (DisplayListManager.isRecording()) GLSMDraws.glEndList(); + GLSMDraws.glDeleteLists(list, 1); } } } diff --git a/src/test/java/net/coderbot/iris/gl/program/ProgramBindingRegressionTest.java b/src/test/java/net/coderbot/iris/gl/program/ProgramBindingRegressionTest.java index 749f8aee1..a3f33beef 100644 --- a/src/test/java/net/coderbot/iris/gl/program/ProgramBindingRegressionTest.java +++ b/src/test/java/net/coderbot/iris/gl/program/ProgramBindingRegressionTest.java @@ -3,7 +3,8 @@ package net.coderbot.iris.gl.program; import com.google.common.collect.ImmutableSet; import com.gtnewhorizons.angelica.glsm.DisplayListManager; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; import com.gtnewhorizons.angelica.glsm.backend.RenderBackend; @@ -35,55 +36,55 @@ class ProgramBindingRegressionTest { final int caller = linkedProgram(); try { for (int mode : new int[] { GL11.GL_COMPILE, GL11.GL_COMPILE_AND_EXECUTE }) { - final int list = GLStateManager.glGenLists(1); + final int list = GLSMDraws.glGenLists(1); Program initialized = null; - GLStateManager.glUseProgram(caller); + GLSMPrograms.glUseProgram(caller); try { - GLStateManager.glNewList(list, mode); + GLSMDraws.glNewList(list, mode); initialized = ProgramBuilder.begin("fallback-test", vertex, null, fragment, ImmutableSet.of(0)).build(); assertEquals(mode == GL11.GL_COMPILE ? DisplayListManager.RecordMode.COMPILE : DisplayListManager.RecordMode.COMPILE_AND_EXECUTE, DisplayListManager.getRecordMode()); - assertEquals(caller, GLStateManager.getActiveProgram()); + assertEquals(caller, GLSMPrograms.getActiveProgram()); assertEquals(caller, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM)); - GLStateManager.glEndList(); - final int location = GLStateManager.glGetUniformLocation(initialized.getProgramId(), "alphaTestRef"); + GLSMDraws.glEndList(); + final int location = GLSMPrograms.glGetUniformLocation(initialized.getProgramId(), "alphaTestRef"); assertNotEquals(-1, location); final FloatBuffer value = BufferUtils.createFloatBuffer(4); - GLStateManager.glGetUniform(initialized.getProgramId(), location, value); + GLSMPrograms.glGetUniform(initialized.getProgramId(), location, value); assertEquals(-1f, value.get(0)); assertEquals(0, DisplayListManager.getDisplayList(list).getCommandCounts().get(GLCommand.USE_PROGRAM)); - GLStateManager.glCallList(list); - assertEquals(caller, GLStateManager.getActiveProgram()); + GLSMDraws.glCallList(list); + assertEquals(caller, GLSMPrograms.getActiveProgram()); } finally { - if (DisplayListManager.isRecording()) GLStateManager.glEndList(); - GLStateManager.glDeleteLists(list, 1); + if (DisplayListManager.isRecording()) GLSMDraws.glEndList(); + GLSMDraws.glDeleteLists(list, 1); if (initialized != null) initialized.destroy(); } } } finally { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(caller); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(caller); } } @Test void deletionBookkeepingRetainsOnlyDeferredDeletes() { final int bound = linkedProgram(); - GLStateManager.glUseProgram(bound); - GLStateManager.glDeleteProgram(bound); - assertTrue(GLStateManager.isProgramPendingDeletion(bound)); + GLSMPrograms.glUseProgram(bound); + GLSMPrograms.glDeleteProgram(bound); + assertTrue(GLSMPrograms.isProgramPendingDeletion(bound)); assertTrue(GL20.glIsProgram(bound), "driver keeps the bound program alive"); final int other = linkedProgram(); - GLStateManager.glUseProgram(other); + GLSMPrograms.glUseProgram(other); for (int i = 0; i < 8; i++) { - final int unused = GLStateManager.glCreateProgram(); - GLStateManager.glDeleteProgram(unused); - assertFalse(GLStateManager.isProgramPendingDeletion(unused)); + final int unused = GLSMPrograms.glCreateProgram(); + GLSMPrograms.glDeleteProgram(unused); + assertFalse(GLSMPrograms.isProgramPendingDeletion(unused)); assertFalse(GL20.glIsProgram(unused), "driver deletes an unbound program immediately"); - assertFalse(GLStateManager.isProgramPendingDeletion(bound)); + assertFalse(GLSMPrograms.isProgramPendingDeletion(bound)); } - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(other); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(other); } private static int linkedProgram() { @@ -108,22 +109,22 @@ class ProgramBindingRegressionTest { Reflect.setStaticFinal(Iris.class, "enabled", boolean.class, true); try { for (int i = 0; i < 3; i++) { - GLStateManager.glUseProgram(other); + GLSMPrograms.glUseProgram(other); program.use(); verify(uniforms, times(i + 1)).update(); assertFalse(Program.isManagedBind(id)); } program.use(); // Cached binds must still update dynamic uniforms. verify(uniforms, times(4)).update(); - GLStateManager.glUseProgram(other); - GLStateManager.glUseProgram(id); + GLSMPrograms.glUseProgram(other); + GLSMPrograms.glUseProgram(id); verify(uniforms, times(5)).update(); } finally { Reflect.setStaticFinal(Iris.class, "enabled", boolean.class, enabled); Reflect.set(manager, "pipeline", previous); - GLStateManager.glUseProgram(0); + GLSMPrograms.glUseProgram(0); program.destroy(); - GLStateManager.glDeleteProgram(other); + GLSMPrograms.glDeleteProgram(other); } } @@ -131,44 +132,44 @@ class ProgramBindingRegressionTest { void replayCachesValidityAndRevalidatesDeletionIncludingBoundPrograms() { int id = linkedProgram(); int other = linkedProgram(); - int list = GLStateManager.glGenLists(1); - GLStateManager.glNewList(list, GL11.GL_COMPILE); - GLStateManager.glUseProgram(id); - GLStateManager.glEndList(); + int list = GLSMDraws.glGenLists(1); + GLSMDraws.glNewList(list, GL11.GL_COMPILE); + GLSMPrograms.glUseProgram(id); + GLSMDraws.glEndList(); RenderBackend original = BackendManager.RENDER_BACKEND; RenderBackend backend = mock(RenderBackend.class, delegatesTo(original)); Reflect.setStaticFinal(BackendManager.class, "RENDER_BACKEND", RenderBackend.class, backend); boolean idDeleted = false; boolean otherDeleted = false; try { - for (int i = 0; i < 5; i++) GLStateManager.glCallList(list); + for (int i = 0; i < 5; i++) GLSMDraws.glCallList(list); verify(backend, times(1)).isProgram(id); - assertEquals(id, GLStateManager.getActiveProgram()); + assertEquals(id, GLSMPrograms.getActiveProgram()); assertEquals(id, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM)); - GLStateManager.glDeleteProgram(id); + GLSMPrograms.glDeleteProgram(id); idDeleted = true; - GLStateManager.glCallList(list); // Still valid while bound, but must not be cached. - assertEquals(id, GLStateManager.getActiveProgram()); + GLSMDraws.glCallList(list); // Still valid while bound, but must not be cached. + assertEquals(id, GLSMPrograms.getActiveProgram()); assertEquals(id, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM)); - GLStateManager.glUseProgram(other); // Completes deferred deletion. - GLStateManager.glCallList(list); - assertEquals(0, GLStateManager.getActiveProgram()); + GLSMPrograms.glUseProgram(other); // Completes deferred deletion. + GLSMDraws.glCallList(list); + assertEquals(0, GLSMPrograms.getActiveProgram()); verify(backend, times(4)).isProgram(id); - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); verify(backend, times(4)).isProgram(id); - GLStateManager.glDeleteProgram(other); + GLSMPrograms.glDeleteProgram(other); otherDeleted = true; - GLStateManager.glCallList(list); + GLSMDraws.glCallList(list); verify(backend, times(5)).isProgram(id); } finally { Reflect.setStaticFinal(BackendManager.class, "RENDER_BACKEND", RenderBackend.class, original); - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteLists(list, 1); + GLSMPrograms.glUseProgram(0); + GLSMDraws.glDeleteLists(list, 1); // FFP's glUseProgram(0) is lazy, so other stays current; deleting it again is GL_INVALID_OPERATION on macOS - if (!idDeleted) GLStateManager.glDeleteProgram(id); - if (!otherDeleted) GLStateManager.glDeleteProgram(other); + if (!idDeleted) GLSMPrograms.glDeleteProgram(id); + if (!otherDeleted) GLSMPrograms.glDeleteProgram(other); } } } diff --git a/src/test/java/net/coderbot/iris/pipeline/AttributeTransformerLinkGLTest.java b/src/test/java/net/coderbot/iris/pipeline/AttributeTransformerLinkGLTest.java index 005ed689c..5c4b162eb 100644 --- a/src/test/java/net/coderbot/iris/pipeline/AttributeTransformerLinkGLTest.java +++ b/src/test/java/net/coderbot/iris/pipeline/AttributeTransformerLinkGLTest.java @@ -1,7 +1,7 @@ package net.coderbot.iris.pipeline; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; import com.gtnewhorizons.angelica.glsm.shader.ShaderType; import net.coderbot.iris.gbuffer_overrides.matching.InputAvailability; import net.coderbot.iris.gl.shader.GlShader; @@ -102,10 +102,10 @@ class AttributeTransformerLinkGLTest { final Map result = TransformPatcher.patchAttributesWideLines(COMPAT_VERTEX, null, null, null, COMPAT_FRAGMENT, InputAvailability.NONE); final int program = link("wideLines", result); try { - assertNotEquals(-1, GLStateManager.glGetUniformLocation(program, "iris_LineWidth"), () -> result.get(PatchShaderType.VERTEX)); - assertNotEquals(-1, GLStateManager.glGetUniformLocation(program, "iris_ScreenSize"), () -> result.get(PatchShaderType.VERTEX)); + assertNotEquals(-1, GLSMPrograms.glGetUniformLocation(program, "iris_LineWidth"), () -> result.get(PatchShaderType.VERTEX)); + assertNotEquals(-1, GLSMPrograms.glGetUniformLocation(program, "iris_ScreenSize"), () -> result.get(PatchShaderType.VERTEX)); } finally { - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glDeleteProgram(program); } } @@ -115,17 +115,17 @@ class AttributeTransformerLinkGLTest { final int program = link("coreProfileInputs", result); try { for (String input : new String[] {"vaPosition", "vaNormal", "vaColor", "vaUV2"}) { - assertEquals(-1, GLStateManager.glGetAttribLocation(program, input), () -> input + " left unmapped:\n" + result.get(PatchShaderType.VERTEX)); + assertEquals(-1, GLSMPrograms.glGetAttribLocation(program, input), () -> input + " left unmapped:\n" + result.get(PatchShaderType.VERTEX)); } - assertEquals(0, GLStateManager.glGetAttribLocation(program, "iris_Vertex")); - assertEquals(1, GLStateManager.glGetAttribLocation(program, "iris_Color")); - assertEquals(4, GLStateManager.glGetAttribLocation(program, "iris_Normal")); - assertEquals(-1, GLStateManager.glGetUniformLocation(program, "modelViewMatrix")); - assertEquals(-1, GLStateManager.glGetUniformLocation(program, "projectionMatrix")); - assertNotEquals(-1, GLStateManager.glGetUniformLocation(program, "iris_ModelViewMatrix")); - assertNotEquals(-1, GLStateManager.glGetUniformLocation(program, "iris_ProjectionMatrix")); + assertEquals(0, GLSMPrograms.glGetAttribLocation(program, "iris_Vertex")); + assertEquals(1, GLSMPrograms.glGetAttribLocation(program, "iris_Color")); + assertEquals(4, GLSMPrograms.glGetAttribLocation(program, "iris_Normal")); + assertEquals(-1, GLSMPrograms.glGetUniformLocation(program, "modelViewMatrix")); + assertEquals(-1, GLSMPrograms.glGetUniformLocation(program, "projectionMatrix")); + assertNotEquals(-1, GLSMPrograms.glGetUniformLocation(program, "iris_ModelViewMatrix")); + assertNotEquals(-1, GLSMPrograms.glGetUniformLocation(program, "iris_ProjectionMatrix")); } finally { - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glDeleteProgram(program); } } } diff --git a/src/test/java/net/coderbot/iris/pipeline/IrisInstancingGLTest.java b/src/test/java/net/coderbot/iris/pipeline/IrisInstancingGLTest.java index e311281af..cbd176b2f 100644 --- a/src/test/java/net/coderbot/iris/pipeline/IrisInstancingGLTest.java +++ b/src/test/java/net/coderbot/iris/pipeline/IrisInstancingGLTest.java @@ -2,6 +2,16 @@ package net.coderbot.iris.pipeline; import com.gtnewhorizons.angelica.glsm.EntityIdsOnlyHandler; import com.gtnewhorizons.angelica.glsm.GLCoreTest; +import com.gtnewhorizons.angelica.glsm.GLSMAttribStack; +import com.gtnewhorizons.angelica.glsm.GLSMBlend; +import com.gtnewhorizons.angelica.glsm.GLSMBuffers; +import com.gtnewhorizons.angelica.glsm.GLSMCurrentAttribs; +import com.gtnewhorizons.angelica.glsm.GLSMDepthStencilAlpha; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMFramebuffer; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMRasterizer; +import com.gtnewhorizons.angelica.glsm.GLSMVertexInput; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.ffp.Instancing; @@ -180,7 +190,7 @@ class IrisInstancingGLTest { @BeforeEach void setUp() { TransformTestSupport.clearCaches(); - GLStateManager.disableBlend(); + GLSMBlend.disableBlend(); } @AfterEach @@ -209,7 +219,7 @@ class IrisInstancingGLTest { @Test void settersDeferInsideASafeBatchWindowAndResolveWhenItCloses() { final DeferredWorldRenderingPipeline pipeline = newPipeline(WorldRenderingPhase.ENTITIES, true); - final long dc = GLStateManager.drawCalls; + final long dc = GLSMDraws.drawCalls; BatchEligibility.begin(BatchEligibility.SAFE, dc); BatchEligibility.begin(BatchEligibility.SAFE, dc); @@ -252,7 +262,7 @@ class IrisInstancingGLTest { final DeferredWorldRenderingPipeline pipeline = newPipeline(WorldRenderingPhase.ENTITIES, true); Reflect.set(pipeline, "currentCondition", RenderCondition.ENTITIES); - final long dc = GLStateManager.drawCalls; + final long dc = GLSMDraws.drawCalls; BatchEligibility.begin(BatchEligibility.SAFE, dc); pipeline.setInputs(InputAvailability.of(true, true)); assertSame(pipeline, GLSMHooks.pendingProgramSelection); @@ -268,12 +278,12 @@ class IrisInstancingGLTest { void rebindCurrentPassResolvesBeforeItsOwnNullPassFallback() { final DeferredWorldRenderingPipeline pipeline = newPipeline(WorldRenderingPhase.ENTITIES, true); - final int program = GLStateManager.glCreateProgram(); - GLStateManager.glUseProgram(program); + final int program = GLSMPrograms.glCreateProgram(); + GLSMPrograms.glUseProgram(program); // Never linked, so the driver rejects the bind; GLSM still tracks it as the active program. assertEquals(GL11.GL_INVALID_OPERATION, GL11.glGetError()); try { - final long dc = GLStateManager.drawCalls; + final long dc = GLSMDraws.drawCalls; BatchEligibility.begin(BatchEligibility.SAFE, dc); pipeline.setInputs(InputAvailability.of(true, true)); assertSame(pipeline, GLSMHooks.pendingProgramSelection); @@ -284,8 +294,8 @@ class IrisInstancingGLTest { BatchEligibility.end(BatchEligibility.SAFE, dc); } finally { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(program); } } @@ -321,7 +331,7 @@ class IrisInstancingGLTest { } private static void link(String name, Map result) { - GLStateManager.glDeleteProgram(linkProgram(name, result)); + GLSMPrograms.glDeleteProgram(linkProgram(name, result)); } @ParameterizedTest @@ -344,21 +354,21 @@ class IrisInstancingGLTest { final int program = linkProgram("entityTint", kind == Instancing.NONE ? TransformPatcher.patchAttributes(vertexSource, null, fragmentSource, TEX_LM) : TransformPatcher.patchAttributesInstanced(vertexSource, null, null, null, fragmentSource, TEX_LM, false, kind)); - final int vao = GLStateManager.glGenVertexArrays(); - final int buffer = GLStateManager.glGenBuffers(); - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + final int vao = GLSMVertexInput.glGenVertexArrays(); + final int buffer = GLSMBuffers.glGenBuffers(); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); try { - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.glViewport(0, 0, 8, 8); - GLStateManager.glUseProgram(program); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); + GLSMBlend.glColorMask(true, true, true, true); + GLSMRasterizer.glViewport(0, 0, 8, 8); + GLSMPrograms.glUseProgram(program); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); InstancedAttribs.pointHead(0, InstancedAttribs.HEAD_SIZE); - GLStateManager.glEnableVertexAttribArray(InstancedAttribs.LOC_OVERLAY); - GLStateManager.glVertexAttribDivisor(InstancedAttribs.LOC_OVERLAY, 1); + GLSMVertexInput.glEnableVertexAttribArray(InstancedAttribs.LOC_OVERLAY); + GLSMVertexInput.glVertexAttribDivisor(InstancedAttribs.LOC_OVERLAY, 1); final ByteBuffer data = BufferUtils.createByteBuffer(InstancedAttribs.HEAD_SIZE); final var builder = ProgramUniforms.builder("entityTint", program); builder.uniform4f("entityColor", state::getCurrentEntityColor, state.getEntityColorNotifier()); @@ -366,11 +376,11 @@ class IrisInstancingGLTest { final Consumer checkPixel = expected -> { for (Uniform uniform : uniforms) uniform.update(); data.putInt(InstancedAttribs.OFFSET_OVERLAY, AngelicaBufferSource.packEntityColor(state.getCurrentEntityColor())); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); - GLStateManager.glClearColor(0, 0, 0, 1); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - if (kind == Instancing.NONE) GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); - else GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 1); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); + GLSMBlend.glClearColor(0, 0, 0, 1); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + if (kind == Instancing.NONE) GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + else GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 1); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "draw error"); final int[] pixel = FfpFixture.readPixel(0, 0); for (int channel = 0; channel < 4; channel++) { @@ -385,13 +395,13 @@ class IrisInstancingGLTest { checkPixel.accept(new int[] {0, 0, 255, 255}); } finally { state.getEntityColorNotifier().setListener(null); - GLStateManager.glUseProgram(0); - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDeleteBuffers(buffer); - GLStateManager.glDeleteVertexArrays(vao); - GLStateManager.glDeleteProgram(program); - GLStateManager.glPopAttrib(); + GLSMPrograms.glUseProgram(0); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glDeleteBuffers(buffer); + GLSMVertexInput.glDeleteVertexArrays(vao); + GLSMPrograms.glDeleteProgram(program); + GLSMAttribStack.glPopAttrib(); } } @@ -418,41 +428,41 @@ class IrisInstancingGLTest { } """; final int[] ids = { -1, 0, 32767, 32768, 45020, 50020, 50072, 65534 }; - final int vao = GLStateManager.glGenVertexArrays(); - final int buffer = GLStateManager.glGenBuffers(); - GLStateManager.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); - GLStateManager.disableDepthTest(); - GLStateManager.disableCull(); - GLStateManager.glColorMask(true, true, true, true); - GLStateManager.glViewport(0, 0, 8, 8); + final int vao = GLSMVertexInput.glGenVertexArrays(); + final int buffer = GLSMBuffers.glGenBuffers(); + GLSMAttribStack.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GLSMDepthStencilAlpha.disableDepthTest(); + GLSMRasterizer.disableCull(); + GLSMBlend.glColorMask(true, true, true, true); + GLSMRasterizer.glViewport(0, 0, 8, 8); try { for (Instancing kind : new Instancing[] { Instancing.TEMPLATE, Instancing.CUBE }) { final int program = linkProgram("highIds", TransformPatcher.patchAttributesInstanced( vertexSource, null, null, null, fragmentSource, TEX_LM, false, kind)); try { - GLStateManager.glUseProgram(program); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7); - GLStateManager.glBindVertexArray(vao); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); + GLSMPrograms.glUseProgram(program); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7); + GLSMVertexInput.glBindVertexArray(vao); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, buffer); InstancedAttribs.pointHead(0, InstancedAttribs.HEAD_SIZE); - GLStateManager.glEnableVertexAttribArray(InstancedAttribs.LOC_ENTITY); - GLStateManager.glVertexAttribDivisor(InstancedAttribs.LOC_ENTITY, 1); + GLSMVertexInput.glEnableVertexAttribArray(InstancedAttribs.LOC_ENTITY); + GLSMVertexInput.glVertexAttribDivisor(InstancedAttribs.LOC_ENTITY, 1); final ByteBuffer data = BufferUtils.createByteBuffer(InstancedAttribs.HEAD_SIZE); for (int id : ids) { data.putLong(InstancedAttribs.OFFSET_ENTITY, InstancedAttribs.packEntityInfo(id, id, id)); - GLStateManager.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "expectedId"), id); - GLStateManager.glClearColor(0, 0, 0, 1); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 1); + GLSMBuffers.glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STREAM_DRAW); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "expectedId"), id); + GLSMBlend.glClearColor(0, 0, 0, 1); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMDraws.glDrawArraysInstanced(GL11.GL_TRIANGLES, 0, 3, 1); assertEquals(program, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM), "draw program"); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "draw error"); final int[] pixel = FfpFixture.readPixel(0, 0); assertEquals(255, pixel[1], kind + " material ID " + id + " pixel " + Arrays.toString(pixel)); } } finally { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(program); } } @@ -460,31 +470,31 @@ class IrisInstancingGLTest { final ImmediateExtendedAttribHandler previousHandler = GLSMHooks.immediateExtendedHandler; try { EntityIdsOnlyHandler.install(); - GLStateManager.glUseProgram(program); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7); - GLStateManager.glBindVertexArray(vao); + GLSMPrograms.glUseProgram(program); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "iris_currentAlphaFunc"), 7); + GLSMVertexInput.glBindVertexArray(vao); for (int id : ids) { - GLStateManager.setEntityIds(id, id, id); - GLStateManager.glUniform1i(GLStateManager.glGetUniformLocation(program, "expectedId"), id); - GLStateManager.glClearColor(0, 0, 0, 1); - GLStateManager.glClear(GL11.GL_COLOR_BUFFER_BIT); - GLStateManager.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); + GLSMCurrentAttribs.setEntityIds(id, id, id); + GLSMPrograms.glUniform1i(GLSMPrograms.glGetUniformLocation(program, "expectedId"), id); + GLSMBlend.glClearColor(0, 0, 0, 1); + GLSMFramebuffer.glClear(GL11.GL_COLOR_BUFFER_BIT); + GLSMDraws.glDrawArrays(GL11.GL_TRIANGLES, 0, 3); assertEquals(GL11.GL_NO_ERROR, GL11.glGetError(), "draw error"); final int[] pixel = FfpFixture.readPixel(0, 0); assertEquals(255, pixel[1], "immediate material ID " + id + " pixel " + Arrays.toString(pixel)); } } finally { - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(program); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(program); GLSMHooks.immediateExtendedHandler = previousHandler; - GLStateManager.setEntityIds(-1, 0, -1); + GLSMCurrentAttribs.setEntityIds(-1, 0, -1); } } finally { - GLStateManager.glBindVertexArray(0); - GLStateManager.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - GLStateManager.glDeleteBuffers(buffer); - GLStateManager.glDeleteVertexArrays(vao); - GLStateManager.glPopAttrib(); + GLSMVertexInput.glBindVertexArray(0); + GLSMBuffers.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + GLSMBuffers.glDeleteBuffers(buffer); + GLSMVertexInput.glDeleteVertexArrays(vao); + GLSMAttribStack.glPopAttrib(); } } @@ -512,6 +522,6 @@ class IrisInstancingGLTest { } private static void compile(int type, String source) { - GLStateManager.glDeleteShader(GlTestSupport.compile(type, source)); + GLSMPrograms.glDeleteShader(GlTestSupport.compile(type, source)); } } diff --git a/src/test/java/net/coderbot/iris/pipeline/PbrSamplerBindingGLTest.java b/src/test/java/net/coderbot/iris/pipeline/PbrSamplerBindingGLTest.java index a925b1ebf..c239011d4 100644 --- a/src/test/java/net/coderbot/iris/pipeline/PbrSamplerBindingGLTest.java +++ b/src/test/java/net/coderbot/iris/pipeline/PbrSamplerBindingGLTest.java @@ -1,7 +1,8 @@ package net.coderbot.iris.pipeline; import com.gtnewhorizons.angelica.glsm.GLCoreTest; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMPrograms; +import com.gtnewhorizons.angelica.glsm.GLSMTextures; import com.gtnewhorizons.angelica.glsm.GlTestSupport; import com.gtnewhorizons.angelica.glsm.RenderSystem; import com.gtnewhorizons.angelica.glsm.backend.BackendManager; @@ -72,7 +73,7 @@ class PbrSamplerBindingGLTest { BlockRenderingSettings.INSTANCE.setBreaksAnisotropy(false); program = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, TestPaths.readString("src/test/resources/assets/angelica/shaders/pbrSamplerBindingTest.fsh")); - GLStateManager.glUseProgram(program); + GLSMPrograms.glUseProgram(program); normal = texture(); specular = texture(); custom = texture(); @@ -82,20 +83,20 @@ class PbrSamplerBindingGLTest { void tearDown() { ProgramSamplers.clearActiveSamplers(); BlockRenderingSettings.INSTANCE.setBreaksAnisotropy(false); - GLStateManager.glUseProgram(0); - GLStateManager.glDeleteProgram(program); - GLStateManager.glDeleteTextures(normal); - GLStateManager.glDeleteTextures(specular); - GLStateManager.glDeleteTextures(custom); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); + GLSMPrograms.glUseProgram(0); + GLSMPrograms.glDeleteProgram(program); + GLSMTextures.glDeleteTextures(normal); + GLSMTextures.glDeleteTextures(specular); + GLSMTextures.glDeleteTextures(custom); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); } private static int texture() { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0); - final int texture = GLStateManager.glGenTextures(); - GLStateManager.glBindTexture(GL11.GL_TEXTURE_2D, texture); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); - GLStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0); + final int texture = GLSMTextures.glGenTextures(); + GLSMTextures.glBindTexture(GL11.GL_TEXTURE_2D, texture); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GLSMTextures.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); return texture; } @@ -116,7 +117,7 @@ class PbrSamplerBindingGLTest { } private static int boundSampler(int unit) { - GLStateManager.glActiveTexture(GL13.GL_TEXTURE0 + unit); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0 + unit); return GL11.glGetInteger(GL33.GL_SAMPLER_BINDING); } @@ -246,7 +247,7 @@ class PbrSamplerBindingGLTest { assertNotEquals(0, boundSampler(5)); assertNotEquals(0, boundSampler(6)); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); switch (kind) { case GRAPHICS -> Program.unbind(); case COMPUTE -> ComputeProgram.unbind(); @@ -268,7 +269,7 @@ class PbrSamplerBindingGLTest { () -> { throw new IllegalStateException("Failed sampler lookup"); }, "specular"); final ProgramSamplers samplers = builder.build(); - GLStateManager.glActiveTexture(GL13.GL_TEXTURE2); + GLSMTextures.glActiveTexture(GL13.GL_TEXTURE2); assertThrows(IllegalStateException.class, samplers::update); assertEquals(GL13.GL_TEXTURE2, GL11.glGetInteger(GL13.GL_ACTIVE_TEXTURE)); assertEquals(0, boundSampler(NORMAL_UNIT)); diff --git a/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinMinecraft_FrameHook.java b/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinMinecraft_FrameHook.java index 58192ecf8..4a8e5e157 100644 --- a/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinMinecraft_FrameHook.java +++ b/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinMinecraft_FrameHook.java @@ -1,5 +1,6 @@ package com.gtnewhorizons.umbra.mixins.early.glsm; +import com.gtnewhorizons.angelica.glsm.GLSMEnable; import com.gtnewhorizons.angelica.glsm.GLStateManager; import com.gtnewhorizons.angelica.glsm.ffp.ShaderManager; import com.gtnewhorizons.angelica.glsm.hooks.FrameHooks; @@ -39,7 +40,7 @@ public class MixinMinecraft_FrameHook { at = @At(value = "INVOKE", target = "Lcpw/mods/fml/common/FMLCommonHandler;onRenderTickEnd(F)V", shift = At.Shift.AFTER, remap = false) ) private void umbra$injectLightingFixPostRenderTick(CallbackInfo ci) { - GLStateManager.glEnable(GL11.GL_LIGHTING); + GLSMEnable.glEnable(GL11.GL_LIGHTING); } @Inject(method = "runGameLoop", at = @At("RETURN")) diff --git a/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinWorldRenderer_VertexState.java b/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinWorldRenderer_VertexState.java index 79ed12239..e05510829 100644 --- a/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinWorldRenderer_VertexState.java +++ b/umbra/src/mixin/java/com/gtnewhorizons/umbra/mixins/early/glsm/MixinWorldRenderer_VertexState.java @@ -10,7 +10,8 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.gtnewhorizons.angelica.glsm.GLStateManager; +import com.gtnewhorizons.angelica.glsm.GLSMDraws; +import com.gtnewhorizons.angelica.glsm.GLSMMatrices; import net.minecraftforge.client.ForgeHooksClient; @Mixin(WorldRenderer.class) @@ -24,8 +25,8 @@ public class MixinWorldRenderer_VertexState { // Can't get vertex state from DirectTessellator, draw and return Tessellator.instance.draw(); ForgeHooksClient.onPostRenderWorld((WorldRenderer)(Object)this, pass); - GLStateManager.glPopMatrix(); - GLStateManager.glEndList(); + GLSMMatrices.glPopMatrix(); + GLSMDraws.glEndList(); ci.cancel(); } }