Merge pull request #4092 from Morph1984/image-bindings
gl_device: Reserve 4 image bindings for fragment stage
This commit is contained in:
		
						commit
						edb2114bac
					
				@ -123,16 +123,24 @@ std::array<Device::BaseBindings, Tegra::Engines::MaxShaderTypes> BuildBaseBindin
 | 
				
			|||||||
    u32 num_images = GetInteger<u32>(GL_MAX_IMAGE_UNITS);
 | 
					    u32 num_images = GetInteger<u32>(GL_MAX_IMAGE_UNITS);
 | 
				
			||||||
    u32 base_images = 0;
 | 
					    u32 base_images = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Reserve more image bindings on fragment and vertex stages.
 | 
					    // GL_MAX_IMAGE_UNITS is guaranteed by the spec to have a minimum value of 8.
 | 
				
			||||||
 | 
					    // Due to the limitation of GL_MAX_IMAGE_UNITS, reserve at least 4 image bindings on the
 | 
				
			||||||
 | 
					    // fragment stage, and at least 1 for the rest of the stages.
 | 
				
			||||||
 | 
					    // So far games are observed to use 1 image binding on vertex and 4 on fragment stages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Reserve at least 4 image bindings on the fragment stage.
 | 
				
			||||||
    bindings[4].image =
 | 
					    bindings[4].image =
 | 
				
			||||||
        Extract(base_images, num_images, num_images / NumStages + 2, LimitImages[4]);
 | 
					        Extract(base_images, num_images, std::max(4U, num_images / NumStages), LimitImages[4]);
 | 
				
			||||||
    bindings[0].image =
 | 
					
 | 
				
			||||||
        Extract(base_images, num_images, num_images / NumStages + 1, LimitImages[0]);
 | 
					    // This is guaranteed to be at least 1.
 | 
				
			||||||
 | 
					    const u32 total_extracted_images = num_images / (NumStages - 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Reserve the other image bindings.
 | 
					    // Reserve the other image bindings.
 | 
				
			||||||
    const u32 total_extracted_images = num_images / (NumStages - 2);
 | 
					    for (std::size_t i = 0; i < NumStages; ++i) {
 | 
				
			||||||
    for (std::size_t i = 2; i < NumStages; ++i) {
 | 
					 | 
				
			||||||
        const std::size_t stage = stage_swizzle[i];
 | 
					        const std::size_t stage = stage_swizzle[i];
 | 
				
			||||||
 | 
					        if (stage == 4) {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        bindings[stage].image =
 | 
					        bindings[stage].image =
 | 
				
			||||||
            Extract(base_images, num_images, total_extracted_images, LimitImages[stage]);
 | 
					            Extract(base_images, num_images, total_extracted_images, LimitImages[stage]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user