mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	video_core: add samples check when find render target
This commit is contained in:
		@@ -280,7 +280,7 @@ void TextureCache<P>::SynchronizeComputeDescriptors() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class P>
 | 
			
		||||
bool TextureCache<P>::RescaleRenderTargets(bool is_clear) {
 | 
			
		||||
bool TextureCache<P>::RescaleRenderTargets() {
 | 
			
		||||
    auto& flags = maxwell3d->dirty.flags;
 | 
			
		||||
    u32 scale_rating = 0;
 | 
			
		||||
    bool rescaled = false;
 | 
			
		||||
@@ -318,13 +318,13 @@ bool TextureCache<P>::RescaleRenderTargets(bool is_clear) {
 | 
			
		||||
            ImageViewId& color_buffer_id = render_targets.color_buffer_ids[index];
 | 
			
		||||
            if (flags[Dirty::ColorBuffer0 + index] || force) {
 | 
			
		||||
                flags[Dirty::ColorBuffer0 + index] = false;
 | 
			
		||||
                BindRenderTarget(&color_buffer_id, FindColorBuffer(index, is_clear));
 | 
			
		||||
                BindRenderTarget(&color_buffer_id, FindColorBuffer(index));
 | 
			
		||||
            }
 | 
			
		||||
            check_rescale(color_buffer_id, tmp_color_images[index]);
 | 
			
		||||
        }
 | 
			
		||||
        if (flags[Dirty::ZetaBuffer] || force) {
 | 
			
		||||
            flags[Dirty::ZetaBuffer] = false;
 | 
			
		||||
            BindRenderTarget(&render_targets.depth_buffer_id, FindDepthBuffer(is_clear));
 | 
			
		||||
            BindRenderTarget(&render_targets.depth_buffer_id, FindDepthBuffer());
 | 
			
		||||
        }
 | 
			
		||||
        check_rescale(render_targets.depth_buffer_id, tmp_depth_image);
 | 
			
		||||
 | 
			
		||||
@@ -389,7 +389,7 @@ void TextureCache<P>::UpdateRenderTargets(bool is_clear) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const bool rescaled = RescaleRenderTargets(is_clear);
 | 
			
		||||
    const bool rescaled = RescaleRenderTargets();
 | 
			
		||||
    if (is_rescaling != rescaled) {
 | 
			
		||||
        flags[Dirty::RescaleViewports] = true;
 | 
			
		||||
        flags[Dirty::RescaleScissors] = true;
 | 
			
		||||
@@ -1658,7 +1658,7 @@ SamplerId TextureCache<P>::FindSampler(const TSCEntry& config) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class P>
 | 
			
		||||
ImageViewId TextureCache<P>::FindColorBuffer(size_t index, bool is_clear) {
 | 
			
		||||
ImageViewId TextureCache<P>::FindColorBuffer(size_t index) {
 | 
			
		||||
    const auto& regs = maxwell3d->regs;
 | 
			
		||||
    if (index >= regs.rt_control.count) {
 | 
			
		||||
        return ImageViewId{};
 | 
			
		||||
@@ -1672,11 +1672,11 @@ ImageViewId TextureCache<P>::FindColorBuffer(size_t index, bool is_clear) {
 | 
			
		||||
        return ImageViewId{};
 | 
			
		||||
    }
 | 
			
		||||
    const ImageInfo info(regs.rt[index], regs.anti_alias_samples_mode);
 | 
			
		||||
    return FindRenderTargetView(info, gpu_addr, is_clear);
 | 
			
		||||
    return FindRenderTargetView(info, gpu_addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class P>
 | 
			
		||||
ImageViewId TextureCache<P>::FindDepthBuffer(bool is_clear) {
 | 
			
		||||
ImageViewId TextureCache<P>::FindDepthBuffer() {
 | 
			
		||||
    const auto& regs = maxwell3d->regs;
 | 
			
		||||
    if (!regs.zeta_enable) {
 | 
			
		||||
        return ImageViewId{};
 | 
			
		||||
@@ -1686,18 +1686,16 @@ ImageViewId TextureCache<P>::FindDepthBuffer(bool is_clear) {
 | 
			
		||||
        return ImageViewId{};
 | 
			
		||||
    }
 | 
			
		||||
    const ImageInfo info(regs.zeta, regs.zeta_size, regs.anti_alias_samples_mode);
 | 
			
		||||
    return FindRenderTargetView(info, gpu_addr, is_clear);
 | 
			
		||||
    return FindRenderTargetView(info, gpu_addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <class P>
 | 
			
		||||
ImageViewId TextureCache<P>::FindRenderTargetView(const ImageInfo& info, GPUVAddr gpu_addr,
 | 
			
		||||
                                                  bool is_clear) {
 | 
			
		||||
    const auto options = is_clear ? RelaxedOptions::Samples : RelaxedOptions{};
 | 
			
		||||
ImageViewId TextureCache<P>::FindRenderTargetView(const ImageInfo& info, GPUVAddr gpu_addr) {
 | 
			
		||||
    ImageId image_id{};
 | 
			
		||||
    bool delete_state = has_deleted_images;
 | 
			
		||||
    do {
 | 
			
		||||
        has_deleted_images = false;
 | 
			
		||||
        image_id = FindOrInsertImage(info, gpu_addr, options);
 | 
			
		||||
        image_id = FindOrInsertImage(info, gpu_addr);
 | 
			
		||||
        delete_state |= has_deleted_images;
 | 
			
		||||
    } while (has_deleted_images);
 | 
			
		||||
    has_deleted_images = delete_state;
 | 
			
		||||
 
 | 
			
		||||
@@ -166,9 +166,8 @@ public:
 | 
			
		||||
    void SynchronizeComputeDescriptors();
 | 
			
		||||
 | 
			
		||||
    /// Updates the Render Targets if they can be rescaled
 | 
			
		||||
    /// @param is_clear True when the render targets are being used for clears
 | 
			
		||||
    /// @retval True if the Render Targets have been rescaled.
 | 
			
		||||
    bool RescaleRenderTargets(bool is_clear);
 | 
			
		||||
    bool RescaleRenderTargets();
 | 
			
		||||
 | 
			
		||||
    /// Update bound render targets and upload memory if necessary
 | 
			
		||||
    /// @param is_clear True when the render targets are being used for clears
 | 
			
		||||
@@ -324,14 +323,13 @@ private:
 | 
			
		||||
    [[nodiscard]] SamplerId FindSampler(const TSCEntry& config);
 | 
			
		||||
 | 
			
		||||
    /// Find or create an image view for the given color buffer index
 | 
			
		||||
    [[nodiscard]] ImageViewId FindColorBuffer(size_t index, bool is_clear);
 | 
			
		||||
    [[nodiscard]] ImageViewId FindColorBuffer(size_t index);
 | 
			
		||||
 | 
			
		||||
    /// Find or create an image view for the depth buffer
 | 
			
		||||
    [[nodiscard]] ImageViewId FindDepthBuffer(bool is_clear);
 | 
			
		||||
    [[nodiscard]] ImageViewId FindDepthBuffer();
 | 
			
		||||
 | 
			
		||||
    /// Find or create a view for a render target with the given image parameters
 | 
			
		||||
    [[nodiscard]] ImageViewId FindRenderTargetView(const ImageInfo& info, GPUVAddr gpu_addr,
 | 
			
		||||
                                                   bool is_clear);
 | 
			
		||||
    [[nodiscard]] ImageViewId FindRenderTargetView(const ImageInfo& info, GPUVAddr gpu_addr);
 | 
			
		||||
 | 
			
		||||
    /// Iterates over all the images in a region calling func
 | 
			
		||||
    template <typename Func>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user