gl_texture_cache: Migrate BGRCopyPass from util_shaders
The BGR copies no longer use shaders.
This commit is contained in:
		| @@ -473,7 +473,7 @@ void TextureCacheRuntime::EmulateCopyImage(Image& dst, Image& src, | ||||
|         ASSERT(src.info.type == ImageType::e3D); | ||||
|         util_shaders.CopyBC4(dst, src, copies); | ||||
|     } else if (IsPixelFormatBGR(dst.info.format) || IsPixelFormatBGR(src.info.format)) { | ||||
|         util_shaders.CopyBGR(dst, src, copies); | ||||
|         bgr_copy_pass.CopyBGR(dst, src, copies); | ||||
|     } else { | ||||
|         UNREACHABLE(); | ||||
|     } | ||||
| @@ -1112,4 +1112,37 @@ Framebuffer::Framebuffer(TextureCacheRuntime& runtime, std::span<ImageView*, NUM | ||||
|     framebuffer.handle = handle; | ||||
| } | ||||
|  | ||||
| void BGRCopyPass::CopyBGR(Image& dst_image, Image& src_image, | ||||
|                           std::span<const VideoCommon::ImageCopy> copies) { | ||||
|     static constexpr VideoCommon::Offset3D zero_offset{0, 0, 0}; | ||||
|     const u32 requested_pbo_size = | ||||
|         std::max(src_image.unswizzled_size_bytes, dst_image.unswizzled_size_bytes); | ||||
|  | ||||
|     if (bgr_pbo_size < requested_pbo_size) { | ||||
|         bgr_pbo.Create(); | ||||
|         bgr_pbo_size = requested_pbo_size; | ||||
|         glNamedBufferData(bgr_pbo.handle, bgr_pbo_size, nullptr, GL_STREAM_COPY); | ||||
|     } | ||||
|     for (const ImageCopy& copy : copies) { | ||||
|         ASSERT(copy.src_offset == zero_offset); | ||||
|         ASSERT(copy.dst_offset == zero_offset); | ||||
|  | ||||
|         // Copy from source to PBO | ||||
|         glPixelStorei(GL_PACK_ALIGNMENT, 1); | ||||
|         glPixelStorei(GL_PACK_ROW_LENGTH, copy.extent.width); | ||||
|         glBindBuffer(GL_PIXEL_PACK_BUFFER, bgr_pbo.handle); | ||||
|         glGetTextureSubImage(src_image.Handle(), 0, 0, 0, 0, copy.extent.width, copy.extent.height, | ||||
|                              copy.src_subresource.num_layers, src_image.GlFormat(), | ||||
|                              src_image.GlType(), static_cast<GLsizei>(bgr_pbo_size), nullptr); | ||||
|  | ||||
|         // Copy from PBO to destination in desired GL format | ||||
|         glPixelStorei(GL_UNPACK_ALIGNMENT, 1); | ||||
|         glPixelStorei(GL_UNPACK_ROW_LENGTH, copy.extent.width); | ||||
|         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, bgr_pbo.handle); | ||||
|         glTextureSubImage3D(dst_image.Handle(), 0, 0, 0, 0, copy.extent.width, copy.extent.height, | ||||
|                             copy.dst_subresource.num_layers, dst_image.GlFormat(), | ||||
|                             dst_image.GlType(), nullptr); | ||||
|     } | ||||
| } | ||||
|  | ||||
| } // namespace OpenGL | ||||
|   | ||||
| @@ -47,6 +47,19 @@ struct FormatProperties { | ||||
|     bool is_compressed; | ||||
| }; | ||||
|  | ||||
| class BGRCopyPass { | ||||
| public: | ||||
|     BGRCopyPass() = default; | ||||
|     ~BGRCopyPass() = default; | ||||
|  | ||||
|     void CopyBGR(Image& dst_image, Image& src_image, | ||||
|                  std::span<const VideoCommon::ImageCopy> copies); | ||||
|  | ||||
| private: | ||||
|     OGLBuffer bgr_pbo; | ||||
|     size_t bgr_pbo_size{}; | ||||
| }; | ||||
|  | ||||
| class TextureCacheRuntime { | ||||
|     friend Framebuffer; | ||||
|     friend Image; | ||||
| @@ -118,6 +131,7 @@ private: | ||||
|     const Device& device; | ||||
|     StateTracker& state_tracker; | ||||
|     UtilShaders util_shaders; | ||||
|     BGRCopyPass bgr_copy_pass; | ||||
|  | ||||
|     std::array<std::unordered_map<GLenum, FormatProperties>, 3> format_properties; | ||||
|     bool has_broken_texture_view_formats = false; | ||||
|   | ||||
| @@ -44,11 +44,6 @@ namespace { | ||||
| OGLProgram MakeProgram(std::string_view source) { | ||||
|     return CreateProgram(source, GL_COMPUTE_SHADER); | ||||
| } | ||||
|  | ||||
| size_t NumPixelsInCopy(const VideoCommon::ImageCopy& copy) { | ||||
|     return static_cast<size_t>(copy.extent.width * copy.extent.height * | ||||
|                                copy.src_subresource.num_layers); | ||||
| } | ||||
| } // Anonymous namespace | ||||
|  | ||||
| UtilShaders::UtilShaders(ProgramManager& program_manager_) | ||||
| @@ -255,36 +250,6 @@ void UtilShaders::CopyBC4(Image& dst_image, Image& src_image, std::span<const Im | ||||
|     program_manager.RestoreGuestCompute(); | ||||
| } | ||||
|  | ||||
| void UtilShaders::CopyBGR(Image& dst_image, Image& src_image, | ||||
|                           std::span<const VideoCommon::ImageCopy> copies) { | ||||
|     static constexpr VideoCommon::Offset3D zero_offset{0, 0, 0}; | ||||
|     for (const ImageCopy& copy : copies) { | ||||
|         ASSERT(copy.src_offset == zero_offset); | ||||
|         ASSERT(copy.dst_offset == zero_offset); | ||||
|  | ||||
|         if (bgr_pbo_size < dst_image.unswizzled_size_bytes) { | ||||
|             bgr_pbo.Create(); | ||||
|             bgr_pbo_size = dst_image.unswizzled_size_bytes; | ||||
|             glNamedBufferData(bgr_pbo.handle, bgr_pbo_size, nullptr, GL_STREAM_COPY); | ||||
|         } | ||||
|         // Copy from source to PBO | ||||
|         glPixelStorei(GL_PACK_ALIGNMENT, 1); | ||||
|         glPixelStorei(GL_PACK_ROW_LENGTH, copy.extent.width); | ||||
|         glBindBuffer(GL_PIXEL_PACK_BUFFER, bgr_pbo.handle); | ||||
|         glGetTextureSubImage(src_image.Handle(), 0, 0, 0, 0, copy.extent.width, copy.extent.height, | ||||
|                              copy.src_subresource.num_layers, src_image.GlFormat(), | ||||
|                              src_image.GlType(), static_cast<GLsizei>(bgr_pbo_size), nullptr); | ||||
|  | ||||
|         // Copy from PBO to destination in reverse order | ||||
|         glPixelStorei(GL_UNPACK_ALIGNMENT, 1); | ||||
|         glPixelStorei(GL_UNPACK_ROW_LENGTH, copy.extent.width); | ||||
|         glBindBuffer(GL_PIXEL_UNPACK_BUFFER, bgr_pbo.handle); | ||||
|         glTextureSubImage3D(dst_image.Handle(), 0, 0, 0, 0, copy.extent.width, copy.extent.height, | ||||
|                             copy.dst_subresource.num_layers, dst_image.GlFormat(), | ||||
|                             dst_image.GlType(), nullptr); | ||||
|     } | ||||
| } | ||||
|  | ||||
| GLenum StoreFormat(u32 bytes_per_block) { | ||||
|     switch (bytes_per_block) { | ||||
|     case 1: | ||||
|   | ||||
| @@ -39,9 +39,6 @@ public: | ||||
|     void CopyBC4(Image& dst_image, Image& src_image, | ||||
|                  std::span<const VideoCommon::ImageCopy> copies); | ||||
|  | ||||
|     void CopyBGR(Image& dst_image, Image& src_image, | ||||
|                  std::span<const VideoCommon::ImageCopy> copies); | ||||
|  | ||||
| private: | ||||
|     ProgramManager& program_manager; | ||||
|  | ||||
| @@ -53,9 +50,6 @@ private: | ||||
|     OGLProgram pitch_unswizzle_program; | ||||
|     OGLProgram copy_bgra_program; | ||||
|     OGLProgram copy_bc4_program; | ||||
|  | ||||
|     OGLBuffer bgr_pbo; | ||||
|     size_t bgr_pbo_size{}; | ||||
| }; | ||||
|  | ||||
| GLenum StoreFormat(u32 bytes_per_block); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ameerj
					ameerj