From eae6fea9d9c550789134188f0ab0580eb36bb2a0 Mon Sep 17 00:00:00 2001 From: Karl Blomster Date: Mon, 20 Jul 2009 01:32:01 +0000 Subject: [PATCH] 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. --- aegisub/src/dialog_options.cpp | 3 - aegisub/src/gl_wrap.cpp | 208 --------------------------- aegisub/src/gl_wrap.h | 10 -- aegisub/src/options.cpp | 1 - aegisub/src/video_context.cpp | 20 --- aegisub/src/video_context.h | 2 - aegisub/src/video_display.cpp | 2 - aegisub/src/video_provider_avs.cpp | 6 +- aegisub/src/video_provider_dshow.cpp | 1 - 9 files changed, 2 insertions(+), 251 deletions(-) diff --git a/aegisub/src/dialog_options.cpp b/aegisub/src/dialog_options.cpp index ee5bba40b..c746c36ed 100644 --- a/aegisub/src/dialog_options.cpp +++ b/aegisub/src/dialog_options.cpp @@ -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); diff --git a/aegisub/src/gl_wrap.cpp b/aegisub/src/gl_wrap.cpp index 39dd6ed05..f6d1e179e 100644 --- a/aegisub/src/gl_wrap.cpp +++ b/aegisub/src/gl_wrap.cpp @@ -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 diff --git a/aegisub/src/gl_wrap.h b/aegisub/src/gl_wrap.h index eb0201d2e..a072b7013 100644 --- a/aegisub/src/gl_wrap.h +++ b/aegisub/src/gl_wrap.h @@ -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); }; diff --git a/aegisub/src/options.cpp b/aegisub/src/options.cpp index 34ba0c923..02ef17cf6 100644 --- a/aegisub/src/options.cpp +++ b/aegisub/src/options.cpp @@ -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); diff --git a/aegisub/src/video_context.cpp b/aegisub/src/video_context.cpp index 18ee6516f..ff3249cb8 100644 --- a/aegisub/src/video_context.cpp +++ b/aegisub/src/video_context.cpp @@ -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) diff --git a/aegisub/src/video_context.h b/aegisub/src/video_context.h index d2c3ec4ad..bd21a89b8 100644 --- a/aegisub/src/video_context.h +++ b/aegisub/src/video_context.h @@ -83,7 +83,6 @@ private: std::list 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; } diff --git a/aegisub/src/video_display.cpp b/aegisub/src/video_display.cpp index bc09ef752..79c69fc97 100644 --- a/aegisub/src/video_display.cpp +++ b/aegisub/src/video_display.cpp @@ -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 diff --git a/aegisub/src/video_provider_avs.cpp b/aegisub/src/video_provider_avs.cpp index 5b85b1ff2..66528bf7f 100644 --- a/aegisub/src/video_provider_avs.cpp +++ b/aegisub/src/video_provider_avs.cpp @@ -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")); diff --git a/aegisub/src/video_provider_dshow.cpp b/aegisub/src/video_provider_dshow.cpp index b5199e774..9c406dbb9 100644 --- a/aegisub/src/video_provider_dshow.cpp +++ b/aegisub/src/video_provider_dshow.cpp @@ -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