Skip to content

Commit dd02569

Browse files
committed
upload_texture: upload cpu textures as SRGBA8
1 parent 980e69d commit dd02569

File tree

5 files changed

+134
-0
lines changed

5 files changed

+134
-0
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,86 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
10831083
description: Cow::Borrowed("TODO"),
10841084
properties: None,
10851085
},
1086+
#[cfg(feature = "gpu")]
1087+
DocumentNodeDefinition {
1088+
identifier: "Upload Texture",
1089+
category: "Debug: GPU",
1090+
node_template: NodeTemplate {
1091+
document_node: DocumentNode {
1092+
implementation: DocumentNodeImplementation::Network(NodeNetwork {
1093+
exports: vec![NodeInput::node(NodeId(2), 0)],
1094+
nodes: [
1095+
DocumentNode {
1096+
inputs: vec![NodeInput::scope("editor-api")],
1097+
implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::ops::IntoNode<&WgpuExecutor>")),
1098+
..Default::default()
1099+
},
1100+
DocumentNode {
1101+
inputs: vec![NodeInput::network(concrete!(RasterDataTable<CPU>), 0), NodeInput::node(NodeId(0), 0)],
1102+
manual_composition: Some(generic!(T)),
1103+
implementation: DocumentNodeImplementation::ProtoNode(wgpu_executor::texture_upload::upload_texture::IDENTIFIER),
1104+
..Default::default()
1105+
},
1106+
DocumentNode {
1107+
manual_composition: Some(generic!(T)),
1108+
inputs: vec![NodeInput::node(NodeId(1), 0)],
1109+
implementation: DocumentNodeImplementation::ProtoNode(memo::impure_memo::IDENTIFIER),
1110+
..Default::default()
1111+
},
1112+
]
1113+
.into_iter()
1114+
.enumerate()
1115+
.map(|(id, node)| (NodeId(id as u64), node))
1116+
.collect(),
1117+
..Default::default()
1118+
}),
1119+
inputs: vec![NodeInput::value(TaggedValue::RasterData(RasterDataTable::default()), true)],
1120+
..Default::default()
1121+
},
1122+
persistent_node_metadata: DocumentNodePersistentMetadata {
1123+
output_names: vec!["Texture".to_string()],
1124+
network_metadata: Some(NodeNetworkMetadata {
1125+
persistent_metadata: NodeNetworkPersistentMetadata {
1126+
node_metadata: [
1127+
DocumentNodeMetadata {
1128+
persistent_metadata: DocumentNodePersistentMetadata {
1129+
display_name: "Extract Executor".to_string(),
1130+
node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 0)),
1131+
..Default::default()
1132+
},
1133+
..Default::default()
1134+
},
1135+
DocumentNodeMetadata {
1136+
persistent_metadata: DocumentNodePersistentMetadata {
1137+
display_name: "Upload Texture".to_string(),
1138+
node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(7, 0)),
1139+
..Default::default()
1140+
},
1141+
..Default::default()
1142+
},
1143+
DocumentNodeMetadata {
1144+
persistent_metadata: DocumentNodePersistentMetadata {
1145+
display_name: "Cache".to_string(),
1146+
node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(14, 0)),
1147+
..Default::default()
1148+
},
1149+
..Default::default()
1150+
},
1151+
]
1152+
.into_iter()
1153+
.enumerate()
1154+
.map(|(id, node)| (NodeId(id as u64), node))
1155+
.collect(),
1156+
..Default::default()
1157+
},
1158+
..Default::default()
1159+
}),
1160+
..Default::default()
1161+
},
1162+
},
1163+
description: Cow::Borrowed("TODO"),
1164+
properties: None,
1165+
},
10861166
DocumentNodeDefinition {
10871167
identifier: "Extract",
10881168
category: "Debug",

node-graph/wgpu-executor/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ futures = { workspace = true }
2525
web-sys = { workspace = true }
2626
winit = { workspace = true }
2727
vello = { workspace = true }
28+
bytemuck = { workspace = true }

node-graph/wgpu-executor/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
mod context;
2+
pub mod texture_upload;
23

34
use anyhow::Result;
45
pub use context::Context;
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use crate::WgpuExecutor;
2+
use graphene_core::color::SRGBA8;
3+
use graphene_core::instances::Instance;
4+
use graphene_core::raster_types::{CPU, GPU, Raster, RasterDataTable};
5+
use graphene_core::{Ctx, ExtractFootprint};
6+
use wgpu::util::{DeviceExt, TextureDataOrder};
7+
use wgpu::{Extent3d, TextureDescriptor, TextureDimension, TextureFormat, TextureUsages};
8+
9+
#[node_macro::node(category(""))]
10+
pub async fn upload_texture<'a: 'n>(_: impl ExtractFootprint + Ctx, input: RasterDataTable<CPU>, executor: &'a WgpuExecutor) -> RasterDataTable<GPU> {
11+
let device = &executor.context.device;
12+
let queue = &executor.context.queue;
13+
let instances = input
14+
.instance_ref_iter()
15+
.map(|instance| {
16+
let image = instance.instance;
17+
let rgba8_data: Vec<SRGBA8> = image.data.iter().map(|x| (*x).into()).collect();
18+
19+
let texture = device.create_texture_with_data(
20+
queue,
21+
&TextureDescriptor {
22+
label: Some("upload_texture node texture"),
23+
size: Extent3d {
24+
width: image.width,
25+
height: image.height,
26+
depth_or_array_layers: 1,
27+
},
28+
mip_level_count: 1,
29+
sample_count: 1,
30+
dimension: TextureDimension::D2,
31+
format: TextureFormat::Rgba8UnormSrgb,
32+
// I don't know what usages are actually necessary
33+
usage: TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST | TextureUsages::COPY_SRC,
34+
view_formats: &[],
35+
},
36+
TextureDataOrder::LayerMajor,
37+
bytemuck::cast_slice(rgba8_data.as_slice()),
38+
);
39+
40+
Instance {
41+
instance: Raster::new_gpu(texture.into()),
42+
transform: *instance.transform,
43+
alpha_blending: *instance.alpha_blending,
44+
source_node_id: *instance.source_node_id,
45+
}
46+
})
47+
.collect();
48+
49+
queue.submit([]);
50+
instances
51+
}

0 commit comments

Comments
 (0)