Make the paint texture dynamically-sized on the GPU side

This commit is contained in:
Patrick Walton 2019-05-14 11:38:48 -07:00
parent 376a1c7165
commit a54378f931
2 changed files with 22 additions and 18 deletions

View File

@ -12,7 +12,6 @@ use crate::gpu::debug::DebugUIPresenter;
use crate::gpu_data::{AlphaTileBatchPrimitive, FillBatchPrimitive, PaintData}; use crate::gpu_data::{AlphaTileBatchPrimitive, FillBatchPrimitive, PaintData};
use crate::gpu_data::{RenderCommand, SolidTileBatchPrimitive}; use crate::gpu_data::{RenderCommand, SolidTileBatchPrimitive};
use crate::post::DefringingKernel; use crate::post::DefringingKernel;
use crate::scene::{PAINT_TEXTURE_HEIGHT, PAINT_TEXTURE_WIDTH};
use crate::tiles::{TILE_HEIGHT, TILE_WIDTH}; use crate::tiles::{TILE_HEIGHT, TILE_WIDTH};
use pathfinder_geometry::basic::point::{Point2DI32, Point3DF32}; use pathfinder_geometry::basic::point::{Point2DI32, Point3DF32};
use pathfinder_geometry::basic::rect::RectI32; use pathfinder_geometry::basic::rect::RectI32;
@ -65,7 +64,7 @@ where
quad_vertex_positions_buffer: D::Buffer, quad_vertex_positions_buffer: D::Buffer,
fill_vertex_array: FillVertexArray<D>, fill_vertex_array: FillVertexArray<D>,
mask_framebuffer: D::Framebuffer, mask_framebuffer: D::Framebuffer,
paint_texture: D::Texture, paint_texture: Option<D::Texture>,
// Postprocessing shader // Postprocessing shader
postprocess_source_framebuffer: Option<D::Framebuffer>, postprocess_source_framebuffer: Option<D::Framebuffer>,
@ -168,9 +167,6 @@ where
device.create_texture(TextureFormat::R16F, mask_framebuffer_size); device.create_texture(TextureFormat::R16F, mask_framebuffer_size);
let mask_framebuffer = device.create_framebuffer(mask_framebuffer_texture); let mask_framebuffer = device.create_framebuffer(mask_framebuffer_texture);
let paint_size = Point2DI32::new(PAINT_TEXTURE_WIDTH, PAINT_TEXTURE_HEIGHT);
let paint_texture = device.create_texture(TextureFormat::RGBA8, paint_size);
let window_size = dest_framebuffer.window_size(&device); let window_size = dest_framebuffer.window_size(&device);
let debug_ui_presenter = DebugUIPresenter::new(&device, resources, window_size); let debug_ui_presenter = DebugUIPresenter::new(&device, resources, window_size);
@ -191,7 +187,7 @@ where
quad_vertex_positions_buffer, quad_vertex_positions_buffer,
fill_vertex_array, fill_vertex_array,
mask_framebuffer, mask_framebuffer,
paint_texture, paint_texture: None,
postprocess_source_framebuffer: None, postprocess_source_framebuffer: None,
postprocess_program, postprocess_program,
@ -342,7 +338,18 @@ where
} }
fn upload_paint_data(&mut self, paint_data: &PaintData) { fn upload_paint_data(&mut self, paint_data: &PaintData) {
self.device.upload_to_texture(&self.paint_texture, paint_data.size, &paint_data.texels); match self.paint_texture {
Some(ref paint_texture) if
self.device.texture_size(paint_texture) == paint_data.size => {}
_ => {
let texture = self.device.create_texture(TextureFormat::RGBA8, paint_data.size);
self.paint_texture = Some(texture)
}
}
self.device.upload_to_texture(self.paint_texture.as_ref().unwrap(),
paint_data.size,
&paint_data.texels);
} }
fn upload_solid_tiles(&mut self, solid_tiles: &[SolidTileBatchPrimitive]) { fn upload_solid_tiles(&mut self, solid_tiles: &[SolidTileBatchPrimitive]) {
@ -480,16 +487,15 @@ where
match self.render_mode { match self.render_mode {
RenderMode::Multicolor => { RenderMode::Multicolor => {
self.device.bind_texture(&self.paint_texture, 1); let paint_texture = self.paint_texture.as_ref().unwrap();
self.device.bind_texture(paint_texture, 1);
self.device.set_uniform( self.device.set_uniform(
&self.alpha_multicolor_tile_program.paint_texture_uniform, &self.alpha_multicolor_tile_program.paint_texture_uniform,
UniformData::TextureUnit(1), UniformData::TextureUnit(1),
); );
self.device.set_uniform( self.device.set_uniform(
&self.alpha_multicolor_tile_program.paint_texture_size_uniform, &self.alpha_multicolor_tile_program.paint_texture_size_uniform,
UniformData::Vec2( UniformData::Vec2(self.device.texture_size(paint_texture).0.to_f32x4())
I32x4::new(PAINT_TEXTURE_WIDTH, PAINT_TEXTURE_HEIGHT, 0, 0).to_f32x4()
),
); );
} }
RenderMode::Monochrome { .. } if self.postprocessing_needed() => { RenderMode::Monochrome { .. } if self.postprocessing_needed() => {
@ -540,7 +546,8 @@ where
match self.render_mode { match self.render_mode {
RenderMode::Multicolor => { RenderMode::Multicolor => {
self.device.bind_texture(&self.paint_texture, 0); let paint_texture = self.paint_texture.as_ref().unwrap();
self.device.bind_texture(paint_texture, 0);
self.device.set_uniform( self.device.set_uniform(
&self &self
.solid_multicolor_tile_program .solid_multicolor_tile_program
@ -551,10 +558,7 @@ where
&self &self
.solid_multicolor_tile_program .solid_multicolor_tile_program
.paint_texture_size_uniform, .paint_texture_size_uniform,
UniformData::Vec2( UniformData::Vec2(self.device.texture_size(paint_texture).0.to_f32x4())
I32x4::new(PAINT_TEXTURE_WIDTH, PAINT_TEXTURE_HEIGHT, 0, 0)
.to_f32x4(),
),
); );
} }
RenderMode::Monochrome { .. } if self.postprocessing_needed() => { RenderMode::Monochrome { .. } if self.postprocessing_needed() => {

View File

@ -23,8 +23,8 @@ use pathfinder_geometry::color::ColorU;
use pathfinder_geometry::outline::Outline; use pathfinder_geometry::outline::Outline;
use std::io::{self, Write}; use std::io::{self, Write};
pub const PAINT_TEXTURE_WIDTH: i32 = 256; const PAINT_TEXTURE_WIDTH: i32 = 256;
pub const PAINT_TEXTURE_HEIGHT: i32 = 256; const PAINT_TEXTURE_HEIGHT: i32 = 256;
#[derive(Clone)] #[derive(Clone)]
pub struct Scene { pub struct Scene {