837 lines
33 KiB
JavaScript
837 lines
33 KiB
JavaScript
|
|
defineSuite([
|
||
|
|
'Renderer/RenderState',
|
||
|
|
'Core/WebGLConstants',
|
||
|
|
'Core/WindingOrder',
|
||
|
|
'Renderer/ContextLimits',
|
||
|
|
'Specs/createContext'
|
||
|
|
], function(
|
||
|
|
RenderState,
|
||
|
|
WebGLConstants,
|
||
|
|
WindingOrder,
|
||
|
|
ContextLimits,
|
||
|
|
createContext) {
|
||
|
|
'use strict';
|
||
|
|
|
||
|
|
var context;
|
||
|
|
|
||
|
|
beforeAll(function() {
|
||
|
|
context = createContext();
|
||
|
|
});
|
||
|
|
|
||
|
|
afterAll(function() {
|
||
|
|
context.destroyForSpecs();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('creates with defaults', function() {
|
||
|
|
var defaultRS = {
|
||
|
|
frontFace : WindingOrder.COUNTER_CLOCKWISE,
|
||
|
|
cull : {
|
||
|
|
enabled : false,
|
||
|
|
face : WebGLConstants.BACK
|
||
|
|
},
|
||
|
|
lineWidth : 1,
|
||
|
|
polygonOffset : {
|
||
|
|
enabled : false,
|
||
|
|
factor : 0,
|
||
|
|
units : 0
|
||
|
|
},
|
||
|
|
scissorTest : {
|
||
|
|
enabled : false,
|
||
|
|
rectangle : {
|
||
|
|
x : 0,
|
||
|
|
y : 0,
|
||
|
|
width : 0,
|
||
|
|
height : 0
|
||
|
|
}
|
||
|
|
},
|
||
|
|
depthRange : {
|
||
|
|
near : 0,
|
||
|
|
far : 1
|
||
|
|
},
|
||
|
|
depthTest : {
|
||
|
|
enabled : false,
|
||
|
|
func : WebGLConstants.LESS
|
||
|
|
},
|
||
|
|
colorMask : {
|
||
|
|
red : true,
|
||
|
|
green : true,
|
||
|
|
blue : true,
|
||
|
|
alpha : true
|
||
|
|
},
|
||
|
|
depthMask : true,
|
||
|
|
stencilMask : ~0,
|
||
|
|
blending : {
|
||
|
|
enabled : false,
|
||
|
|
color : {
|
||
|
|
red : 0.0,
|
||
|
|
green : 0.0,
|
||
|
|
blue : 0.0,
|
||
|
|
alpha : 0.0
|
||
|
|
},
|
||
|
|
equationRgb : WebGLConstants.FUNC_ADD,
|
||
|
|
equationAlpha : WebGLConstants.FUNC_ADD,
|
||
|
|
functionSourceRgb : WebGLConstants.ONE,
|
||
|
|
functionSourceAlpha : WebGLConstants.ONE,
|
||
|
|
functionDestinationRgb : WebGLConstants.ZERO,
|
||
|
|
functionDestinationAlpha : WebGLConstants.ZERO
|
||
|
|
},
|
||
|
|
stencilTest : {
|
||
|
|
enabled : false,
|
||
|
|
frontFunction : WebGLConstants.ALWAYS,
|
||
|
|
backFunction : WebGLConstants.ALWAYS,
|
||
|
|
reference : 0,
|
||
|
|
mask : ~0,
|
||
|
|
frontOperation : {
|
||
|
|
fail : WebGLConstants.KEEP,
|
||
|
|
zFail : WebGLConstants.KEEP,
|
||
|
|
zPass : WebGLConstants.KEEP
|
||
|
|
},
|
||
|
|
backOperation : {
|
||
|
|
fail : WebGLConstants.KEEP,
|
||
|
|
zFail : WebGLConstants.KEEP,
|
||
|
|
zPass : WebGLConstants.KEEP
|
||
|
|
}
|
||
|
|
},
|
||
|
|
sampleCoverage : {
|
||
|
|
enabled : false,
|
||
|
|
value : 1.0,
|
||
|
|
invert : false
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
var rs = RenderState.fromCache();
|
||
|
|
|
||
|
|
expect(rs.frontFace).toEqual(defaultRS.frontFace);
|
||
|
|
expect(rs.cull.enabled).toEqual(defaultRS.cull.enabled);
|
||
|
|
expect(rs.cull.face).toEqual(defaultRS.cull.face);
|
||
|
|
expect(rs.cull.lineWidth).toEqual(defaultRS.cull.lineWidth);
|
||
|
|
expect(rs.polygonOffset.enabled).toEqual(defaultRS.polygonOffset.enabled);
|
||
|
|
expect(rs.polygonOffset.factor).toEqual(defaultRS.polygonOffset.factor);
|
||
|
|
expect(rs.polygonOffset.units).toEqual(defaultRS.polygonOffset.units);
|
||
|
|
expect(rs.scissorTest.enabled).toEqual(defaultRS.scissorTest.enabled);
|
||
|
|
expect(rs.scissorTest.rectangle.x).toEqual(defaultRS.scissorTest.rectangle.x);
|
||
|
|
expect(rs.scissorTest.rectangle.y).toEqual(defaultRS.scissorTest.rectangle.y);
|
||
|
|
expect(rs.scissorTest.rectangle.width).toEqual(defaultRS.scissorTest.rectangle.width);
|
||
|
|
expect(rs.scissorTest.rectangle.height).toEqual(defaultRS.scissorTest.rectangle.height);
|
||
|
|
expect(rs.depthRange.near).toEqual(defaultRS.depthRange.near);
|
||
|
|
expect(rs.depthRange.far).toEqual(defaultRS.depthRange.far);
|
||
|
|
expect(rs.depthTest.enabled).toEqual(defaultRS.depthTest.enabled);
|
||
|
|
expect(rs.depthTest.func).toEqual(defaultRS.depthTest.func);
|
||
|
|
expect(rs.colorMask.red).toEqual(defaultRS.colorMask.red);
|
||
|
|
expect(rs.colorMask.green).toEqual(defaultRS.colorMask.green);
|
||
|
|
expect(rs.colorMask.blue).toEqual(defaultRS.colorMask.blue);
|
||
|
|
expect(rs.colorMask.alpha).toEqual(defaultRS.colorMask.alpha);
|
||
|
|
expect(rs.depthMask).toEqual(defaultRS.depthMask);
|
||
|
|
expect(rs.stencilMask).toEqual(defaultRS.stencilMask);
|
||
|
|
expect(rs.blending.enabled).toEqual(defaultRS.blending.enabled);
|
||
|
|
expect(rs.blending.color.red).toEqual(defaultRS.blending.color.red);
|
||
|
|
expect(rs.blending.color.green).toEqual(defaultRS.blending.color.green);
|
||
|
|
expect(rs.blending.color.blue).toEqual(defaultRS.blending.color.blue);
|
||
|
|
expect(rs.blending.color.alpha).toEqual(defaultRS.blending.color.alpha);
|
||
|
|
expect(rs.blending.equationRgb).toEqual(defaultRS.blending.equationRgb);
|
||
|
|
expect(rs.blending.equationAlpha).toEqual(defaultRS.blending.equationAlpha);
|
||
|
|
expect(rs.blending.functionSourceRgb).toEqual(defaultRS.blending.functionSourceRgb);
|
||
|
|
expect(rs.blending.functionSourceAlpha).toEqual(defaultRS.blending.functionSourceAlpha);
|
||
|
|
expect(rs.blending.functionDestinationRgb).toEqual(defaultRS.blending.functionDestinationRgb);
|
||
|
|
expect(rs.blending.functionDestinationAlpha).toEqual(defaultRS.blending.functionDestinationAlpha);
|
||
|
|
expect(rs.stencilTest.enabled).toEqual(defaultRS.stencilTest.enabled);
|
||
|
|
expect(rs.stencilTest.frontFunction).toEqual(defaultRS.stencilTest.frontFunction);
|
||
|
|
expect(rs.stencilTest.backFunction).toEqual(defaultRS.stencilTest.backFunction);
|
||
|
|
expect(rs.stencilTest.reference).toEqual(defaultRS.stencilTest.reference);
|
||
|
|
expect(rs.stencilTest.mask).toEqual(defaultRS.stencilTest.mask);
|
||
|
|
expect(rs.stencilTest.frontOperation.fail).toEqual(defaultRS.stencilTest.frontOperation.fail);
|
||
|
|
expect(rs.stencilTest.frontOperation.zFail).toEqual(defaultRS.stencilTest.frontOperation.zFail);
|
||
|
|
expect(rs.stencilTest.frontOperation.zPass).toEqual(defaultRS.stencilTest.frontOperation.zPass);
|
||
|
|
expect(rs.stencilTest.backOperation.fail).toEqual(defaultRS.stencilTest.backOperation.fail);
|
||
|
|
expect(rs.stencilTest.backOperation.zFail).toEqual(defaultRS.stencilTest.backOperation.zFail);
|
||
|
|
expect(rs.stencilTest.backOperation.zPass).toEqual(defaultRS.stencilTest.backOperation.zPass);
|
||
|
|
expect(rs.sampleCoverage.enabled).toEqual(defaultRS.sampleCoverage.enabled);
|
||
|
|
expect(rs.sampleCoverage.value).toEqual(defaultRS.sampleCoverage.value);
|
||
|
|
expect(rs.sampleCoverage.invert).toEqual(defaultRS.sampleCoverage.invert);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('creates with all render states', function() {
|
||
|
|
var r = {
|
||
|
|
frontFace : WindingOrder.CLOCKWISE,
|
||
|
|
cull : {
|
||
|
|
enabled : true,
|
||
|
|
face : WebGLConstants.FRONT
|
||
|
|
},
|
||
|
|
lineWidth : ContextLimits.maximumAliasedLineWidth,
|
||
|
|
polygonOffset : {
|
||
|
|
enabled : false,
|
||
|
|
factor : 1,
|
||
|
|
units : 1
|
||
|
|
},
|
||
|
|
scissorTest : {
|
||
|
|
enabled : true,
|
||
|
|
rectangle : {
|
||
|
|
x : 1,
|
||
|
|
y : 1,
|
||
|
|
width : 2,
|
||
|
|
height : 2
|
||
|
|
}
|
||
|
|
},
|
||
|
|
depthRange : {
|
||
|
|
near : 0.25,
|
||
|
|
far : 0.75
|
||
|
|
},
|
||
|
|
depthTest : {
|
||
|
|
enabled : true,
|
||
|
|
func : WebGLConstants.GREATER
|
||
|
|
},
|
||
|
|
colorMask : {
|
||
|
|
red : false,
|
||
|
|
green : false,
|
||
|
|
blue : false,
|
||
|
|
alpha : false
|
||
|
|
},
|
||
|
|
depthMask : false,
|
||
|
|
stencilMask : 0,
|
||
|
|
blending : {
|
||
|
|
enabled : true,
|
||
|
|
color : {
|
||
|
|
red : 1.0,
|
||
|
|
green : 1.0,
|
||
|
|
blue : 1.0,
|
||
|
|
alpha : 1.0
|
||
|
|
},
|
||
|
|
equationRgb : WebGLConstants.FUNC_SUBTRACT,
|
||
|
|
equationAlpha : WebGLConstants.FUNC_SUBTRACT,
|
||
|
|
functionSourceRgb : WebGLConstants.ZERO,
|
||
|
|
functionSourceAlpha : WebGLConstants.ZERO,
|
||
|
|
functionDestinationRgb : WebGLConstants.ONE,
|
||
|
|
functionDestinationAlpha : WebGLConstants.ONE
|
||
|
|
},
|
||
|
|
stencilTest : {
|
||
|
|
enabled : true,
|
||
|
|
frontFunction : WebGLConstants.NEVER,
|
||
|
|
backFunction : WebGLConstants.NEVER,
|
||
|
|
reference : 1,
|
||
|
|
mask : 0,
|
||
|
|
frontOperation : {
|
||
|
|
fail : WebGLConstants.REPLACE,
|
||
|
|
zFail : WebGLConstants.REPLACE,
|
||
|
|
zPass : WebGLConstants.REPLACE
|
||
|
|
},
|
||
|
|
backOperation : {
|
||
|
|
fail : WebGLConstants.REPLACE,
|
||
|
|
zFail : WebGLConstants.REPLACE,
|
||
|
|
zPass : WebGLConstants.REPLACE
|
||
|
|
}
|
||
|
|
},
|
||
|
|
sampleCoverage : {
|
||
|
|
enabled : true,
|
||
|
|
value : 0.5,
|
||
|
|
invert : true
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
var rs = RenderState.fromCache(r);
|
||
|
|
|
||
|
|
expect(rs.frontFace).toEqual(r.frontFace);
|
||
|
|
expect(rs.cull.enabled).toEqual(r.cull.enabled);
|
||
|
|
expect(rs.cull.face).toEqual(r.cull.face);
|
||
|
|
expect(rs.cull.lineWidth).toEqual(r.cull.lineWidth);
|
||
|
|
expect(rs.polygonOffset.enabled).toEqual(r.polygonOffset.enabled);
|
||
|
|
expect(rs.polygonOffset.factor).toEqual(r.polygonOffset.factor);
|
||
|
|
expect(rs.polygonOffset.units).toEqual(r.polygonOffset.units);
|
||
|
|
expect(rs.scissorTest.enabled).toEqual(r.scissorTest.enabled);
|
||
|
|
expect(rs.scissorTest.rectangle.x).toEqual(r.scissorTest.rectangle.x);
|
||
|
|
expect(rs.scissorTest.rectangle.y).toEqual(r.scissorTest.rectangle.y);
|
||
|
|
expect(rs.scissorTest.rectangle.width).toEqual(r.scissorTest.rectangle.width);
|
||
|
|
expect(rs.scissorTest.rectangle.height).toEqual(r.scissorTest.rectangle.height);
|
||
|
|
expect(rs.depthRange.near).toEqual(r.depthRange.near);
|
||
|
|
expect(rs.depthRange.far).toEqual(r.depthRange.far);
|
||
|
|
expect(rs.depthTest.enabled).toEqual(r.depthTest.enabled);
|
||
|
|
expect(rs.depthTest.func).toEqual(r.depthTest.func);
|
||
|
|
expect(rs.colorMask.red).toEqual(r.colorMask.red);
|
||
|
|
expect(rs.colorMask.green).toEqual(r.colorMask.green);
|
||
|
|
expect(rs.colorMask.blue).toEqual(r.colorMask.blue);
|
||
|
|
expect(rs.colorMask.alpha).toEqual(r.colorMask.alpha);
|
||
|
|
expect(rs.depthMask).toEqual(r.depthMask);
|
||
|
|
expect(rs.stencilMask).toEqual(r.stencilMask);
|
||
|
|
expect(rs.blending.enabled).toEqual(r.blending.enabled);
|
||
|
|
expect(rs.blending.color.red).toEqual(r.blending.color.red);
|
||
|
|
expect(rs.blending.color.green).toEqual(r.blending.color.green);
|
||
|
|
expect(rs.blending.color.blue).toEqual(r.blending.color.blue);
|
||
|
|
expect(rs.blending.color.alpha).toEqual(r.blending.color.alpha);
|
||
|
|
expect(rs.blending.equationRgb).toEqual(r.blending.equationRgb);
|
||
|
|
expect(rs.blending.equationAlpha).toEqual(r.blending.equationAlpha);
|
||
|
|
expect(rs.blending.functionSourceRgb).toEqual(r.blending.functionSourceRgb);
|
||
|
|
expect(rs.blending.functionSourceAlpha).toEqual(r.blending.functionSourceAlpha);
|
||
|
|
expect(rs.blending.functionDestinationRgb).toEqual(r.blending.functionDestinationRgb);
|
||
|
|
expect(rs.blending.functionDestinationAlpha).toEqual(r.blending.functionDestinationAlpha);
|
||
|
|
expect(rs.stencilTest.enabled).toEqual(r.stencilTest.enabled);
|
||
|
|
expect(rs.stencilTest.frontFunction).toEqual(r.stencilTest.frontFunction);
|
||
|
|
expect(rs.stencilTest.backFunction).toEqual(r.stencilTest.backFunction);
|
||
|
|
expect(rs.stencilTest.reference).toEqual(r.stencilTest.reference);
|
||
|
|
expect(rs.stencilTest.mask).toEqual(r.stencilTest.mask);
|
||
|
|
expect(rs.stencilTest.frontOperation.fail).toEqual(r.stencilTest.frontOperation.fail);
|
||
|
|
expect(rs.stencilTest.frontOperation.zFail).toEqual(r.stencilTest.frontOperation.zFail);
|
||
|
|
expect(rs.stencilTest.frontOperation.zPass).toEqual(r.stencilTest.frontOperation.zPass);
|
||
|
|
expect(rs.stencilTest.backOperation.fail).toEqual(r.stencilTest.backOperation.fail);
|
||
|
|
expect(rs.stencilTest.backOperation.zFail).toEqual(r.stencilTest.backOperation.zFail);
|
||
|
|
expect(rs.stencilTest.backOperation.zPass).toEqual(r.stencilTest.backOperation.zPass);
|
||
|
|
expect(rs.sampleCoverage.enabled).toEqual(r.sampleCoverage.enabled);
|
||
|
|
expect(rs.sampleCoverage.value).toEqual(r.sampleCoverage.value);
|
||
|
|
expect(rs.sampleCoverage.invert).toEqual(r.sampleCoverage.invert);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('creates with some render states', function() {
|
||
|
|
var r = {
|
||
|
|
frontFace : WindingOrder.CLOCKWISE,
|
||
|
|
depthRange : {
|
||
|
|
near : 0.25,
|
||
|
|
far : 0.75
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
var rs = RenderState.fromCache(r);
|
||
|
|
expect(rs.frontFace).toEqual(r.frontFace);
|
||
|
|
expect(rs.depthRange.near).toEqual(r.depthRange.near);
|
||
|
|
expect(rs.depthRange.far).toEqual(r.depthRange.far);
|
||
|
|
|
||
|
|
var defaultRS = RenderState.fromCache();
|
||
|
|
expect(rs.cull.enabled).toEqual(defaultRS.cull.enabled);
|
||
|
|
expect(rs.cull.face).toEqual(defaultRS.cull.face);
|
||
|
|
expect(rs.cull.lineWidth).toEqual(defaultRS.cull.lineWidth);
|
||
|
|
expect(rs.polygonOffset.enabled).toEqual(defaultRS.polygonOffset.enabled);
|
||
|
|
expect(rs.polygonOffset.factor).toEqual(defaultRS.polygonOffset.factor);
|
||
|
|
expect(rs.polygonOffset.units).toEqual(defaultRS.polygonOffset.units);
|
||
|
|
expect(rs.scissorTest.enabled).toEqual(defaultRS.scissorTest.enabled);
|
||
|
|
expect(rs.scissorTest.rectangle.x).toEqual(defaultRS.scissorTest.rectangle.x);
|
||
|
|
expect(rs.scissorTest.rectangle.y).toEqual(defaultRS.scissorTest.rectangle.y);
|
||
|
|
expect(rs.scissorTest.rectangle.width).toEqual(defaultRS.scissorTest.rectangle.width);
|
||
|
|
expect(rs.scissorTest.rectangle.height).toEqual(defaultRS.scissorTest.rectangle.height);
|
||
|
|
expect(rs.depthTest.enabled).toEqual(defaultRS.depthTest.enabled);
|
||
|
|
expect(rs.depthTest.func).toEqual(defaultRS.depthTest.func);
|
||
|
|
expect(rs.colorMask.red).toEqual(defaultRS.colorMask.red);
|
||
|
|
expect(rs.colorMask.green).toEqual(defaultRS.colorMask.green);
|
||
|
|
expect(rs.colorMask.blue).toEqual(defaultRS.colorMask.blue);
|
||
|
|
expect(rs.colorMask.alpha).toEqual(defaultRS.colorMask.alpha);
|
||
|
|
expect(rs.depthMask).toEqual(defaultRS.depthMask);
|
||
|
|
expect(rs.stencilMask).toEqual(defaultRS.stencilMask);
|
||
|
|
expect(rs.blending.enabled).toEqual(defaultRS.blending.enabled);
|
||
|
|
expect(rs.blending.color.red).toEqual(defaultRS.blending.color.red);
|
||
|
|
expect(rs.blending.color.green).toEqual(defaultRS.blending.color.green);
|
||
|
|
expect(rs.blending.color.blue).toEqual(defaultRS.blending.color.blue);
|
||
|
|
expect(rs.blending.color.alpha).toEqual(defaultRS.blending.color.alpha);
|
||
|
|
expect(rs.blending.equationRgb).toEqual(defaultRS.blending.equationRgb);
|
||
|
|
expect(rs.blending.equationAlpha).toEqual(defaultRS.blending.equationAlpha);
|
||
|
|
expect(rs.blending.functionSourceRgb).toEqual(defaultRS.blending.functionSourceRgb);
|
||
|
|
expect(rs.blending.functionSourceAlpha).toEqual(defaultRS.blending.functionSourceAlpha);
|
||
|
|
expect(rs.blending.functionDestinationRgb).toEqual(defaultRS.blending.functionDestinationRgb);
|
||
|
|
expect(rs.blending.functionDestinationAlpha).toEqual(defaultRS.blending.functionDestinationAlpha);
|
||
|
|
expect(rs.stencilTest.enabled).toEqual(defaultRS.stencilTest.enabled);
|
||
|
|
expect(rs.stencilTest.frontFunction).toEqual(defaultRS.stencilTest.frontFunction);
|
||
|
|
expect(rs.stencilTest.backFunction).toEqual(defaultRS.stencilTest.backFunction);
|
||
|
|
expect(rs.stencilTest.reference).toEqual(defaultRS.stencilTest.reference);
|
||
|
|
expect(rs.stencilTest.mask).toEqual(defaultRS.stencilTest.mask);
|
||
|
|
expect(rs.stencilTest.frontOperation.fail).toEqual(defaultRS.stencilTest.frontOperation.fail);
|
||
|
|
expect(rs.stencilTest.frontOperation.zFail).toEqual(defaultRS.stencilTest.frontOperation.zFail);
|
||
|
|
expect(rs.stencilTest.frontOperation.zPass).toEqual(defaultRS.stencilTest.frontOperation.zPass);
|
||
|
|
expect(rs.stencilTest.backOperation.fail).toEqual(defaultRS.stencilTest.backOperation.fail);
|
||
|
|
expect(rs.stencilTest.backOperation.zFail).toEqual(defaultRS.stencilTest.backOperation.zFail);
|
||
|
|
expect(rs.stencilTest.backOperation.zPass).toEqual(defaultRS.stencilTest.backOperation.zPass);
|
||
|
|
expect(rs.sampleCoverage.enabled).toEqual(defaultRS.sampleCoverage.enabled);
|
||
|
|
expect(rs.sampleCoverage.value).toEqual(defaultRS.sampleCoverage.value);
|
||
|
|
expect(rs.sampleCoverage.invert).toEqual(defaultRS.sampleCoverage.invert);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('caches render states', function() {
|
||
|
|
var rs = RenderState.fromCache();
|
||
|
|
var rs2 = RenderState.fromCache();
|
||
|
|
// rs3 is still the same state as rs and rs2, but with a partial definition
|
||
|
|
var rs3 = RenderState.fromCache({
|
||
|
|
depthTest : {
|
||
|
|
enabled : false,
|
||
|
|
func : WebGLConstants.LESS
|
||
|
|
}
|
||
|
|
});
|
||
|
|
// rs4 is a cache miss since it has a different depthTest
|
||
|
|
var rs4 = RenderState.fromCache({
|
||
|
|
depthTest : {
|
||
|
|
enabled : true,
|
||
|
|
func : WebGLConstants.NEVER
|
||
|
|
}
|
||
|
|
});
|
||
|
|
expect(rs2).toBe(rs);
|
||
|
|
expect(rs3).toBe(rs);
|
||
|
|
expect(rs4).not.toBe(rs);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('removes from render cache', function() {
|
||
|
|
RenderState.clearCache();
|
||
|
|
var cache = RenderState.getCache();
|
||
|
|
|
||
|
|
var rs = RenderState.fromCache();
|
||
|
|
var undefinedKey = JSON.stringify(undefined);
|
||
|
|
var fullKey = JSON.stringify(new RenderState());
|
||
|
|
|
||
|
|
expect(cache[fullKey].referenceCount).toEqual(1);
|
||
|
|
expect(cache[undefinedKey].referenceCount).toEqual(1);
|
||
|
|
|
||
|
|
var rs2 = RenderState.fromCache();
|
||
|
|
|
||
|
|
expect(cache[fullKey].referenceCount).toEqual(1);
|
||
|
|
expect(cache[undefinedKey].referenceCount).toEqual(2);
|
||
|
|
|
||
|
|
// rs3 is still the same state as rs and rs2, but with a partial definition
|
||
|
|
var param = {
|
||
|
|
depthTest : {
|
||
|
|
enabled : false,
|
||
|
|
func : WebGLConstants.LESS
|
||
|
|
}
|
||
|
|
};
|
||
|
|
var rs3 = RenderState.fromCache(param);
|
||
|
|
var paramKey = JSON.stringify(param);
|
||
|
|
|
||
|
|
expect(rs2).toBe(rs);
|
||
|
|
expect(rs3).toBe(rs);
|
||
|
|
|
||
|
|
expect(cache[fullKey].referenceCount).toEqual(2);
|
||
|
|
expect(cache[undefinedKey].referenceCount).toEqual(2);
|
||
|
|
expect(cache[paramKey].referenceCount).toEqual(1);
|
||
|
|
|
||
|
|
RenderState.removeFromCache(param);
|
||
|
|
|
||
|
|
expect(cache[fullKey].referenceCount).toEqual(1);
|
||
|
|
expect(cache[undefinedKey].referenceCount).toEqual(2);
|
||
|
|
expect(cache[paramKey]).not.toBeDefined();
|
||
|
|
|
||
|
|
RenderState.removeFromCache();
|
||
|
|
RenderState.removeFromCache();
|
||
|
|
|
||
|
|
expect(cache[undefinedKey]).not.toBeDefined();
|
||
|
|
expect(cache[fullKey]).not.toBeDefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('freezes render states', function() {
|
||
|
|
var rs = RenderState.fromCache();
|
||
|
|
expect(Object.isFrozen(rs)).toBe(!window.specsUsingRelease);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (frontFace)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
frontFace : 'invalid value'
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (cull.face)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
cull : {
|
||
|
|
face : 'invalid value'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (small lineWidth)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
lineWidth : ContextLimits.minimumAliasedLineWidth - 1
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (large lineWidth)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
lineWidth : ContextLimits.maximumAliasedLineWidth + 1
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (negative scissorTest.rectangle.width)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
scissorTest : {
|
||
|
|
rectangle : {
|
||
|
|
x : 0,
|
||
|
|
y : 0,
|
||
|
|
width : -1,
|
||
|
|
height : 0
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (negative scissorTest.rectangle.height)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
scissorTest : {
|
||
|
|
rectangle : {
|
||
|
|
x : 0,
|
||
|
|
y : 0,
|
||
|
|
width : 0,
|
||
|
|
height : -1
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (near > far)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
depthRange : {
|
||
|
|
near : 0.75,
|
||
|
|
far : 0.25
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (near < 0)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
depthRange : {
|
||
|
|
near : -1
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (far > 1)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
depthRange : {
|
||
|
|
far : 2
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (depthTest.func)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
depthTest : {
|
||
|
|
func : 'invalid value'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (blending.color < 0)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
blending : {
|
||
|
|
color : {
|
||
|
|
red : -1.0,
|
||
|
|
green : 0.0,
|
||
|
|
blue : 0.0,
|
||
|
|
alpha : 0.0
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (blending.color > 1)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
blending: {
|
||
|
|
color: {
|
||
|
|
red: 0.0,
|
||
|
|
green: 0.0,
|
||
|
|
blue: 0.0,
|
||
|
|
alpha: 2.0
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (blend.equationRgb)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
blending: {
|
||
|
|
equationRgb: 'invalid value'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (blend.equationAlpha)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
blending: {
|
||
|
|
equationAlpha: 'invalid value'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (blend.functionSourceRgb)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
blending: {
|
||
|
|
functionSourceRgb: 'invalid value'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (blend.functionSourceAlpha)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
blending: {
|
||
|
|
functionSourceAlpha: 'invalid value'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (blend.functionDestinationRgb)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
blending: {
|
||
|
|
functionDestinationRgb: 'invalid value'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (blend.functionDestinationAlpha)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
blending: {
|
||
|
|
functionDestinationAlpha: 'invalid value'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (stencilTest.frontFunction)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
stencilTest: {
|
||
|
|
frontFunction: 'invalid value'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (stencilTest.backFunction)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
stencilTest: {
|
||
|
|
backFunction: 'invalid value'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (stencilTest.frontOperation.fail)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
stencilTest: {
|
||
|
|
frontOperation: {
|
||
|
|
fail: 'invalid value'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (stencilTest.frontOperation.zFail)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
stencilTest: {
|
||
|
|
frontOperation: {
|
||
|
|
zFail: 'invalid value'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (stencilTest.frontOperation.zPass)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
stencilTest: {
|
||
|
|
frontOperation: {
|
||
|
|
zPass: 'invalid value'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (stencilTest.backOperation.fail)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
stencilTest: {
|
||
|
|
backOperation: {
|
||
|
|
fail: 'invalid value'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (stencilTest.backOperation.zFail)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
stencilTest: {
|
||
|
|
backOperation: {
|
||
|
|
zFail: 'invalid value'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to create (stencilTest.backOperation.zPass)', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.fromCache({
|
||
|
|
stencilTest: {
|
||
|
|
backOperation: {
|
||
|
|
zPass: 'invalid value'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('fails to get state without renderState', function() {
|
||
|
|
expect(function() {
|
||
|
|
RenderState.getState(undefined);
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('clones', function() {
|
||
|
|
var r = {
|
||
|
|
frontFace : WindingOrder.CLOCKWISE,
|
||
|
|
cull : {
|
||
|
|
enabled : true,
|
||
|
|
face : WebGLConstants.FRONT
|
||
|
|
},
|
||
|
|
lineWidth : ContextLimits.maximumAliasedLineWidth,
|
||
|
|
polygonOffset : {
|
||
|
|
enabled : false,
|
||
|
|
factor : 1,
|
||
|
|
units : 1
|
||
|
|
},
|
||
|
|
scissorTest : {
|
||
|
|
enabled : true,
|
||
|
|
rectangle : {
|
||
|
|
x : 1,
|
||
|
|
y : 1,
|
||
|
|
width : 2,
|
||
|
|
height : 2
|
||
|
|
}
|
||
|
|
},
|
||
|
|
depthRange : {
|
||
|
|
near : 0.25,
|
||
|
|
far : 0.75
|
||
|
|
},
|
||
|
|
depthTest : {
|
||
|
|
enabled : true,
|
||
|
|
func : WebGLConstants.GREATER
|
||
|
|
},
|
||
|
|
colorMask : {
|
||
|
|
red : false,
|
||
|
|
green : false,
|
||
|
|
blue : false,
|
||
|
|
alpha : false
|
||
|
|
},
|
||
|
|
depthMask : false,
|
||
|
|
stencilMask : 0,
|
||
|
|
blending : {
|
||
|
|
enabled : true,
|
||
|
|
color : {
|
||
|
|
red : 1.0,
|
||
|
|
green : 1.0,
|
||
|
|
blue : 1.0,
|
||
|
|
alpha : 1.0
|
||
|
|
},
|
||
|
|
equationRgb : WebGLConstants.FUNC_SUBTRACT,
|
||
|
|
equationAlpha : WebGLConstants.FUNC_SUBTRACT,
|
||
|
|
functionSourceRgb : WebGLConstants.ZERO,
|
||
|
|
functionSourceAlpha : WebGLConstants.ZERO,
|
||
|
|
functionDestinationRgb : WebGLConstants.ONE,
|
||
|
|
functionDestinationAlpha : WebGLConstants.ONE
|
||
|
|
},
|
||
|
|
stencilTest : {
|
||
|
|
enabled : true,
|
||
|
|
frontFunction : WebGLConstants.NEVER,
|
||
|
|
backFunction : WebGLConstants.NEVER,
|
||
|
|
reference : 1,
|
||
|
|
mask : 0,
|
||
|
|
frontOperation : {
|
||
|
|
fail : WebGLConstants.REPLACE,
|
||
|
|
zFail : WebGLConstants.REPLACE,
|
||
|
|
zPass : WebGLConstants.REPLACE
|
||
|
|
},
|
||
|
|
backOperation : {
|
||
|
|
fail : WebGLConstants.REPLACE,
|
||
|
|
zFail : WebGLConstants.REPLACE,
|
||
|
|
zPass : WebGLConstants.REPLACE
|
||
|
|
}
|
||
|
|
},
|
||
|
|
sampleCoverage : {
|
||
|
|
enabled : true,
|
||
|
|
value : 0.5,
|
||
|
|
invert : true
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
var rs = RenderState.fromCache(RenderState.getState(r));
|
||
|
|
|
||
|
|
expect(rs.frontFace).toEqual(r.frontFace);
|
||
|
|
expect(rs.cull.enabled).toEqual(r.cull.enabled);
|
||
|
|
expect(rs.cull.face).toEqual(r.cull.face);
|
||
|
|
expect(rs.cull.lineWidth).toEqual(r.cull.lineWidth);
|
||
|
|
expect(rs.polygonOffset.enabled).toEqual(r.polygonOffset.enabled);
|
||
|
|
expect(rs.polygonOffset.factor).toEqual(r.polygonOffset.factor);
|
||
|
|
expect(rs.polygonOffset.units).toEqual(r.polygonOffset.units);
|
||
|
|
expect(rs.scissorTest.enabled).toEqual(r.scissorTest.enabled);
|
||
|
|
expect(rs.scissorTest.rectangle.x).toEqual(r.scissorTest.rectangle.x);
|
||
|
|
expect(rs.scissorTest.rectangle.y).toEqual(r.scissorTest.rectangle.y);
|
||
|
|
expect(rs.scissorTest.rectangle.width).toEqual(r.scissorTest.rectangle.width);
|
||
|
|
expect(rs.scissorTest.rectangle.height).toEqual(r.scissorTest.rectangle.height);
|
||
|
|
expect(rs.depthRange.near).toEqual(r.depthRange.near);
|
||
|
|
expect(rs.depthRange.far).toEqual(r.depthRange.far);
|
||
|
|
expect(rs.depthTest.enabled).toEqual(r.depthTest.enabled);
|
||
|
|
expect(rs.depthTest.func).toEqual(r.depthTest.func);
|
||
|
|
expect(rs.colorMask.red).toEqual(r.colorMask.red);
|
||
|
|
expect(rs.colorMask.green).toEqual(r.colorMask.green);
|
||
|
|
expect(rs.colorMask.blue).toEqual(r.colorMask.blue);
|
||
|
|
expect(rs.colorMask.alpha).toEqual(r.colorMask.alpha);
|
||
|
|
expect(rs.depthMask).toEqual(r.depthMask);
|
||
|
|
expect(rs.stencilMask).toEqual(r.stencilMask);
|
||
|
|
expect(rs.blending.enabled).toEqual(r.blending.enabled);
|
||
|
|
expect(rs.blending.color.red).toEqual(r.blending.color.red);
|
||
|
|
expect(rs.blending.color.green).toEqual(r.blending.color.green);
|
||
|
|
expect(rs.blending.color.blue).toEqual(r.blending.color.blue);
|
||
|
|
expect(rs.blending.color.alpha).toEqual(r.blending.color.alpha);
|
||
|
|
expect(rs.blending.equationRgb).toEqual(r.blending.equationRgb);
|
||
|
|
expect(rs.blending.equationAlpha).toEqual(r.blending.equationAlpha);
|
||
|
|
expect(rs.blending.functionSourceRgb).toEqual(r.blending.functionSourceRgb);
|
||
|
|
expect(rs.blending.functionSourceAlpha).toEqual(r.blending.functionSourceAlpha);
|
||
|
|
expect(rs.blending.functionDestinationRgb).toEqual(r.blending.functionDestinationRgb);
|
||
|
|
expect(rs.blending.functionDestinationAlpha).toEqual(r.blending.functionDestinationAlpha);
|
||
|
|
expect(rs.stencilTest.enabled).toEqual(r.stencilTest.enabled);
|
||
|
|
expect(rs.stencilTest.frontFunction).toEqual(r.stencilTest.frontFunction);
|
||
|
|
expect(rs.stencilTest.backFunction).toEqual(r.stencilTest.backFunction);
|
||
|
|
expect(rs.stencilTest.reference).toEqual(r.stencilTest.reference);
|
||
|
|
expect(rs.stencilTest.mask).toEqual(r.stencilTest.mask);
|
||
|
|
expect(rs.stencilTest.frontOperation.fail).toEqual(r.stencilTest.frontOperation.fail);
|
||
|
|
expect(rs.stencilTest.frontOperation.zFail).toEqual(r.stencilTest.frontOperation.zFail);
|
||
|
|
expect(rs.stencilTest.frontOperation.zPass).toEqual(r.stencilTest.frontOperation.zPass);
|
||
|
|
expect(rs.stencilTest.backOperation.fail).toEqual(r.stencilTest.backOperation.fail);
|
||
|
|
expect(rs.stencilTest.backOperation.zFail).toEqual(r.stencilTest.backOperation.zFail);
|
||
|
|
expect(rs.stencilTest.backOperation.zPass).toEqual(r.stencilTest.backOperation.zPass);
|
||
|
|
expect(rs.sampleCoverage.enabled).toEqual(r.sampleCoverage.enabled);
|
||
|
|
expect(rs.sampleCoverage.value).toEqual(r.sampleCoverage.value);
|
||
|
|
expect(rs.sampleCoverage.invert).toEqual(r.sampleCoverage.invert);
|
||
|
|
});
|
||
|
|
|
||
|
|
}, 'WebGL');
|