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:
Karl Blomster 2009-07-20 01:32:01 +00:00
parent 17abf6965e
commit eae6fea9d9
9 changed files with 2 additions and 251 deletions

View File

@ -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);

View File

@ -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

View File

@ -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);
};

View File

@ -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);

View File

@ -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)

View File

@ -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; }

View File

@ -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

View File

@ -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"));

View File

@ -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