VulkanShader_1.21.10-0.0.4-alpha.jar
Download file
package net.vulkanmod.vulkan.shader;
import java.util.Objects;
import net.vulkanmod.vulkan.VRenderSystem;
import net.vulkanmod.vulkan.framebuffer.RenderPass;
public class PipelineState {
private static final int DEFAULT_DEPTH_OP = 515;
public static BlendInfo blendInfo = defaultBlendInfo();
public static final PipelineState DEFAULT = new PipelineState(getAssemblyRasterState(), getBlendState(), getDepthState(), getLogicOpState(), VRenderSystem.getColorMask(), (RenderPass)null);
public static PipelineState currentState;
final RenderPass renderPass;
int assemblyRasterState;
int blendState_i;
int depthState_i;
int colorMask_i;
int logicOp_i;
public static PipelineState getCurrentPipelineState(RenderPass renderPass) {
int assemblyRasterState = getAssemblyRasterState();
int blendState = getBlendState();
int currentColorMask = VRenderSystem.getColorMask();
int depthState = getDepthState();
int logicOp = getLogicOpState();
return currentState.checkEquals(assemblyRasterState, blendState, depthState, logicOp, currentColorMask, renderPass) ? currentState : (currentState = new PipelineState(assemblyRasterState, blendState, depthState, logicOp, currentColorMask, renderPass));
}
public static int getBlendState() {
return PipelineState.BlendState.getState(blendInfo);
}
public static int getAssemblyRasterState() {
return PipelineState.AssemblyRasterState.encode(VRenderSystem.cull, VRenderSystem.topology, VRenderSystem.polygonMode);
}
public static int getDepthState() {
int depthState = 0;
depthState |= VRenderSystem.depthTest ? 1 : 0;
depthState |= VRenderSystem.depthMask ? 2 : 0;
depthState |= PipelineState.DepthState.encodeDepthFun(VRenderSystem.depthFun);
return depthState;
}
public static int getLogicOpState() {
int logicOpState = 0;
logicOpState |= VRenderSystem.logicOp ? 1 : 0;
logicOpState |= PipelineState.LogicOpState.encodeLogicOpFun(VRenderSystem.logicOpFun);
return logicOpState;
}
public PipelineState(int assemblyRasterState, int blendState, int depthState, int logicOp, int colorMask, RenderPass renderPass) {
this.renderPass = renderPass;
this.assemblyRasterState = assemblyRasterState;
this.blendState_i = blendState;
this.depthState_i = depthState;
this.colorMask_i = colorMask;
this.logicOp_i = logicOp;
}
private boolean checkEquals(int assemblyRasterState, int blendState, int depthState, int logicOp, int colorMask, RenderPass renderPass) {
return blendState == this.blendState_i && depthState == this.depthState_i && renderPass == this.renderPass && logicOp == this.logicOp_i && assemblyRasterState == this.assemblyRasterState && colorMask == this.colorMask_i;
}
public boolean equals(Object o) {
if (this == o) {
return true;
} else if (o != null && this.getClass() == o.getClass()) {
PipelineState that = (PipelineState)o;
return this.blendState_i == that.blendState_i && this.depthState_i == that.depthState_i && this.renderPass == that.renderPass && this.logicOp_i == that.logicOp_i && this.assemblyRasterState == that.assemblyRasterState && this.colorMask_i == that.colorMask_i;
} else {
return false;
}
}
public int hashCode() {
return Objects.hash(new Object[]{this.blendState_i, this.depthState_i, this.logicOp_i, this.assemblyRasterState, this.colorMask_i, this.renderPass});
}
public static BlendInfo defaultBlendInfo() {
return new BlendInfo(true, 6, 7, 1, 0, 0);
}
static {
currentState = DEFAULT;
}
public static class BlendInfo {
public boolean enabled;
public int srcRgbFactor;
public int dstRgbFactor;
public int srcAlphaFactor;
public int dstAlphaFactor;
public int blendOp;
public BlendInfo(boolean enabled, int srcRgbFactor, int dstRgbFactor, int srcAlphaFactor, int dstAlphaFactor, int blendOp) {
this.enabled = enabled;
this.srcRgbFactor = srcRgbFactor;
this.dstRgbFactor = dstRgbFactor;
this.srcAlphaFactor = srcAlphaFactor;
this.dstAlphaFactor = dstAlphaFactor;
this.blendOp = blendOp;
}
public void setBlendFunction(int sourceFactor, int destFactor) {
this.srcRgbFactor = glToVulkanBlendFactor(sourceFactor);
this.srcAlphaFactor = glToVulkanBlendFactor(sourceFactor);
this.dstRgbFactor = glToVulkanBlendFactor(destFactor);
this.dstAlphaFactor = glToVulkanBlendFactor(destFactor);
}
public void setBlendFuncSeparate(int srcRgb, int dstRgb, int srcAlpha, int dstAlpha) {
this.srcRgbFactor = glToVulkanBlendFactor(srcRgb);
this.srcAlphaFactor = glToVulkanBlendFactor(srcAlpha);
this.dstRgbFactor = glToVulkanBlendFactor(dstRgb);
this.dstAlphaFactor = glToVulkanBlendFactor(dstAlpha);
}
public void setBlendOp(int i) {
this.blendOp = glToVulkanBlendOp(i);
}
public int createBlendState() {
return PipelineState.BlendState.getState(this);
}
private static int glToVulkanBlendOp(int value) {
byte var10000;
switch (value) {
case 32774:
var10000 = 0;
break;
case 32775:
var10000 = 3;
break;
case 32776:
var10000 = 4;
break;
case 32777:
default:
throw new RuntimeException("unknown blend factor: " + value);
case 32778:
var10000 = 1;
break;
case 32779:
var10000 = 2;
}
return var10000;
}
private static int glToVulkanBlendFactor(int value) {
byte var10000;
switch (value) {
case 0 -> var10000 = 0;
case 1 -> var10000 = 1;
case 768 -> var10000 = 2;
case 769 -> var10000 = 3;
case 770 -> var10000 = 6;
case 771 -> var10000 = 7;
case 774 -> var10000 = 4;
case 775 -> var10000 = 5;
default -> throw new RuntimeException("unknown blend factor: " + value);
}
return var10000;
}
}
public static class BlendState {
public static final int SRC_RGB_OFFSET = 0;
public static final int DST_RGB_OFFSET = 5;
public static final int SRC_A_OFFSET = 10;
public static final int DST_A_OFFSET = 15;
public static final int FUN_OFFSET = 20;
public static final int ENABLE_BIT = 16777216;
public static final int OP_MASK = 15;
public static final int FACTOR_MASK = 31;
public static int getState(BlendInfo blendInfo) {
int s = 0;
s |= blendInfo.enabled ? 16777216 : 0;
s |= encode(blendInfo.srcRgbFactor, 0, 31);
s |= encode(blendInfo.dstRgbFactor, 5, 31);
s |= encode(blendInfo.srcAlphaFactor, 10, 31);
s |= encode(blendInfo.dstAlphaFactor, 15, 31);
s |= encode(blendInfo.blendOp, 20, 15);
return s;
}
public static boolean enable(int i) {
return (i & 16777216) != 0;
}
public static int encode(int i, int offset, int mask) {
return (i & mask) << offset;
}
public static int decode(int i, int offset, int bits) {
return i >>> offset & bits;
}
public static int getSrcRgbFactor(int s) {
return decode(s, 0, 31);
}
public static int getDstRgbFactor(int s) {
return decode(s, 5, 31);
}
public static int getSrcAlphaFactor(int s) {
return decode(s, 10, 31);
}
public static int getDstAlphaFactor(int s) {
return decode(s, 15, 31);
}
public static int blendOp(int state) {
return decode(state, 20, 15);
}
}
public abstract static class LogicOpState {
public static final int ENABLE_BIT = 1;
public static final int FUN_OFFSET = 1;
public static final int FUN_BITS = 5;
public static boolean enable(int i) {
return (i & 1) != 0;
}
public static int encodeLogicOpFun(int glFun) {
int fun = glToVulkan(glFun);
return fun << 1;
}
public static int decodeFun(int state) {
return state >>> 1;
}
public static int glToVulkan(int f) {
byte var10000;
switch (f) {
case 5387 -> var10000 = 11;
default -> var10000 = 1;
}
return var10000;
}
}
public abstract static class AssemblyRasterState {
public static final int POLYGON_MODE_MASK = 7;
public static final int TOPOLOGY_OFFSET = 3;
public static final int TOPOLOGY_BITS = 4;
public static final int TOPOLOGY_MASK = 31;
public static final int CULL_MODE_OFFSET = 7;
public static final int CULL_MODE_BITS = 2;
public static final int CULL_MODE_MASK = 3;
public static int encode(boolean cull, int topology, int polygonMode) {
int state = polygonMode | topology << 3;
state |= (cull ? 2 : 0) << 7;
return state;
}
public static int decodeTopology(int state) {
return state >>> 3 & 31;
}
public static int decodePolygonMode(int state) {
return state & 7;
}
public static int decodeCullMode(int state) {
return state >>> 7 & 3;
}
}
public abstract static class ColorMask {
public static int getColorMask(boolean r, boolean g, boolean b, boolean a) {
return (r ? 1 : 0) | (g ? 2 : 0) | (b ? 4 : 0) | (a ? 8 : 0);
}
}
public abstract static class DepthState {
public static final int DEPTH_TEST_BIT = 1;
public static final int DEPTH_MASK_BIT = 2;
public static final int DEPTH_FUN_OFFSET = 2;
public static final int DEPTH_FUN_BITS = 4;
public static boolean depthTest(int i) {
return (i & 1) != 0;
}
public static boolean depthMask(int i) {
return (i & 2) != 0;
}
public static int encodeDepthFun(int glFun) {
int fun = glToVulkan(glFun);
return fun << 2;
}
public static int decodeDepthFun(int state) {
return state >>> 2;
}
private static int glToVulkan(int value) {
byte var10000;
switch (value) {
case 514:
var10000 = 2;
break;
case 515:
var10000 = 3;
break;
case 516:
var10000 = 4;
break;
case 517:
default:
throw new RuntimeException("unknown blend factor..");
case 518:
var10000 = 6;
break;
case 519:
var10000 = 7;
}
return var10000;
}
}
}
Download file