96 lines
3.0 KiB
Haxe
96 lines
3.0 KiB
Haxe
|
package kha.graphics4;
|
||
|
|
||
|
import kha.graphics4.FragmentShader;
|
||
|
import kha.graphics4.VertexData;
|
||
|
import kha.graphics4.VertexShader;
|
||
|
import kha.graphics4.VertexStructure;
|
||
|
|
||
|
class PipelineState extends PipelineStateBase {
|
||
|
var pipeline: Dynamic;
|
||
|
|
||
|
public function new() {
|
||
|
super();
|
||
|
pipeline = Krom.createPipeline();
|
||
|
}
|
||
|
|
||
|
public function delete() {
|
||
|
Krom.deletePipeline(pipeline);
|
||
|
pipeline = null;
|
||
|
}
|
||
|
|
||
|
public function compile(): Void {
|
||
|
var structure0 = inputLayout.length > 0 ? inputLayout[0] : null;
|
||
|
var structure1 = inputLayout.length > 1 ? inputLayout[1] : null;
|
||
|
var structure2 = inputLayout.length > 2 ? inputLayout[2] : null;
|
||
|
var structure3 = inputLayout.length > 3 ? inputLayout[3] : null;
|
||
|
var gs = geometryShader != null ? geometryShader.shader : null;
|
||
|
var tcs = tessellationControlShader != null ? tessellationControlShader.shader : null;
|
||
|
var tes = tessellationEvaluationShader != null ? tessellationEvaluationShader.shader : null;
|
||
|
var stencilReferenceValue = 0;
|
||
|
switch (this.stencilReferenceValue) {
|
||
|
case Static(value):
|
||
|
stencilReferenceValue = value;
|
||
|
default:
|
||
|
}
|
||
|
Krom.compilePipeline(pipeline, structure0, structure1, structure2, structure3, inputLayout.length, vertexShader.shader, fragmentShader.shader, gs,
|
||
|
tcs, tes, {
|
||
|
cullMode: cullMode,
|
||
|
depthWrite: this.depthWrite,
|
||
|
depthMode: depthMode,
|
||
|
stencilMode: stencilFrontMode,
|
||
|
stencilBothPass: stencilFrontBothPass,
|
||
|
stencilDepthFail: stencilFrontDepthFail,
|
||
|
stencilFail: stencilFrontFail,
|
||
|
stencilReferenceValue: stencilReferenceValue,
|
||
|
stencilReadMask: stencilReadMask,
|
||
|
stencilWriteMask: stencilWriteMask,
|
||
|
blendSource: convertBlendingFactor(blendSource),
|
||
|
blendDestination: convertBlendingFactor(blendDestination),
|
||
|
alphaBlendSource: convertBlendingFactor(alphaBlendSource),
|
||
|
alphaBlendDestination: convertBlendingFactor(alphaBlendDestination),
|
||
|
colorWriteMaskRed: colorWriteMasksRed,
|
||
|
colorWriteMaskGreen: colorWriteMasksGreen,
|
||
|
colorWriteMaskBlue: colorWriteMasksBlue,
|
||
|
colorWriteMaskAlpha: colorWriteMasksAlpha,
|
||
|
conservativeRasterization: conservativeRasterization
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public function set(): Void {
|
||
|
Krom.setPipeline(pipeline);
|
||
|
}
|
||
|
|
||
|
public function getConstantLocation(name: String): kha.graphics4.ConstantLocation {
|
||
|
return Krom.getConstantLocation(pipeline, name);
|
||
|
}
|
||
|
|
||
|
public function getTextureUnit(name: String): kha.graphics4.TextureUnit {
|
||
|
return Krom.getTextureUnit(pipeline, name);
|
||
|
}
|
||
|
|
||
|
static function convertBlendingFactor(factor: BlendingFactor): Int {
|
||
|
switch (factor) {
|
||
|
case Undefined, BlendOne:
|
||
|
return 0;
|
||
|
case BlendZero:
|
||
|
return 1;
|
||
|
case SourceAlpha:
|
||
|
return 2;
|
||
|
case DestinationAlpha:
|
||
|
return 3;
|
||
|
case InverseSourceAlpha:
|
||
|
return 4;
|
||
|
case InverseDestinationAlpha:
|
||
|
return 5;
|
||
|
case SourceColor:
|
||
|
return 6;
|
||
|
case DestinationColor:
|
||
|
return 7;
|
||
|
case InverseSourceColor:
|
||
|
return 8;
|
||
|
case InverseDestinationColor:
|
||
|
return 9;
|
||
|
}
|
||
|
}
|
||
|
}
|