| 20 | namespace fgph |
| 21 | { |
| 22 | static void mergeViewData( ImageViewId const & view |
| 23 | , bool mergeMipLevels |
| 24 | , bool mergeArrayLayers |
| 25 | , ImageViewData & data ) |
| 26 | { |
| 27 | if ( data.image.id == 0 ) |
| 28 | { |
| 29 | data.image = view.data->image; |
| 30 | data.name = data.image.data->name; |
| 31 | data.info.flags = view.data->info.flags; |
| 32 | data.info.format = view.data->info.format; |
| 33 | data.info.viewType = view.data->info.viewType; |
| 34 | data.info.subresourceRange = getSubresourceRange( view ); |
| 35 | } |
| 36 | else |
| 37 | { |
| 38 | assert( data.image == view.data->image ); |
| 39 | |
| 40 | if ( mergeMipLevels ) |
| 41 | { |
| 42 | auto maxLevel = std::max( data.info.subresourceRange.levelCount + data.info.subresourceRange.baseMipLevel |
| 43 | , getSubresourceRange( view ).levelCount + getSubresourceRange( view ).baseMipLevel ); |
| 44 | data.info.subresourceRange.baseMipLevel = std::min( getSubresourceRange( view ).baseMipLevel |
| 45 | , data.info.subresourceRange.baseMipLevel ); |
| 46 | data.info.subresourceRange.levelCount = maxLevel - data.info.subresourceRange.baseMipLevel; |
| 47 | } |
| 48 | else |
| 49 | { |
| 50 | data.info.subresourceRange.baseMipLevel = std::min( getSubresourceRange( view ).baseMipLevel |
| 51 | , data.info.subresourceRange.baseMipLevel ); |
| 52 | data.info.subresourceRange.levelCount = 1u; |
| 53 | } |
| 54 | |
| 55 | if ( mergeArrayLayers ) |
| 56 | { |
| 57 | auto maxLayer = std::max( data.info.subresourceRange.layerCount + data.info.subresourceRange.baseArrayLayer |
| 58 | , getSubresourceRange( view ).layerCount + getSubresourceRange( view ).baseArrayLayer ); |
| 59 | data.info.subresourceRange.baseArrayLayer = std::min( getSubresourceRange( view ).baseArrayLayer |
| 60 | , data.info.subresourceRange.baseArrayLayer ); |
| 61 | data.info.subresourceRange.layerCount = maxLayer - data.info.subresourceRange.baseArrayLayer; |
| 62 | } |
| 63 | else |
| 64 | { |
| 65 | data.info.subresourceRange.baseArrayLayer = std::min( getSubresourceRange( view ).baseArrayLayer |
| 66 | , data.info.subresourceRange.baseArrayLayer ); |
| 67 | data.info.subresourceRange.layerCount = 1u; |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | data.source.push_back( view ); |
| 72 | } |
| 73 | |
| 74 | static void mergeViewData( BufferViewId const & view |
| 75 | , BufferViewData & data ) |