Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions deno_webgpu/01_webgpu.js
Original file line number Diff line number Diff line change
Expand Up @@ -273,8 +273,7 @@ ObjectDefineProperty(GPUSupportedLimitsPrototype, privateCustomInspect, {
"maxBufferSize",
"maxVertexAttributes",
"maxVertexBufferArrayStride",
// TODO(@crowlKats): support max_inter_stage_shader_variables
// "maxInterStageShaderVariables",
"maxInterStageShaderVariables",
"maxColorAttachments",
"maxColorAttachmentBytesPerSample",
"maxComputeWorkgroupStorageSize",
Expand Down
5 changes: 4 additions & 1 deletion deno_webgpu/adapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,10 @@ impl GPUSupportedLimits {
self.0.max_vertex_buffer_array_stride
}

// TODO(@crowlKats): support max_inter_stage_shader_variables
#[getter]
fn maxInterStageShaderVariables(&self) -> u32 {
self.0.max_inter_stage_shader_variables
}

#[getter]
fn maxColorAttachments(&self) -> u32 {
Expand Down
65 changes: 38 additions & 27 deletions wgpu-core/src/device/resource.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3734,10 +3734,10 @@ impl Device {
let final_entry_point_name;

{
let stage = wgt::ShaderStages::COMPUTE;
let stage = validation::ShaderStageForValidation::Compute;

final_entry_point_name = shader_module.finalize_entry_point_name(
stage,
stage.to_naga(),
desc.stage.entry_point.as_ref().map(|ep| ep.as_ref()),
)?;

Expand All @@ -3748,7 +3748,6 @@ impl Device {
&final_entry_point_name,
stage,
io,
None,
)?;
}
}
Expand Down Expand Up @@ -4225,17 +4224,23 @@ impl Device {
pipeline::RenderPipelineVertexProcessor::Vertex(ref vertex) => {
vertex_stage = {
let stage_desc = &vertex.stage;
let stage = wgt::ShaderStages::VERTEX;
let stage = validation::ShaderStageForValidation::Vertex {
topology: desc.primitive.topology,
compare_function: desc.depth_stencil.as_ref().map(|d| d.depth_compare),
};
let stage_bit = stage.to_wgt_bit();

let vertex_shader_module = &stage_desc.module;
vertex_shader_module.same_device(self)?;

let stage_err =
|error| pipeline::CreateRenderPipelineError::Stage { stage, error };
let stage_err = |error| pipeline::CreateRenderPipelineError::Stage {
stage: stage_bit,
error,
};

_vertex_entry_point_name = vertex_shader_module
.finalize_entry_point_name(
stage,
stage.to_naga(),
stage_desc.entry_point.as_ref().map(|ep| ep.as_ref()),
)
.map_err(stage_err)?;
Expand All @@ -4248,10 +4253,9 @@ impl Device {
&_vertex_entry_point_name,
stage,
io,
desc.depth_stencil.as_ref().map(|d| d.depth_compare),
)
.map_err(stage_err)?;
validated_stages |= stage;
validated_stages |= stage_bit;
}
Some(hal::ProgrammableStage {
module: vertex_shader_module.raw(),
Expand All @@ -4267,16 +4271,19 @@ impl Device {

task_stage = if let Some(task) = task {
let stage_desc = &task.stage;
let stage = wgt::ShaderStages::TASK;
let stage = validation::ShaderStageForValidation::Task;
let stage_bit = stage.to_wgt_bit();
let task_shader_module = &stage_desc.module;
task_shader_module.same_device(self)?;

let stage_err =
|error| pipeline::CreateRenderPipelineError::Stage { stage, error };
let stage_err = |error| pipeline::CreateRenderPipelineError::Stage {
stage: stage_bit,
error,
};

_task_entry_point_name = task_shader_module
.finalize_entry_point_name(
stage,
stage.to_naga(),
stage_desc.entry_point.as_ref().map(|ep| ep.as_ref()),
)
.map_err(stage_err)?;
Expand All @@ -4289,10 +4296,9 @@ impl Device {
&_task_entry_point_name,
stage,
io,
desc.depth_stencil.as_ref().map(|d| d.depth_compare),
)
.map_err(stage_err)?;
validated_stages |= stage;
validated_stages |= stage_bit;
}
Some(hal::ProgrammableStage {
module: task_shader_module.raw(),
Expand All @@ -4306,16 +4312,19 @@ impl Device {
};
mesh_stage = {
let stage_desc = &mesh.stage;
let stage = wgt::ShaderStages::MESH;
let stage = validation::ShaderStageForValidation::Mesh;
let stage_bit = stage.to_wgt_bit();
let mesh_shader_module = &stage_desc.module;
mesh_shader_module.same_device(self)?;

let stage_err =
|error| pipeline::CreateRenderPipelineError::Stage { stage, error };
let stage_err = |error| pipeline::CreateRenderPipelineError::Stage {
stage: stage_bit,
error,
};

_mesh_entry_point_name = mesh_shader_module
.finalize_entry_point_name(
stage,
stage.to_naga(),
stage_desc.entry_point.as_ref().map(|ep| ep.as_ref()),
)
.map_err(stage_err)?;
Expand All @@ -4328,10 +4337,9 @@ impl Device {
&_mesh_entry_point_name,
stage,
io,
desc.depth_stencil.as_ref().map(|d| d.depth_compare),
)
.map_err(stage_err)?;
validated_stages |= stage;
validated_stages |= stage_bit;
}
Some(hal::ProgrammableStage {
module: mesh_shader_module.raw(),
Expand All @@ -4347,16 +4355,20 @@ impl Device {
let fragment_entry_point_name;
let fragment_stage = match desc.fragment {
Some(ref fragment_state) => {
let stage = wgt::ShaderStages::FRAGMENT;
let stage = validation::ShaderStageForValidation::Fragment;
let stage_bit = stage.to_wgt_bit();

let shader_module = &fragment_state.stage.module;
shader_module.same_device(self)?;

let stage_err = |error| pipeline::CreateRenderPipelineError::Stage { stage, error };
let stage_err = |error| pipeline::CreateRenderPipelineError::Stage {
stage: stage_bit,
error,
};

fragment_entry_point_name = shader_module
.finalize_entry_point_name(
stage,
stage.to_naga(),
fragment_state
.stage
.entry_point
Expand All @@ -4374,18 +4386,17 @@ impl Device {
&fragment_entry_point_name,
stage,
io,
desc.depth_stencil.as_ref().map(|d| d.depth_compare),
)
.map_err(stage_err)?;
validated_stages |= stage;
validated_stages |= stage_bit;
}
}

if let Some(ref interface) = shader_module.interface {
shader_expects_dual_source_blending = interface
.fragment_uses_dual_source_blending(&fragment_entry_point_name)
.map_err(|error| pipeline::CreateRenderPipelineError::Stage {
stage,
stage: stage_bit,
error,
})?;
}
Expand Down
4 changes: 2 additions & 2 deletions wgpu-core/src/pipeline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,11 @@ impl ShaderModule {

pub(crate) fn finalize_entry_point_name(
&self,
stage_bit: wgt::ShaderStages,
stage: naga::ShaderStage,
entry_point: Option<&str>,
) -> Result<String, validation::StageError> {
match &self.interface {
Some(interface) => interface.finalize_entry_point_name(stage_bit, entry_point),
Some(interface) => interface.finalize_entry_point_name(stage, entry_point),
None => entry_point
.map(|ep| ep.to_string())
.ok_or(validation::StageError::NoEntryPointFound),
Expand Down
Loading
Loading