rpcsx/rpcs3/Emu/RSX/GL/GLProgramBuffer.h

70 lines
2.2 KiB
C
Raw Normal View History

2013-11-09 22:29:49 +01:00
#pragma once
#include "GLProgram.h"
2015-05-16 01:10:27 +02:00
#include "../Common/ProgramStateCache.h"
#include "Utilities/File.h"
2013-11-09 22:29:49 +01:00
2015-05-16 01:10:27 +02:00
struct GLTraits
2013-11-09 22:29:49 +01:00
{
2015-05-16 01:10:27 +02:00
typedef GLVertexProgram VertexProgramData;
typedef GLFragmentProgram FragmentProgramData;
typedef gl::glsl::program PipelineData;
2015-05-16 01:10:27 +02:00
typedef void* PipelineProperties;
typedef void* ExtraData;
2013-11-09 22:29:49 +01:00
2015-05-16 01:10:27 +02:00
static
void RecompileFragmentProgram(RSXFragmentProgram *RSXFP, FragmentProgramData& fragmentProgramData, size_t ID)
{
fragmentProgramData.Decompile(*RSXFP);
fragmentProgramData.Compile();
//checkForGlError("m_fragment_prog.Compile");
// TODO: This shouldn't use current dir
fs::file("./FragmentProgram.txt", fom::write | fom::create | fom::trunc).write(fragmentProgramData.shader.c_str(), fragmentProgramData.shader.size());
2015-05-16 01:10:27 +02:00
}
static
void RecompileVertexProgram(RSXVertexProgram *RSXVP, VertexProgramData& vertexProgramData, size_t ID)
{
vertexProgramData.Decompile(*RSXVP);
vertexProgramData.Compile();
//checkForGlError("m_vertex_prog.Compile");
// TODO: This shouldn't use current dir
fs::file("./VertexProgram.txt", fom::write | fom::create | fom::trunc).write(vertexProgramData.shader.c_str(), vertexProgramData.shader.size());
2015-05-16 01:10:27 +02:00
}
2013-11-09 22:29:49 +01:00
2015-05-16 01:10:27 +02:00
static
PipelineData *BuildProgram(VertexProgramData &vertexProgramData, FragmentProgramData &fragmentProgramData, const PipelineProperties &pipelineProperties, const ExtraData& extraData)
{
PipelineData *result = new PipelineData();
__glcheck result->create()
.attach(gl::glsl::shader_view(vertexProgramData.id))
.attach(gl::glsl::shader_view(fragmentProgramData.id))
.bind_fragment_data_location("ocol0", 0)
.bind_fragment_data_location("ocol1", 1)
.bind_fragment_data_location("ocol2", 2)
.bind_fragment_data_location("ocol3", 3)
.make();
__glcheck result->use();
2013-11-09 22:29:49 +01:00
LOG_NOTICE(RSX, "*** prog id = %d", result->id());
2015-05-16 01:10:27 +02:00
LOG_NOTICE(RSX, "*** vp id = %d", vertexProgramData.id);
LOG_NOTICE(RSX, "*** fp id = %d", fragmentProgramData.id);
2013-11-09 22:29:49 +01:00
2015-05-16 01:10:27 +02:00
LOG_NOTICE(RSX, "*** vp shader = \n%s", vertexProgramData.shader.c_str());
LOG_NOTICE(RSX, "*** fp shader = \n%s", fragmentProgramData.shader.c_str());
2013-11-09 22:29:49 +01:00
2015-05-16 01:10:27 +02:00
return result;
}
static
void DeleteProgram(PipelineData *ptr)
{
ptr->remove();
2015-05-16 01:10:27 +02:00
}
};
class GLProgramBuffer : public ProgramStateCache<GLTraits>
{
};