1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00
GLideN64/src/Graphics/Context.h

317 lines
7.2 KiB
C
Raw Normal View History

#pragma once
#include <memory>
2017-01-03 14:57:46 +00:00
#include <Combiner.h>
2017-01-01 14:59:54 +00:00
#include "ObjectHandle.h"
2016-12-25 15:19:03 +00:00
#include "Parameter.h"
2017-01-03 14:57:46 +00:00
#include "CombinerProgram.h"
2017-01-06 07:33:49 +00:00
#include "ShaderProgram.h"
#include "PixelBuffer.h"
2017-01-16 13:55:57 +00:00
#include "FramebufferTextureFormats.h"
2016-12-27 04:15:29 +00:00
#define GRAPHICS_CONTEXT
2017-01-23 14:57:32 +00:00
struct CachedTexture;
namespace graphics {
enum class SpecialFeatures {
Multisampling,
2017-01-20 11:47:19 +00:00
BlitFramebuffer,
WeakBlitFramebuffer,
2017-01-21 11:55:14 +00:00
DepthFramebufferTextures,
2017-01-22 13:43:05 +00:00
ShaderProgramBinary,
ImageTextures,
2018-04-06 17:17:04 +00:00
IntegerTextures,
2021-02-14 17:10:34 +00:00
N64DepthWithFbFetchDepth,
FramebufferFetchColor,
TextureBarrier,
EglImage,
EglImageFramebuffer,
DualSourceBlending
};
2018-03-10 20:36:46 +00:00
enum class ClampMode {
ClippingEnabled,
NoNearPlaneClipping,
NoClipping
};
class ContextImpl;
2017-01-23 14:57:32 +00:00
class ColorBufferReader;
class Context
{
public:
Context();
~Context();
2016-12-25 15:19:03 +00:00
void init();
2016-12-25 15:19:03 +00:00
void destroy();
2018-03-10 20:36:46 +00:00
void setClampMode(ClampMode _mode);
ClampMode getClampMode();
void enable(EnableParam _parameter, bool _enable);
2018-03-10 20:36:46 +00:00
u32 isEnabled(EnableParam _parameter);
void cullFace(CullModeParam _mode);
void enableDepthWrite(bool _enable);
void setDepthCompare(CompareParam _mode);
void setViewport(s32 _x, s32 _y, s32 _width, s32 _height);
void setScissor(s32 _x, s32 _y, s32 _width, s32 _height);
void setBlending(BlendParam _sfactor, BlendParam _dfactor);
2020-05-10 08:11:59 +00:00
void setBlendingSeparate(BlendParam _sfactorcolor, BlendParam _dfactorcolor, BlendParam _sfactoralpha, BlendParam _dfactoralpha);
void setBlendColor(f32 _red, f32 _green, f32 _blue, f32 _alpha);
2017-01-11 10:07:20 +00:00
void clearColorBuffer(f32 _red, f32 _green, f32 _blue, f32 _alpha);
void clearDepthBuffer();
void setPolygonOffset(f32 _factor, f32 _units);
/*---------------Texture-------------*/
2017-01-01 14:59:54 +00:00
ObjectHandle createTexture(Parameter _target);
2016-12-25 15:19:03 +00:00
2018-05-07 15:43:57 +00:00
void deleteTexture(ObjectHandle _name);
2016-12-25 15:19:03 +00:00
struct InitTextureParams {
2017-01-01 14:59:54 +00:00
ObjectHandle handle;
TextureUnitParam textureUnitIndex{0};
TextureTargetParam target = textureTarget::TEXTURE_2D;
u32 msaaLevel = 0;
u32 width = 0;
u32 height = 0;
u32 mipMapLevel = 0;
2017-01-01 14:59:54 +00:00
u32 mipMapLevels = 1;
ColorFormatParam format;
InternalColorFormatParam internalFormat;
DatatypeParam dataType;
2017-01-01 13:30:28 +00:00
const void * data = nullptr;
};
void init2DTexture(const InitTextureParams & _params);
2017-01-06 07:33:49 +00:00
struct UpdateTextureDataParams {
ObjectHandle handle;
TextureUnitParam textureUnitIndex{0};
2017-01-06 07:33:49 +00:00
u32 x = 0;
u32 y = 0;
u32 width = 0;
u32 height = 0;
u32 mipMapLevel = 0;
ColorFormatParam format;
InternalColorFormatParam internalFormat;
DatatypeParam dataType;
2017-01-06 07:33:49 +00:00
const void * data = nullptr;
};
void update2DTexture(const UpdateTextureDataParams & _params);
2017-01-01 14:59:54 +00:00
struct TexParameters {
ObjectHandle handle;
TextureUnitParam textureUnitIndex{0};
TextureTargetParam target;
TextureParam magFilter;
TextureParam minFilter;
TextureParam wrapS;
TextureParam wrapT;
2017-01-01 14:59:54 +00:00
Parameter maxMipmapLevel;
Parameter maxAnisotropy;
};
void setTextureParameters(const TexParameters & _parameters);
struct BindTextureParameters {
ObjectHandle texture;
TextureUnitParam textureUnitIndex;
TextureTargetParam target;
};
void bindTexture(const BindTextureParameters & _params);
void setTextureUnpackAlignment(s32 _param);
s32 getTextureUnpackAlignment() const;
2017-01-22 13:43:05 +00:00
s32 getMaxTextureSize() const;
f32 getMaxAnisotropy() const;
2017-01-21 11:44:56 +00:00
struct BindImageTextureParameters {
ImageUnitParam imageUnit;
2017-01-21 11:44:56 +00:00
ObjectHandle texture;
ImageAccessModeParam accessMode;
InternalColorFormatParam textureFormat;
2017-01-21 11:44:56 +00:00
};
void bindImageTexture(const BindImageTextureParameters & _params);
u32 convertInternalTextureFormat(u32 _format) const;
void textureBarrier();
/*---------------Framebuffer-------------*/
2017-01-16 13:55:57 +00:00
const FramebufferTextureFormats & getFramebufferTextureFormats();
2017-01-02 14:00:49 +00:00
ObjectHandle createFramebuffer();
void deleteFramebuffer(ObjectHandle _name);
void bindFramebuffer(BufferTargetParam _target, ObjectHandle _name);
ObjectHandle createRenderbuffer();
struct InitRenderbufferParams {
ObjectHandle handle;
TextureTargetParam target;
InternalColorFormatParam format;
u32 width = 0;
u32 height = 0;
};
void initRenderbuffer(const InitRenderbufferParams & _params);
2017-01-02 14:00:49 +00:00
struct FrameBufferRenderTarget {
ObjectHandle bufferHandle;
BufferTargetParam bufferTarget;
BufferAttachmentParam attachment;
2017-01-02 14:00:49 +00:00
Parameter textureTarget;
ObjectHandle textureHandle;
};
void addFrameBufferRenderTarget(const FrameBufferRenderTarget & _params);
2017-01-14 10:08:02 +00:00
struct BlitFramebuffersParams
{
ObjectHandle readBuffer;
ObjectHandle drawBuffer;
s32 srcX0;
s32 srcY0;
s32 srcX1;
s32 srcY1;
s32 dstX0;
s32 dstY0;
s32 dstX1;
s32 dstY1;
Parameter mask;
Parameter filter;
};
bool blitFramebuffers(const BlitFramebuffersParams & _params);
void setDrawBuffers(u32 _num);
2017-01-23 09:03:38 +00:00
/*---------------Pixelbuffer-------------*/
PixelReadBuffer * createPixelReadBuffer(size_t _sizeInBytes);
2017-01-23 14:57:32 +00:00
ColorBufferReader * createColorBufferReader(CachedTexture * _pTexture);
/*---------------Shaders-------------*/
bool isCombinerProgramBuilderObsolete();
void resetCombinerProgramBuilder();
2017-01-03 14:57:46 +00:00
CombinerProgram * createCombinerProgram(Combiner & _color, Combiner & _alpha, const CombinerKey & _key);
2017-01-07 15:46:51 +00:00
bool saveShadersStorage(const Combiners & _combiners);
bool loadShadersStorage(Combiners & _combiners);
2017-01-06 07:33:49 +00:00
ShaderProgram * createDepthFogShader();
2017-02-12 15:21:20 +00:00
TexrectDrawerShaderProgram * createTexrectDrawerDrawShader();
2017-02-12 15:21:20 +00:00
ShaderProgram * createTexrectDrawerClearShader();
ShaderProgram * createTexrectUpscaleCopyShader();
ShaderProgram * createTexrectColorAndDepthUpscaleCopyShader();
ShaderProgram * createTexrectDownscaleCopyShader();
ShaderProgram * createTexrectColorAndDepthDownscaleCopyShader();
ShaderProgram * createGammaCorrectionShader();
ShaderProgram * createFXAAShader();
2018-08-26 10:03:02 +00:00
2017-05-26 09:00:01 +00:00
TextDrawerShaderProgram * createTextDrawerShader();
void resetShaderProgram();
/*---------------Draw-------------*/
struct DrawTriangleParameters
{
DrawModeParam mode;
Parameter elementsType;
u32 verticesCount = 0;
u32 elementsCount = 0;
bool flatColors = false;
SPVertex * vertices = nullptr;
void * elements = nullptr;
const CombinerProgram * combiner = nullptr;
};
void drawTriangles(const DrawTriangleParameters & _params);
2017-01-10 14:58:09 +00:00
struct DrawRectParameters
{
DrawModeParam mode;
bool texrect = true;
u32 verticesCount = 0;
RectVertex * vertices = nullptr;
const CombinerProgram * combiner = nullptr;
};
void drawRects(const DrawRectParameters & _params);
void drawLine(f32 _width, SPVertex * _vertices);
2017-01-11 10:07:20 +00:00
f32 getMaxLineWidth();
/*---------------Misc-------------*/
s32 getMaxMSAALevel();
bool isError() const;
2017-01-22 13:43:05 +00:00
bool isFramebufferError() const;
2018-04-06 17:17:04 +00:00
static bool Multisampling;
static bool BlitFramebuffer;
static bool WeakBlitFramebuffer;
static bool DepthFramebufferTextures;
static bool ShaderProgramBinary;
static bool ImageTextures;
static bool IntegerTextures;
static bool FramebufferFetchDepth;
static bool FramebufferFetchColor;
static bool TextureBarrier;
static bool EglImage;
static bool EglImageFramebuffer;
static bool DualSourceBlending;
2018-04-06 17:17:04 +00:00
private:
std::unique_ptr<ContextImpl> m_impl;
2017-01-16 13:55:57 +00:00
std::unique_ptr<FramebufferTextureFormats> m_fbTexFormats;
};
}
extern graphics::Context gfxContext;