From 8785224c517a9a5302e3efbbce5cbe55c22a8767 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 11 Apr 2026 11:04:48 -0500 Subject: [PATCH] profile wrapper try-finally for pushes --- .../blaze/BlazeDhGenericObjectRenderer.java | 335 ++++++++------- .../render/blaze/BlazeDhTerrainRenderer.java | 384 +++++++++--------- .../generic/GlGenericObjectRenderer.java | 359 ++++++++-------- .../fade/GlDhFarFadeRenderer.java | 8 - .../fade/GlVanillaFadeRenderer.java | 15 +- .../wrappers/minecraft/ProfilerWrapper.java | 44 +- coreSubProjects | 2 +- 7 files changed, 569 insertions(+), 578 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java index 238176f2e..be403eaaa 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java @@ -330,194 +330,194 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer @Override public void render(RenderParams renderEventParam, IProfilerWrapper profiler, boolean renderingWithSsao) { - //==============// - // render setup // - //==============// - //#region - profiler.push("setup"); - - this.init(); - - ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericRenderSetupEvent.class, renderEventParam); - - Vec3d camPos = MC_RENDER.getCameraExactPosition(); - - //#endregion - - if (BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper.isEmpty() - || BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.isEmpty()) + try (IProfilerWrapper.IProfileBlock generic_profile = profiler.push("setup")) { - return; - } - - - - //===========// - // rendering // - //===========// - //#region - - Collection boxList = this.boxGroupById.values(); - for (RenderableBoxGroup boxGroup : boxList) - { - // validation // - // shouldn't happen, but just in case - if (boxGroup == null) + + //==============// + // render setup // + //==============// + //#region + + this.init(); + + ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericRenderSetupEvent.class, renderEventParam); + + Vec3d camPos = MC_RENDER.getCameraExactPosition(); + + //#endregion + + if (BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper.isEmpty() + || BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.isEmpty()) { - continue; + return; } - // skip boxes that shouldn't render this pass - if (boxGroup.ssaoEnabled != renderingWithSsao) - { - continue; - } - profiler.popPush("render prep"); - boxGroup.preRender(renderEventParam); // called even if the group is inactive, so the group can be activate if desired - // ignore inactive groups - if (!boxGroup.active) - { - continue; - } + //===========// + // rendering // + //===========// + //#region - // allow API users to cancel this object's rendering - boolean cancelRendering = ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericObjectRenderEvent.class, new DhApiBeforeGenericObjectRenderEvent.EventParam(renderEventParam, boxGroup)); - if (cancelRendering) + Collection boxList = this.boxGroupById.values(); + for (RenderableBoxGroup boxGroup : boxList) { - continue; - } - - // update instanced data if needed - { - boxGroup.tryUpdateInstancedDataAsync(); + // validation // - // skip groups that haven't been uploaded yet - if (boxGroup.vertexBufferContainer.getState() != IDhGenericObjectVertexBufferContainer.EState.RENDER) + // shouldn't happen, but just in case + if (boxGroup == null) { continue; } + + // skip boxes that shouldn't render this pass + if (boxGroup.ssaoEnabled != renderingWithSsao) + { + continue; + } + + profiler.popPush("render prep"); + boxGroup.preRender(renderEventParam); // called even if the group is inactive, so the group can be activate if desired + + // ignore inactive groups + if (!boxGroup.active) + { + continue; + } + + // allow API users to cancel this object's rendering + boolean cancelRendering = ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericObjectRenderEvent.class, new DhApiBeforeGenericObjectRenderEvent.EventParam(renderEventParam, boxGroup)); + if (cancelRendering) + { + continue; + } + + // update instanced data if needed + { + boxGroup.tryUpdateInstancedDataAsync(); + + // skip groups that haven't been uploaded yet + if (boxGroup.vertexBufferContainer.getState() != IDhGenericObjectVertexBufferContainer.EState.RENDER) + { + continue; + } + } + + + DhApiRenderableBoxGroupShading shading = boxGroup.shading; + if (shading == null) + { + shading = DEFAULT_SHADING; + } + + // uniforms + { + int uniformBufferSize = new Std140SizeCalculator() + .putIVec3() // uOffsetChunk + .putVec3() // uOffsetSubChunk + .putIVec3() // uCameraPosChunk + .putVec3() // uCameraPosSubChunk + + .putVec3() // aTranslateChunk + .putVec3() // aTranslateSubChunk + + .putMat4f() // uProjectionMvm + .putInt() // uSkyLight + .putInt() // uBlockLight + + .putFloat() // uNorthShading + .putFloat() // uSouthShading + .putFloat() // uEastShading + .putFloat() // uWestShading + .putFloat() // uTopShading + .putFloat() // uBottomShading + .get(); + + + // create data // + + Mat4f projectionMvmMatrix = new Mat4f(renderEventParam.dhProjectionMatrix); + projectionMvmMatrix.multiply(renderEventParam.dhModelViewMatrix); + + + // upload data // + + ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); + buffer.order(ByteOrder.nativeOrder()); + buffer = Std140Builder.intoBuffer(buffer) + .putIVec3( + LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().x), + LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().y), + LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().z) + ) // uOffsetChunk + .putVec3( + LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().x), + LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().y), + LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().z) + ) // uOffsetSubChunk + .putIVec3( + LodUtil.getChunkPosFromDouble(camPos.x), + LodUtil.getChunkPosFromDouble(camPos.y), + LodUtil.getChunkPosFromDouble(camPos.z) + ) // uCameraPosChunk + .putVec3( + LodUtil.getSubChunkPosFromDouble(camPos.x), + LodUtil.getSubChunkPosFromDouble(camPos.y), + LodUtil.getSubChunkPosFromDouble(camPos.z) + ) // uCameraPosSubChunk + + .putMat4f(projectionMvmMatrix.createJomlMatrix()) // uProjectionMvm + .putInt(boxGroup.getSkyLight()) // uSkyLight + .putInt(boxGroup.getBlockLight()) // uBlockLight + + .putFloat(shading.north) + .putFloat(shading.south) + .putFloat(shading.east) + .putFloat(shading.west) + .putFloat(shading.top) + .putFloat(shading.bottom) + + .get() + ; + + this.vertUniformBuffer = BlazeUniformUtil.createBuffer("vertUniformBlock", uniformBufferSize, this.vertUniformBuffer); + GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertUniformBuffer, 0, uniformBufferSize); + + COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); + } + + + + + // render // + + profiler.popPush("rendering"); + try (IProfilerWrapper.IProfileBlock namespace_profile = profiler.push(boxGroup.getResourceLocationNamespace()); + IProfilerWrapper.IProfileBlock location_profile = profiler.push(boxGroup.getResourceLocationPath())) + { + this.renderBoxGroupInstanced(renderEventParam, boxGroup, profiler); + } + + boxGroup.postRender(renderEventParam); } - - DhApiRenderableBoxGroupShading shading = boxGroup.shading; - if (shading == null) - { - shading = DEFAULT_SHADING; - } - - // uniforms - { - int uniformBufferSize = new Std140SizeCalculator() - .putIVec3() // uOffsetChunk - .putVec3() // uOffsetSubChunk - .putIVec3() // uCameraPosChunk - .putVec3() // uCameraPosSubChunk - - .putVec3() // aTranslateChunk - .putVec3() // aTranslateSubChunk - - .putMat4f() // uProjectionMvm - .putInt() // uSkyLight - .putInt() // uBlockLight - - .putFloat() // uNorthShading - .putFloat() // uSouthShading - .putFloat() // uEastShading - .putFloat() // uWestShading - .putFloat() // uTopShading - .putFloat() // uBottomShading - .get(); - - - // create data // - - Mat4f projectionMvmMatrix = new Mat4f(renderEventParam.dhProjectionMatrix); - projectionMvmMatrix.multiply(renderEventParam.dhModelViewMatrix); - - - // upload data // - - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) - .putIVec3( - LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().x), - LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().y), - LodUtil.getChunkPosFromDouble(boxGroup.getOriginBlockPos().z) - ) // uOffsetChunk - .putVec3( - LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().x), - LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().y), - LodUtil.getSubChunkPosFromDouble(boxGroup.getOriginBlockPos().z) - ) // uOffsetSubChunk - .putIVec3( - LodUtil.getChunkPosFromDouble(camPos.x), - LodUtil.getChunkPosFromDouble(camPos.y), - LodUtil.getChunkPosFromDouble(camPos.z) - ) // uCameraPosChunk - .putVec3( - LodUtil.getSubChunkPosFromDouble(camPos.x), - LodUtil.getSubChunkPosFromDouble(camPos.y), - LodUtil.getSubChunkPosFromDouble(camPos.z) - ) // uCameraPosSubChunk - - .putMat4f(projectionMvmMatrix.createJomlMatrix()) // uProjectionMvm - .putInt(boxGroup.getSkyLight()) // uSkyLight - .putInt(boxGroup.getBlockLight()) // uBlockLight - - .putFloat(shading.north) - .putFloat(shading.south) - .putFloat(shading.east) - .putFloat(shading.west) - .putFloat(shading.top) - .putFloat(shading.bottom) - - .get() - ; - - this.vertUniformBuffer = BlazeUniformUtil.createBuffer("vertUniformBlock", uniformBufferSize, this.vertUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); - } + //#endregion + //==========// + // clean up // + //==========// + //region - // render // + profiler.popPush("cleanup"); - profiler.popPush("rendering"); - profiler.push(boxGroup.getResourceLocationNamespace()); - profiler.push(boxGroup.getResourceLocationPath()); + ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericRenderCleanupEvent.class, renderEventParam); - this.renderBoxGroupInstanced(renderEventParam, boxGroup, profiler); - - profiler.pop(); // resource path - profiler.pop(); // resource namespace - - boxGroup.postRender(renderEventParam); + //endregion } - - //#endregion - - - - //==========// - // clean up // - //==========// - //region - - profiler.popPush("cleanup"); - - ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericRenderCleanupEvent.class, renderEventParam); - - profiler.pop(); - - //endregion } private String getRenderPassName() { return "distantHorizons:McGenericObjectRenderer"; } @@ -545,8 +545,6 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer // update instance data // - profiler.push("vertex setup"); - BlazeGenericObjectVertexContainer container = (BlazeGenericObjectVertexContainer) boxGroup.vertexBufferContainer; LightMapWrapper lightMapWrapper = (LightMapWrapper) renderEventParam.lightmap; @@ -556,7 +554,6 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer // Bind instance data // - profiler.popPush("binding"); renderPass.setUniform("vertUniformBlock", this.vertUniformBuffer); @@ -568,7 +565,6 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer renderPass.setVertexBuffer(0, container.vboGpuBuffer); // Draw instanced - profiler.popPush("render"); if (container.uploadedBoxCount > 0) { renderPass.drawIndexed( @@ -579,7 +575,6 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer } } - profiler.pop(); } //endregion diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java index ba081ac71..e551b331c 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java @@ -151,210 +151,206 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer { this.tryInit(); - - profiler.push("vert unique uniforms"); + try(var terrain_profile = profiler.push("terrain render")) { - // create data // - - for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++) + profiler.popPush("vert unique uniforms"); { - LodBufferContainer bufferContainer = bufferContainers.get(lodIndex); - bufferContainer.uniformContainer.tryUpload(); - } - } - - profiler.popPush("vert share uniforms"); - { - Mat4f combinedMatrix = new Mat4f(renderEventParam.dhProjectionMatrix); - combinedMatrix.multiply(renderEventParam.dhModelViewMatrix); - - float earthCurveRatio = Config.Client.Advanced.Graphics.Experimental.earthCurveRatio.get(); - if (earthCurveRatio < -1.0f || earthCurveRatio > 1.0f) - { - earthCurveRatio = /*6371KM*/ 6371000.0f / earthCurveRatio; - } - else - { - // disable curvature if the config value is between -1 and 1 - earthCurveRatio = 0.0f; - } - - - // upload data // - - int uniformBufferSize = new Std140SizeCalculator() - .putInt() // uIsWhiteWorld - - .putFloat() // uWorldYOffset - .putFloat() // uMircoOffset - .putFloat() // uEarthRadius - - .putVec3() // uCameraPos - .putMat4f() // uCombinedMatrix - .get(); - - ByteBuffer buffer = MemoryUtil.memAlloc(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - Std140Builder.intoBuffer(buffer) - .putInt(0) // uIsWhiteWorld - - .putFloat((float) renderEventParam.worldYOffset) // uWorldYOffset - .putFloat(0.01f) // uMircoOffset // 0.01 block offset - .putFloat(earthCurveRatio) // uEarthRadius - - .putVec3( - (float)renderEventParam.exactCameraPosition.x, - (float)renderEventParam.exactCameraPosition.y, - (float)renderEventParam.exactCameraPosition.z) // uCameraPos - .putMat4f(combinedMatrix.createJomlMatrix()) // uCombinedMatrix - .get(); - - this.vertSharedUniformBuffer = BlazeUniformUtil.createBuffer("vertSharedUniformBlock", uniformBufferSize, this.vertSharedUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertSharedUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); - - MemoryUtil.memFree(buffer); - } - - profiler.popPush("set frag uniforms"); - { - int uniformBufferSize = new Std140SizeCalculator() - .putFloat() // uClipDistance - .putFloat() // uNoiseIntensity - .putInt() // uNoiseSteps - .putInt() // uNoiseDropoff - .putInt() // uDitherDhRendering - .putInt() // uNoiseEnabled - .get(); - - - // create data // - - float dhNearClipDistance = RenderUtil.getNearClipPlaneInBlocks(); - if (!Config.Client.Advanced.Debugging.lodOnlyMode.get()) - { - // this added value prevents the near clip plane and discard circle from touching, which looks bad - dhNearClipDistance += 16f; - } - - - // upload data // - - ByteBuffer buffer = MemoryUtil.memAlloc(uniformBufferSize); - buffer.order(ByteOrder.nativeOrder()); - buffer = Std140Builder.intoBuffer(buffer) - .putFloat(dhNearClipDistance) // uClipDistance - .putFloat(Config.Client.Advanced.Graphics.NoiseTexture.noiseIntensity.get()) // uNoiseIntensity - .putInt(Config.Client.Advanced.Graphics.NoiseTexture.noiseSteps.get()) // uNoiseSteps - .putInt(Config.Client.Advanced.Graphics.NoiseTexture.noiseDropoff.get()) // uNoiseDropoff - .putInt(Config.Client.Advanced.Graphics.Quality.ditherDhFade.get() ? 1 : 0) // uDitherDhRendering - .putInt(Config.Client.Advanced.Graphics.NoiseTexture.enableNoiseTexture.get() ? 1 : 0) // uNoiseEnabled - .get() - ; - - this.fragUniformBuffer = BlazeUniformUtil.createBuffer("fragUniformBlock", uniformBufferSize, this.fragUniformBuffer); - GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); - - COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); - MemoryUtil.memFree(buffer); - } - - - - // render pass setup - { - profiler.popPush("setup"); - - // create a render pass - try(RenderPass renderPass = COMMAND_ENCODER.createRenderPass( - this::getRenderPassName, - BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper.textureView, - /*optionalClearColorAsInt*/ OptionalInt.empty(), - BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureView, - /*optionalDepthValueAsDouble*/ OptionalDouble.empty()) - ) - { - LightMapWrapper lightMapWrapper = (LightMapWrapper) renderEventParam.lightmap; - BlazeTextureViewWrapper lightmapTextureViewWrapper = lightMapWrapper.getTextureViewWrapper(); - renderPass.bindTexture("uLightMap", lightmapTextureViewWrapper.textureView, lightmapTextureViewWrapper.textureSampler); - - // set pipeline - renderPass.setPipeline(opaquePass ? this.opaquePipeline : this.transparentPipeline); - - // shared uniforms - renderPass.setUniform("fragUniformBlock", this.fragUniformBuffer); - renderPass.setUniform("vertSharedUniformBlock", this.vertSharedUniformBuffer); - - + // create data // for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++) { - profiler.popPush("binding"); - LodBufferContainer bufferContainer = bufferContainers.get(lodIndex); - BlazeLodUniformBufferWrapper uniformWrapper = (BlazeLodUniformBufferWrapper)bufferContainer.uniformContainer; - - boolean columnBuilderDebugEnabled = Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugEnable.get(); - if (columnBuilderDebugEnabled) - { - if (DhSectionPos.getDetailLevel(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugDetailLevel.get() - && DhSectionPos.getX(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugXPos.get() - && DhSectionPos.getZ(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugZPos.get()) - { - int breakpoint = 0; - } - else - { - continue; - } - } - - renderPass.setUniform("vertUniqueUniformBlock", uniformWrapper.gpuBuffer); - - - - profiler.popPush("rendering"); - - // render each buffer - IVertexBufferWrapper[] bufferWrapperList = opaquePass ? bufferContainer.vboOpaqueWrappers : bufferContainer.vboTransparentWrappers; - for (int i = 0; i < bufferWrapperList.length; i++) - { - BlazeVertexBufferWrapper bufferWrapper = (BlazeVertexBufferWrapper) bufferWrapperList[i]; - if (!bufferWrapper.uploaded - || bufferWrapper.vertexCount == 0) - { - continue; - } - - // fire render event - { - Vec3d camPos = renderEventParam.exactCameraPosition; - Vec3f modelPos = new Vec3f( - (float) (bufferContainer.minCornerBlockPos.getX() - camPos.x), - (float) (bufferContainer.minCornerBlockPos.getY() - camPos.y), - (float) (bufferContainer.minCornerBlockPos.getZ() - camPos.z)); - ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeBufferRenderEvent.class, new DhApiBeforeBufferRenderEvent.EventParam(renderEventParam, modelPos)); - } - - renderPass.setIndexBuffer(bufferWrapper.getIndexGpuBuffer(), VertexFormat.IndexType.INT); - renderPass.setVertexBuffer(0, bufferWrapper.vertexGpuBuffer); // vertex buffer can only be "0" lol - - if (!bufferWrapper.vertexGpuBuffer.isClosed()) - { - renderPass.drawIndexed( - /*indexStart*/ 0, - /*firstIndex*/0, - /*indexCount*/bufferWrapper.indexCount, - /*instanceCount*/1); - } - } + bufferContainer.uniformContainer.tryUpload(); + } + } + + profiler.popPush("vert share uniforms"); + { + Mat4f combinedMatrix = new Mat4f(renderEventParam.dhProjectionMatrix); + combinedMatrix.multiply(renderEventParam.dhModelViewMatrix); + + float earthCurveRatio = Config.Client.Advanced.Graphics.Experimental.earthCurveRatio.get(); + if (earthCurveRatio < -1.0f || earthCurveRatio > 1.0f) + { + earthCurveRatio = /*6371KM*/ 6371000.0f / earthCurveRatio; + } + else + { + // disable curvature if the config value is between -1 and 1 + earthCurveRatio = 0.0f; } + + // upload data // + + int uniformBufferSize = new Std140SizeCalculator() + .putInt() // uIsWhiteWorld + + .putFloat() // uWorldYOffset + .putFloat() // uMircoOffset + .putFloat() // uEarthRadius + + .putVec3() // uCameraPos + .putMat4f() // uCombinedMatrix + .get(); + + ByteBuffer buffer = MemoryUtil.memAlloc(uniformBufferSize); + buffer.order(ByteOrder.nativeOrder()); + Std140Builder.intoBuffer(buffer) + .putInt(0) // uIsWhiteWorld + + .putFloat((float) renderEventParam.worldYOffset) // uWorldYOffset + .putFloat(0.01f) // uMircoOffset // 0.01 block offset + .putFloat(earthCurveRatio) // uEarthRadius + + .putVec3( + (float) renderEventParam.exactCameraPosition.x, + (float) renderEventParam.exactCameraPosition.y, + (float) renderEventParam.exactCameraPosition.z) // uCameraPos + .putMat4f(combinedMatrix.createJomlMatrix()) // uCombinedMatrix + .get(); + + this.vertSharedUniformBuffer = BlazeUniformUtil.createBuffer("vertSharedUniformBlock", uniformBufferSize, this.vertSharedUniformBuffer); + GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertSharedUniformBuffer, 0, uniformBufferSize); + + COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); + + MemoryUtil.memFree(buffer); + } + + profiler.popPush("set frag uniforms"); + { + int uniformBufferSize = new Std140SizeCalculator() + .putFloat() // uClipDistance + .putFloat() // uNoiseIntensity + .putInt() // uNoiseSteps + .putInt() // uNoiseDropoff + .putInt() // uDitherDhRendering + .putInt() // uNoiseEnabled + .get(); + + + // create data // + + float dhNearClipDistance = RenderUtil.getNearClipPlaneInBlocks(); + if (!Config.Client.Advanced.Debugging.lodOnlyMode.get()) + { + // this added value prevents the near clip plane and discard circle from touching, which looks bad + dhNearClipDistance += 16f; + } + + + // upload data // + + ByteBuffer buffer = MemoryUtil.memAlloc(uniformBufferSize); + buffer.order(ByteOrder.nativeOrder()); + buffer = Std140Builder.intoBuffer(buffer) + .putFloat(dhNearClipDistance) // uClipDistance + .putFloat(Config.Client.Advanced.Graphics.NoiseTexture.noiseIntensity.get()) // uNoiseIntensity + .putInt(Config.Client.Advanced.Graphics.NoiseTexture.noiseSteps.get()) // uNoiseSteps + .putInt(Config.Client.Advanced.Graphics.NoiseTexture.noiseDropoff.get()) // uNoiseDropoff + .putInt(Config.Client.Advanced.Graphics.Quality.ditherDhFade.get() ? 1 : 0) // uDitherDhRendering + .putInt(Config.Client.Advanced.Graphics.NoiseTexture.enableNoiseTexture.get() ? 1 : 0) // uNoiseEnabled + .get() + ; + + this.fragUniformBuffer = BlazeUniformUtil.createBuffer("fragUniformBlock", uniformBufferSize, this.fragUniformBuffer); + GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); + + COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); + MemoryUtil.memFree(buffer); + } + + + + // render pass setup + { + profiler.popPush("rendering"); + + // create a render pass + try (RenderPass renderPass = COMMAND_ENCODER.createRenderPass( + this::getRenderPassName, + BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper.textureView, + /*optionalClearColorAsInt*/ OptionalInt.empty(), + BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureView, + /*optionalDepthValueAsDouble*/ OptionalDouble.empty()) + ) + { + LightMapWrapper lightMapWrapper = (LightMapWrapper) renderEventParam.lightmap; + BlazeTextureViewWrapper lightmapTextureViewWrapper = lightMapWrapper.getTextureViewWrapper(); + renderPass.bindTexture("uLightMap", lightmapTextureViewWrapper.textureView, lightmapTextureViewWrapper.textureSampler); + + // set pipeline + renderPass.setPipeline(opaquePass ? this.opaquePipeline : this.transparentPipeline); + + // shared uniforms + renderPass.setUniform("fragUniformBlock", this.fragUniformBuffer); + renderPass.setUniform("vertSharedUniformBlock", this.vertSharedUniformBuffer); + + + + for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++) + { + LodBufferContainer bufferContainer = bufferContainers.get(lodIndex); + BlazeLodUniformBufferWrapper uniformWrapper = (BlazeLodUniformBufferWrapper) bufferContainer.uniformContainer; + + boolean columnBuilderDebugEnabled = Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugEnable.get(); + if (columnBuilderDebugEnabled) + { + if (DhSectionPos.getDetailLevel(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugDetailLevel.get() + && DhSectionPos.getX(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugXPos.get() + && DhSectionPos.getZ(bufferContainer.pos) == Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugZPos.get()) + { + int breakpoint = 0; + } + else + { + continue; + } + } + + renderPass.setUniform("vertUniqueUniformBlock", uniformWrapper.gpuBuffer); + + + + // render each buffer + IVertexBufferWrapper[] bufferWrapperList = opaquePass ? bufferContainer.vboOpaqueWrappers : bufferContainer.vboTransparentWrappers; + for (int i = 0; i < bufferWrapperList.length; i++) + { + BlazeVertexBufferWrapper bufferWrapper = (BlazeVertexBufferWrapper) bufferWrapperList[i]; + if (!bufferWrapper.uploaded + || bufferWrapper.vertexCount == 0) + { + continue; + } + + // fire render event + { + Vec3d camPos = renderEventParam.exactCameraPosition; + Vec3f modelPos = new Vec3f( + (float) (bufferContainer.minCornerBlockPos.getX() - camPos.x), + (float) (bufferContainer.minCornerBlockPos.getY() - camPos.y), + (float) (bufferContainer.minCornerBlockPos.getZ() - camPos.z)); + ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeBufferRenderEvent.class, new DhApiBeforeBufferRenderEvent.EventParam(renderEventParam, modelPos)); + } + + renderPass.setIndexBuffer(bufferWrapper.getIndexGpuBuffer(), VertexFormat.IndexType.INT); + renderPass.setVertexBuffer(0, bufferWrapper.vertexGpuBuffer); // vertex buffer can only be "0" lol + + if (!bufferWrapper.vertexGpuBuffer.isClosed()) + { + renderPass.drawIndexed( + /*indexStart*/ 0, + /*firstIndex*/0, + /*indexCount*/bufferWrapper.indexCount, + /*instanceCount*/1); + } + } + } + + } } } - - profiler.pop(); } private String getIndexBufferName() { return "distantHorizons:LodIndexBuffer"; } private String getRenderPassName() { return "distantHorizons:McLodRenderer"; } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/generic/GlGenericObjectRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/generic/GlGenericObjectRenderer.java index cef25bf2f..7ddf49eb4 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/generic/GlGenericObjectRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/generic/GlGenericObjectRenderer.java @@ -413,133 +413,133 @@ public class GlGenericObjectRenderer implements IDhGenericRenderer // render setup // - profiler.push("setup"); - - this.init(); - - ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericRenderSetupEvent.class, renderEventParam); - - - boolean renderWireframe = Config.Client.Advanced.Debugging.renderWireframe.get(); - if (renderWireframe) + try (var setup_profile = profiler.push("setup")) { - GL32.glPolygonMode(GL32.GL_FRONT_AND_BACK, GL32.GL_LINE); - GLMC.disableFaceCulling(); - } - else - { - GL32.glPolygonMode(GL32.GL_FRONT_AND_BACK, GL32.GL_FILL); - GLMC.enableFaceCulling(); - } - - GLMC.enableBlend(); - GL32.glBlendEquation(GL32.GL_FUNC_ADD); - GLMC.glBlendFuncSeparate(GL32.GL_SRC_ALPHA, GL32.GL_ONE_MINUS_SRC_ALPHA, GL32.GL_ONE, GL32.GL_ONE_MINUS_SRC_ALPHA); - - IDhApiGenericObjectShaderProgram shaderProgram = this.instancedRenderingAvailable ? this.instancedShaderProgram : this.directShaderProgram; - IDhApiGenericObjectShaderProgram shaderProgramOverride = OverrideInjector.INSTANCE.get(IDhApiGenericObjectShaderProgram.class); - if (shaderProgramOverride != null && shaderProgram.overrideThisFrame()) - { - shaderProgram = shaderProgramOverride; - } - - shaderProgram.bind(renderEventParam); - shaderProgram.bindVertexBuffer(this.boxVertexBuffer.getId()); - - this.boxIndexBuffer.bind(); - - Vec3d camPos = MC_RENDER.getCameraExactPosition(); - - - - // rendering // - - Collection boxList = this.boxGroupById.values(); - for (RenderableBoxGroup boxGroup : boxList) - { - // validation // - // shouldn't happen, but just in case - if (boxGroup == null) + this.init(); + + ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericRenderSetupEvent.class, renderEventParam); + + + boolean renderWireframe = Config.Client.Advanced.Debugging.renderWireframe.get(); + if (renderWireframe) { - continue; - } - - // skip boxes that shouldn't render this pass - if (boxGroup.ssaoEnabled != renderingWithSsao) - { - continue; - } - - profiler.popPush("render prep"); - boxGroup.preRender(renderEventParam); // called even if the group is inactive, so the group can be activate if desired - - // ignore inactive groups - if (!boxGroup.active) - { - continue; - } - - // allow API users to cancel this object's rendering - boolean cancelRendering = ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericObjectRenderEvent.class, new DhApiBeforeGenericObjectRenderEvent.EventParam(renderEventParam, boxGroup)); - if (cancelRendering) - { - continue; - } - - // update instanced data if needed - if (this.instancedRenderingAvailable) - { - boxGroup.tryUpdateInstancedDataAsync(); - - // skip groups that haven't been uploaded yet - if (boxGroup.vertexBufferContainer.getState() != GlGenericObjectVertexContainer.EState.RENDER) - { - continue; - } - } - - - - // render // - - profiler.popPush("rendering"); - profiler.push(boxGroup.getResourceLocationNamespace()); - profiler.push(boxGroup.getResourceLocationPath()); - if (this.instancedRenderingAvailable) - { - this.renderBoxGroupInstanced(shaderProgram, renderEventParam, boxGroup, camPos, profiler); + GL32.glPolygonMode(GL32.GL_FRONT_AND_BACK, GL32.GL_LINE); + GLMC.disableFaceCulling(); } else { - this.renderBoxGroupDirect(shaderProgram, renderEventParam, boxGroup, camPos, profiler); + GL32.glPolygonMode(GL32.GL_FRONT_AND_BACK, GL32.GL_FILL); + GLMC.enableFaceCulling(); } - profiler.pop(); // resource path - profiler.pop(); // resource namespace - boxGroup.postRender(renderEventParam); + GLMC.enableBlend(); + GL32.glBlendEquation(GL32.GL_FUNC_ADD); + GLMC.glBlendFuncSeparate(GL32.GL_SRC_ALPHA, GL32.GL_ONE_MINUS_SRC_ALPHA, GL32.GL_ONE, GL32.GL_ONE_MINUS_SRC_ALPHA); + + IDhApiGenericObjectShaderProgram shaderProgram = this.instancedRenderingAvailable ? this.instancedShaderProgram : this.directShaderProgram; + IDhApiGenericObjectShaderProgram shaderProgramOverride = OverrideInjector.INSTANCE.get(IDhApiGenericObjectShaderProgram.class); + if (shaderProgramOverride != null && shaderProgram.overrideThisFrame()) + { + shaderProgram = shaderProgramOverride; + } + + shaderProgram.bind(renderEventParam); + shaderProgram.bindVertexBuffer(this.boxVertexBuffer.getId()); + + this.boxIndexBuffer.bind(); + + Vec3d camPos = MC_RENDER.getCameraExactPosition(); + + + + // rendering // + + Collection boxList = this.boxGroupById.values(); + for (RenderableBoxGroup boxGroup : boxList) + { + // validation // + + // shouldn't happen, but just in case + if (boxGroup == null) + { + continue; + } + + // skip boxes that shouldn't render this pass + if (boxGroup.ssaoEnabled != renderingWithSsao) + { + continue; + } + + profiler.popPush("render prep"); + boxGroup.preRender(renderEventParam); // called even if the group is inactive, so the group can be activate if desired + + // ignore inactive groups + if (!boxGroup.active) + { + continue; + } + + // allow API users to cancel this object's rendering + boolean cancelRendering = ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericObjectRenderEvent.class, new DhApiBeforeGenericObjectRenderEvent.EventParam(renderEventParam, boxGroup)); + if (cancelRendering) + { + continue; + } + + // update instanced data if needed + if (this.instancedRenderingAvailable) + { + boxGroup.tryUpdateInstancedDataAsync(); + + // skip groups that haven't been uploaded yet + if (boxGroup.vertexBufferContainer.getState() != GlGenericObjectVertexContainer.EState.RENDER) + { + continue; + } + } + + + + // render // + + profiler.popPush("rendering"); + try (IProfilerWrapper.IProfileBlock namespace_profile = profiler.push(boxGroup.getResourceLocationNamespace()); + IProfilerWrapper.IProfileBlock location_profile = profiler.push(boxGroup.getResourceLocationPath())) + { + if (this.instancedRenderingAvailable) + { + this.renderBoxGroupInstanced(shaderProgram, renderEventParam, boxGroup, camPos, profiler); + } + else + { + this.renderBoxGroupDirect(shaderProgram, renderEventParam, boxGroup, camPos, profiler); + } + } + + boxGroup.postRender(renderEventParam); + } + + + + //==========// + // clean up // + //==========// + + profiler.popPush("cleanup"); + + ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericRenderCleanupEvent.class, renderEventParam); + + if (renderWireframe) + { + // default back to GL_FILL since all other rendering uses it + GL32.glPolygonMode(GL32.GL_FRONT_AND_BACK, GL32.GL_FILL); + GLMC.enableFaceCulling(); + } + + shaderProgram.unbind(); } - - - - //==========// - // clean up // - //==========// - - profiler.popPush("cleanup"); - - ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeGenericRenderCleanupEvent.class, renderEventParam); - - if (renderWireframe) - { - // default back to GL_FILL since all other rendering uses it - GL32.glPolygonMode(GL32.GL_FRONT_AND_BACK, GL32.GL_FILL); - GLMC.enableFaceCulling(); - } - - shaderProgram.unbind(); - - profiler.pop(); } //endregion @@ -556,72 +556,71 @@ public class GlGenericObjectRenderer implements IDhGenericRenderer RenderableBoxGroup boxGroup, Vec3d camPos, IProfilerWrapper profiler) { - // update instance data // - - profiler.push("vertex setup"); - - DhApiRenderableBoxGroupShading shading = boxGroup.shading; - if (shading == null) + try (var render_profile = profiler.push("vertex setup")) { - shading = DEFAULT_SHADING; - } - - shaderProgram.fillIndirectUniformData( + + // update instance data // + DhApiRenderableBoxGroupShading shading = boxGroup.shading; + if (shading == null) + { + shading = DEFAULT_SHADING; + } + + shaderProgram.fillIndirectUniformData( renderEventParam, shading, boxGroup, camPos); - - - - // Bind instance data // - profiler.popPush("binding"); - - GlGenericObjectVertexContainer container = (GlGenericObjectVertexContainer)(boxGroup.vertexBufferContainer); - - GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.color); - GL32.glEnableVertexAttribArray(1); - GL32.glVertexAttribPointer(1, 4, GL32.GL_FLOAT, false, 4 * Float.BYTES, 0); - this.vertexAttribDivisor(1, 1); - - GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.scale); - GL32.glEnableVertexAttribArray(2); - this.vertexAttribDivisor(2, 1); - GL32.glVertexAttribPointer(2, 3, GL32.GL_FLOAT, false, 3 * Float.BYTES, 0); - - GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.chunkPos); - GL32.glEnableVertexAttribArray(3); - this.vertexAttribDivisor(3, 1); - GL32.glVertexAttribIPointer(3, 3, GL32.GL_INT, 3 * Integer.BYTES, 0); - - GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.subChunkPos); - GL32.glEnableVertexAttribArray(4); - this.vertexAttribDivisor(4, 1); - GL32.glVertexAttribPointer(4, 3, GL32.GL_FLOAT, false, 3 * Float.BYTES, 0); - - GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.material); - GL32.glEnableVertexAttribArray(5); - this.vertexAttribDivisor(5, 1); - GL32.glVertexAttribIPointer(5, 1, GL32.GL_BYTE, Byte.BYTES, 0); - - - // Draw instanced - profiler.popPush("render"); - if (container.uploadedBoxCount > 0) - { - GL32.glDrawElementsInstanced(GL32.GL_TRIANGLES, BOX_INDICES.length, GL32.GL_UNSIGNED_INT, 0, container.uploadedBoxCount); + + + + // Bind instance data // + profiler.popPush("binding"); + + GlGenericObjectVertexContainer container = (GlGenericObjectVertexContainer) (boxGroup.vertexBufferContainer); + + GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.color); + GL32.glEnableVertexAttribArray(1); + GL32.glVertexAttribPointer(1, 4, GL32.GL_FLOAT, false, 4 * Float.BYTES, 0); + this.vertexAttribDivisor(1, 1); + + GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.scale); + GL32.glEnableVertexAttribArray(2); + this.vertexAttribDivisor(2, 1); + GL32.glVertexAttribPointer(2, 3, GL32.GL_FLOAT, false, 3 * Float.BYTES, 0); + + GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.chunkPos); + GL32.glEnableVertexAttribArray(3); + this.vertexAttribDivisor(3, 1); + GL32.glVertexAttribIPointer(3, 3, GL32.GL_INT, 3 * Integer.BYTES, 0); + + GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.subChunkPos); + GL32.glEnableVertexAttribArray(4); + this.vertexAttribDivisor(4, 1); + GL32.glVertexAttribPointer(4, 3, GL32.GL_FLOAT, false, 3 * Float.BYTES, 0); + + GL32.glBindBuffer(GL32.GL_ARRAY_BUFFER, container.material); + GL32.glEnableVertexAttribArray(5); + this.vertexAttribDivisor(5, 1); + GL32.glVertexAttribIPointer(5, 1, GL32.GL_BYTE, Byte.BYTES, 0); + + + // Draw instanced + profiler.popPush("render"); + if (container.uploadedBoxCount > 0) + { + GL32.glDrawElementsInstanced(GL32.GL_TRIANGLES, BOX_INDICES.length, GL32.GL_UNSIGNED_INT, 0, container.uploadedBoxCount); + } + + + // Clean up + profiler.popPush("cleanup"); + + GL32.glDisableVertexAttribArray(1); + GL32.glDisableVertexAttribArray(2); + GL32.glDisableVertexAttribArray(3); + GL32.glDisableVertexAttribArray(4); + GL32.glDisableVertexAttribArray(5); } - - - // Clean up - profiler.popPush("cleanup"); - - GL32.glDisableVertexAttribArray(1); - GL32.glDisableVertexAttribArray(2); - GL32.glDisableVertexAttribArray(3); - GL32.glDisableVertexAttribArray(4); - GL32.glDisableVertexAttribArray(5); - - profiler.pop(); } /** * Clean way to handle both {@link GL33#glVertexAttribDivisor} and {@link ARBInstancedArrays#glVertexAttribDivisorARB} @@ -689,8 +688,6 @@ public class GlGenericObjectRenderer implements IDhGenericRenderer break; } } - - profiler.pop(); } //endregion diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fade/GlDhFarFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fade/GlDhFarFadeRenderer.java index f9a7d7960..5fbd50b32 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fade/GlDhFarFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fade/GlDhFarFadeRenderer.java @@ -122,8 +122,6 @@ public class GlDhFarFadeRenderer implements IDhFarFadeRenderer { try { - //profiler.push("Fade Generate"); - this.init(); // resize the framebuffer if necessary @@ -141,8 +139,6 @@ public class GlDhFarFadeRenderer implements IDhFarFadeRenderer GlDhFarFadeShader.INSTANCE.setProjectionMatrix(renderParams.mcModelViewMatrix, renderParams.mcProjectionMatrix); GlDhFarFadeShader.INSTANCE.render(renderParams); - //profiler.popPush("Fade Apply"); - GlDhFarFadeApplyShader.INSTANCE.fadeTexture = this.fadeTexture; GlDhFarFadeApplyShader.INSTANCE.readFramebuffer = GlDhFarFadeShader.INSTANCE.frameBuffer; GlDhFarFadeApplyShader.INSTANCE.drawFramebuffer = GlDhMetaRenderer.INSTANCE.getActiveFramebufferId(); @@ -152,10 +148,6 @@ public class GlDhFarFadeRenderer implements IDhFarFadeRenderer { LOGGER.error("Unexpected error during fade render, error: ["+e.getMessage()+"].", e); } - finally - { - //profiler.pop(); - } } //emdregion diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fade/GlVanillaFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fade/GlVanillaFadeRenderer.java index 238f917ce..0592caa34 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fade/GlVanillaFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/openGl/postProcessing/fade/GlVanillaFadeRenderer.java @@ -135,14 +135,9 @@ public class GlVanillaFadeRenderer implements IDhVanillaFadeRenderer IProfilerWrapper profiler = MC_CLIENT.getProfiler(); - profiler.pop(); // get out of "terrain" - profiler.push("DH-Vanilla Fade"); - - - try(GLState mcState = new GLState()) + try (IProfilerWrapper.IProfileBlock fade_profile = profiler.push("DH-Vanilla Fade"); + GLState mcState = new GLState()) { - profiler.push("Vanilla Fade Generate"); - this.init(); // resize the framebuffer if necessary @@ -165,19 +160,15 @@ public class GlVanillaFadeRenderer implements IDhVanillaFadeRenderer // otherwise we can directly render to their texture if (MC_RENDER.mcRendersToFrameBuffer()) { - profiler.popPush("Vanilla Fade Apply"); - GlDhFarFadeApplyShader.INSTANCE.fadeTexture = this.fadeTexture; GlDhFarFadeApplyShader.INSTANCE.readFramebuffer = GlDhVanillaFadeShader.INSTANCE.frameBuffer; GlDhFarFadeApplyShader.INSTANCE.drawFramebuffer = MC_RENDER.getTargetFramebuffer(); GlDhFarFadeApplyShader.INSTANCE.render(renderParams); } - - profiler.pop(); } catch (Exception e) { - LOGGER.error("Unexpected error during fade render, error: ["+e.getMessage()+"].", e); + LOGGER.error("Unexpected error during fade render, error: [" + e.getMessage() + "].", e); } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/ProfilerWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/ProfilerWrapper.java index 15b004e3d..b9e4392fc 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/ProfilerWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/ProfilerWrapper.java @@ -23,27 +23,47 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrap import net.minecraft.util.profiling.ProfilerFiller; -/** - * @author James Seibel - * @version 11-20-2021 - */ public class ProfilerWrapper implements IProfilerWrapper { public ProfilerFiller profiler; public ProfilerWrapper(ProfilerFiller newProfiler) { this.profiler = newProfiler; } - - /** starts a new section inside the currently running section */ @Override - public void push(String newSection) { /*this.profiler.push(newSection);*/ } + public IProfileBlock push(String newSection) + { + this.profiler.push(newSection); + return new ProfileBlock(this.profiler); + } - /** ends the currently running section and starts a new one */ @Override - public void popPush(String newSection) { /*this.profiler.popPush(newSection);*/ } + public void popPush(String newSection) + { + this.profiler.popPush(newSection); + } + + + + //================// + // helper classes // + //================// + //region + + public static class ProfileBlock implements IProfileBlock + { + private final ProfilerFiller profiler; + public ProfileBlock(ProfilerFiller newProfiler) { this.profiler = newProfiler; } + + + @Override + public void close() + { + this.profiler.pop(); + } + } + + //endregion + - /** ends the currently running section */ - @Override - public void pop() { /*this.profiler.pop();*/ } } diff --git a/coreSubProjects b/coreSubProjects index cb3e42fac..50e0e940d 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit cb3e42fac45ffbb7796f836669e4312efe7c4cdf +Subproject commit 50e0e940d1104dc37652b5b70ee8d2d62bdc10a4