forked from mia/Aegisub
The Great Colorspace Reworking of '09, part 1 of ???: remove all traces of the YV12->RGB32 OpenGL shader program, as it was very broken and nobody ever used it. Updates #926.
Originally committed to SVN as r3180.
This commit is contained in:
parent
17abf6965e
commit
eae6fea9d9
9 changed files with 2 additions and 251 deletions
|
@ -409,9 +409,6 @@ DialogOptions::DialogOptions(wxWindow *parent)
|
|||
//control = new wxCheckBox(videoPage,-1,_("Threaded video"));
|
||||
//Bind(control,_T("Threaded video"));
|
||||
//videoSizer4->Add(control,1,wxEXPAND);
|
||||
//control = new wxCheckBox(videoPage,-1,_("Use pixel shaders if available"));
|
||||
//Bind(control,_T("Video use pixel shaders"));
|
||||
//videoSizer4->Add(control,1,wxEXPAND);
|
||||
control = new wxCheckBox(videoPage,-1,_("Allow pre-2.56a Avisynth"));
|
||||
Bind(control,_T("Allow Ancient Avisynth"));
|
||||
videoSizer4->Add(control,1,wxEXPAND);
|
||||
|
|
|
@ -61,22 +61,6 @@ void* glGetProc(const char *str) { return wglGetProcAddress(str); }
|
|||
#endif
|
||||
|
||||
|
||||
//////////////////////////////////////
|
||||
// OpenGL extension function pointers
|
||||
#ifndef __APPLE__
|
||||
PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
|
||||
PFNGLDELETEOBJECTARBPROC glDeleteObjectARB = NULL;
|
||||
PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
|
||||
PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
|
||||
PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
|
||||
PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
|
||||
PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
|
||||
PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
|
||||
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
|
||||
PFNGLUNIFORM1IARBPROC glUniform1iARB = NULL;
|
||||
PFNGLUNIFORM2FARBPROC glUniform2fARB = NULL;
|
||||
#endif
|
||||
|
||||
|
||||
///////////////
|
||||
// Constructor
|
||||
|
@ -306,27 +290,6 @@ void OpenGLWrapper::SetModeFill() {
|
|||
}
|
||||
|
||||
|
||||
//////////////////////////
|
||||
// Are shaders available?
|
||||
bool OpenGLWrapper::ShadersAvailable() {
|
||||
static bool first = true;
|
||||
static bool available = false;
|
||||
if (first) {
|
||||
first = false;
|
||||
available = IsExtensionSupported("GL_ARB_vertex_shader") && IsExtensionSupported("GL_ARB_fragment_shader");
|
||||
if (!available) wxMessageBox(_T("Warning, OpenGL shaders are not available on this machine. YV12 video will be on greyscale."),_T("GL Shaders Error"));
|
||||
}
|
||||
return available;
|
||||
}
|
||||
|
||||
|
||||
////////////////
|
||||
// Use shaders?
|
||||
bool OpenGLWrapper::UseShaders() {
|
||||
return Options.AsBool(_T("Video Use Pixel Shaders")) && ShadersAvailable();
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////
|
||||
// Is extension supported?
|
||||
bool OpenGLWrapper::IsExtensionSupported(const char *ext) {
|
||||
|
@ -336,177 +299,6 @@ bool OpenGLWrapper::IsExtensionSupported(const char *ext) {
|
|||
}
|
||||
|
||||
|
||||
///////////////////
|
||||
// Initialize GLEW
|
||||
void OpenGLWrapper::Initialize() {
|
||||
static bool initialized = false;
|
||||
if (!initialized) {
|
||||
initialized = true;
|
||||
|
||||
#ifndef __WXMAC_OSX__
|
||||
glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) glGetProc("glUseProgramObjectARB");
|
||||
if (!glUseProgramObjectARB) throw _T("OpenGL shader support not available.");
|
||||
glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) glGetProc("glDeleteObjectARB");
|
||||
glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) glGetProc("glCreateProgramObjectARB");
|
||||
glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) glGetProc("glAttachObjectARB");
|
||||
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) glGetProc("glLinkProgramARB");
|
||||
glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) glGetProc("glCreateShaderObjectARB");
|
||||
glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) glGetProc("glShaderSourceARB");
|
||||
glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) glGetProc("glCompileShaderARB");
|
||||
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) glGetProc("glGetUniformLocationARB");
|
||||
glUniform1iARB = (PFNGLUNIFORM1IARBPROC) glGetProc("glUniform1iARB");
|
||||
glUniform2fARB = (PFNGLUNIFORM2FARBPROC) glGetProc("glUniform2fARB");
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////
|
||||
// Set current shader
|
||||
void OpenGLWrapper::SetShader(GLhandleARB i) {
|
||||
if (UseShaders()) {
|
||||
Initialize();
|
||||
glUseProgramObjectARB(i);
|
||||
if (glGetError()) throw _T("Could not set shader program.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////
|
||||
// Destroy shader program
|
||||
void OpenGLWrapper::DestroyShaderProgram(GLhandleARB i) {
|
||||
if (UseShaders()) {
|
||||
Initialize();
|
||||
SetShader(0);
|
||||
glDeleteObjectARB(i);
|
||||
if (glGetError()) throw _T("Error removing shader program.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////
|
||||
// Create shader program from vertex and pixel shaders
|
||||
GLhandleARB OpenGLWrapper::CreateShaderProgram(GLhandleARB vertex,GLhandleARB pixel) {
|
||||
// Create instance
|
||||
Initialize();
|
||||
GLhandleARB program = glCreateProgramObjectARB();
|
||||
if (glGetError()) throw _T("Error creating shader program.");
|
||||
|
||||
// Attach shaders
|
||||
glAttachObjectARB(program,vertex);
|
||||
if (glGetError()) throw _T("Error attaching vertex shader to shader program.");
|
||||
glAttachObjectARB(program,pixel);
|
||||
if (glGetError()) throw _T("Error attaching pixel shader to shader program.");
|
||||
|
||||
// Link
|
||||
glLinkProgramARB(program);
|
||||
if (glGetError()) throw _T("Error attaching linking shader program.");
|
||||
|
||||
// Return
|
||||
return program;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////
|
||||
// Create standard Vertex shader
|
||||
GLhandleARB OpenGLWrapper::CreateStandardVertexShader() {
|
||||
// Create instance
|
||||
Initialize();
|
||||
GLhandleARB shader = glCreateShaderObjectARB(GL_VERTEX_SHADER);
|
||||
if (glGetError()) throw _T("Error generating vertex shader.");
|
||||
|
||||
// Read source
|
||||
char source[] =
|
||||
"void main() {\n"
|
||||
" gl_TexCoord[0] = gl_MultiTexCoord0;\n"
|
||||
" gl_Position = ftransform();\n"
|
||||
"}";
|
||||
|
||||
// Compile
|
||||
const GLchar *src = source;
|
||||
glShaderSourceARB(shader,1,&src,NULL);
|
||||
if (glGetError()) throw _T("Error acquiring source for vertex shader.");
|
||||
glCompileShaderARB(shader);
|
||||
if (glGetError()) throw _T("Error compiling vertex shader.");
|
||||
|
||||
// Return
|
||||
return shader;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////
|
||||
// Create YV12->RGB32 Pixel Shader
|
||||
GLhandleARB OpenGLWrapper::CreateYV12PixelShader() {
|
||||
// Create instance
|
||||
Initialize();
|
||||
GLhandleARB shader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER);
|
||||
if (glGetError()) throw _T("Error generating pixel shader.");
|
||||
|
||||
// Read source
|
||||
char source[] =
|
||||
"uniform sampler2D tex;\n"
|
||||
"uniform vec2 off1;\n"
|
||||
"uniform vec2 off2;\n"
|
||||
"\n"
|
||||
"void main() {\n"
|
||||
" vec2 pos = gl_TexCoord[0].st;\n"
|
||||
" vec4 y_bias = vec4(-0.063,-0.063,-0.063,0.0);\n"
|
||||
" vec4 y_mult = vec4(1.164,1.164,1.164,1.0);\n"
|
||||
" vec4 color_y = (texture2D(tex,pos) + y_bias) * y_mult;\n"
|
||||
" pos *= 0.5;\n"
|
||||
" vec4 uv_bias = vec4(-0.5,-0.5,-0.5,0.0);\n"
|
||||
" vec4 uv_mult = vec4(0.0,-0.391,2.018,1.0);\n"
|
||||
//" vec4 uv_mult = vec4(0.0,-0.344,1.770,1.0);\n"
|
||||
" vec4 color_u = (texture2D(tex,pos + off1) + uv_bias) * uv_mult;\n"
|
||||
" uv_mult = vec4(1.596,-0.813,0.0,1.0);\n"
|
||||
//" uv_mult = vec4(1.403,-0.714,0.0,1.0);\n"
|
||||
" vec4 color_v = (texture2D(tex,pos + off2) + uv_bias) * uv_mult;\n"
|
||||
" gl_FragColor = color_y + color_u + color_v;\n"
|
||||
"}";
|
||||
|
||||
// Compile
|
||||
const GLchar *src = source;
|
||||
glShaderSourceARB(shader,1,&src,NULL);
|
||||
if (glGetError()) throw _T("Error acquiring source for vertex shader.");
|
||||
glCompileShaderARB(shader);
|
||||
if (glGetError()) throw _T("Error compiling vertex shader.");
|
||||
|
||||
// Return
|
||||
return shader;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////////
|
||||
// Create YV12->RGB32 Shader Program
|
||||
GLhandleARB OpenGLWrapper::CreateYV12Shader(float tw,float th,float tws) {
|
||||
// Create vertex shader
|
||||
GLhandleARB ver = OpenGLWrapper::CreateStandardVertexShader();
|
||||
if (glGetError() != 0) throw _T("Error creating generic vertex shader");
|
||||
|
||||
// Create pixel shader
|
||||
GLhandleARB pix = OpenGLWrapper::CreateYV12PixelShader();
|
||||
if (glGetError() != 0) throw _T("Error creating YV12 pixel shader");
|
||||
|
||||
// Create program
|
||||
GLhandleARB program = OpenGLWrapper::CreateShaderProgram(ver,pix);
|
||||
if (glGetError() != 0) throw _T("Error creating shader program");
|
||||
|
||||
// Set shader
|
||||
OpenGLWrapper::SetShader(program);
|
||||
if (glGetError() != 0) throw _T("Error setting shader");
|
||||
|
||||
// Set uniform variables
|
||||
GLuint address = glGetUniformLocationARB(program,"tex");
|
||||
glUniform1iARB(address, 0);
|
||||
address = glGetUniformLocationARB(program,"off1");
|
||||
glUniform2fARB(address, 0.0f, th);
|
||||
address = glGetUniformLocationARB(program,"off2");
|
||||
glUniform2fARB(address, tws, th);
|
||||
|
||||
// Return shader
|
||||
return program;
|
||||
}
|
||||
|
||||
|
||||
/////////
|
||||
// Mutex
|
||||
|
|
|
@ -55,11 +55,6 @@ private:
|
|||
float r2,g2,b2,a2;
|
||||
int lw;
|
||||
|
||||
static void Initialize();
|
||||
static GLhandleARB CreateStandardVertexShader();
|
||||
static GLhandleARB CreateYV12PixelShader();
|
||||
static GLhandleARB CreateShaderProgram(GLhandleARB vertex,GLhandleARB pixel);
|
||||
|
||||
public:
|
||||
OpenGLWrapper();
|
||||
|
||||
|
@ -77,10 +72,5 @@ public:
|
|||
void DrawRing(float x,float y,float r1,float r2,float ar=1.0f,float arcStart=0.0f,float arcEnd=0.0f);
|
||||
void DrawTriangle(float x1,float y1,float x2,float y2,float x3,float y3);
|
||||
|
||||
static bool UseShaders();
|
||||
static bool IsExtensionSupported(const char *ext);
|
||||
static bool ShadersAvailable();
|
||||
static void SetShader(GLhandleARB i);
|
||||
static void DestroyShaderProgram(GLhandleARB i);
|
||||
static GLhandleARB CreateYV12Shader(float tw,float th,float tws);
|
||||
};
|
||||
|
|
|
@ -173,7 +173,6 @@ void OptionsManager::LoadDefaults(bool onlyDefaults,bool doOverride) {
|
|||
#else
|
||||
SetText(_T("Subtitles Provider"),_T(DEFAULT_PROVIDER_SUBTITLE));
|
||||
#endif
|
||||
SetBool(_T("Video Use Pixel Shaders"),false,1700);
|
||||
SetInt(_T("FFmpegSource max cache size"),42);
|
||||
SetInt(_T("FFmpegSource max cache files"),20);
|
||||
SetInt(_T("FFmpegSource always index all tracks"), true);
|
||||
|
|
|
@ -100,7 +100,6 @@ VideoContext::VideoContext() {
|
|||
ownGlContext = false;
|
||||
lastTex = 0;
|
||||
lastFrame = -1;
|
||||
yv12shader = 0;
|
||||
|
||||
// Set options
|
||||
audio = NULL;
|
||||
|
@ -162,12 +161,6 @@ void VideoContext::Reset() {
|
|||
// Reset ?video path
|
||||
StandardPaths::SetPathValue(_T("?video"),_T(""));
|
||||
|
||||
// Reset shader
|
||||
if (yv12shader) {
|
||||
OpenGLWrapper::DestroyShaderProgram(yv12shader);
|
||||
yv12shader = 0;
|
||||
}
|
||||
|
||||
// Clear keyframes
|
||||
KeyFrames.Clear();
|
||||
keyFramesLoaded = false;
|
||||
|
@ -501,7 +494,6 @@ AegiVideoFrame VideoContext::GetFrame(int n,bool raw) {
|
|||
|
||||
// Get available formats
|
||||
int formats = FORMAT_RGB32;
|
||||
if (yv12shader != 0 || OpenGLWrapper::UseShaders()) formats |= FORMAT_YV12;
|
||||
|
||||
// Get frame
|
||||
AegiVideoFrame frame = provider->GetFrame(n,formats);
|
||||
|
@ -597,11 +589,6 @@ GLuint VideoContext::GetFrameAsTexture(int n) {
|
|||
//glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
|
||||
//if (glGetError() != 0) throw _T("Error setting hinting.");
|
||||
|
||||
// Create shader
|
||||
if (frame.format == FORMAT_YV12 && yv12shader == 0 && OpenGLWrapper::UseShaders()) {
|
||||
yv12shader = OpenGLWrapper::CreateYV12Shader(texW,texH,float(frame.pitch[1])/float(tw));
|
||||
}
|
||||
|
||||
// Set priority
|
||||
float priority = 1.0f;
|
||||
glPrioritizeTextures(1,&lastTex,&priority);
|
||||
|
@ -880,13 +867,6 @@ void VideoContext::SetAspectRatio(int _type, double value) {
|
|||
}
|
||||
|
||||
|
||||
////////////////////////////
|
||||
// Enable or disable shader
|
||||
void VideoContext::SetShader(bool enabled) {
|
||||
OpenGLWrapper::SetShader(enabled ? yv12shader : 0);
|
||||
}
|
||||
|
||||
|
||||
//////////////////////
|
||||
// Thread constructor
|
||||
VideoContextThread::VideoContextThread(VideoContext *par)
|
||||
|
|
|
@ -83,7 +83,6 @@ private:
|
|||
std::list<VideoDisplay*> displayList;
|
||||
|
||||
GLuint lastTex;
|
||||
GLhandleARB yv12shader;
|
||||
int lastFrame;
|
||||
bool ownGlContext;
|
||||
wxGLContext *glContext;
|
||||
|
@ -154,7 +153,6 @@ public:
|
|||
float GetTexW() { return texW; }
|
||||
float GetTexH() { return texH; }
|
||||
VideoFrameFormat GetFormat() { return vidFormat; }
|
||||
void SetShader(bool enabled);
|
||||
|
||||
bool IsLoaded() { return loaded; }
|
||||
bool IsPlaying() { return isPlaying; }
|
||||
|
|
|
@ -278,7 +278,6 @@ try {
|
|||
// Draw frame
|
||||
glDisable(GL_BLEND);
|
||||
if (glGetError()) throw _T("Error disabling blending.");
|
||||
context->SetShader(true);
|
||||
glBindTexture(GL_TEXTURE_2D, VideoContext::Get()->GetFrameAsTexture(-1));
|
||||
if (glGetError()) throw _T("Error binding texture.");
|
||||
glColor4f(1.0f,1.0f,1.0f,1.0f);
|
||||
|
@ -296,7 +295,6 @@ try {
|
|||
glTexCoord2f(right,top);
|
||||
glVertex2f(sw,0);
|
||||
glEnd();
|
||||
context->SetShader(false);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
|
||||
// TV effects
|
||||
|
|
|
@ -330,10 +330,8 @@ PClip AvisynthVideoProvider::OpenVideo(Aegisub::String _filename, bool mpeg2dec3
|
|||
}
|
||||
|
||||
// Convert to RGB32
|
||||
if (!OpenGLWrapper::UseShaders()) {
|
||||
script = env->Invoke("ConvertToRGB32", script);
|
||||
AVSTRACE(_T("AvisynthVideoProvider::OpenVideo: Converted to RGB32"));
|
||||
}
|
||||
script = env->Invoke("ConvertToRGB32", script);
|
||||
AVSTRACE(_T("AvisynthVideoProvider::OpenVideo: Converted to RGB32"));
|
||||
|
||||
// Cache
|
||||
AVSTRACE(_T("AvisynthVideoProvider::OpenVideo: Finished opening video, AVS mutex will be released now"));
|
||||
|
|
|
@ -219,7 +219,6 @@ HRESULT DirectShowVideoProvider::OpenVideo(wxString _filename) {
|
|||
|
||||
// Set allowed types for sink
|
||||
unsigned int types = IVS_RGB24 | IVS_RGB32;
|
||||
if (OpenGLWrapper::UseShaders()) types = types | IVS_YV12;
|
||||
sink->SetAllowedTypes(types);
|
||||
|
||||
// Pass the event to sink, so it gets set when a frame is available
|
||||
|
|
Loading…
Reference in a new issue