2019-04-11 22:14:55 +02:00
|
|
|
// Copyright 2019 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <array>
|
|
|
|
#include <functional>
|
|
|
|
#include <utility>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include <glad/glad.h>
|
|
|
|
|
|
|
|
#include "common/common_types.h"
|
|
|
|
#include "video_core/engines/shader_bytecode.h"
|
2019-04-24 23:47:59 +02:00
|
|
|
#include "video_core/renderer_opengl/gl_resource_manager.h"
|
2019-04-25 18:41:57 +02:00
|
|
|
#include "video_core/texture_cache/texture_cache.h"
|
2019-04-11 22:14:55 +02:00
|
|
|
|
|
|
|
namespace OpenGL {
|
|
|
|
|
|
|
|
using VideoCommon::SurfaceParams;
|
2019-05-07 16:57:16 +02:00
|
|
|
using VideoCommon::ViewParams;
|
2019-04-11 22:14:55 +02:00
|
|
|
|
|
|
|
class CachedSurfaceView;
|
|
|
|
class CachedSurface;
|
2019-04-21 01:01:26 +02:00
|
|
|
class TextureCacheOpenGL;
|
2019-04-11 22:14:55 +02:00
|
|
|
|
2019-04-17 01:01:07 +02:00
|
|
|
using Surface = std::shared_ptr<CachedSurface>;
|
2019-05-07 16:57:16 +02:00
|
|
|
using View = std::shared_ptr<CachedSurfaceView>;
|
|
|
|
using TextureCacheBase = VideoCommon::TextureCache<Surface, View>;
|
2019-04-11 22:14:55 +02:00
|
|
|
|
2019-05-07 16:57:16 +02:00
|
|
|
class CachedSurface final : public VideoCommon::SurfaceBase<View> {
|
2019-04-11 22:14:55 +02:00
|
|
|
friend CachedSurfaceView;
|
|
|
|
|
|
|
|
public:
|
2019-05-07 16:57:16 +02:00
|
|
|
explicit CachedSurface(const GPUVAddr gpu_addr, const SurfaceParams& params);
|
2019-04-11 22:14:55 +02:00
|
|
|
~CachedSurface();
|
|
|
|
|
2019-05-07 16:57:16 +02:00
|
|
|
void UploadTexture(std::vector<u8>& staging_buffer) override;
|
|
|
|
void DownloadTexture(std::vector<u8>& staging_buffer) override;
|
2019-04-25 18:41:57 +02:00
|
|
|
|
2019-04-14 06:44:16 +02:00
|
|
|
GLenum GetTarget() const {
|
|
|
|
return target;
|
|
|
|
}
|
|
|
|
|
2019-04-11 22:14:55 +02:00
|
|
|
GLuint GetTexture() const {
|
|
|
|
return texture.handle;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
2019-04-17 01:01:07 +02:00
|
|
|
void DecorateSurfaceName();
|
|
|
|
|
2019-05-07 16:57:16 +02:00
|
|
|
View CreateView(const ViewParams& view_key) override;
|
2019-04-11 22:14:55 +02:00
|
|
|
|
|
|
|
private:
|
2019-05-07 16:57:16 +02:00
|
|
|
void UploadTextureMipmap(u32 level, std::vector<u8>& staging_buffer);
|
2019-04-11 22:14:55 +02:00
|
|
|
|
|
|
|
GLenum internal_format{};
|
|
|
|
GLenum format{};
|
|
|
|
GLenum type{};
|
|
|
|
bool is_compressed{};
|
2019-04-14 06:44:16 +02:00
|
|
|
GLenum target{};
|
2019-05-07 16:57:16 +02:00
|
|
|
u32 view_count{};
|
2019-04-11 22:14:55 +02:00
|
|
|
|
|
|
|
OGLTexture texture;
|
|
|
|
};
|
|
|
|
|
2019-05-07 16:57:16 +02:00
|
|
|
class CachedSurfaceView final : public VideoCommon::ViewBase {
|
2019-04-11 22:14:55 +02:00
|
|
|
public:
|
2019-05-07 16:57:16 +02:00
|
|
|
explicit CachedSurfaceView(CachedSurface& surface, const ViewParams& params);
|
2019-04-11 22:14:55 +02:00
|
|
|
~CachedSurfaceView();
|
|
|
|
|
2019-04-14 23:16:27 +02:00
|
|
|
/// Attaches this texture view to the current bound GL_DRAW_FRAMEBUFFER
|
|
|
|
void Attach(GLenum attachment) const;
|
2019-04-11 22:14:55 +02:00
|
|
|
|
2019-05-07 16:57:16 +02:00
|
|
|
GLuint GetTexture() {
|
2019-05-08 01:09:34 +02:00
|
|
|
return texture_view.handle;
|
2019-04-11 22:14:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
const SurfaceParams& GetSurfaceParams() const {
|
2019-05-07 16:57:16 +02:00
|
|
|
return surface.GetSurfaceParams();
|
2019-04-11 22:14:55 +02:00
|
|
|
}
|
|
|
|
|
2019-04-15 21:17:27 +02:00
|
|
|
u32 GetWidth() const {
|
2019-05-07 16:57:16 +02:00
|
|
|
const auto owner_params = GetSurfaceParams();
|
|
|
|
return owner_params.GetMipWidth(params.base_level);
|
2019-04-15 21:17:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
u32 GetHeight() const {
|
2019-05-07 16:57:16 +02:00
|
|
|
const auto owner_params = GetSurfaceParams();
|
|
|
|
return owner_params.GetMipHeight(params.base_level);
|
2019-04-15 21:17:27 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
u32 GetDepth() const {
|
2019-05-07 16:57:16 +02:00
|
|
|
const auto owner_params = GetSurfaceParams();
|
|
|
|
return owner_params.GetMipDepth(params.base_level);
|
2019-04-15 21:17:27 +02:00
|
|
|
}
|
|
|
|
|
2019-05-07 16:57:16 +02:00
|
|
|
void ApplySwizzle(Tegra::Texture::SwizzleSource x_source,
|
|
|
|
Tegra::Texture::SwizzleSource y_source,
|
|
|
|
Tegra::Texture::SwizzleSource z_source,
|
|
|
|
Tegra::Texture::SwizzleSource w_source);
|
2019-04-15 21:17:27 +02:00
|
|
|
|
2019-05-07 16:57:16 +02:00
|
|
|
void DecorateViewName(GPUVAddr gpu_addr, std::string prefix);
|
2019-04-15 21:17:27 +02:00
|
|
|
|
2019-04-11 22:14:55 +02:00
|
|
|
private:
|
2019-05-07 16:57:16 +02:00
|
|
|
u32 EncodeSwizzle(Tegra::Texture::SwizzleSource x_source,
|
2019-04-11 22:14:55 +02:00
|
|
|
Tegra::Texture::SwizzleSource y_source,
|
|
|
|
Tegra::Texture::SwizzleSource z_source,
|
2019-05-07 16:57:16 +02:00
|
|
|
Tegra::Texture::SwizzleSource w_source) const {
|
|
|
|
return (static_cast<u32>(x_source) << 24) | (static_cast<u32>(y_source) << 16) |
|
|
|
|
(static_cast<u32>(z_source) << 8) | static_cast<u32>(w_source);
|
|
|
|
}
|
2019-04-11 22:14:55 +02:00
|
|
|
|
2019-05-08 01:09:34 +02:00
|
|
|
OGLTextureView CreateTextureView() const;
|
2019-04-11 22:14:55 +02:00
|
|
|
|
|
|
|
CachedSurface& surface;
|
2019-05-07 16:57:16 +02:00
|
|
|
GLenum target{};
|
|
|
|
|
2019-05-08 01:09:34 +02:00
|
|
|
OGLTextureView texture_view;
|
|
|
|
u32 swizzle;
|
2019-04-11 22:14:55 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class TextureCacheOpenGL final : public TextureCacheBase {
|
|
|
|
public:
|
|
|
|
explicit TextureCacheOpenGL(Core::System& system, VideoCore::RasterizerInterface& rasterizer);
|
|
|
|
~TextureCacheOpenGL();
|
|
|
|
|
|
|
|
protected:
|
2019-05-07 16:57:16 +02:00
|
|
|
Surface CreateSurface(GPUVAddr gpu_addr, const SurfaceParams& params) override;
|
2019-05-08 05:13:05 +02:00
|
|
|
|
2019-05-07 16:57:16 +02:00
|
|
|
void ImageCopy(Surface src_surface, Surface dst_surface,
|
|
|
|
const VideoCommon::CopyParams& copy_params) override;
|
2019-05-08 05:13:05 +02:00
|
|
|
|
|
|
|
void ImageBlit(Surface src_surface, Surface dst_surface, const Common::Rectangle<u32>& src_rect,
|
2019-05-09 00:27:29 +02:00
|
|
|
const Common::Rectangle<u32>& dst_rect) override;
|
2019-05-08 05:13:05 +02:00
|
|
|
|
|
|
|
private:
|
|
|
|
OGLFramebuffer src_framebuffer;
|
|
|
|
OGLFramebuffer dst_framebuffer;
|
2019-04-11 22:14:55 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace OpenGL
|