Use a 3D transform in the tile vertex shaders.
This opens the door to caching tiles at different zoom levels (issue #191).
This commit is contained in:
parent
4cdded74b4
commit
222fa89b23
|
@ -306,6 +306,11 @@ impl Transform3DF {
|
||||||
pub fn as_ptr(&self) -> *const f32 {
|
pub fn as_ptr(&self) -> *const f32 {
|
||||||
(&self.c0) as *const F32x4 as *const f32
|
(&self.c0) as *const F32x4 as *const f32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn to_columns(&self) -> [F32x4; 4] {
|
||||||
|
[self.c0, self.c1, self.c2, self.c3]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Add<Matrix2x2F> for Matrix2x2F {
|
impl Add<Matrix2x2F> for Matrix2x2F {
|
||||||
|
|
|
@ -473,17 +473,23 @@ where
|
||||||
self.buffered_fills.clear();
|
self.buffered_fills.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn tile_transform(&self) -> Transform3DF {
|
||||||
|
let draw_viewport = self.draw_viewport().size().to_f32();
|
||||||
|
let scale = F32x4::new(2.0 / draw_viewport.x(), -2.0 / draw_viewport.y(), 1.0, 1.0);
|
||||||
|
let transform = Transform3DF::from_scale(scale.x(), scale.y(), 1.0);
|
||||||
|
Transform3DF::from_translation(-1.0, 1.0, 0.0).post_mul(&transform)
|
||||||
|
}
|
||||||
|
|
||||||
fn draw_alpha_tiles(&mut self, count: u32) {
|
fn draw_alpha_tiles(&mut self, count: u32) {
|
||||||
let clear_color = self.clear_color_for_draw_operation();
|
let clear_color = self.clear_color_for_draw_operation();
|
||||||
|
|
||||||
let alpha_tile_vertex_array = self.alpha_tile_vertex_array();
|
let alpha_tile_vertex_array = self.alpha_tile_vertex_array();
|
||||||
let alpha_tile_program = self.alpha_tile_program();
|
let alpha_tile_program = self.alpha_tile_program();
|
||||||
|
|
||||||
let draw_viewport = self.draw_viewport();
|
|
||||||
let mut textures = vec![self.device.framebuffer_texture(&self.mask_framebuffer)];
|
let mut textures = vec![self.device.framebuffer_texture(&self.mask_framebuffer)];
|
||||||
let mut uniforms = vec![
|
let mut uniforms = vec![
|
||||||
(&alpha_tile_program.framebuffer_size_uniform,
|
(&alpha_tile_program.transform_uniform,
|
||||||
UniformData::Vec2(draw_viewport.size().to_f32().0)),
|
UniformData::Mat4(self.tile_transform().to_columns())),
|
||||||
(&alpha_tile_program.tile_size_uniform,
|
(&alpha_tile_program.tile_size_uniform,
|
||||||
UniformData::Vec2(I32x4::new(TILE_WIDTH as i32,
|
UniformData::Vec2(I32x4::new(TILE_WIDTH as i32,
|
||||||
TILE_HEIGHT as i32,
|
TILE_HEIGHT as i32,
|
||||||
|
@ -495,8 +501,6 @@ where
|
||||||
MASK_FRAMEBUFFER_HEIGHT,
|
MASK_FRAMEBUFFER_HEIGHT,
|
||||||
0,
|
0,
|
||||||
0).to_f32x4())),
|
0).to_f32x4())),
|
||||||
// FIXME(pcwalton): Fill this in properly!
|
|
||||||
(&alpha_tile_program.view_box_origin_uniform, UniformData::Vec2(F32x4::default())),
|
|
||||||
];
|
];
|
||||||
|
|
||||||
match self.render_mode {
|
match self.render_mode {
|
||||||
|
@ -528,7 +532,7 @@ where
|
||||||
primitive: Primitive::Triangles,
|
primitive: Primitive::Triangles,
|
||||||
textures: &textures,
|
textures: &textures,
|
||||||
uniforms: &uniforms,
|
uniforms: &uniforms,
|
||||||
viewport: draw_viewport,
|
viewport: self.draw_viewport(),
|
||||||
options: RenderOptions {
|
options: RenderOptions {
|
||||||
blend: BlendState::RGBSrcAlphaAlphaOneMinusSrcAlpha,
|
blend: BlendState::RGBSrcAlphaAlphaOneMinusSrcAlpha,
|
||||||
stencil: self.stencil_state(),
|
stencil: self.stencil_state(),
|
||||||
|
@ -546,18 +550,15 @@ where
|
||||||
let solid_tile_vertex_array = self.solid_tile_vertex_array();
|
let solid_tile_vertex_array = self.solid_tile_vertex_array();
|
||||||
let solid_tile_program = self.solid_tile_program();
|
let solid_tile_program = self.solid_tile_program();
|
||||||
|
|
||||||
let draw_viewport = self.draw_viewport();
|
|
||||||
let mut textures = vec![];
|
let mut textures = vec![];
|
||||||
let mut uniforms = vec![
|
let mut uniforms = vec![
|
||||||
(&solid_tile_program.framebuffer_size_uniform,
|
(&solid_tile_program.transform_uniform,
|
||||||
UniformData::Vec2(draw_viewport.size().0.to_f32x4())),
|
UniformData::Mat4(self.tile_transform().to_columns())),
|
||||||
(&solid_tile_program.tile_size_uniform,
|
(&solid_tile_program.tile_size_uniform,
|
||||||
UniformData::Vec2(I32x4::new(TILE_WIDTH as i32,
|
UniformData::Vec2(I32x4::new(TILE_WIDTH as i32,
|
||||||
TILE_HEIGHT as i32,
|
TILE_HEIGHT as i32,
|
||||||
0,
|
0,
|
||||||
0).to_f32x4())),
|
0).to_f32x4())),
|
||||||
// FIXME(pcwalton): Fill this in properly!
|
|
||||||
(&solid_tile_program.view_box_origin_uniform, UniformData::Vec2(F32x4::default())),
|
|
||||||
];
|
];
|
||||||
|
|
||||||
match self.render_mode {
|
match self.render_mode {
|
||||||
|
@ -589,7 +590,7 @@ where
|
||||||
primitive: Primitive::Triangles,
|
primitive: Primitive::Triangles,
|
||||||
textures: &textures,
|
textures: &textures,
|
||||||
uniforms: &uniforms,
|
uniforms: &uniforms,
|
||||||
viewport: draw_viewport,
|
viewport: self.draw_viewport(),
|
||||||
options: RenderOptions {
|
options: RenderOptions {
|
||||||
stencil: self.stencil_state(),
|
stencil: self.stencil_state(),
|
||||||
clear_ops: ClearOps { color: clear_color, ..ClearOps::default() },
|
clear_ops: ClearOps { color: clear_color, ..ClearOps::default() },
|
||||||
|
@ -1217,9 +1218,8 @@ where
|
||||||
D: Device,
|
D: Device,
|
||||||
{
|
{
|
||||||
program: D::Program,
|
program: D::Program,
|
||||||
framebuffer_size_uniform: D::Uniform,
|
transform_uniform: D::Uniform,
|
||||||
tile_size_uniform: D::Uniform,
|
tile_size_uniform: D::Uniform,
|
||||||
view_box_origin_uniform: D::Uniform,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<D> SolidTileProgram<D>
|
impl<D> SolidTileProgram<D>
|
||||||
|
@ -1233,15 +1233,9 @@ where
|
||||||
program_name,
|
program_name,
|
||||||
"tile_solid",
|
"tile_solid",
|
||||||
);
|
);
|
||||||
let framebuffer_size_uniform = device.get_uniform(&program, "FramebufferSize");
|
let transform_uniform = device.get_uniform(&program, "Transform");
|
||||||
let tile_size_uniform = device.get_uniform(&program, "TileSize");
|
let tile_size_uniform = device.get_uniform(&program, "TileSize");
|
||||||
let view_box_origin_uniform = device.get_uniform(&program, "ViewBoxOrigin");
|
SolidTileProgram { program, transform_uniform, tile_size_uniform }
|
||||||
SolidTileProgram {
|
|
||||||
program,
|
|
||||||
framebuffer_size_uniform,
|
|
||||||
tile_size_uniform,
|
|
||||||
view_box_origin_uniform,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1299,11 +1293,10 @@ where
|
||||||
D: Device,
|
D: Device,
|
||||||
{
|
{
|
||||||
program: D::Program,
|
program: D::Program,
|
||||||
framebuffer_size_uniform: D::Uniform,
|
transform_uniform: D::Uniform,
|
||||||
tile_size_uniform: D::Uniform,
|
tile_size_uniform: D::Uniform,
|
||||||
stencil_texture_uniform: D::Uniform,
|
stencil_texture_uniform: D::Uniform,
|
||||||
stencil_texture_size_uniform: D::Uniform,
|
stencil_texture_size_uniform: D::Uniform,
|
||||||
view_box_origin_uniform: D::Uniform,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<D> AlphaTileProgram<D>
|
impl<D> AlphaTileProgram<D>
|
||||||
|
@ -1317,18 +1310,16 @@ where
|
||||||
program_name,
|
program_name,
|
||||||
"tile_alpha",
|
"tile_alpha",
|
||||||
);
|
);
|
||||||
let framebuffer_size_uniform = device.get_uniform(&program, "FramebufferSize");
|
let transform_uniform = device.get_uniform(&program, "Transform");
|
||||||
let tile_size_uniform = device.get_uniform(&program, "TileSize");
|
let tile_size_uniform = device.get_uniform(&program, "TileSize");
|
||||||
let stencil_texture_uniform = device.get_uniform(&program, "StencilTexture");
|
let stencil_texture_uniform = device.get_uniform(&program, "StencilTexture");
|
||||||
let stencil_texture_size_uniform = device.get_uniform(&program, "StencilTextureSize");
|
let stencil_texture_size_uniform = device.get_uniform(&program, "StencilTextureSize");
|
||||||
let view_box_origin_uniform = device.get_uniform(&program, "ViewBoxOrigin");
|
|
||||||
AlphaTileProgram {
|
AlphaTileProgram {
|
||||||
program,
|
program,
|
||||||
framebuffer_size_uniform,
|
transform_uniform,
|
||||||
tile_size_uniform,
|
tile_size_uniform,
|
||||||
stencil_texture_uniform,
|
stencil_texture_uniform,
|
||||||
stencil_texture_size_uniform,
|
stencil_texture_size_uniform,
|
||||||
view_box_origin_uniform,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,10 +27,9 @@ precision highp float;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uniform vec2 uFramebufferSize;
|
uniform mat4 uTransform;
|
||||||
uniform vec2 uTileSize;
|
uniform vec2 uTileSize;
|
||||||
uniform vec2 uStencilTextureSize;
|
uniform vec2 uStencilTextureSize;
|
||||||
uniform vec2 uViewBoxOrigin;
|
|
||||||
|
|
||||||
in uvec2 aTessCoord;
|
in uvec2 aTessCoord;
|
||||||
in uvec3 aTileOrigin;
|
in uvec3 aTileOrigin;
|
||||||
|
@ -51,15 +50,14 @@ vec2 computeTileOffset(uint tileIndex, float stencilTextureWidth){
|
||||||
|
|
||||||
void computeVaryings(){
|
void computeVaryings(){
|
||||||
vec2 origin = vec2(aTileOrigin . xy)+ vec2(aTileOrigin . z & 15u, aTileOrigin . z >> 4u)* 256.0;
|
vec2 origin = vec2(aTileOrigin . xy)+ vec2(aTileOrigin . z & 15u, aTileOrigin . z >> 4u)* 256.0;
|
||||||
vec2 pixelPosition =(origin + vec2(aTessCoord))* uTileSize + uViewBoxOrigin;
|
vec2 position =(origin + vec2(aTessCoord))* uTileSize;
|
||||||
vec2 position =(pixelPosition / uFramebufferSize * 2.0 - 1.0)* vec2(1.0, - 1.0);
|
|
||||||
vec2 maskTexCoordOrigin = computeTileOffset(uint(aTileIndex), uStencilTextureSize . x);
|
vec2 maskTexCoordOrigin = computeTileOffset(uint(aTileIndex), uStencilTextureSize . x);
|
||||||
vec2 maskTexCoord = maskTexCoordOrigin + aTessCoord * uTileSize;
|
vec2 maskTexCoord = maskTexCoordOrigin + aTessCoord * uTileSize;
|
||||||
|
|
||||||
vTexCoord = maskTexCoord / uStencilTextureSize;
|
vTexCoord = maskTexCoord / uStencilTextureSize;
|
||||||
vBackdrop = float(aBackdrop);
|
vBackdrop = float(aBackdrop);
|
||||||
vColor = getColor();
|
vColor = getColor();
|
||||||
gl_Position = vec4(position, 0.0, 1.0);
|
gl_Position = uTransform * vec4(position, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,10 +27,9 @@ precision highp float;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uniform vec2 uFramebufferSize;
|
uniform mat4 uTransform;
|
||||||
uniform vec2 uTileSize;
|
uniform vec2 uTileSize;
|
||||||
uniform vec2 uStencilTextureSize;
|
uniform vec2 uStencilTextureSize;
|
||||||
uniform vec2 uViewBoxOrigin;
|
|
||||||
|
|
||||||
in uvec2 aTessCoord;
|
in uvec2 aTessCoord;
|
||||||
in uvec3 aTileOrigin;
|
in uvec3 aTileOrigin;
|
||||||
|
@ -51,15 +50,14 @@ vec2 computeTileOffset(uint tileIndex, float stencilTextureWidth){
|
||||||
|
|
||||||
void computeVaryings(){
|
void computeVaryings(){
|
||||||
vec2 origin = vec2(aTileOrigin . xy)+ vec2(aTileOrigin . z & 15u, aTileOrigin . z >> 4u)* 256.0;
|
vec2 origin = vec2(aTileOrigin . xy)+ vec2(aTileOrigin . z & 15u, aTileOrigin . z >> 4u)* 256.0;
|
||||||
vec2 pixelPosition =(origin + vec2(aTessCoord))* uTileSize + uViewBoxOrigin;
|
vec2 position =(origin + vec2(aTessCoord))* uTileSize;
|
||||||
vec2 position =(pixelPosition / uFramebufferSize * 2.0 - 1.0)* vec2(1.0, - 1.0);
|
|
||||||
vec2 maskTexCoordOrigin = computeTileOffset(uint(aTileIndex), uStencilTextureSize . x);
|
vec2 maskTexCoordOrigin = computeTileOffset(uint(aTileIndex), uStencilTextureSize . x);
|
||||||
vec2 maskTexCoord = maskTexCoordOrigin + aTessCoord * uTileSize;
|
vec2 maskTexCoord = maskTexCoordOrigin + aTessCoord * uTileSize;
|
||||||
|
|
||||||
vTexCoord = maskTexCoord / uStencilTextureSize;
|
vTexCoord = maskTexCoord / uStencilTextureSize;
|
||||||
vBackdrop = float(aBackdrop);
|
vBackdrop = float(aBackdrop);
|
||||||
vColor = getColor();
|
vColor = getColor();
|
||||||
gl_Position = vec4(position, 0.0, 1.0);
|
gl_Position = uTransform * vec4(position, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,8 @@ precision highp float;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uniform vec2 uFramebufferSize;
|
uniform mat4 uTransform;
|
||||||
uniform vec2 uTileSize;
|
uniform vec2 uTileSize;
|
||||||
uniform vec2 uViewBoxOrigin;
|
|
||||||
|
|
||||||
in uvec2 aTessCoord;
|
in uvec2 aTessCoord;
|
||||||
in ivec2 aTileOrigin;
|
in ivec2 aTileOrigin;
|
||||||
|
@ -39,11 +38,9 @@ out vec4 vColor;
|
||||||
vec4 getColor();
|
vec4 getColor();
|
||||||
|
|
||||||
void computeVaryings(){
|
void computeVaryings(){
|
||||||
vec2 pixelPosition = vec2(aTileOrigin + ivec2(aTessCoord))* uTileSize + uViewBoxOrigin;
|
vec2 position = vec2(aTileOrigin + ivec2(aTessCoord))* uTileSize;
|
||||||
vec2 position =(pixelPosition / uFramebufferSize * 2.0 - 1.0)* vec2(1.0, - 1.0);
|
|
||||||
|
|
||||||
vColor = getColor();
|
vColor = getColor();
|
||||||
gl_Position = vec4(position, 0.0, 1.0);
|
gl_Position = uTransform * vec4(position, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,8 @@ precision highp float;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uniform vec2 uFramebufferSize;
|
uniform mat4 uTransform;
|
||||||
uniform vec2 uTileSize;
|
uniform vec2 uTileSize;
|
||||||
uniform vec2 uViewBoxOrigin;
|
|
||||||
|
|
||||||
in uvec2 aTessCoord;
|
in uvec2 aTessCoord;
|
||||||
in ivec2 aTileOrigin;
|
in ivec2 aTileOrigin;
|
||||||
|
@ -39,11 +38,9 @@ out vec4 vColor;
|
||||||
vec4 getColor();
|
vec4 getColor();
|
||||||
|
|
||||||
void computeVaryings(){
|
void computeVaryings(){
|
||||||
vec2 pixelPosition = vec2(aTileOrigin + ivec2(aTessCoord))* uTileSize + uViewBoxOrigin;
|
vec2 position = vec2(aTileOrigin + ivec2(aTessCoord))* uTileSize;
|
||||||
vec2 position =(pixelPosition / uFramebufferSize * 2.0 - 1.0)* vec2(1.0, - 1.0);
|
|
||||||
|
|
||||||
vColor = getColor();
|
vColor = getColor();
|
||||||
gl_Position = vec4(position, 0.0, 1.0);
|
gl_Position = uTransform * vec4(position, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,10 +9,9 @@ using namespace metal;
|
||||||
struct spvDescriptorSetBuffer0
|
struct spvDescriptorSetBuffer0
|
||||||
{
|
{
|
||||||
constant float2* uTileSize [[id(0)]];
|
constant float2* uTileSize [[id(0)]];
|
||||||
constant float2* uViewBoxOrigin [[id(1)]];
|
constant float2* uStencilTextureSize [[id(1)]];
|
||||||
constant float2* uFramebufferSize [[id(2)]];
|
constant float4x4* uTransform [[id(2)]];
|
||||||
constant float2* uStencilTextureSize [[id(3)]];
|
constant float4* uColor [[id(3)]];
|
||||||
constant float4* uColor [[id(4)]];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct main0_out
|
struct main0_out
|
||||||
|
@ -43,11 +42,10 @@ float4 getColor(thread float4 uColor)
|
||||||
return uColor;
|
return uColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeVaryings(thread float2 uTileSize, thread uint3& aTileOrigin, thread uint2& aTessCoord, thread float2 uViewBoxOrigin, thread float2 uFramebufferSize, thread int& aTileIndex, thread float2 uStencilTextureSize, thread float2& vTexCoord, thread float& vBackdrop, thread int& aBackdrop, thread float4& vColor, thread float4& gl_Position, thread float4 uColor)
|
void computeVaryings(thread float2 uTileSize, thread uint3& aTileOrigin, thread uint2& aTessCoord, thread int& aTileIndex, thread float2 uStencilTextureSize, thread float2& vTexCoord, thread float& vBackdrop, thread int& aBackdrop, thread float4& vColor, thread float4& gl_Position, thread float4x4 uTransform, thread float4 uColor)
|
||||||
{
|
{
|
||||||
float2 origin = float2(aTileOrigin.xy) + (float2(float(aTileOrigin.z & 15u), float(aTileOrigin.z >> 4u)) * 256.0);
|
float2 origin = float2(aTileOrigin.xy) + (float2(float(aTileOrigin.z & 15u), float(aTileOrigin.z >> 4u)) * 256.0);
|
||||||
float2 pixelPosition = ((origin + float2(aTessCoord)) * uTileSize) + uViewBoxOrigin;
|
float2 position = (origin + float2(aTessCoord)) * uTileSize;
|
||||||
float2 position = (((pixelPosition / uFramebufferSize) * 2.0) - float2(1.0)) * float2(1.0, -1.0);
|
|
||||||
uint param = uint(aTileIndex);
|
uint param = uint(aTileIndex);
|
||||||
float param_1 = uStencilTextureSize.x;
|
float param_1 = uStencilTextureSize.x;
|
||||||
float2 maskTexCoordOrigin = computeTileOffset(param, param_1, uTileSize);
|
float2 maskTexCoordOrigin = computeTileOffset(param, param_1, uTileSize);
|
||||||
|
@ -55,13 +53,13 @@ void computeVaryings(thread float2 uTileSize, thread uint3& aTileOrigin, thread
|
||||||
vTexCoord = maskTexCoord / uStencilTextureSize;
|
vTexCoord = maskTexCoord / uStencilTextureSize;
|
||||||
vBackdrop = float(aBackdrop);
|
vBackdrop = float(aBackdrop);
|
||||||
vColor = getColor(uColor);
|
vColor = getColor(uColor);
|
||||||
gl_Position = float4(position, 0.0, 1.0);
|
gl_Position = uTransform * float4(position, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vertex main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]])
|
vertex main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]])
|
||||||
{
|
{
|
||||||
main0_out out = {};
|
main0_out out = {};
|
||||||
computeVaryings((*spvDescriptorSet0.uTileSize), in.aTileOrigin, in.aTessCoord, (*spvDescriptorSet0.uViewBoxOrigin), (*spvDescriptorSet0.uFramebufferSize), in.aTileIndex, (*spvDescriptorSet0.uStencilTextureSize), out.vTexCoord, out.vBackdrop, in.aBackdrop, out.vColor, out.gl_Position, (*spvDescriptorSet0.uColor));
|
computeVaryings((*spvDescriptorSet0.uTileSize), in.aTileOrigin, in.aTessCoord, in.aTileIndex, (*spvDescriptorSet0.uStencilTextureSize), out.vTexCoord, out.vBackdrop, in.aBackdrop, out.vColor, out.gl_Position, (*spvDescriptorSet0.uTransform), (*spvDescriptorSet0.uColor));
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,11 +9,10 @@ using namespace metal;
|
||||||
struct spvDescriptorSetBuffer0
|
struct spvDescriptorSetBuffer0
|
||||||
{
|
{
|
||||||
constant float2* uTileSize [[id(0)]];
|
constant float2* uTileSize [[id(0)]];
|
||||||
constant float2* uViewBoxOrigin [[id(1)]];
|
constant float2* uStencilTextureSize [[id(1)]];
|
||||||
constant float2* uFramebufferSize [[id(2)]];
|
constant float4x4* uTransform [[id(2)]];
|
||||||
constant float2* uStencilTextureSize [[id(3)]];
|
texture2d<float> uPaintTexture [[id(3)]];
|
||||||
texture2d<float> uPaintTexture [[id(4)]];
|
sampler uPaintTextureSmplr [[id(4)]];
|
||||||
sampler uPaintTextureSmplr [[id(5)]];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct main0_out
|
struct main0_out
|
||||||
|
@ -45,11 +44,10 @@ float4 getColor(thread texture2d<float> uPaintTexture, thread const sampler uPai
|
||||||
return uPaintTexture.sample(uPaintTextureSmplr, aColorTexCoord, level(0.0));
|
return uPaintTexture.sample(uPaintTextureSmplr, aColorTexCoord, level(0.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeVaryings(thread float2 uTileSize, thread uint3& aTileOrigin, thread uint2& aTessCoord, thread float2 uViewBoxOrigin, thread float2 uFramebufferSize, thread int& aTileIndex, thread float2 uStencilTextureSize, thread float2& vTexCoord, thread float& vBackdrop, thread int& aBackdrop, thread float4& vColor, thread float4& gl_Position, thread texture2d<float> uPaintTexture, thread const sampler uPaintTextureSmplr, thread float2& aColorTexCoord)
|
void computeVaryings(thread float2 uTileSize, thread uint3& aTileOrigin, thread uint2& aTessCoord, thread int& aTileIndex, thread float2 uStencilTextureSize, thread float2& vTexCoord, thread float& vBackdrop, thread int& aBackdrop, thread float4& vColor, thread float4& gl_Position, thread float4x4 uTransform, thread texture2d<float> uPaintTexture, thread const sampler uPaintTextureSmplr, thread float2& aColorTexCoord)
|
||||||
{
|
{
|
||||||
float2 origin = float2(aTileOrigin.xy) + (float2(float(aTileOrigin.z & 15u), float(aTileOrigin.z >> 4u)) * 256.0);
|
float2 origin = float2(aTileOrigin.xy) + (float2(float(aTileOrigin.z & 15u), float(aTileOrigin.z >> 4u)) * 256.0);
|
||||||
float2 pixelPosition = ((origin + float2(aTessCoord)) * uTileSize) + uViewBoxOrigin;
|
float2 position = (origin + float2(aTessCoord)) * uTileSize;
|
||||||
float2 position = (((pixelPosition / uFramebufferSize) * 2.0) - float2(1.0)) * float2(1.0, -1.0);
|
|
||||||
uint param = uint(aTileIndex);
|
uint param = uint(aTileIndex);
|
||||||
float param_1 = uStencilTextureSize.x;
|
float param_1 = uStencilTextureSize.x;
|
||||||
float2 maskTexCoordOrigin = computeTileOffset(param, param_1, uTileSize);
|
float2 maskTexCoordOrigin = computeTileOffset(param, param_1, uTileSize);
|
||||||
|
@ -57,13 +55,13 @@ void computeVaryings(thread float2 uTileSize, thread uint3& aTileOrigin, thread
|
||||||
vTexCoord = maskTexCoord / uStencilTextureSize;
|
vTexCoord = maskTexCoord / uStencilTextureSize;
|
||||||
vBackdrop = float(aBackdrop);
|
vBackdrop = float(aBackdrop);
|
||||||
vColor = getColor(uPaintTexture, uPaintTextureSmplr, aColorTexCoord);
|
vColor = getColor(uPaintTexture, uPaintTextureSmplr, aColorTexCoord);
|
||||||
gl_Position = float4(position, 0.0, 1.0);
|
gl_Position = uTransform * float4(position, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vertex main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]])
|
vertex main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]])
|
||||||
{
|
{
|
||||||
main0_out out = {};
|
main0_out out = {};
|
||||||
computeVaryings((*spvDescriptorSet0.uTileSize), in.aTileOrigin, in.aTessCoord, (*spvDescriptorSet0.uViewBoxOrigin), (*spvDescriptorSet0.uFramebufferSize), in.aTileIndex, (*spvDescriptorSet0.uStencilTextureSize), out.vTexCoord, out.vBackdrop, in.aBackdrop, out.vColor, out.gl_Position, spvDescriptorSet0.uPaintTexture, spvDescriptorSet0.uPaintTextureSmplr, in.aColorTexCoord);
|
computeVaryings((*spvDescriptorSet0.uTileSize), in.aTileOrigin, in.aTessCoord, in.aTileIndex, (*spvDescriptorSet0.uStencilTextureSize), out.vTexCoord, out.vBackdrop, in.aBackdrop, out.vColor, out.gl_Position, (*spvDescriptorSet0.uTransform), spvDescriptorSet0.uPaintTexture, spvDescriptorSet0.uPaintTextureSmplr, in.aColorTexCoord);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,9 +9,8 @@ using namespace metal;
|
||||||
struct spvDescriptorSetBuffer0
|
struct spvDescriptorSetBuffer0
|
||||||
{
|
{
|
||||||
constant float2* uTileSize [[id(0)]];
|
constant float2* uTileSize [[id(0)]];
|
||||||
constant float2* uViewBoxOrigin [[id(1)]];
|
constant float4x4* uTransform [[id(1)]];
|
||||||
constant float2* uFramebufferSize [[id(2)]];
|
constant float4* uColor [[id(2)]];
|
||||||
constant float4* uColor [[id(3)]];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct main0_out
|
struct main0_out
|
||||||
|
@ -31,18 +30,17 @@ float4 getColor(thread float4 uColor)
|
||||||
return uColor;
|
return uColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeVaryings(thread int2& aTileOrigin, thread uint2& aTessCoord, thread float2 uTileSize, thread float2 uViewBoxOrigin, thread float2 uFramebufferSize, thread float4& vColor, thread float4& gl_Position, thread float4 uColor)
|
void computeVaryings(thread int2& aTileOrigin, thread uint2& aTessCoord, thread float2 uTileSize, thread float4& vColor, thread float4& gl_Position, thread float4x4 uTransform, thread float4 uColor)
|
||||||
{
|
{
|
||||||
float2 pixelPosition = (float2(aTileOrigin + int2(aTessCoord)) * uTileSize) + uViewBoxOrigin;
|
float2 position = float2(aTileOrigin + int2(aTessCoord)) * uTileSize;
|
||||||
float2 position = (((pixelPosition / uFramebufferSize) * 2.0) - float2(1.0)) * float2(1.0, -1.0);
|
|
||||||
vColor = getColor(uColor);
|
vColor = getColor(uColor);
|
||||||
gl_Position = float4(position, 0.0, 1.0);
|
gl_Position = uTransform * float4(position, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vertex main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]])
|
vertex main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]])
|
||||||
{
|
{
|
||||||
main0_out out = {};
|
main0_out out = {};
|
||||||
computeVaryings(in.aTileOrigin, in.aTessCoord, (*spvDescriptorSet0.uTileSize), (*spvDescriptorSet0.uViewBoxOrigin), (*spvDescriptorSet0.uFramebufferSize), out.vColor, out.gl_Position, (*spvDescriptorSet0.uColor));
|
computeVaryings(in.aTileOrigin, in.aTessCoord, (*spvDescriptorSet0.uTileSize), out.vColor, out.gl_Position, (*spvDescriptorSet0.uTransform), (*spvDescriptorSet0.uColor));
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,10 +9,9 @@ using namespace metal;
|
||||||
struct spvDescriptorSetBuffer0
|
struct spvDescriptorSetBuffer0
|
||||||
{
|
{
|
||||||
constant float2* uTileSize [[id(0)]];
|
constant float2* uTileSize [[id(0)]];
|
||||||
constant float2* uViewBoxOrigin [[id(1)]];
|
constant float4x4* uTransform [[id(1)]];
|
||||||
constant float2* uFramebufferSize [[id(2)]];
|
texture2d<float> uPaintTexture [[id(2)]];
|
||||||
texture2d<float> uPaintTexture [[id(3)]];
|
sampler uPaintTextureSmplr [[id(3)]];
|
||||||
sampler uPaintTextureSmplr [[id(4)]];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct main0_out
|
struct main0_out
|
||||||
|
@ -33,18 +32,17 @@ float4 getColor(thread texture2d<float> uPaintTexture, thread const sampler uPai
|
||||||
return uPaintTexture.sample(uPaintTextureSmplr, aColorTexCoord, level(0.0));
|
return uPaintTexture.sample(uPaintTextureSmplr, aColorTexCoord, level(0.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void computeVaryings(thread int2& aTileOrigin, thread uint2& aTessCoord, thread float2 uTileSize, thread float2 uViewBoxOrigin, thread float2 uFramebufferSize, thread float4& vColor, thread float4& gl_Position, thread texture2d<float> uPaintTexture, thread const sampler uPaintTextureSmplr, thread float2& aColorTexCoord)
|
void computeVaryings(thread int2& aTileOrigin, thread uint2& aTessCoord, thread float2 uTileSize, thread float4& vColor, thread float4& gl_Position, thread float4x4 uTransform, thread texture2d<float> uPaintTexture, thread const sampler uPaintTextureSmplr, thread float2& aColorTexCoord)
|
||||||
{
|
{
|
||||||
float2 pixelPosition = (float2(aTileOrigin + int2(aTessCoord)) * uTileSize) + uViewBoxOrigin;
|
float2 position = float2(aTileOrigin + int2(aTessCoord)) * uTileSize;
|
||||||
float2 position = (((pixelPosition / uFramebufferSize) * 2.0) - float2(1.0)) * float2(1.0, -1.0);
|
|
||||||
vColor = getColor(uPaintTexture, uPaintTextureSmplr, aColorTexCoord);
|
vColor = getColor(uPaintTexture, uPaintTextureSmplr, aColorTexCoord);
|
||||||
gl_Position = float4(position, 0.0, 1.0);
|
gl_Position = uTransform * float4(position, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vertex main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]])
|
vertex main0_out main0(main0_in in [[stage_in]], constant spvDescriptorSetBuffer0& spvDescriptorSet0 [[buffer(0)]])
|
||||||
{
|
{
|
||||||
main0_out out = {};
|
main0_out out = {};
|
||||||
computeVaryings(in.aTileOrigin, in.aTessCoord, (*spvDescriptorSet0.uTileSize), (*spvDescriptorSet0.uViewBoxOrigin), (*spvDescriptorSet0.uFramebufferSize), out.vColor, out.gl_Position, spvDescriptorSet0.uPaintTexture, spvDescriptorSet0.uPaintTextureSmplr, in.aColorTexCoord);
|
computeVaryings(in.aTileOrigin, in.aTessCoord, (*spvDescriptorSet0.uTileSize), out.vColor, out.gl_Position, (*spvDescriptorSet0.uTransform), spvDescriptorSet0.uPaintTexture, spvDescriptorSet0.uPaintTextureSmplr, in.aColorTexCoord);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,9 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
uniform vec2 uFramebufferSize;
|
uniform mat4 uTransform;
|
||||||
uniform vec2 uTileSize;
|
uniform vec2 uTileSize;
|
||||||
uniform vec2 uStencilTextureSize;
|
uniform vec2 uStencilTextureSize;
|
||||||
uniform vec2 uViewBoxOrigin;
|
|
||||||
|
|
||||||
in uvec2 aTessCoord;
|
in uvec2 aTessCoord;
|
||||||
in uvec3 aTileOrigin;
|
in uvec3 aTileOrigin;
|
||||||
|
@ -32,14 +31,13 @@ vec2 computeTileOffset(uint tileIndex, float stencilTextureWidth) {
|
||||||
|
|
||||||
void computeVaryings() {
|
void computeVaryings() {
|
||||||
vec2 origin = vec2(aTileOrigin.xy) + vec2(aTileOrigin.z & 15u, aTileOrigin.z >> 4u) * 256.0;
|
vec2 origin = vec2(aTileOrigin.xy) + vec2(aTileOrigin.z & 15u, aTileOrigin.z >> 4u) * 256.0;
|
||||||
vec2 pixelPosition = (origin + vec2(aTessCoord)) * uTileSize + uViewBoxOrigin;
|
vec2 position = (origin + vec2(aTessCoord)) * uTileSize;
|
||||||
vec2 position = (pixelPosition / uFramebufferSize * 2.0 - 1.0) * vec2(1.0, -1.0);
|
|
||||||
vec2 maskTexCoordOrigin = computeTileOffset(uint(aTileIndex), uStencilTextureSize.x);
|
vec2 maskTexCoordOrigin = computeTileOffset(uint(aTileIndex), uStencilTextureSize.x);
|
||||||
vec2 maskTexCoord = maskTexCoordOrigin + aTessCoord * uTileSize;
|
vec2 maskTexCoord = maskTexCoordOrigin + aTessCoord * uTileSize;
|
||||||
|
|
||||||
vTexCoord = maskTexCoord / uStencilTextureSize;
|
vTexCoord = maskTexCoord / uStencilTextureSize;
|
||||||
vBackdrop = float(aBackdrop);
|
vBackdrop = float(aBackdrop);
|
||||||
vColor = getColor();
|
vColor = getColor();
|
||||||
gl_Position = vec4(position, 0.0, 1.0);
|
gl_Position = uTransform * vec4(position, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,8 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
uniform vec2 uFramebufferSize;
|
uniform mat4 uTransform;
|
||||||
uniform vec2 uTileSize;
|
uniform vec2 uTileSize;
|
||||||
uniform vec2 uViewBoxOrigin;
|
|
||||||
|
|
||||||
in uvec2 aTessCoord;
|
in uvec2 aTessCoord;
|
||||||
in ivec2 aTileOrigin;
|
in ivec2 aTileOrigin;
|
||||||
|
@ -20,9 +19,7 @@ out vec4 vColor;
|
||||||
vec4 getColor();
|
vec4 getColor();
|
||||||
|
|
||||||
void computeVaryings() {
|
void computeVaryings() {
|
||||||
vec2 pixelPosition = vec2(aTileOrigin + ivec2(aTessCoord)) * uTileSize + uViewBoxOrigin;
|
vec2 position = vec2(aTileOrigin + ivec2(aTessCoord)) * uTileSize;
|
||||||
vec2 position = (pixelPosition / uFramebufferSize * 2.0 - 1.0) * vec2(1.0, -1.0);
|
|
||||||
|
|
||||||
vColor = getColor();
|
vColor = getColor();
|
||||||
gl_Position = vec4(position, 0.0, 1.0);
|
gl_Position = uTransform * vec4(position, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue