Remove ShaderSet presets

This commit is contained in:
Henrik Rydgård 2016-12-26 13:42:53 +01:00
parent 1ed7f0d7fd
commit 8d84fb75c7
8 changed files with 53 additions and 59 deletions

View File

@ -78,6 +78,10 @@ SoftGPU::SoftGPU(GraphicsContext *gfxCtx, Draw::DrawContext *_thin3D)
samplerNearest = thin3d->CreateSamplerState({ TextureFilter::NEAREST, TextureFilter::NEAREST, TextureFilter::NEAREST });
samplerLinear = thin3d->CreateSamplerState({ TextureFilter::LINEAR, TextureFilter::LINEAR, TextureFilter::LINEAR });
PipelineDesc pipelineDesc;
pipelineDesc.shaders = { thin3d->GetVshaderPreset(VS_TEXTURE_COLOR_2D), thin3d->GetFshaderPreset(FS_TEXTURE_COLOR_2D) };
texColor = thin3d->CreateGraphicsPipeline(pipelineDesc);
fb.data = Memory::GetPointer(0x44000000); // TODO: correct default address?
depthbuf.data = Memory::GetPointer(0x44000000); // TODO: correct default address?
@ -100,6 +104,9 @@ void SoftGPU::DeviceRestore() {
}
SoftGPU::~SoftGPU() {
texColor->Release();
texColor = nullptr;
vformat->Release();
vformat = nullptr;
fbTex->Release();
@ -238,7 +245,6 @@ void SoftGPU::CopyToCurrentFboFromDisplayRam(int srcwidth, int srcheight) {
idata->SetData((const uint8_t *)indexes, sizeof(indexes));
thin3d->BindTexture(0, fbTex);
Pipeline *texColor = thin3d->GetShaderSetPreset(SS_TEXTURE_COLOR_2D);
static const float identity4x4[16] = {
1.0f, 0.0f, 0.0f, 0.0f,

View File

@ -19,6 +19,7 @@
#include "GPU/GPUCommon.h"
#include "GPU/Common/GPUDebugInterface.h"
#include "thin3d/thin3d.h"
typedef struct {
union {
@ -45,10 +46,6 @@ typedef struct {
} FormatBuffer;
class ShaderManager;
namespace Draw {
class DrawContext;
class Texture;
}
class SoftGPU : public GPUCommon {
public:
@ -109,5 +106,6 @@ private:
GraphicsContext *gfxCtx_;
Draw::Texture *fbTex;
Draw::DrawContext *thin3d;
Draw::Pipeline *texColor;
std::vector<u32> fbTexBuffer;
};

View File

@ -140,6 +140,8 @@ struct PendingMessage {
static recursive_mutex pendingMutex;
static std::vector<PendingMessage> pendingMessages;
static Draw::DrawContext *thin3d;
static Draw::Pipeline *colorPipeline;
static Draw::Pipeline *texColorPipeline;
static UIContext *uiContext;
static std::vector<std::string> inputboxValue;
@ -592,7 +594,13 @@ void NativeInitGraphics(GraphicsContext *graphicsContext) {
uiContext = new UIContext();
uiContext->theme = &ui_theme;
uiContext->Init(thin3d, thin3d->GetShaderSetPreset(SS_TEXTURE_COLOR_2D), thin3d->GetShaderSetPreset(SS_COLOR_2D), uiTexture, &ui_draw2d, &ui_draw2d_front);
PipelineDesc colorDesc{ { thin3d->GetVshaderPreset(VS_COLOR_2D), thin3d->GetFshaderPreset(FS_COLOR_2D) } };
PipelineDesc texColorDesc{ { thin3d->GetVshaderPreset(VS_TEXTURE_COLOR_2D), thin3d->GetFshaderPreset(FS_TEXTURE_COLOR_2D) } };
colorPipeline = thin3d->CreateGraphicsPipeline(colorDesc);
texColorPipeline = thin3d->CreateGraphicsPipeline(texColorDesc);
uiContext->Init(thin3d, texColorPipeline, colorPipeline, uiTexture, &ui_draw2d, &ui_draw2d_front);
if (uiContext->Text())
uiContext->Text()->SetFont("Tahoma", 20, 0);
@ -628,6 +636,9 @@ void NativeShutdownGraphics() {
ui_draw2d.Shutdown();
ui_draw2d_front.Shutdown();
colorPipeline->Release();
texColorPipeline->Release();
// TODO: Reconsider this annoying ref counting stuff.
if (thin3d->Release()) {
thin3d = nullptr;

View File

@ -161,26 +161,14 @@ void DrawContext::CreatePresets() {
fsPresets_[FS_TEXTURE_COLOR_2D] = CreateShaderModule(ShaderStage::FRAGMENT, glsl_fsTexCol, hlslFsTexCol, vulkan_fsTexCol);
fsPresets_[FS_COLOR_2D] = CreateShaderModule(ShaderStage::FRAGMENT, glsl_fsCol, hlslFsCol, vulkan_fsCol);
ssPresets_[SS_TEXTURE_COLOR_2D] = CreatePipeline({ {vsPresets_[VS_TEXTURE_COLOR_2D], fsPresets_[FS_TEXTURE_COLOR_2D]} });
ssPresets_[SS_COLOR_2D] = CreatePipeline({{vsPresets_[VS_COLOR_2D], fsPresets_[FS_COLOR_2D]}});
}
DrawContext::~DrawContext() {
for (int i = 0; i < VS_MAX_PRESET; i++) {
if (vsPresets_[i]) {
vsPresets_[i]->Release();
}
vsPresets_[i]->Release();
}
for (int i = 0; i < FS_MAX_PRESET; i++) {
if (fsPresets_[i]) {
fsPresets_[i]->Release();
}
}
for (int i = 0; i < SS_MAX_PRESET; i++) {
if (ssPresets_[i]) {
ssPresets_[i]->Release();
}
fsPresets_[i]->Release();
}
}

View File

@ -136,13 +136,6 @@ enum FragmentShaderPreset : int {
FS_MAX_PRESET,
};
// Predefined full shader setups.
enum ShaderSetPreset : int {
SS_COLOR_2D,
SS_TEXTURE_COLOR_2D,
SS_MAX_PRESET,
};
enum ClearFlag : int {
COLOR = 1,
DEPTH = 2,
@ -453,7 +446,7 @@ public:
virtual SamplerState *CreateSamplerState(const SamplerStateDesc &desc) = 0;
virtual RasterState *CreateRasterState(const RasterStateDesc &desc) = 0;
virtual Buffer *CreateBuffer(size_t size, uint32_t usageFlags) = 0;
virtual Pipeline *CreatePipeline(const PipelineDesc &desc) = 0;
virtual Pipeline *CreateGraphicsPipeline(const PipelineDesc &desc) = 0;
virtual InputLayout *CreateInputLayout(const InputLayoutDesc &desc) = 0;
virtual Texture *CreateTexture() = 0; // To be later filled in by ->LoadFromFile or similar.
@ -466,7 +459,6 @@ public:
// Note that these DO NOT AddRef so you must not ->Release presets unless you manually AddRef them.
ShaderModule *GetVshaderPreset(VertexShaderPreset preset) { return fsPresets_[preset]; }
ShaderModule *GetFshaderPreset(FragmentShaderPreset preset) { return vsPresets_[preset]; }
Pipeline *GetShaderSetPreset(ShaderSetPreset preset) { return ssPresets_[preset]; }
// The implementation makes the choice of which shader code to use.
virtual ShaderModule *CreateShaderModule(ShaderStage stage, const char *glsl_source, const char *hlsl_source, const char *vulkan_source) = 0;
@ -514,7 +506,6 @@ protected:
ShaderModule *vsPresets_[VS_MAX_PRESET];
ShaderModule *fsPresets_[FS_MAX_PRESET];
Pipeline *ssPresets_[SS_MAX_PRESET];
int targetWidth_;
int targetHeight_;

View File

@ -460,7 +460,7 @@ public:
SamplerState *CreateSamplerState(const SamplerStateDesc &desc) override;
RasterState *CreateRasterState(const RasterStateDesc &desc) override;
Buffer *CreateBuffer(size_t size, uint32_t usageFlags) override;
Pipeline *CreatePipeline(const PipelineDesc &desc) override;
Pipeline *CreateGraphicsPipeline(const PipelineDesc &desc) override;
InputLayout *CreateInputLayout(const InputLayoutDesc &desc) override;
Texture *CreateTexture() override;
Texture *CreateTexture(TextureType type, DataFormat format, int width, int height, int depth, int mipLevels) override;
@ -548,21 +548,21 @@ ShaderModule *D3D9Context::CreateShaderModule(ShaderStage stage, const char *gls
}
}
Pipeline *D3D9Context::CreatePipeline(const PipelineDesc &desc) {
Pipeline *D3D9Context::CreateGraphicsPipeline(const PipelineDesc &desc) {
if (!desc.shaders.size()) {
ELOG("ShaderSet requires at least one shader");
ELOG("Pipeline requires at least one shader");
return NULL;
}
D3D9Pipeline *shaderSet = new D3D9Pipeline(device_);
D3D9Pipeline *pipeline = new D3D9Pipeline(device_);
for (auto iter : desc.shaders) {
if (iter->GetStage() == ShaderStage::FRAGMENT) {
shaderSet->pshader = static_cast<D3D9ShaderModule *>(iter);
pipeline->pshader = static_cast<D3D9ShaderModule *>(iter);
}
else if (iter->GetStage() == ShaderStage::VERTEX) {
shaderSet->vshader = static_cast<D3D9ShaderModule *>(iter);
pipeline->vshader = static_cast<D3D9ShaderModule *>(iter);
}
}
return shaderSet;
return pipeline;
}
DepthStencilState *D3D9Context::CreateDepthStencilState(const DepthStencilStateDesc &desc) {

View File

@ -268,7 +268,7 @@ GLuint ShaderStageToOpenGL(ShaderStage stage) {
}
}
// Not registering this as a resource holder, instead ShaderSet is registered. It will
// Not registering this as a resource holder, instead Pipeline is registered. It will
// invoke Compile again to recreate the shader then link them together.
class OpenGLShaderModule : public ShaderModule {
public:
@ -411,7 +411,7 @@ public:
SamplerState *CreateSamplerState(const SamplerStateDesc &desc) override;
RasterState *CreateRasterState(const RasterStateDesc &desc) override;
Buffer *CreateBuffer(size_t size, uint32_t usageFlags) override;
Pipeline *CreatePipeline(const PipelineDesc &desc) override;
Pipeline *CreateGraphicsPipeline(const PipelineDesc &desc) override;
InputLayout *CreateInputLayout(const InputLayoutDesc &desc) override;
Texture *CreateTexture(TextureType type, DataFormat format, int width, int height, int depth, int mipLevels) override;
Texture *CreateTexture() override;
@ -802,20 +802,20 @@ Buffer *OpenGLContext::CreateBuffer(size_t size, uint32_t usageFlags) {
return new OpenGLBuffer(size, usageFlags);
}
Pipeline *OpenGLContext::CreatePipeline(const PipelineDesc &desc) {
Pipeline *OpenGLContext::CreateGraphicsPipeline(const PipelineDesc &desc) {
if (!desc.shaders.size()) {
ELOG("ShaderSet requires at least one shader");
ELOG("Pipeline requires at least one shader");
return NULL;
}
OpenGLPipeline *shaderSet = new OpenGLPipeline();
OpenGLPipeline *pipeline = new OpenGLPipeline();
for (auto iter : desc.shaders) {
iter->AddRef();
shaderSet->shaders.push_back(static_cast<OpenGLShaderModule *>(iter));
pipeline->shaders.push_back(static_cast<OpenGLShaderModule *>(iter));
}
if (shaderSet->Link()) {
return shaderSet;
if (pipeline->Link()) {
return pipeline;
} else {
delete shaderSet;
delete pipeline;
return NULL;
}
}
@ -1027,7 +1027,7 @@ void OpenGLInputLayout::Apply(const void *base) {
intptr_t b = (intptr_t)base;
if (b != lastBase_) {
for (size_t i = 0; i < desc.attributes.size(); i++) {
size_t stride = desc.bindings[desc.attributes[i].binding].stride;
GLsizei stride = (GLsizei)desc.bindings[desc.attributes[i].binding].stride;
switch (desc.attributes[i].format) {
case DataFormat::R32G32_FLOAT:
glVertexAttribPointer(desc.attributes[i].location, 2, GL_FLOAT, GL_FALSE, stride, (void *)(b + (intptr_t)desc.attributes[i].offset));

View File

@ -231,7 +231,7 @@ VkShaderStageFlagBits StageToVulkan(ShaderStage stage) {
}
}
// Not registering this as a resource holder, instead ShaderSet is registered. It will
// Not registering this as a resource holder, instead the pipeline is registered. It will
// invoke Compile again to recreate the shader then link them together.
class VKShaderModule : public ShaderModule {
public:
@ -347,7 +347,7 @@ private:
struct PipelineKey {
VKDepthStencilState *depthStencil;
VKBlendState *blend;
VKPipeline *shaderSet;
VKPipeline *pipeline;
VkPrimitiveTopology topology;
VKRasterState *raster;
@ -356,7 +356,7 @@ struct PipelineKey {
bool operator < (const PipelineKey &other) const {
if (depthStencil < other.depthStencil) return true; else if (depthStencil > other.depthStencil) return false;
if (blend < other.blend) return true; else if (blend > other.blend) return false;
if (shaderSet < other.shaderSet) return true; else if (shaderSet > other.shaderSet) return false;
if (pipeline < other.pipeline) return true; else if (pipeline > other.pipeline) return false;
if (topology < other.topology) return true; else if (topology > other.topology) return false;
if (raster < other.raster) return true; else if (raster > other.raster) return false;
// etc etc
@ -393,7 +393,7 @@ public:
InputLayout *CreateInputLayout(const InputLayoutDesc &desc) override;
SamplerState *CreateSamplerState(const SamplerStateDesc &desc) override;
RasterState *CreateRasterState(const RasterStateDesc &desc) override;
Pipeline *CreatePipeline(const PipelineDesc &desc) override;
Pipeline *CreateGraphicsPipeline(const PipelineDesc &desc) override;
// The implementation makes the choice of which shader code to use.
ShaderModule *CreateShaderModule(ShaderStage stage, const char *glsl_source, const char *hlsl_source, const char *vulkan_source) override;
@ -865,7 +865,7 @@ VkPipeline VKContext::GetOrCreatePipeline() {
PipelineKey key;
key.blend = curBlendState_;
key.depthStencil = curDepthStencilState_;
key.shaderSet = curPipeline_;
key.pipeline = curPipeline_;
key.topology = curPrim_;
key.raster = curRasterState_;
@ -1058,20 +1058,20 @@ Buffer *VKContext::CreateBuffer(size_t size, uint32_t usageFlags) {
return new Thin3DVKBuffer(size, usageFlags);
}
Pipeline *VKContext::CreatePipeline(const PipelineDesc &desc) {
Pipeline *VKContext::CreateGraphicsPipeline(const PipelineDesc &desc) {
if (!desc.shaders.size()) {
ELOG("ShaderSet requires at least one shader");
ELOG("Pipeline requires at least one shader");
return NULL;
}
VKPipeline *shaderSet = new VKPipeline();
VKPipeline *pipeline = new VKPipeline();
for (auto iter : desc.shaders) {
iter->AddRef();
shaderSet->shaders.push_back(static_cast<VKShaderModule *>(iter));
pipeline->shaders.push_back(static_cast<VKShaderModule *>(iter));
}
if (shaderSet->Link()) {
return shaderSet;
if (pipeline->Link()) {
return pipeline;
} else {
delete shaderSet;
delete pipeline;
return NULL;
}
}