Auto merge of #413 - pcwalton:s3bk-color-matrix, r=pcwalton

Add ColorMatrix filter
This commit is contained in:
bors-servo 2020-07-23 15:47:57 -04:00 committed by GitHub
commit 536cb4c093
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 596 additions and 194 deletions

View File

@ -13,6 +13,8 @@ use std::f32::consts::PI;
use std::fmt::{self, Debug, Formatter};
use std::slice;
pub mod matrix;
// TODO(pcwalton): Maybe this should be a u32? Need to be aware of endianness issues if we do that.
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[repr(C)]

126
color/src/matrix.rs Normal file
View File

@ -0,0 +1,126 @@
// pathfinder/color/src/lib.rs
//
// Copyright © 2020 The Pathfinder Project Developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use pathfinder_simd::default::F32x4;
use std::ops::{Add, Mul, Deref};
/// ColorMatrix filter/transformation
///
/// The entries are stored in 5 columns of F32x4, each containing a row.
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct ColorMatrix(pub [F32x4; 5]);
impl ColorMatrix {
#[inline]
pub fn from_rows(rows: [[f32; 5]; 4]) -> ColorMatrix {
ColorMatrix([
F32x4::new(rows[0][0], rows[1][0], rows[2][0], rows[3][0]),
F32x4::new(rows[0][1], rows[1][1], rows[2][1], rows[3][1]),
F32x4::new(rows[0][2], rows[1][2], rows[2][2], rows[3][2]),
F32x4::new(rows[0][3], rows[1][3], rows[2][3], rows[3][3]),
F32x4::new(rows[0][4], rows[1][4], rows[2][4], rows[3][4]),
])
}
/// Creates a hue-rotate color matrix filter from the given angle in radians.
///
/// See the `hueRotate` attribute of the `feColorMatrix` element in the SVG specification.
pub fn hue_rotate(angle: f32) -> ColorMatrix {
let a = ColorMatrix::from_rows([
[ 0.213, 0.715, 0.072, 0.0, 0.0],
[ 0.213, 0.715, 0.072, 0.0, 0.0],
[ 0.213, 0.715, 0.072, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 1.0, 0.0],
]);
let b = ColorMatrix::from_rows([
[ 0.787, -0.715, -0.072, 0.0, 0.0],
[-0.213, 0.285, -0.072, 0.0, 0.0],
[-0.213, -0.715, 0.928, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0],
]);
let c = ColorMatrix::from_rows([
[-0.213, -0.715, 0.928, 0.0, 0.0],
[ 0.143, 0.140, -0.283, 0.0, 0.0],
[-0.787, 0.715, 0.072, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0],
]);
a + b * angle.cos() + c * angle.sin()
}
/// Creates a saturate color matrix filter with the given factor between 0 and 1.
///
/// See the `saturate` attribute of the `feColorMatrix` element in the SVG specification.
pub fn saturate(saturation: f32) -> ColorMatrix {
let a = ColorMatrix::from_rows([
[ 0.213, 0.715, 0.072, 0.0, 0.0],
[ 0.213, 0.715, 0.072, 0.0, 0.0],
[ 0.213, 0.715, 0.072, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 1.0, 0.0],
]);
let b = ColorMatrix::from_rows([
[ 0.787, -0.715, -0.072, 0.0, 0.0],
[-0.213, 0.285, -0.072, 0.0, 0.0],
[-0.213, -0.715, 0.928, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0],
]);
a + b * saturation
}
/// Creates a luminance-to-alpha color matrix filter.
///
/// See the `luminanceToAlpha` attribute of the `feColorMatrix` element in the SVG
/// specification.
pub fn luminance_to_alpha() -> ColorMatrix {
ColorMatrix::from_rows([
[ 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.0, 0.0, 0.0, 0.0, 0.0],
[ 0.2125, 0.7154, 0.0721, 0.0, 0.0],
])
}
}
impl Deref for ColorMatrix {
type Target = [F32x4; 5];
#[inline]
fn deref(&self) -> &[F32x4; 5] {
&self.0
}
}
impl Add for ColorMatrix {
type Output = ColorMatrix;
#[inline]
fn add(self, rhs: ColorMatrix) -> ColorMatrix {
ColorMatrix([
self[0] + rhs[0],
self[1] + rhs[1],
self[2] + rhs[2],
self[3] + rhs[3],
self[4] + rhs[4],
])
}
}
impl Mul<f32> for ColorMatrix {
type Output = ColorMatrix;
#[inline]
fn mul(self, rhs: f32) -> ColorMatrix {
let rhs = F32x4::splat(rhs);
ColorMatrix([
self[0] * rhs,
self[1] * rhs,
self[2] * rhs,
self[3] * rhs,
self[4] * rhs,
])
}
}

View File

@ -10,7 +10,7 @@
//! Special effects that can be applied to layers.
use pathfinder_color::ColorF;
use pathfinder_color::{ColorF, matrix::ColorMatrix};
use pathfinder_geometry::line_segment::LineSegment2F;
use pathfinder_geometry::vector::Vector2F;
use pathfinder_simd::default::F32x2;
@ -83,6 +83,12 @@ pub enum PatternFilter {
direction: BlurDirection,
sigma: f32,
},
/// A color matrix multiplication.
///
/// The matrix is stored in 5 columns of `F32x4`. See the `feColorMatrix` element in the SVG
/// specification.
ColorMatrix(ColorMatrix),
}
/// Blend modes that can be applied to individual paths.

View File

@ -53,7 +53,7 @@ pub(crate) const MASK_TILES_DOWN: u32 = 256;
const SQRT_2_PI_INV: f32 = 0.3989422804014327;
const TEXTURE_METADATA_ENTRIES_PER_ROW: i32 = 128;
const TEXTURE_METADATA_TEXTURE_WIDTH: i32 = TEXTURE_METADATA_ENTRIES_PER_ROW * 8;
const TEXTURE_METADATA_TEXTURE_WIDTH: i32 = TEXTURE_METADATA_ENTRIES_PER_ROW * 10;
const TEXTURE_METADATA_TEXTURE_HEIGHT: i32 = 65536 / TEXTURE_METADATA_ENTRIES_PER_ROW;
// FIXME(pcwalton): Shrink this again!
@ -63,10 +63,11 @@ pub(crate) const MASK_FRAMEBUFFER_HEIGHT: i32 = TILE_HEIGHT as i32 / 4 * MASK_TI
const COMBINER_CTRL_FILTER_RADIAL_GRADIENT: i32 = 0x1;
const COMBINER_CTRL_FILTER_TEXT: i32 = 0x2;
const COMBINER_CTRL_FILTER_BLUR: i32 = 0x3;
const COMBINER_CTRL_FILTER_COLOR_MATRIX: i32 = 0x4;
const COMBINER_CTRL_COLOR_FILTER_SHIFT: i32 = 4;
const COMBINER_CTRL_COLOR_COMBINE_SHIFT: i32 = 6;
const COMBINER_CTRL_COMPOSITE_SHIFT: i32 = 8;
const COMBINER_CTRL_COLOR_COMBINE_SHIFT: i32 = 8;
const COMBINER_CTRL_COMPOSITE_SHIFT: i32 = 10;
/// The GPU renderer that processes commands necessary to render a scene.
pub struct Renderer<D> where D: Device {
@ -693,11 +694,21 @@ impl<D> Renderer<D> where D: Device {
f16::from_f32(filter_params.p2.z()),
f16::from_f32(filter_params.p2.w()),
// 6
f16::from_f32(filter_params.p3.x()),
f16::from_f32(filter_params.p3.y()),
f16::from_f32(filter_params.p3.z()),
f16::from_f32(filter_params.p3.w()),
// 7
f16::from_f32(filter_params.p4.x()),
f16::from_f32(filter_params.p4.y()),
f16::from_f32(filter_params.p4.z()),
f16::from_f32(filter_params.p4.w()),
// 8
f16::from_f32(filter_params.ctrl as f32),
f16::default(),
f16::default(),
f16::default(),
// 7
// 9
f16::default(),
f16::default(),
f16::default(),
@ -921,6 +932,8 @@ impl<D> Renderer<D> where D: Device {
p0: line.from().0.concat_xy_xy(line.vector().0),
p1: radii.concat_xy_xy(uv_origin.0),
p2: F32x4::default(),
p3: F32x4::default(),
p4: F32x4::default(),
ctrl: ctrl | (COMBINER_CTRL_FILTER_RADIAL_GRADIENT <<
COMBINER_CTRL_COLOR_FILTER_SHIFT)
}
@ -942,6 +955,8 @@ impl<D> Renderer<D> where D: Device {
p0: src_offset.0.concat_xy_xy(F32x2::new(support, 0.0)),
p1: F32x4::new(gauss_coeff_x, gauss_coeff_y, gauss_coeff_z, 0.0),
p2: F32x4::default(),
p3: F32x4::default(),
p4: F32x4::default(),
ctrl: ctrl | (COMBINER_CTRL_FILTER_BLUR << COMBINER_CTRL_COLOR_FILTER_SHIFT),
}
}
@ -961,14 +976,25 @@ impl<D> Renderer<D> where D: Device {
},
p1: bg_color.0,
p2,
p3: F32x4::default(),
p4: F32x4::default(),
ctrl: ctrl | (COMBINER_CTRL_FILTER_TEXT << COMBINER_CTRL_COLOR_FILTER_SHIFT),
}
}
Filter::PatternFilter(PatternFilter::ColorMatrix(matrix)) => {
let [p0, p1, p2, p3, p4] = matrix.0;
FilterParams {
p0, p1, p2, p3, p4,
ctrl: ctrl | (COMBINER_CTRL_FILTER_COLOR_MATRIX << COMBINER_CTRL_COLOR_FILTER_SHIFT),
}
}
Filter::None => {
FilterParams {
p0: F32x4::default(),
p1: F32x4::default(),
p2: F32x4::default(),
p3: F32x4::default(),
p4: F32x4::default(),
ctrl,
}
}
@ -1317,6 +1343,8 @@ struct FilterParams {
p0: F32x4,
p1: F32x4,
p2: F32x4,
p3: F32x4,
p4: F32x4,
ctrl: i32,
}

