@@ -36,6 +36,7 @@ use std::ops::Range;
3636use gfx_hal:: device:: Device ;
3737
3838use super :: {
39+ assembler:: VertexAttribute ,
3940 buffer:: Buffer ,
4041 gpu:: Gpu ,
4142 shader:: ShaderModule ,
@@ -45,6 +46,8 @@ use super::{
4546pub struct RenderPipelineBuilder < RenderBackend : internal:: Backend > {
4647 pipeline_layout : Option < RenderBackend :: PipelineLayout > ,
4748 push_constants : Vec < PushConstantUpload > ,
49+ buffers : Vec < Buffer < RenderBackend > > ,
50+ attributes : Vec < VertexAttribute > ,
4851}
4952
5053pub type PipelineStage = gfx_hal:: pso:: ShaderStageFlags ;
@@ -56,19 +59,27 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
5659 return Self {
5760 pipeline_layout : None ,
5861 push_constants : Vec :: new ( ) ,
62+ buffers : Vec :: new ( ) ,
63+ attributes : Vec :: new ( ) ,
5964 } ;
6065 }
6166
62- pub fn with_buffer ( & mut self , buffer : & Buffer < RenderBackend > ) -> & mut Self {
63- todo ! ( )
67+ pub fn with_buffer (
68+ & mut self ,
69+ buffer : Buffer < RenderBackend > ,
70+ attributes : Vec < VertexAttribute > ,
71+ ) -> & mut Self {
72+ self . buffers . push ( buffer) ;
73+ self . attributes . extend ( attributes) ;
74+ return self ;
6475 }
6576
6677 /// Adds a push constant to the render pipeline at the set PipelineStage(s)
6778 pub fn with_push_constant (
68- mut self ,
79+ & mut self ,
6980 stage : PipelineStage ,
7081 bytes : u32 ,
71- ) -> Self {
82+ ) -> & mut Self {
7283 self . push_constants . push ( ( stage, 0 ..bytes) ) ;
7384 return self ;
7485 }
@@ -91,6 +102,8 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
91102 render_pass : & super :: render_pass:: RenderPass < RenderBackend > ,
92103 vertex_shader : & ShaderModule < RenderBackend > ,
93104 fragment_shader : Option < & ShaderModule < RenderBackend > > ,
105+ buffers : & Vec < & Buffer < RenderBackend > > ,
106+ attributes : & [ VertexAttribute ] ,
94107 ) -> RenderPipeline < RenderBackend > {
95108 // TODO(vmarcella): The pipeline layout should be configurable through the
96109 // RenderPipelineBuilder.
@@ -109,7 +122,8 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
109122 // TODO(vmarcella): The primitive assembler should be configurable through
110123 // the RenderPipelineBuilder so that buffers & attributes can be bound.
111124 let mut builder = super :: assembler:: PrimitiveAssemblerBuilder :: new ( ) ;
112- let primitive_assembler = builder. build ( vertex_shader, None , None ) ;
125+ let primitive_assembler =
126+ builder. build ( vertex_shader, Some ( buffers) , Some ( attributes) ) ;
113127
114128 let fragment_entry = match fragment_shader {
115129 Some ( shader) => Some ( internal:: EntryPoint :: < RenderBackend > {
@@ -143,14 +157,16 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
143157 } ) ;
144158
145159 let pipeline = unsafe {
146- super :: internal:: logical_device_for ( gpu)
160+ gpu
161+ . logical_device ( )
147162 . create_graphics_pipeline ( & pipeline_desc, None )
148163 . expect ( "Failed to create graphics pipeline" )
149164 } ;
150165
151166 return RenderPipeline {
152167 pipeline_layout,
153168 pipeline,
169+ buffers : self . buffers ,
154170 } ;
155171 }
156172}
@@ -160,16 +176,19 @@ impl<RenderBackend: internal::Backend> RenderPipelineBuilder<RenderBackend> {
160176pub struct RenderPipeline < RenderBackend : internal:: Backend > {
161177 pipeline_layout : RenderBackend :: PipelineLayout ,
162178 pipeline : RenderBackend :: GraphicsPipeline ,
179+ buffers : Vec < Buffer < RenderBackend > > ,
163180}
164181
165182impl < RenderBackend : internal:: Backend > RenderPipeline < RenderBackend > {
166183 /// Destroys the pipeline layout and graphical pipeline
167184 pub fn destroy ( self , gpu : & super :: gpu:: Gpu < RenderBackend > ) {
168185 unsafe {
169- super :: gpu:: internal:: logical_device_for ( gpu)
186+ gpu
187+ . logical_device ( )
170188 . destroy_pipeline_layout ( self . pipeline_layout ) ;
171189
172- super :: gpu:: internal:: logical_device_for ( gpu)
190+ gpu
191+ . logical_device ( )
173192 . destroy_graphics_pipeline ( self . pipeline ) ;
174193 }
175194 }
0 commit comments