Kaydet (Commit) fe9bcdc5 authored tarafından Emmanuel Gil Peyrot's avatar Emmanuel Gil Peyrot Kaydeden (comit) Tomaž Vajngerl

opengl: Add Geometry Shader support to OpenGLHelper

This is the ground work for some later transitions in slideshow.

Change-Id: Ib200cf7fabd579256a5255b0fb5d8c4accf7d24b
(cherry picked from commit facfbeb5)
üst 1a4ce718
...@@ -43,7 +43,10 @@ public: ...@@ -43,7 +43,10 @@ public:
static rtl::OString GetDigest(const OUString& rVertexShaderName, const OUString& rFragmentShaderName, const rtl::OString& preamble = "" ); static rtl::OString GetDigest(const OUString& rVertexShaderName, const OUString& rFragmentShaderName, const rtl::OString& preamble = "" );
static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName, const rtl::OString& preamble = "", const rtl::OString& rDigest = "" ); static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName, const OUString& rGeometryShaderName, const rtl::OString& preamble, const rtl::OString& rDigest );
static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName, const rtl::OString& preamble, const rtl::OString& rDigest );
static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName, const OUString& rGeometryShaderName);
static GLint LoadShaders(const OUString& rVertexShaderName, const OUString& rFragmentShaderName);
/** /**
* The caller is responsible for allocate the memory for the RGBA buffer, before call * The caller is responsible for allocate the memory for the RGBA buffer, before call
......
...@@ -366,10 +366,12 @@ bool OGLTransitionerImpl::initWindowFromSlideShowView( const Reference< presenta ...@@ -366,10 +366,12 @@ bool OGLTransitionerImpl::initWindowFromSlideShowView( const Reference< presenta
aDeviceParams[1] >>= aVal; aDeviceParams[1] >>= aVal;
mpContext = OpenGLContext::Create(); mpContext = OpenGLContext::Create();
mpContext->requestLegacyContext();
if( !mpContext->init( reinterpret_cast< vcl::Window* >( aVal ) ) ) if( !mpContext->init( reinterpret_cast< vcl::Window* >( aVal ) ) ) {
return false; mpContext->requestLegacyContext();
if( !mpContext->init( reinterpret_cast< vcl::Window* >( aVal ) ) )
return false;
}
SAL_INFO("slideshow", "created the context"); SAL_INFO("slideshow", "created the context");
CHECK_GL_ERROR(); CHECK_GL_ERROR();
......
...@@ -302,12 +302,15 @@ namespace ...@@ -302,12 +302,15 @@ namespace
OString createFileName( const OUString& rVertexShaderName, OString createFileName( const OUString& rVertexShaderName,
const OUString& rFragmentShaderName, const OUString& rFragmentShaderName,
const OUString& rGeometryShaderName,
const OString& rDigest ) const OString& rDigest )
{ {
OString aFileName; OString aFileName;
aFileName += getCacheFolder(); aFileName += getCacheFolder();
aFileName += rtl::OUStringToOString( rVertexShaderName, RTL_TEXTENCODING_UTF8 ) + "-"; aFileName += rtl::OUStringToOString( rVertexShaderName, RTL_TEXTENCODING_UTF8 ) + "-";
aFileName += rtl::OUStringToOString( rFragmentShaderName, RTL_TEXTENCODING_UTF8 ) + "-"; aFileName += rtl::OUStringToOString( rFragmentShaderName, RTL_TEXTENCODING_UTF8 ) + "-";
if (!rGeometryShaderName.isEmpty())
aFileName += rtl::OUStringToOString( rGeometryShaderName, RTL_TEXTENCODING_UTF8 ) + "-";
aFileName += rDigest + ".bin"; aFileName += rDigest + ".bin";
return aFileName; return aFileName;
} }
...@@ -376,6 +379,7 @@ rtl::OString OpenGLHelper::GetDigest( const OUString& rVertexShaderName, ...@@ -376,6 +379,7 @@ rtl::OString OpenGLHelper::GetDigest( const OUString& rVertexShaderName,
GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName, GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
const OUString& rFragmentShaderName, const OUString& rFragmentShaderName,
const OUString& rGeometryShaderName,
const OString& preamble, const OString& preamble,
const OString& rDigest) const OString& rDigest)
{ {
...@@ -383,18 +387,23 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName, ...@@ -383,18 +387,23 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
gbInShaderCompile = true; gbInShaderCompile = true;
bool bHasGeometryShader = !rGeometryShaderName.isEmpty();
// create the program object // create the program object
GLint ProgramID = glCreateProgram(); GLint ProgramID = glCreateProgram();
// read shaders from file // read shaders from file
OString aVertexShaderSource = getShaderSource(rVertexShaderName); OString aVertexShaderSource = getShaderSource(rVertexShaderName);
OString aFragmentShaderSource = getShaderSource(rFragmentShaderName); OString aFragmentShaderSource = getShaderSource(rFragmentShaderName);
OString aGeometryShaderSource;
if (bHasGeometryShader)
aGeometryShaderSource = getShaderSource(rGeometryShaderName);
GLint bBinaryResult = GL_FALSE; GLint bBinaryResult = GL_FALSE;
if( GLEW_ARB_get_program_binary && !rDigest.isEmpty() ) if( GLEW_ARB_get_program_binary && !rDigest.isEmpty() )
{ {
OString aFileName = OString aFileName =
createFileName(rVertexShaderName, rFragmentShaderName, rDigest); createFileName(rVertexShaderName, rFragmentShaderName, rGeometryShaderName, rDigest);
bBinaryResult = loadProgramBinary(ProgramID, aFileName); bBinaryResult = loadProgramBinary(ProgramID, aFileName);
VCL_GL_INFO("Load binary shader from '" << aFileName << "'" << bBinaryResult); VCL_GL_INFO("Load binary shader from '" << aFileName << "'" << bBinaryResult);
CHECK_GL_ERROR(); CHECK_GL_ERROR();
...@@ -403,10 +412,16 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName, ...@@ -403,10 +412,16 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
if( bBinaryResult != GL_FALSE ) if( bBinaryResult != GL_FALSE )
return ProgramID; return ProgramID;
VCL_GL_INFO("Load shader: vertex " << rVertexShaderName << " fragment " << rFragmentShaderName); if (bHasGeometryShader)
VCL_GL_INFO("Load shader: vertex " << rVertexShaderName << " fragment " << rFragmentShaderName << " geometry " << rGeometryShaderName);
else
VCL_GL_INFO("Load shader: vertex " << rVertexShaderName << " fragment " << rFragmentShaderName);
// Create the shaders // Create the shaders
GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
GLuint GeometryShaderID = 0;
if (bHasGeometryShader)
GeometryShaderID = glCreateShader(GL_GEOMETRY_SHADER);
GLint Result = GL_FALSE; GLint Result = GL_FALSE;
...@@ -436,9 +451,27 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName, ...@@ -436,9 +451,27 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
return LogCompilerError(FragmentShaderID, "fragment", return LogCompilerError(FragmentShaderID, "fragment",
rFragmentShaderName, true); rFragmentShaderName, true);
if (bHasGeometryShader)
{
// Compile Geometry Shader
if( !preamble.isEmpty())
addPreamble( aGeometryShaderSource, preamble );
char const * GeometrySourcePointer = aGeometryShaderSource.getStr();
glShaderSource(GeometryShaderID, 1, &GeometrySourcePointer , nullptr);
glCompileShader(GeometryShaderID);
// Check Geometry Shader
glGetShaderiv(GeometryShaderID, GL_COMPILE_STATUS, &Result);
if (!Result)
return LogCompilerError(GeometryShaderID, "geometry",
rGeometryShaderName, true);
}
// Link the program // Link the program
glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, VertexShaderID);
glAttachShader(ProgramID, FragmentShaderID); glAttachShader(ProgramID, FragmentShaderID);
if (bHasGeometryShader)
glAttachShader(ProgramID, GeometryShaderID);
if( GLEW_ARB_get_program_binary && !rDigest.isEmpty() ) if( GLEW_ARB_get_program_binary && !rDigest.isEmpty() )
{ {
...@@ -451,7 +484,7 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName, ...@@ -451,7 +484,7 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
return LogCompilerError(ProgramID, "program", "<both>", false); return LogCompilerError(ProgramID, "program", "<both>", false);
} }
OString aFileName = OString aFileName =
createFileName(rVertexShaderName, rFragmentShaderName, rDigest); createFileName(rVertexShaderName, rFragmentShaderName, rGeometryShaderName, rDigest);
saveProgramBinary(ProgramID, aFileName); saveProgramBinary(ProgramID, aFileName);
} }
else else
...@@ -461,6 +494,8 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName, ...@@ -461,6 +494,8 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
glDeleteShader(VertexShaderID); glDeleteShader(VertexShaderID);
glDeleteShader(FragmentShaderID); glDeleteShader(FragmentShaderID);
if (bHasGeometryShader)
glDeleteShader(GeometryShaderID);
// Check the program // Check the program
glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
...@@ -476,6 +511,27 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName, ...@@ -476,6 +511,27 @@ GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
return ProgramID; return ProgramID;
} }
GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
const OUString& rFragmentShaderName,
const OString& preamble,
const OString& rDigest)
{
return LoadShaders(rVertexShaderName, rFragmentShaderName, OUString(), preamble, rDigest);
}
GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
const OUString& rFragmentShaderName,
const OUString& rGeometryShaderName)
{
return LoadShaders(rVertexShaderName, rFragmentShaderName, rGeometryShaderName, OString(), OString());
}
GLint OpenGLHelper::LoadShaders(const OUString& rVertexShaderName,
const OUString& rFragmentShaderName)
{
return LoadShaders(rVertexShaderName, rFragmentShaderName, OUString(), "", "");
}
void OpenGLHelper::ConvertBitmapExToRGBATextureBuffer(const BitmapEx& rBitmapEx, sal_uInt8* o_pRGBABuffer, const bool bFlip) void OpenGLHelper::ConvertBitmapExToRGBATextureBuffer(const BitmapEx& rBitmapEx, sal_uInt8* o_pRGBABuffer, const bool bFlip)
{ {
long nBmpWidth = rBitmapEx.GetSizePixel().Width(); long nBmpWidth = rBitmapEx.GetSizePixel().Width();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment