| 12 | { |
| 13 | |
| 14 | Rasterizer::Rasterizer( |
| 15 | const unsigned int viewport_size_x, |
| 16 | const unsigned int viewport_size_y, |
| 17 | const unsigned int row_size, |
| 18 | uint32_t* const color_buffer ) |
| 19 | : viewport_size_x_( int(viewport_size_x) ) |
| 20 | , viewport_size_y_( int(viewport_size_y) ) |
| 21 | , row_size_( int(row_size) ) |
| 22 | , color_buffer_( color_buffer ) |
| 23 | { |
| 24 | { // Setup depth buffer and depth buffer hierarchy. |
| 25 | unsigned int memory_for_depth_required= 0u; |
| 26 | depth_buffer_width_= ( viewport_size_x + 1u ) & (~1u); |
| 27 | const unsigned int depth_buffer_memory_size= depth_buffer_width_ * viewport_size_y; |
| 28 | memory_for_depth_required+= depth_buffer_memory_size; |
| 29 | |
| 30 | for( unsigned int i= 0u; i < c_depth_buffer_hierarchy_levels; i++ ) |
| 31 | { |
| 32 | const unsigned int hierarchy_cell_size= c_first_depth_hierarchy_level_size << i; |
| 33 | depth_buffer_hierarchy_[i].width = ( depth_buffer_width_ + ( hierarchy_cell_size - 1u ) ) / hierarchy_cell_size; |
| 34 | depth_buffer_hierarchy_[i].height= ( viewport_size_y_ + ( hierarchy_cell_size - 1u ) ) / hierarchy_cell_size; |
| 35 | |
| 36 | memory_for_depth_required+= depth_buffer_hierarchy_[i].width * depth_buffer_hierarchy_[i].height; |
| 37 | } |
| 38 | |
| 39 | depth_buffer_storage_.resize( memory_for_depth_required ); |
| 40 | |
| 41 | unsigned int offset= 0u; |
| 42 | depth_buffer_= depth_buffer_storage_.data(); |
| 43 | offset+= depth_buffer_memory_size; |
| 44 | |
| 45 | for( unsigned int i= 0u; i < c_depth_buffer_hierarchy_levels; i++ ) |
| 46 | { |
| 47 | depth_buffer_hierarchy_[i].data= depth_buffer_storage_.data() + offset; |
| 48 | offset+= depth_buffer_hierarchy_[i].width * depth_buffer_hierarchy_[i].height; |
| 49 | } |
| 50 | } |
| 51 | // Setup occlusion buffer |
| 52 | { |
| 53 | const unsigned int top_hierarchy_level_cell_size= 16u << ( (c_occlusion_hierarchy_levels-1u) * 2u ); |
| 54 | const unsigned int top_hierarchy_level_cell_size_minus_one= top_hierarchy_level_cell_size - 1u; |
| 55 | const unsigned int viewport_size_x_ceil= ( viewport_size_x + top_hierarchy_level_cell_size_minus_one ) / top_hierarchy_level_cell_size * top_hierarchy_level_cell_size; |
| 56 | const unsigned int viewport_size_y_ceil= ( viewport_size_y + top_hierarchy_level_cell_size_minus_one ) / top_hierarchy_level_cell_size * top_hierarchy_level_cell_size; |
| 57 | |
| 58 | // Main buffer |
| 59 | occlusion_buffer_width_ = viewport_size_x_ceil / 8u; |
| 60 | occlusion_buffer_height_= viewport_size_y_ceil; |
| 61 | occlusion_buffer_storage_.resize( occlusion_buffer_width_ * occlusion_buffer_height_ ); |
| 62 | occlusion_buffer_= occlusion_buffer_storage_.data(); |
| 63 | |
| 64 | // Hierarchy |
| 65 | unsigned int hexopixels_requested= 0u; |
| 66 | for( unsigned int i= 0u; i < c_occlusion_hierarchy_levels; i++ ) |
| 67 | { |
| 68 | auto& level= occlusion_hierarchy_levels_[i]; |
| 69 | const unsigned int heirarchy_cell_size= 16u << ( i * 2u ); |
| 70 | level.size[0]= ( viewport_size_x_ceil + ( heirarchy_cell_size - 1u ) ) / heirarchy_cell_size; |
| 71 | level.size[1]= ( viewport_size_y_ceil + ( heirarchy_cell_size - 1u ) ) / heirarchy_cell_size; |
nothing calls this directly
no outgoing calls
no test coverage detected