View File

@ -94,6 +94,7 @@ precision highp float;
vec4 sampleColor(sampler2D colorTexture, vec2 colorTexCoord){
@ -370,6 +371,18 @@ vec4 filterBlur(vec2 colorTexCoord,
return color / gaussSum;
}
vec4 filterColorMatrix(vec2 colorTexCoord,
sampler2D colorTexture,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4){
vec4 srcColor = texture(colorTexture, colorTexCoord);
mat4 colorMatrix = mat4(filterParams0, filterParams1, filterParams2, filterParams3);
return colorMatrix * srcColor + filterParams4;
}
vec4 filterNone(vec2 colorTexCoord, sampler2D colorTexture){
return sampleColor(colorTexture, colorTexCoord);
}
@ -383,6 +396,8 @@ vec4 filterColor(vec2 colorTexCoord,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4,
int colorFilter){
switch(colorFilter){
case 0x1 :
@ -407,6 +422,14 @@ vec4 filterColor(vec2 colorTexCoord,
filterParams0,
filterParams1,
filterParams2);
case 0x4 :
return filterColorMatrix(colorTexCoord,
colorTexture,
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4);
}
return filterNone(colorTexCoord, colorTexture);
}
@ -569,6 +592,8 @@ vec4 calculateColor(vec2 fragCoord,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4,
vec2 framebufferSize,
int ctrl,
vec3 maskTexCoord0,
@ -582,10 +607,10 @@ vec4 calculateColor(vec2 fragCoord,
vec4 color = baseColor;
int color0Combine =(ctrl >> 6)&
int color0Combine =(ctrl >> 8)&
0x3;
if(color0Combine != 0){
int color0Filter =(ctrl >> 4)& 0x3;
int color0Filter =(ctrl >> 4)& 0xf;
vec4 color0 = filterColor(colorTexCoord0,
colorTexture0,
gammaLUT,
@ -595,6 +620,8 @@ vec4 calculateColor(vec2 fragCoord,
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4,
color0Filter);
color = combineColor0(color, color0, color0Combine);
}
@ -603,7 +630,7 @@ vec4 calculateColor(vec2 fragCoord,
color . a *= maskAlpha;
int compositeOp =(ctrl >> 8)& 0xf;
int compositeOp =(ctrl >> 10)& 0xf;
color = composite(color, destTexture, framebufferSize, fragCoord, compositeOp);
@ -627,6 +654,8 @@ in float vTileCtrl;
in vec4 vFilterParams0;
in vec4 vFilterParams1;
in vec4 vFilterParams2;
in vec4 vFilterParams3;
in vec4 vFilterParams4;
in float vCtrl;
out vec4 oFragColor;
@ -646,6 +675,8 @@ void main(){
vFilterParams0,
vFilterParams1,
vFilterParams2,
vFilterParams3,
vFilterParams4,
uFramebufferSize,
int(vCtrl),
vMaskTexCoord0,

View File

@ -44,21 +44,27 @@ void computeTileVaryings(vec2 position,
out vec4 outFilterParams0,
out vec4 outFilterParams1,
out vec4 outFilterParams2,
out vec4 outFilterParams3,
out vec4 outFilterParams4,
out int outCtrl){
vec2 metadataScale = vec2(1.0)/ vec2(textureMetadataSize);
vec2 metadataEntryCoord = vec2(colorEntry % 128 * 8, colorEntry / 128);
vec2 metadataEntryCoord = vec2(colorEntry % 128 * 10, colorEntry / 128);
vec4 colorTexMatrix0 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 0);
vec4 colorTexOffsets = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 1);
vec4 baseColor = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 2);
vec4 filterParams0 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 3);
vec4 filterParams1 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 4);
vec4 filterParams2 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 5);
vec4 extra = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 6);
vec4 filterParams3 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 6);
vec4 filterParams4 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 7);
vec4 extra = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 8);
outColorTexCoord0 = mat2(colorTexMatrix0)* position + colorTexOffsets . xy;
outBaseColor = baseColor;
outFilterParams0 = filterParams0;
outFilterParams1 = filterParams1;
outFilterParams2 = filterParams2;
outFilterParams3 = filterParams3;
outFilterParams4 = filterParams4;
outCtrl = int(extra . x);
}
@ -84,6 +90,8 @@ out float vTileCtrl;
out vec4 vFilterParams0;
out vec4 vFilterParams1;
out vec4 vFilterParams2;
out vec4 vFilterParams3;
out vec4 vFilterParams4;
out float vCtrl;
void main(){
@ -113,6 +121,8 @@ void main(){
vFilterParams0,
vFilterParams1,
vFilterParams2,
vFilterParams3,
vFilterParams4,
ctrl);
vTileCtrl = float(aCtrlBackdrop . x);

View File

@ -96,6 +96,7 @@ layout(local_size_x = 16, local_size_y = 4)in;
vec4 sampleColor(sampler2D colorTexture, vec2 colorTexCoord){
@ -372,6 +373,18 @@ vec4 filterBlur(vec2 colorTexCoord,
return color / gaussSum;
}
vec4 filterColorMatrix(vec2 colorTexCoord,
sampler2D colorTexture,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4){
vec4 srcColor = texture(colorTexture, colorTexCoord);
mat4 colorMatrix = mat4(filterParams0, filterParams1, filterParams2, filterParams3);
return colorMatrix * srcColor + filterParams4;
}
vec4 filterNone(vec2 colorTexCoord, sampler2D colorTexture){
return sampleColor(colorTexture, colorTexCoord);
}
@ -385,6 +398,8 @@ vec4 filterColor(vec2 colorTexCoord,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4,
int colorFilter){
switch(colorFilter){
case 0x1 :
@ -409,6 +424,14 @@ vec4 filterColor(vec2 colorTexCoord,
filterParams0,
filterParams1,
filterParams2);
case 0x4 :
return filterColorMatrix(colorTexCoord,
colorTexture,
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4);
}
return filterNone(colorTexCoord, colorTexture);
}
@ -571,6 +594,8 @@ vec4 calculateColor(vec2 fragCoord,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4,
vec2 framebufferSize,
int ctrl,
vec3 maskTexCoord0,
@ -584,10 +609,10 @@ vec4 calculateColor(vec2 fragCoord,
vec4 color = baseColor;
int color0Combine =(ctrl >> 6)&
int color0Combine =(ctrl >> 8)&
0x3;
if(color0Combine != 0){
int color0Filter =(ctrl >> 4)& 0x3;
int color0Filter =(ctrl >> 4)& 0xf;
vec4 color0 = filterColor(colorTexCoord0,
colorTexture0,
gammaLUT,
@ -597,6 +622,8 @@ vec4 calculateColor(vec2 fragCoord,
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4,
color0Filter);
color = combineColor0(color, color0, color0Combine);
}
@ -605,7 +632,7 @@ vec4 calculateColor(vec2 fragCoord,
color . a *= maskAlpha;
int compositeOp =(ctrl >> 8)& 0xf;
int compositeOp =(ctrl >> 10)& 0xf;
color = composite(color, destTexture, framebufferSize, fragCoord, compositeOp);
@ -637,21 +664,27 @@ void computeTileVaryings(vec2 position,
out vec4 outFilterParams0,
out vec4 outFilterParams1,
out vec4 outFilterParams2,
out vec4 outFilterParams3,
out vec4 outFilterParams4,
out int outCtrl){
vec2 metadataScale = vec2(1.0)/ vec2(textureMetadataSize);
vec2 metadataEntryCoord = vec2(colorEntry % 128 * 8, colorEntry / 128);
vec2 metadataEntryCoord = vec2(colorEntry % 128 * 10, colorEntry / 128);
vec4 colorTexMatrix0 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 0);
vec4 colorTexOffsets = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 1);
vec4 baseColor = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 2);
vec4 filterParams0 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 3);
vec4 filterParams1 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 4);
vec4 filterParams2 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 5);
vec4 extra = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 6);
vec4 filterParams3 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 6);
vec4 filterParams4 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 7);
vec4 extra = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 8);
outColorTexCoord0 = mat2(colorTexMatrix0)* position + colorTexOffsets . xy;
outBaseColor = baseColor;
outFilterParams0 = filterParams0;
outFilterParams1 = filterParams1;
outFilterParams2 = filterParams2;
outFilterParams3 = filterParams3;
outFilterParams4 = filterParams4;
outCtrl = int(extra . x);
}
@ -748,7 +781,7 @@ void main(){
vec3 maskTexCoord0 = vec3(vec2(ivec2(maskTileCoord)+ tileSubCoord), backdrop);
vec2 colorTexCoord0;
vec4 baseColor, filterParams0, filterParams1, filterParams2;
vec4 baseColor, filterParams0, filterParams1, filterParams2, filterParams3, filterParams4;
int ctrl;
computeTileVaryings(fragCoord,
int(colorEntry),
@ -759,6 +792,8 @@ void main(){
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4,
ctrl);
@ -774,6 +809,8 @@ void main(){
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4,
uFramebufferSize,
ctrl,
maskTexCoord0,

View File

@ -94,6 +94,7 @@ precision highp float;
vec4 sampleColor(sampler2D colorTexture, vec2 colorTexCoord){
@ -370,6 +371,18 @@ vec4 filterBlur(vec2 colorTexCoord,
return color / gaussSum;
}
vec4 filterColorMatrix(vec2 colorTexCoord,
sampler2D colorTexture,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4){
vec4 srcColor = texture(colorTexture, colorTexCoord);
mat4 colorMatrix = mat4(filterParams0, filterParams1, filterParams2, filterParams3);
return colorMatrix * srcColor + filterParams4;
}
vec4 filterNone(vec2 colorTexCoord, sampler2D colorTexture){
return sampleColor(colorTexture, colorTexCoord);
}
@ -383,6 +396,8 @@ vec4 filterColor(vec2 colorTexCoord,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4,
int colorFilter){
switch(colorFilter){
case 0x1 :
@ -407,6 +422,14 @@ vec4 filterColor(vec2 colorTexCoord,
filterParams0,
filterParams1,
filterParams2);
case 0x4 :
return filterColorMatrix(colorTexCoord,
colorTexture,
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4);
}
return filterNone(colorTexCoord, colorTexture);
}
@ -569,6 +592,8 @@ vec4 calculateColor(vec2 fragCoord,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4,
vec2 framebufferSize,
int ctrl,
vec3 maskTexCoord0,
@ -582,10 +607,10 @@ vec4 calculateColor(vec2 fragCoord,
vec4 color = baseColor;
int color0Combine =(ctrl >> 6)&
int color0Combine =(ctrl >> 8)&
0x3;
if(color0Combine != 0){
int color0Filter =(ctrl >> 4)& 0x3;
int color0Filter =(ctrl >> 4)& 0xf;
vec4 color0 = filterColor(colorTexCoord0,
colorTexture0,
gammaLUT,
@ -595,6 +620,8 @@ vec4 calculateColor(vec2 fragCoord,
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4,
color0Filter);
color = combineColor0(color, color0, color0Combine);
}
@ -603,7 +630,7 @@ vec4 calculateColor(vec2 fragCoord,
color . a *= maskAlpha;
int compositeOp =(ctrl >> 8)& 0xf;
int compositeOp =(ctrl >> 10)& 0xf;
color = composite(color, destTexture, framebufferSize, fragCoord, compositeOp);
@ -627,6 +654,8 @@ in float vTileCtrl;
in vec4 vFilterParams0;
in vec4 vFilterParams1;
in vec4 vFilterParams2;
in vec4 vFilterParams3;
in vec4 vFilterParams4;
in float vCtrl;
out vec4 oFragColor;
@ -646,6 +675,8 @@ void main(){
vFilterParams0,
vFilterParams1,
vFilterParams2,
vFilterParams3,
vFilterParams4,
uFramebufferSize,
int(vCtrl),
vMaskTexCoord0,

View File

@ -44,21 +44,27 @@ void computeTileVaryings(vec2 position,
out vec4 outFilterParams0,
out vec4 outFilterParams1,
out vec4 outFilterParams2,
out vec4 outFilterParams3,
out vec4 outFilterParams4,
out int outCtrl){
vec2 metadataScale = vec2(1.0)/ vec2(textureMetadataSize);
vec2 metadataEntryCoord = vec2(colorEntry % 128 * 8, colorEntry / 128);
vec2 metadataEntryCoord = vec2(colorEntry % 128 * 10, colorEntry / 128);
vec4 colorTexMatrix0 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 0);
vec4 colorTexOffsets = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 1);
vec4 baseColor = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 2);
vec4 filterParams0 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 3);
vec4 filterParams1 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 4);
vec4 filterParams2 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 5);
vec4 extra = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 6);
vec4 filterParams3 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 6);
vec4 filterParams4 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 7);
vec4 extra = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 8);
outColorTexCoord0 = mat2(colorTexMatrix0)* position + colorTexOffsets . xy;
outBaseColor = baseColor;
outFilterParams0 = filterParams0;
outFilterParams1 = filterParams1;
outFilterParams2 = filterParams2;
outFilterParams3 = filterParams3;
outFilterParams4 = filterParams4;
outCtrl = int(extra . x);
}
@ -84,6 +90,8 @@ out float vTileCtrl;
out vec4 vFilterParams0;
out vec4 vFilterParams1;
out vec4 vFilterParams2;
out vec4 vFilterParams3;
out vec4 vFilterParams4;
out float vCtrl;
void main(){
@ -113,6 +121,8 @@ void main(){
vFilterParams0,
vFilterParams1,
vFilterParams2,
vFilterParams3,
vFilterParams4,
ctrl);
vTileCtrl = float(aCtrlBackdrop . x);

View File

@ -18,7 +18,7 @@ struct bTiles
constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(16u, 4u, 1u);
constant float3 _1081 = {};
constant float3 _1151 = {};
// Implementation of the GLSL mod() function, which is slightly different than Metal fmod()
template<typename Tx, typename Ty>
@ -40,10 +40,10 @@ float4 fetchUnscaled(thread const texture2d<float> srcTexture, thread const samp
}
static inline __attribute__((always_inline))
void computeTileVaryings(thread const float2& position, thread const int& colorEntry, thread const texture2d<float> textureMetadata, thread const sampler textureMetadataSmplr, thread const int2& textureMetadataSize, thread float2& outColorTexCoord0, thread float4& outBaseColor, thread float4& outFilterParams0, thread float4& outFilterParams1, thread float4& outFilterParams2, thread int& outCtrl)
void computeTileVaryings(thread const float2& position, thread const int& colorEntry, thread const texture2d<float> textureMetadata, thread const sampler textureMetadataSmplr, thread const int2& textureMetadataSize, thread float2& outColorTexCoord0, thread float4& outBaseColor, thread float4& outFilterParams0, thread float4& outFilterParams1, thread float4& outFilterParams2, thread float4& outFilterParams3, thread float4& outFilterParams4, thread int& outCtrl)
{
float2 metadataScale = float2(1.0) / float2(textureMetadataSize);
float2 metadataEntryCoord = float2(float((colorEntry % 128) * 8), float(colorEntry / 128));
float2 metadataEntryCoord = float2(float((colorEntry % 128) * 10), float(colorEntry / 128));
float2 param = metadataScale;
float2 param_1 = metadataEntryCoord;
int param_2 = 0;
@ -71,12 +71,22 @@ void computeTileVaryings(thread const float2& position, thread const int& colorE
float2 param_18 = metadataScale;
float2 param_19 = metadataEntryCoord;
int param_20 = 6;
float4 extra = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_18, param_19, param_20);
float4 filterParams3 = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_18, param_19, param_20);
float2 param_21 = metadataScale;
float2 param_22 = metadataEntryCoord;
int param_23 = 7;
float4 filterParams4 = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_21, param_22, param_23);
float2 param_24 = metadataScale;
float2 param_25 = metadataEntryCoord;
int param_26 = 8;
float4 extra = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_24, param_25, param_26);
outColorTexCoord0 = (float2x2(float2(colorTexMatrix0.xy), float2(colorTexMatrix0.zw)) * position) + colorTexOffsets.xy;
outBaseColor = baseColor;
outFilterParams0 = filterParams0;
outFilterParams1 = filterParams1;
outFilterParams2 = filterParams2;
outFilterParams3 = filterParams3;
outFilterParams4 = filterParams4;
outCtrl = int(extra.x);
}
@ -123,16 +133,16 @@ float4 filterRadialGradient(thread const float2& colorTexCoord, thread const tex
{
ts = ts.yx;
}
float _595;
float _611;
if (ts.x >= 0.0)
{
_595 = ts.x;
_611 = ts.x;
}
else
{
_595 = ts.y;
_611 = ts.y;
}
float t = _595;
float t = _611;
color = colorTexture.sample(colorTextureSmplr, (uvOrigin + float2(t, 0.0)), level(0.0));
}
return color;
@ -146,19 +156,19 @@ float4 filterBlur(thread const float2& colorTexCoord, thread const texture2d<flo
float3 gaussCoeff = filterParams1.xyz;
float gaussSum = gaussCoeff.x;
float4 color = colorTexture.sample(colorTextureSmplr, colorTexCoord, level(0.0)) * gaussCoeff.x;
float2 _639 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_639.x, _639.y, gaussCoeff.z);
float2 _655 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_655.x, _655.y, gaussCoeff.z);
for (int i = 1; i <= support; i += 2)
{
float gaussPartialSum = gaussCoeff.x;
float2 _659 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_659.x, _659.y, gaussCoeff.z);
float2 _675 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_675.x, _675.y, gaussCoeff.z);
gaussPartialSum += gaussCoeff.x;
float2 srcOffset = srcOffsetScale * (float(i) + (gaussCoeff.x / gaussPartialSum));
color += ((colorTexture.sample(colorTextureSmplr, (colorTexCoord - srcOffset), level(0.0)) + colorTexture.sample(colorTextureSmplr, (colorTexCoord + srcOffset), level(0.0))) * gaussPartialSum);
gaussSum += (2.0 * gaussPartialSum);
float2 _699 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_699.x, _699.y, gaussCoeff.z);
float2 _715 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_715.x, _715.y, gaussCoeff.z);
}
return color / float4(gaussSum);
}
@ -173,16 +183,16 @@ static inline __attribute__((always_inline))
void filterTextSample9Tap(thread float4& outAlphaLeft, thread float& outAlphaCenter, thread float4& outAlphaRight, thread const texture2d<float> colorTexture, thread const sampler colorTextureSmplr, thread const float2& colorTexCoord, thread const float4& kernel0, thread const float& onePixel)
{
bool wide = kernel0.x > 0.0;
float _276;
float _292;
if (wide)
{
float param = (-4.0) * onePixel;
float2 param_1 = colorTexCoord;
_276 = filterTextSample1Tap(param, colorTexture, colorTextureSmplr, param_1);
_292 = filterTextSample1Tap(param, colorTexture, colorTextureSmplr, param_1);
}
else
{
_276 = 0.0;
_292 = 0.0;
}
float param_2 = (-3.0) * onePixel;
float2 param_3 = colorTexCoord;
@ -190,7 +200,7 @@ void filterTextSample9Tap(thread float4& outAlphaLeft, thread float& outAlphaCen
float2 param_5 = colorTexCoord;
float param_6 = (-1.0) * onePixel;
float2 param_7 = colorTexCoord;
outAlphaLeft = float4(_276, filterTextSample1Tap(param_2, colorTexture, colorTextureSmplr, param_3), filterTextSample1Tap(param_4, colorTexture, colorTextureSmplr, param_5), filterTextSample1Tap(param_6, colorTexture, colorTextureSmplr, param_7));
outAlphaLeft = float4(_292, filterTextSample1Tap(param_2, colorTexture, colorTextureSmplr, param_3), filterTextSample1Tap(param_4, colorTexture, colorTextureSmplr, param_5), filterTextSample1Tap(param_6, colorTexture, colorTextureSmplr, param_7));
float param_8 = 0.0;
float2 param_9 = colorTexCoord;
outAlphaCenter = filterTextSample1Tap(param_8, colorTexture, colorTextureSmplr, param_9);
@ -200,18 +210,18 @@ void filterTextSample9Tap(thread float4& outAlphaLeft, thread float& outAlphaCen
float2 param_13 = colorTexCoord;
float param_14 = 3.0 * onePixel;
float2 param_15 = colorTexCoord;
float _336;
float _352;
if (wide)
{
float param_16 = 4.0 * onePixel;
float2 param_17 = colorTexCoord;
_336 = filterTextSample1Tap(param_16, colorTexture, colorTextureSmplr, param_17);
_352 = filterTextSample1Tap(param_16, colorTexture, colorTextureSmplr, param_17);
}
else
{
_336 = 0.0;
_352 = 0.0;
}
outAlphaRight = float4(filterTextSample1Tap(param_10, colorTexture, colorTextureSmplr, param_11), filterTextSample1Tap(param_12, colorTexture, colorTextureSmplr, param_13), filterTextSample1Tap(param_14, colorTexture, colorTextureSmplr, param_15), _336);
outAlphaRight = float4(filterTextSample1Tap(param_10, colorTexture, colorTextureSmplr, param_11), filterTextSample1Tap(param_12, colorTexture, colorTextureSmplr, param_13), filterTextSample1Tap(param_14, colorTexture, colorTextureSmplr, param_15), _352);
}
static inline __attribute__((always_inline))
@ -285,6 +295,14 @@ float4 filterText(thread const float2& colorTexCoord, thread const texture2d<flo
return float4(mix(bgColor, fgColor, alpha), 1.0);
}
static inline __attribute__((always_inline))
float4 filterColorMatrix(thread const float2& colorTexCoord, thread const texture2d<float> colorTexture, thread const sampler colorTextureSmplr, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const float4& filterParams3, thread const float4& filterParams4)
{
float4 srcColor = colorTexture.sample(colorTextureSmplr, colorTexCoord, level(0.0));
float4x4 colorMatrix = float4x4(float4(filterParams0), float4(filterParams1), float4(filterParams2), float4(filterParams3));
return (colorMatrix * srcColor) + filterParams4;
}
static inline __attribute__((always_inline))
float4 sampleColor(thread const texture2d<float> colorTexture, thread const sampler colorTextureSmplr, thread const float2& colorTexCoord)
{
@ -299,7 +317,7 @@ float4 filterNone(thread const float2& colorTexCoord, thread const texture2d<flo
}
static inline __attribute__((always_inline))
float4 filterColor(thread const float2& colorTexCoord, thread const texture2d<float> colorTexture, thread const sampler colorTextureSmplr, thread const texture2d<float> gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize, thread const float2& fragCoord, thread const float2& framebufferSize, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const int& colorFilter)
float4 filterColor(thread const float2& colorTexCoord, thread const texture2d<float> colorTexture, thread const sampler colorTextureSmplr, thread const texture2d<float> gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize, thread const float2& fragCoord, thread const float2& framebufferSize, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const float4& filterParams3, thread const float4& filterParams4, thread const int& colorFilter)
{
switch (colorFilter)
{
@ -330,9 +348,19 @@ float4 filterColor(thread const float2& colorTexCoord, thread const texture2d<fl
float4 param_14 = filterParams2;
return filterText(param_10, colorTexture, colorTextureSmplr, gammaLUT, gammaLUTSmplr, param_11, param_12, param_13, param_14);
}
}
case 4:
{
float2 param_15 = colorTexCoord;
return filterNone(param_15, colorTexture, colorTextureSmplr);
float4 param_16 = filterParams0;
float4 param_17 = filterParams1;
float4 param_18 = filterParams2;
float4 param_19 = filterParams3;
float4 param_20 = filterParams4;
return filterColorMatrix(param_15, colorTexture, colorTextureSmplr, param_16, param_17, param_18, param_19, param_20);
}
}
float2 param_21 = colorTexCoord;
return filterNone(param_21, colorTexture, colorTextureSmplr);
}
static inline __attribute__((always_inline))
@ -361,34 +389,34 @@ float3 compositeScreen(thread const float3& destColor, thread const float3& srcC
static inline __attribute__((always_inline))
float3 compositeSelect(thread const bool3& cond, thread const float3& ifTrue, thread const float3& ifFalse)
{
float _765;
float _835;
if (cond.x)
{
_765 = ifTrue.x;
_835 = ifTrue.x;
}
else
{
_765 = ifFalse.x;
_835 = ifFalse.x;
}
float _776;
float _846;
if (cond.y)
{
_776 = ifTrue.y;
_846 = ifTrue.y;
}
else
{
_776 = ifFalse.y;
_846 = ifFalse.y;
}
float _787;
float _857;
if (cond.z)
{
_787 = ifTrue.z;
_857 = ifTrue.z;
}
else
{
_787 = ifFalse.z;
_857 = ifFalse.z;
}
return float3(_765, _776, _787);
return float3(_835, _846, _857);
}
static inline __attribute__((always_inline))
@ -433,16 +461,16 @@ float3 compositeSoftLight(thread const float3& destColor, thread const float3& s
static inline __attribute__((always_inline))
float compositeDivide(thread const float& num, thread const float& denom)
{
float _801;
float _871;
if (denom != 0.0)
{
_801 = num / denom;
_871 = num / denom;
}
else
{
_801 = 0.0;
_871 = 0.0;
}
return _801;
return _871;
}
static inline __attribute__((always_inline))
@ -452,25 +480,25 @@ float3 compositeRGBToHSL(thread const float3& rgb)
float xMin = fast::min(fast::min(rgb.x, rgb.y), rgb.z);
float c = v - xMin;
float l = mix(xMin, v, 0.5);
float3 _907;
float3 _977;
if (rgb.x == v)
{
_907 = float3(0.0, rgb.yz);
_977 = float3(0.0, rgb.yz);
}
else
{
float3 _920;
float3 _990;
if (rgb.y == v)
{
_920 = float3(2.0, rgb.zx);
_990 = float3(2.0, rgb.zx);
}
else
{
_920 = float3(4.0, rgb.xy);
_990 = float3(4.0, rgb.xy);
}
_907 = _920;
_977 = _990;
}
float3 terms = _907;
float3 terms = _977;
float param = ((terms.x * c) + terms.y) - terms.z;
float param_1 = c;
float h = 1.0471975803375244140625 * compositeDivide(param, param_1);
@ -607,7 +635,7 @@ float4 composite(thread const float4& srcColor, thread const texture2d<float> de
}
static inline __attribute__((always_inline))
float4 calculateColor(thread const float2& fragCoord, thread const texture2d<float> colorTexture0, thread const sampler colorTexture0Smplr, thread const texture2d<float> maskTexture0, thread const sampler maskTexture0Smplr, thread const texture2d<float> destTexture, thread const sampler destTextureSmplr, thread const texture2d<float> gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize0, thread const float2& maskTextureSize0, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const float2& framebufferSize, thread const int& ctrl, thread const float3& maskTexCoord0, thread const float2& colorTexCoord0, thread const float4& baseColor, thread const int& tileCtrl)
float4 calculateColor(thread const float2& fragCoord, thread const texture2d<float> colorTexture0, thread const sampler colorTexture0Smplr, thread const texture2d<float> maskTexture0, thread const sampler maskTexture0Smplr, thread const texture2d<float> destTexture, thread const sampler destTextureSmplr, thread const texture2d<float> gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize0, thread const float2& maskTextureSize0, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const float4& filterParams3, thread const float4& filterParams4, thread const float2& framebufferSize, thread const int& ctrl, thread const float3& maskTexCoord0, thread const float2& colorTexCoord0, thread const float4& baseColor, thread const int& tileCtrl)
{
int maskCtrl0 = (tileCtrl >> 0) & 3;
float maskAlpha = 1.0;
@ -617,10 +645,10 @@ float4 calculateColor(thread const float2& fragCoord, thread const texture2d<flo
int param_3 = maskCtrl0;
maskAlpha = sampleMask(param, maskTexture0, maskTexture0Smplr, param_1, param_2, param_3);
float4 color = baseColor;
int color0Combine = (ctrl >> 6) & 3;
int color0Combine = (ctrl >> 8) & 3;
if (color0Combine != 0)
{
int color0Filter = (ctrl >> 4) & 3;
int color0Filter = (ctrl >> 4) & 15;
float2 param_4 = colorTexCoord0;
float2 param_5 = colorTextureSize0;
float2 param_6 = fragCoord;
@ -628,31 +656,33 @@ float4 calculateColor(thread const float2& fragCoord, thread const texture2d<flo
float4 param_8 = filterParams0;
float4 param_9 = filterParams1;
float4 param_10 = filterParams2;
int param_11 = color0Filter;
float4 color0 = filterColor(param_4, colorTexture0, colorTexture0Smplr, gammaLUT, gammaLUTSmplr, param_5, param_6, param_7, param_8, param_9, param_10, param_11);
float4 param_12 = color;
float4 param_13 = color0;
int param_14 = color0Combine;
color = combineColor0(param_12, param_13, param_14);
float4 param_11 = filterParams3;
float4 param_12 = filterParams4;
int param_13 = color0Filter;
float4 color0 = filterColor(param_4, colorTexture0, colorTexture0Smplr, gammaLUT, gammaLUTSmplr, param_5, param_6, param_7, param_8, param_9, param_10, param_11, param_12, param_13);
float4 param_14 = color;
float4 param_15 = color0;
int param_16 = color0Combine;
color = combineColor0(param_14, param_15, param_16);
}
color.w *= maskAlpha;
int compositeOp = (ctrl >> 8) & 15;
float4 param_15 = color;
float2 param_16 = framebufferSize;
float2 param_17 = fragCoord;
int param_18 = compositeOp;
color = composite(param_15, destTexture, destTextureSmplr, param_16, param_17, param_18);
float3 _1363 = color.xyz * color.w;
color = float4(_1363.x, _1363.y, _1363.z, color.w);
int compositeOp = (ctrl >> 10) & 15;
float4 param_17 = color;
float2 param_18 = framebufferSize;
float2 param_19 = fragCoord;
int param_20 = compositeOp;
color = composite(param_17, destTexture, destTextureSmplr, param_18, param_19, param_20);
float3 _1437 = color.xyz * color.w;
color = float4(_1437.x, _1437.y, _1437.z, color.w);
return color;
}
kernel void main0(constant int2& uFramebufferTileSize [[buffer(3)]], constant int& uLoadAction [[buffer(4)]], constant int2& uTextureMetadataSize [[buffer(7)]], constant float2& uFramebufferSize [[buffer(0)]], constant float2& uTileSize [[buffer(1)]], constant float4& uClearColor [[buffer(5)]], constant float2& uColorTextureSize0 [[buffer(8)]], constant float2& uMaskTextureSize0 [[buffer(9)]], const device bFirstTileMap& _1509 [[buffer(2)]], const device bTiles& _1602 [[buffer(6)]], texture2d<float, access::read_write> uDestImage [[texture(0)]], texture2d<float> uTextureMetadata [[texture(1)]], texture2d<float> uColorTexture0 [[texture(2)]], texture2d<float> uMaskTexture0 [[texture(3)]], texture2d<float> uGammaLUT [[texture(4)]], sampler uTextureMetadataSmplr [[sampler(0)]], sampler uColorTexture0Smplr [[sampler(1)]], sampler uMaskTexture0Smplr [[sampler(2)]], sampler uGammaLUTSmplr [[sampler(3)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]])
kernel void main0(constant int2& uFramebufferTileSize [[buffer(3)]], constant int& uLoadAction [[buffer(4)]], constant int2& uTextureMetadataSize [[buffer(7)]], constant float2& uFramebufferSize [[buffer(0)]], constant float2& uTileSize [[buffer(1)]], constant float4& uClearColor [[buffer(5)]], constant float2& uColorTextureSize0 [[buffer(8)]], constant float2& uMaskTextureSize0 [[buffer(9)]], const device bFirstTileMap& _1601 [[buffer(2)]], const device bTiles& _1692 [[buffer(6)]], texture2d<float, access::read_write> uDestImage [[texture(0)]], texture2d<float> uTextureMetadata [[texture(1)]], texture2d<float> uColorTexture0 [[texture(2)]], texture2d<float> uMaskTexture0 [[texture(3)]], texture2d<float> uGammaLUT [[texture(4)]], sampler uTextureMetadataSmplr [[sampler(0)]], sampler uColorTexture0Smplr [[sampler(1)]], sampler uMaskTexture0Smplr [[sampler(2)]], sampler uGammaLUTSmplr [[sampler(3)]], uint3 gl_WorkGroupID [[threadgroup_position_in_grid]], uint3 gl_LocalInvocationID [[thread_position_in_threadgroup]])
{
int2 tileCoord = int2(gl_WorkGroupID.xy);
int2 firstTileSubCoord = int2(gl_LocalInvocationID.xy) * int2(1, 4);
int2 firstFragCoord = (tileCoord * int2(uTileSize)) + firstTileSubCoord;
int tileIndex = _1509.iFirstTileMap[tileCoord.x + (uFramebufferTileSize.x * tileCoord.y)];
int tileIndex = _1601.iFirstTileMap[tileCoord.x + (uFramebufferTileSize.x * tileCoord.y)];
if ((tileIndex < 0) && (uLoadAction != 0))
{
return;
@ -678,15 +708,17 @@ kernel void main0(constant int2& uFramebufferTileSize [[buffer(3)]], constant in
float4 param_6;
float4 param_7;
float4 param_8;
int param_9;
float4 param_9;
float4 param_10;
int param_11;
while (tileIndex >= 0)
{
for (int subY_1 = 0; subY_1 < 4; subY_1++)
{
int2 tileSubCoord = firstTileSubCoord + int2(0, subY_1);
float2 fragCoord = float2(firstFragCoord + int2(0, subY_1)) + float2(0.5);
int alphaTileIndex = int(_1602.iTiles[(tileIndex * 4) + 2] << uint(8)) >> 8;
uint tileControlWord = _1602.iTiles[(tileIndex * 4) + 3];
int alphaTileIndex = int(_1692.iTiles[(tileIndex * 4) + 2] << uint(8)) >> 8;
uint tileControlWord = _1692.iTiles[(tileIndex * 4) + 3];
uint colorEntry = tileControlWord & 65535u;
int tileCtrl = int((tileControlWord >> uint(16)) & 255u);
if (alphaTileIndex >= 0)
@ -704,34 +736,38 @@ kernel void main0(constant int2& uFramebufferTileSize [[buffer(3)]], constant in
float2 param_1 = fragCoord;
int param_2 = int(colorEntry);
int2 param_3 = uTextureMetadataSize;
computeTileVaryings(param_1, param_2, uTextureMetadata, uTextureMetadataSmplr, param_3, param_4, param_5, param_6, param_7, param_8, param_9);
computeTileVaryings(param_1, param_2, uTextureMetadata, uTextureMetadataSmplr, param_3, param_4, param_5, param_6, param_7, param_8, param_9, param_10, param_11);
float2 colorTexCoord0 = param_4;
float4 baseColor = param_5;
float4 filterParams0 = param_6;
float4 filterParams1 = param_7;
float4 filterParams2 = param_8;
int ctrl = param_9;
float2 param_10 = fragCoord;
float2 param_11 = uColorTextureSize0;
float2 param_12 = uMaskTextureSize0;
float4 param_13 = filterParams0;
float4 param_14 = filterParams1;
float4 param_15 = filterParams2;
float2 param_16 = uFramebufferSize;
int param_17 = ctrl;
float3 param_18 = maskTexCoord0;
float2 param_19 = colorTexCoord0;
float4 param_20 = baseColor;
int param_21 = tileCtrl;
float4 srcColor = calculateColor(param_10, uColorTexture0, uColorTexture0Smplr, uMaskTexture0, uMaskTexture0Smplr, uColorTexture0, uColorTexture0Smplr, uGammaLUT, uGammaLUTSmplr, param_11, param_12, param_13, param_14, param_15, param_16, param_17, param_18, param_19, param_20, param_21);
float4 filterParams3 = param_9;
float4 filterParams4 = param_10;
int ctrl = param_11;
float2 param_12 = fragCoord;
float2 param_13 = uColorTextureSize0;
float2 param_14 = uMaskTextureSize0;
float4 param_15 = filterParams0;
float4 param_16 = filterParams1;
float4 param_17 = filterParams2;
float4 param_18 = filterParams3;
float4 param_19 = filterParams4;
float2 param_20 = uFramebufferSize;
int param_21 = ctrl;
float3 param_22 = maskTexCoord0;
float2 param_23 = colorTexCoord0;
float4 param_24 = baseColor;
int param_25 = tileCtrl;
float4 srcColor = calculateColor(param_12, uColorTexture0, uColorTexture0Smplr, uMaskTexture0, uMaskTexture0Smplr, uColorTexture0, uColorTexture0Smplr, uGammaLUT, uGammaLUTSmplr, param_13, param_14, param_15, param_16, param_17, param_18, param_19, param_20, param_21, param_22, param_23, param_24, param_25);
destColors[subY_1] = (destColors[subY_1] * (1.0 - srcColor.w)) + srcColor;
}
tileIndex = int(_1602.iTiles[(tileIndex * 4) + 0]);
tileIndex = int(_1692.iTiles[(tileIndex * 4) + 0]);
}
for (int subY_2 = 0; subY_2 < 4; subY_2++)
{
int2 param_22 = firstFragCoord + int2(0, subY_2);
uDestImage.write(destColors[subY_2], uint2(toImageCoords(param_22, uFramebufferSize)));
int2 param_26 = firstFragCoord + int2(0, subY_2);
uDestImage.write(destColors[subY_2], uint2(toImageCoords(param_26, uFramebufferSize)));
}
}

View File

@ -6,7 +6,7 @@
using namespace metal;
constant float3 _1055 = {};
constant float3 _1123 = {};
struct main0_out
{
@ -22,7 +22,9 @@ struct main0_in
float4 vFilterParams0 [[user(locn4)]];
float4 vFilterParams1 [[user(locn5)]];
float4 vFilterParams2 [[user(locn6)]];
float vCtrl [[user(locn7)]];
float4 vFilterParams3 [[user(locn7)]];
float4 vFilterParams4 [[user(locn8)]];
float vCtrl [[user(locn9)]];
};
// Implementation of the GLSL mod() function, which is slightly different than Metal fmod()
@ -75,16 +77,16 @@ float4 filterRadialGradient(thread const float2& colorTexCoord, thread const tex
{
ts = ts.yx;
}
float _569;
float _583;
if (ts.x >= 0.0)
{
_569 = ts.x;
_583 = ts.x;
}
else
{
_569 = ts.y;
_583 = ts.y;
}
float t = _569;
float t = _583;
color = colorTexture.sample(colorTextureSmplr, (uvOrigin + float2(t, 0.0)));
}
return color;
@ -98,19 +100,19 @@ float4 filterBlur(thread const float2& colorTexCoord, thread const texture2d<flo
float3 gaussCoeff = filterParams1.xyz;
float gaussSum = gaussCoeff.x;
float4 color = colorTexture.sample(colorTextureSmplr, colorTexCoord) * gaussCoeff.x;
float2 _613 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_613.x, _613.y, gaussCoeff.z);
float2 _627 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_627.x, _627.y, gaussCoeff.z);
for (int i = 1; i <= support; i += 2)
{
float gaussPartialSum = gaussCoeff.x;
float2 _633 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_633.x, _633.y, gaussCoeff.z);
float2 _647 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_647.x, _647.y, gaussCoeff.z);
gaussPartialSum += gaussCoeff.x;
float2 srcOffset = srcOffsetScale * (float(i) + (gaussCoeff.x / gaussPartialSum));
color += ((colorTexture.sample(colorTextureSmplr, (colorTexCoord - srcOffset)) + colorTexture.sample(colorTextureSmplr, (colorTexCoord + srcOffset))) * gaussPartialSum);
gaussSum += (2.0 * gaussPartialSum);
float2 _673 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_673.x, _673.y, gaussCoeff.z);
float2 _687 = gaussCoeff.xy * gaussCoeff.yz;
gaussCoeff = float3(_687.x, _687.y, gaussCoeff.z);
}
return color / float4(gaussSum);
}
@ -125,16 +127,16 @@ static inline __attribute__((always_inline))
void filterTextSample9Tap(thread float4& outAlphaLeft, thread float& outAlphaCenter, thread float4& outAlphaRight, thread const texture2d<float> colorTexture, thread const sampler colorTextureSmplr, thread const float2& colorTexCoord, thread const float4& kernel0, thread const float& onePixel)
{
bool wide = kernel0.x > 0.0;
float _250;
float _264;
if (wide)
{
float param = (-4.0) * onePixel;
float2 param_1 = colorTexCoord;
_250 = filterTextSample1Tap(param, colorTexture, colorTextureSmplr, param_1);
_264 = filterTextSample1Tap(param, colorTexture, colorTextureSmplr, param_1);
}
else
{
_250 = 0.0;
_264 = 0.0;
}
float param_2 = (-3.0) * onePixel;
float2 param_3 = colorTexCoord;
@ -142,7 +144,7 @@ void filterTextSample9Tap(thread float4& outAlphaLeft, thread float& outAlphaCen
float2 param_5 = colorTexCoord;
float param_6 = (-1.0) * onePixel;
float2 param_7 = colorTexCoord;
outAlphaLeft = float4(_250, filterTextSample1Tap(param_2, colorTexture, colorTextureSmplr, param_3), filterTextSample1Tap(param_4, colorTexture, colorTextureSmplr, param_5), filterTextSample1Tap(param_6, colorTexture, colorTextureSmplr, param_7));
outAlphaLeft = float4(_264, filterTextSample1Tap(param_2, colorTexture, colorTextureSmplr, param_3), filterTextSample1Tap(param_4, colorTexture, colorTextureSmplr, param_5), filterTextSample1Tap(param_6, colorTexture, colorTextureSmplr, param_7));
float param_8 = 0.0;
float2 param_9 = colorTexCoord;
outAlphaCenter = filterTextSample1Tap(param_8, colorTexture, colorTextureSmplr, param_9);
@ -152,18 +154,18 @@ void filterTextSample9Tap(thread float4& outAlphaLeft, thread float& outAlphaCen
float2 param_13 = colorTexCoord;
float param_14 = 3.0 * onePixel;
float2 param_15 = colorTexCoord;
float _310;
float _324;
if (wide)
{
float param_16 = 4.0 * onePixel;
float2 param_17 = colorTexCoord;
_310 = filterTextSample1Tap(param_16, colorTexture, colorTextureSmplr, param_17);
_324 = filterTextSample1Tap(param_16, colorTexture, colorTextureSmplr, param_17);
}
else
{
_310 = 0.0;
_324 = 0.0;
}
outAlphaRight = float4(filterTextSample1Tap(param_10, colorTexture, colorTextureSmplr, param_11), filterTextSample1Tap(param_12, colorTexture, colorTextureSmplr, param_13), filterTextSample1Tap(param_14, colorTexture, colorTextureSmplr, param_15), _310);
outAlphaRight = float4(filterTextSample1Tap(param_10, colorTexture, colorTextureSmplr, param_11), filterTextSample1Tap(param_12, colorTexture, colorTextureSmplr, param_13), filterTextSample1Tap(param_14, colorTexture, colorTextureSmplr, param_15), _324);
}
static inline __attribute__((always_inline))
@ -237,6 +239,14 @@ float4 filterText(thread const float2& colorTexCoord, thread const texture2d<flo
return float4(mix(bgColor, fgColor, alpha), 1.0);
}
static inline __attribute__((always_inline))
float4 filterColorMatrix(thread const float2& colorTexCoord, thread const texture2d<float> colorTexture, thread const sampler colorTextureSmplr, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const float4& filterParams3, thread const float4& filterParams4)
{
float4 srcColor = colorTexture.sample(colorTextureSmplr, colorTexCoord);
float4x4 colorMatrix = float4x4(float4(filterParams0), float4(filterParams1), float4(filterParams2), float4(filterParams3));
return (colorMatrix * srcColor) + filterParams4;
}
static inline __attribute__((always_inline))
float4 sampleColor(thread const texture2d<float> colorTexture, thread const sampler colorTextureSmplr, thread const float2& colorTexCoord)
{
@ -251,7 +261,7 @@ float4 filterNone(thread const float2& colorTexCoord, thread const texture2d<flo
}
static inline __attribute__((always_inline))
float4 filterColor(thread const float2& colorTexCoord, thread const texture2d<float> colorTexture, thread const sampler colorTextureSmplr, thread const texture2d<float> gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize, thread const float2& fragCoord, thread const float2& framebufferSize, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const int& colorFilter)
float4 filterColor(thread const float2& colorTexCoord, thread const texture2d<float> colorTexture, thread const sampler colorTextureSmplr, thread const texture2d<float> gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize, thread const float2& fragCoord, thread const float2& framebufferSize, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const float4& filterParams3, thread const float4& filterParams4, thread const int& colorFilter)
{
switch (colorFilter)
{
@ -282,9 +292,19 @@ float4 filterColor(thread const float2& colorTexCoord, thread const texture2d<fl
float4 param_14 = filterParams2;
return filterText(param_10, colorTexture, colorTextureSmplr, gammaLUT, gammaLUTSmplr, param_11, param_12, param_13, param_14);
}
}
case 4:
{
float2 param_15 = colorTexCoord;
return filterNone(param_15, colorTexture, colorTextureSmplr);
float4 param_16 = filterParams0;
float4 param_17 = filterParams1;
float4 param_18 = filterParams2;
float4 param_19 = filterParams3;
float4 param_20 = filterParams4;
return filterColorMatrix(param_15, colorTexture, colorTextureSmplr, param_16, param_17, param_18, param_19, param_20);
}
}
float2 param_21 = colorTexCoord;
return filterNone(param_21, colorTexture, colorTextureSmplr);
}
static inline __attribute__((always_inline))
@ -313,34 +333,34 @@ float3 compositeScreen(thread const float3& destColor, thread const float3& srcC
static inline __attribute__((always_inline))
float3 compositeSelect(thread const bool3& cond, thread const float3& ifTrue, thread const float3& ifFalse)
{
float _739;
float _807;
if (cond.x)
{
_739 = ifTrue.x;
_807 = ifTrue.x;
}
else
{
_739 = ifFalse.x;
_807 = ifFalse.x;
}
float _750;
float _818;
if (cond.y)
{
_750 = ifTrue.y;
_818 = ifTrue.y;
}
else
{
_750 = ifFalse.y;
_818 = ifFalse.y;
}
float _761;
float _829;
if (cond.z)
{
_761 = ifTrue.z;
_829 = ifTrue.z;
}
else
{
_761 = ifFalse.z;
_829 = ifFalse.z;
}
return float3(_739, _750, _761);
return float3(_807, _818, _829);
}
static inline __attribute__((always_inline))
@ -385,16 +405,16 @@ float3 compositeSoftLight(thread const float3& destColor, thread const float3& s
static inline __attribute__((always_inline))
float compositeDivide(thread const float& num, thread const float& denom)
{
float _775;
float _843;
if (denom != 0.0)
{
_775 = num / denom;
_843 = num / denom;
}
else
{
_775 = 0.0;
_843 = 0.0;
}
return _775;
return _843;
}
static inline __attribute__((always_inline))
@ -404,25 +424,25 @@ float3 compositeRGBToHSL(thread const float3& rgb)
float xMin = fast::min(fast::min(rgb.x, rgb.y), rgb.z);
float c = v - xMin;
float l = mix(xMin, v, 0.5);
float3 _881;
float3 _949;
if (rgb.x == v)
{
_881 = float3(0.0, rgb.yz);
_949 = float3(0.0, rgb.yz);
}
else
{
float3 _894;
float3 _962;
if (rgb.y == v)
{
_894 = float3(2.0, rgb.zx);
_962 = float3(2.0, rgb.zx);
}
else
{
_894 = float3(4.0, rgb.xy);
_962 = float3(4.0, rgb.xy);
}
_881 = _894;
_949 = _962;
}
float3 terms = _881;
float3 terms = _949;
float param = ((terms.x * c) + terms.y) - terms.z;
float param_1 = c;
float h = 1.0471975803375244140625 * compositeDivide(param, param_1);
@ -559,7 +579,7 @@ float4 composite(thread const float4& srcColor, thread const texture2d<float> de
}
static inline __attribute__((always_inline))
float4 calculateColor(thread const float2& fragCoord, thread const texture2d<float> colorTexture0, thread const sampler colorTexture0Smplr, thread const texture2d<float> maskTexture0, thread const sampler maskTexture0Smplr, thread const texture2d<float> destTexture, thread const sampler destTextureSmplr, thread const texture2d<float> gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize0, thread const float2& maskTextureSize0, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const float2& framebufferSize, thread const int& ctrl, thread const float3& maskTexCoord0, thread const float2& colorTexCoord0, thread const float4& baseColor, thread const int& tileCtrl)
float4 calculateColor(thread const float2& fragCoord, thread const texture2d<float> colorTexture0, thread const sampler colorTexture0Smplr, thread const texture2d<float> maskTexture0, thread const sampler maskTexture0Smplr, thread const texture2d<float> destTexture, thread const sampler destTextureSmplr, thread const texture2d<float> gammaLUT, thread const sampler gammaLUTSmplr, thread const float2& colorTextureSize0, thread const float2& maskTextureSize0, thread const float4& filterParams0, thread const float4& filterParams1, thread const float4& filterParams2, thread const float4& filterParams3, thread const float4& filterParams4, thread const float2& framebufferSize, thread const int& ctrl, thread const float3& maskTexCoord0, thread const float2& colorTexCoord0, thread const float4& baseColor, thread const int& tileCtrl)
{
int maskCtrl0 = (tileCtrl >> 0) & 3;
float maskAlpha = 1.0;
@ -569,10 +589,10 @@ float4 calculateColor(thread const float2& fragCoord, thread const texture2d<flo
int param_3 = maskCtrl0;
maskAlpha = sampleMask(param, maskTexture0, maskTexture0Smplr, param_1, param_2, param_3);
float4 color = baseColor;
int color0Combine = (ctrl >> 6) & 3;
int color0Combine = (ctrl >> 8) & 3;
if (color0Combine != 0)
{
int color0Filter = (ctrl >> 4) & 3;
int color0Filter = (ctrl >> 4) & 15;
float2 param_4 = colorTexCoord0;
float2 param_5 = colorTextureSize0;
float2 param_6 = fragCoord;
@ -580,22 +600,24 @@ float4 calculateColor(thread const float2& fragCoord, thread const texture2d<flo
float4 param_8 = filterParams0;
float4 param_9 = filterParams1;
float4 param_10 = filterParams2;
int param_11 = color0Filter;
float4 color0 = filterColor(param_4, colorTexture0, colorTexture0Smplr, gammaLUT, gammaLUTSmplr, param_5, param_6, param_7, param_8, param_9, param_10, param_11);
float4 param_12 = color;
float4 param_13 = color0;
int param_14 = color0Combine;
color = combineColor0(param_12, param_13, param_14);
float4 param_11 = filterParams3;
float4 param_12 = filterParams4;
int param_13 = color0Filter;
float4 color0 = filterColor(param_4, colorTexture0, colorTexture0Smplr, gammaLUT, gammaLUTSmplr, param_5, param_6, param_7, param_8, param_9, param_10, param_11, param_12, param_13);
float4 param_14 = color;
float4 param_15 = color0;
int param_16 = color0Combine;
color = combineColor0(param_14, param_15, param_16);
}
color.w *= maskAlpha;
int compositeOp = (ctrl >> 8) & 15;
float4 param_15 = color;
float2 param_16 = framebufferSize;
float2 param_17 = fragCoord;
int param_18 = compositeOp;
color = composite(param_15, destTexture, destTextureSmplr, param_16, param_17, param_18);
float3 _1339 = color.xyz * color.w;
color = float4(_1339.x, _1339.y, _1339.z, color.w);
int compositeOp = (ctrl >> 10) & 15;
float4 param_17 = color;
float2 param_18 = framebufferSize;
float2 param_19 = fragCoord;
int param_20 = compositeOp;
color = composite(param_17, destTexture, destTextureSmplr, param_18, param_19, param_20);
float3 _1411 = color.xyz * color.w;
color = float4(_1411.x, _1411.y, _1411.z, color.w);
return color;
}
@ -608,13 +630,15 @@ fragment main0_out main0(main0_in in [[stage_in]], constant float2& uColorTextur
float4 param_3 = in.vFilterParams0;
float4 param_4 = in.vFilterParams1;
float4 param_5 = in.vFilterParams2;
float2 param_6 = uFramebufferSize;
int param_7 = int(in.vCtrl);
float3 param_8 = in.vMaskTexCoord0;
float2 param_9 = in.vColorTexCoord0;
float4 param_10 = in.vBaseColor;
int param_11 = int(in.vTileCtrl);
out.oFragColor = calculateColor(param, uColorTexture0, uColorTexture0Smplr, uMaskTexture0, uMaskTexture0Smplr, uDestTexture, uDestTextureSmplr, uGammaLUT, uGammaLUTSmplr, param_1, param_2, param_3, param_4, param_5, param_6, param_7, param_8, param_9, param_10, param_11);
float4 param_6 = in.vFilterParams3;
float4 param_7 = in.vFilterParams4;
float2 param_8 = uFramebufferSize;
int param_9 = int(in.vCtrl);
float3 param_10 = in.vMaskTexCoord0;
float2 param_11 = in.vColorTexCoord0;
float4 param_12 = in.vBaseColor;
int param_13 = int(in.vTileCtrl);
out.oFragColor = calculateColor(param, uColorTexture0, uColorTexture0Smplr, uMaskTexture0, uMaskTexture0Smplr, uDestTexture, uDestTextureSmplr, uGammaLUT, uGammaLUTSmplr, param_1, param_2, param_3, param_4, param_5, param_6, param_7, param_8, param_9, param_10, param_11, param_12, param_13);
return out;
}

View File

@ -15,7 +15,9 @@ struct main0_out
float4 vFilterParams0 [[user(locn4)]];
float4 vFilterParams1 [[user(locn5)]];
float4 vFilterParams2 [[user(locn6)]];
float vCtrl [[user(locn7)]];
float4 vFilterParams3 [[user(locn7)]];
float4 vFilterParams4 [[user(locn8)]];
float vCtrl [[user(locn9)]];
float4 gl_Position [[position]];
};
@ -36,10 +38,10 @@ float4 fetchUnscaled(thread const texture2d<float> srcTexture, thread const samp
}
static inline __attribute__((always_inline))
void computeTileVaryings(thread const float2& position, thread const int& colorEntry, thread const texture2d<float> textureMetadata, thread const sampler textureMetadataSmplr, thread const int2& textureMetadataSize, thread float2& outColorTexCoord0, thread float4& outBaseColor, thread float4& outFilterParams0, thread float4& outFilterParams1, thread float4& outFilterParams2, thread int& outCtrl)
void computeTileVaryings(thread const float2& position, thread const int& colorEntry, thread const texture2d<float> textureMetadata, thread const sampler textureMetadataSmplr, thread const int2& textureMetadataSize, thread float2& outColorTexCoord0, thread float4& outBaseColor, thread float4& outFilterParams0, thread float4& outFilterParams1, thread float4& outFilterParams2, thread float4& outFilterParams3, thread float4& outFilterParams4, thread int& outCtrl)
{
float2 metadataScale = float2(1.0) / float2(textureMetadataSize);
float2 metadataEntryCoord = float2(float((colorEntry % 128) * 8), float(colorEntry / 128));
float2 metadataEntryCoord = float2(float((colorEntry % 128) * 10), float(colorEntry / 128));
float2 param = metadataScale;
float2 param_1 = metadataEntryCoord;
int param_2 = 0;
@ -67,12 +69,22 @@ void computeTileVaryings(thread const float2& position, thread const int& colorE
float2 param_18 = metadataScale;
float2 param_19 = metadataEntryCoord;
int param_20 = 6;
float4 extra = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_18, param_19, param_20);
float4 filterParams3 = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_18, param_19, param_20);
float2 param_21 = metadataScale;
float2 param_22 = metadataEntryCoord;
int param_23 = 7;
float4 filterParams4 = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_21, param_22, param_23);
float2 param_24 = metadataScale;
float2 param_25 = metadataEntryCoord;
int param_26 = 8;
float4 extra = fetchUnscaled(textureMetadata, textureMetadataSmplr, param_24, param_25, param_26);
outColorTexCoord0 = (float2x2(float2(colorTexMatrix0.xy), float2(colorTexMatrix0.zw)) * position) + colorTexOffsets.xy;
outBaseColor = baseColor;
outFilterParams0 = filterParams0;
outFilterParams1 = filterParams1;
outFilterParams2 = filterParams2;
outFilterParams3 = filterParams3;
outFilterParams4 = filterParams4;
outCtrl = int(extra.x);
}
@ -90,17 +102,17 @@ vertex main0_out main0(main0_in in [[stage_in]], constant int2& uZBufferSize [[b
}
uint2 maskTileCoord = uint2(in.aMaskTexCoord0.x, in.aMaskTexCoord0.y + (256u * in.aMaskTexCoord0.z));
float2 maskTexCoord0 = (float2(maskTileCoord) + tileOffset) * uTileSize;
bool _244 = in.aCtrlBackdrop.y == 0;
bool _250;
if (_244)
bool _264 = in.aCtrlBackdrop.y == 0;
bool _270;
if (_264)
{
_250 = in.aMaskTexCoord0.w != 0u;
_270 = in.aMaskTexCoord0.w != 0u;
}
else
{
_250 = _244;
_270 = _264;
}
if (_250)
if (_270)
{
out.gl_Position = float4(0.0);
return out;
@ -113,14 +125,18 @@ vertex main0_out main0(main0_in in [[stage_in]], constant int2& uZBufferSize [[b
float4 param_5;
float4 param_6;
float4 param_7;
int param_8;
computeTileVaryings(param, param_1, uTextureMetadata, uTextureMetadataSmplr, param_2, param_3, param_4, param_5, param_6, param_7, param_8);
float4 param_8;
float4 param_9;
int param_10;
computeTileVaryings(param, param_1, uTextureMetadata, uTextureMetadataSmplr, param_2, param_3, param_4, param_5, param_6, param_7, param_8, param_9, param_10);
out.vColorTexCoord0 = param_3;
out.vBaseColor = param_4;
out.vFilterParams0 = param_5;
out.vFilterParams1 = param_6;
out.vFilterParams2 = param_7;
int ctrl = param_8;
out.vFilterParams3 = param_8;
out.vFilterParams4 = param_9;
int ctrl = param_10;
out.vTileCtrl = float(in.aCtrlBackdrop.x);
out.vCtrl = float(ctrl);
out.vMaskTexCoord0 = float3(maskTexCoord0, float(in.aCtrlBackdrop.y));

View File

@ -115,7 +115,7 @@ void main() {
vec3 maskTexCoord0 = vec3(vec2(ivec2(maskTileCoord) + tileSubCoord), backdrop);
vec2 colorTexCoord0;
vec4 baseColor, filterParams0, filterParams1, filterParams2;
vec4 baseColor, filterParams0, filterParams1, filterParams2, filterParams3, filterParams4;
int ctrl;
computeTileVaryings(fragCoord,
int(colorEntry),
@ -126,6 +126,8 @@ void main() {
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4,
ctrl);
// FIXME(pcwalton): The `uColorTexture0` below is a placeholder and needs to be
@ -141,6 +143,8 @@ void main() {
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4,
uFramebufferSize,
ctrl,
maskTexCoord0,

View File

@ -35,6 +35,8 @@ in float vTileCtrl;
in vec4 vFilterParams0;
in vec4 vFilterParams1;
in vec4 vFilterParams2;
in vec4 vFilterParams3;
in vec4 vFilterParams4;
in float vCtrl;
out vec4 oFragColor;
@ -54,6 +56,8 @@ void main() {
vFilterParams0,
vFilterParams1,
vFilterParams2,
vFilterParams3,
vFilterParams4,
uFramebufferSize,
int(vCtrl),
vMaskTexCoord0,

View File

@ -41,6 +41,8 @@ out float vTileCtrl;
out vec4 vFilterParams0;
out vec4 vFilterParams1;
out vec4 vFilterParams2;
out vec4 vFilterParams3;
out vec4 vFilterParams4;
out float vCtrl;
void main() {
@ -70,6 +72,8 @@ void main() {
vFilterParams0,
vFilterParams1,
vFilterParams2,
vFilterParams3,
vFilterParams4,
ctrl);
vTileCtrl = float(aCtrlBackdrop.x);

View File

@ -44,10 +44,11 @@
#define COMBINER_CTRL_COLOR_COMBINE_SRC_IN 0x1
#define COMBINER_CTRL_COLOR_COMBINE_DEST_IN 0x2
#define COMBINER_CTRL_FILTER_MASK 0x3
#define COMBINER_CTRL_FILTER_MASK 0xf
#define COMBINER_CTRL_FILTER_RADIAL_GRADIENT 0x1
#define COMBINER_CTRL_FILTER_TEXT 0x2
#define COMBINER_CTRL_FILTER_BLUR 0x3
#define COMBINER_CTRL_FILTER_COLOR_MATRIX 0x4
#define COMBINER_CTRL_COMPOSITE_MASK 0xf
#define COMBINER_CTRL_COMPOSITE_NORMAL 0x0
@ -68,8 +69,8 @@
#define COMBINER_CTRL_COMPOSITE_LUMINOSITY 0xf
#define COMBINER_CTRL_COLOR_FILTER_SHIFT 4
#define COMBINER_CTRL_COLOR_COMBINE_SHIFT 6
#define COMBINER_CTRL_COMPOSITE_SHIFT 8
#define COMBINER_CTRL_COLOR_COMBINE_SHIFT 8
#define COMBINER_CTRL_COMPOSITE_SHIFT 10
// Color sampling
@ -347,6 +348,18 @@ vec4 filterBlur(vec2 colorTexCoord,
return color / gaussSum;
}
vec4 filterColorMatrix(vec2 colorTexCoord,
sampler2D colorTexture,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4) {
vec4 srcColor = texture(colorTexture, colorTexCoord);
mat4 colorMatrix = mat4(filterParams0, filterParams1, filterParams2, filterParams3);
return colorMatrix * srcColor + filterParams4;
}
vec4 filterNone(vec2 colorTexCoord, sampler2D colorTexture) {
return sampleColor(colorTexture, colorTexCoord);
}
@ -360,6 +373,8 @@ vec4 filterColor(vec2 colorTexCoord,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4,
int colorFilter) {
switch (colorFilter) {
case COMBINER_CTRL_FILTER_RADIAL_GRADIENT:
@ -384,6 +399,14 @@ vec4 filterColor(vec2 colorTexCoord,
filterParams0,
filterParams1,
filterParams2);
case COMBINER_CTRL_FILTER_COLOR_MATRIX:
return filterColorMatrix(colorTexCoord,
colorTexture,
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4);
}
return filterNone(colorTexCoord, colorTexture);
}
@ -546,6 +569,8 @@ vec4 calculateColor(vec2 fragCoord,
vec4 filterParams0,
vec4 filterParams1,
vec4 filterParams2,
vec4 filterParams3,
vec4 filterParams4,
vec2 framebufferSize,
int ctrl,
vec3 maskTexCoord0,
@ -572,6 +597,8 @@ vec4 calculateColor(vec2 fragCoord,
filterParams0,
filterParams1,
filterParams2,
filterParams3,
filterParams4,
color0Filter);
color = combineColor0(color, color0, color0Combine);
}

View File

@ -21,20 +21,26 @@ void computeTileVaryings(vec2 position,
out vec4 outFilterParams0,
out vec4 outFilterParams1,
out vec4 outFilterParams2,
out vec4 outFilterParams3,
out vec4 outFilterParams4,
out int outCtrl) {
vec2 metadataScale = vec2(1.0) / vec2(textureMetadataSize);
vec2 metadataEntryCoord = vec2(colorEntry % 128 * 8, colorEntry / 128);
vec2 metadataEntryCoord = vec2(colorEntry % 128 * 10, colorEntry / 128);
vec4 colorTexMatrix0 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 0);
vec4 colorTexOffsets = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 1);
vec4 baseColor = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 2);
vec4 filterParams0 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 3);
vec4 filterParams1 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 4);
vec4 filterParams2 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 5);
vec4 extra = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 6);
vec4 filterParams3 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 6);
vec4 filterParams4 = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 7);
vec4 extra = fetchUnscaled(textureMetadata, metadataScale, metadataEntryCoord, 8);
outColorTexCoord0 = mat2(colorTexMatrix0) * position + colorTexOffsets.xy;
outBaseColor = baseColor;
outFilterParams0 = filterParams0;
outFilterParams1 = filterParams1;
outFilterParams2 = filterParams2;
outFilterParams3 = filterParams3;
outFilterParams4 = filterParams4;
outCtrl = int(extra.x);
}