// Copyright 2018 The Amber Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SRC_DAWN_PIPELINE_INFO_H_ #define SRC_DAWN_PIPELINE_INFO_H_ #include #include #include #include #include #include #include "amber/result.h" #include "dawn/dawncpp.h" #include "src/command.h" #include "src/format.h" namespace amber { namespace dawn { struct hash_pair { template size_t operator()(const std::pair& p) const { auto hash1 = std::hash{}(p.first); auto hash2 = std::hash{}(p.second); return hash1 ^ hash2; } }; /// Stores information relating to a graphics pipeline in Dawn. struct RenderPipelineInfo { RenderPipelineInfo() {} RenderPipelineInfo(::amber::Pipeline* the_pipeline, ::dawn::ShaderModule vert, ::dawn::ShaderModule frag) : pipeline(the_pipeline), vertex_shader(vert), fragment_shader(frag) {} ::amber::Pipeline* pipeline = nullptr; ::dawn::ShaderModule vertex_shader; ::dawn::ShaderModule fragment_shader; ::dawn::Color clear_color_value = {0.f, 0.f, 0.f, 0.f}; float clear_depth_value = 1.0f; uint32_t clear_stencil_value = 0; // Depth-stencil target. This resides on the GPU. ::dawn::Texture depth_stencil_texture; // Vertex buffers std::vector<::dawn::Buffer> vertex_buffers; // Index buffer ::dawn::Buffer index_buffer; // Storage and uniform buffers std::vector<::dawn::Buffer> buffers; // Binding info std::vector<::dawn::BindGroup> bind_groups; std::vector<::dawn::BindGroupLayout> bind_group_layouts; // Mapping from the to dawn buffer index in buffers std::unordered_map, uint32_t, hash_pair> buffer_map; std::set used_descriptor_set; }; /// Stores information relating to a compute pipeline in Dawn. struct ComputePipelineInfo { ComputePipelineInfo() {} ComputePipelineInfo(::amber::Pipeline* the_pipeline, ::dawn::ShaderModule comp) : pipeline(the_pipeline), compute_shader(comp) {} ::amber::Pipeline* pipeline = nullptr; ::dawn::ShaderModule compute_shader; // storage and uniform buffers std::vector<::dawn::Buffer> buffers; std::vector<::dawn::BindGroup> bind_groups; std::vector<::dawn::BindGroupLayout> bind_group_layouts; // Mapping from the to dawn buffer index in buffers std::unordered_map, uint32_t, hash_pair> buffer_map; std::set used_descriptor_set; }; /// Holds either a render or compute pipeline. struct Pipeline { std::unique_ptr render_pipeline; std::unique_ptr compute_pipeline; }; } // namespace dawn } // namespace amber #endif // SRC_DAWN_PIPELINE_INFO_H_