зеркало из https://github.com/AvaloniaUI/angle.git
Initial import from TransGaming
git-svn-id: https://angleproject.googlecode.com/svn/trunk@2 736b8ea6-26fd-11df-bfd4-992fa37f6226
This commit is contained in:
Родитель
eff14256db
Коммит
4f39fd9956
|
@ -0,0 +1,18 @@
|
|||
Debug
|
||||
Release
|
||||
ANGLE.ncb
|
||||
ANGLE.suo
|
||||
Compiler/Compiler.vcproj.*
|
||||
Compiler/Gen_glslang.cpp
|
||||
Compiler/Gen_glslang_tab.cpp
|
||||
Compiler/glslang.output
|
||||
Compiler/glslang_tab.h
|
||||
Compiler/Debug
|
||||
Compiler/Release
|
||||
libEGL/Debug
|
||||
libEGL/Release
|
||||
libEGL/libEGL.vcproj.*
|
||||
libGLESv2/Debug
|
||||
libGLESv2/Release
|
||||
libGLESv2/libGLESv2.vcproj.*
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||
# Visual C++ Express 2008
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libEGL", "libEGL\libEGL.vcproj", "{E746FCA9-64C3-433E-85E8-9A5A67AB7ED6}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{B5871A7A-968C-42E3-A33B-981E6F448E78} = {B5871A7A-968C-42E3-A33B-981E6F448E78}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libGLESv2", "libGLESv2\libGLESv2.vcproj", "{B5871A7A-968C-42E3-A33B-981E6F448E78}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{5B3A6DB8-1E7E-40D7-92B9-DA8AAE619FAD} = {5B3A6DB8-1E7E-40D7-92B9-DA8AAE619FAD}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Compiler", "Compiler\Compiler.vcproj", "{5B3A6DB8-1E7E-40D7-92B9-DA8AAE619FAD}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{E746FCA9-64C3-433E-85E8-9A5A67AB7ED6}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{E746FCA9-64C3-433E-85E8-9A5A67AB7ED6}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{E746FCA9-64C3-433E-85E8-9A5A67AB7ED6}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{E746FCA9-64C3-433E-85E8-9A5A67AB7ED6}.Release|Win32.Build.0 = Release|Win32
|
||||
{B5871A7A-968C-42E3-A33B-981E6F448E78}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{B5871A7A-968C-42E3-A33B-981E6F448E78}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{B5871A7A-968C-42E3-A33B-981E6F448E78}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{B5871A7A-968C-42E3-A33B-981E6F448E78}.Release|Win32.Build.0 = Release|Win32
|
||||
{5B3A6DB8-1E7E-40D7-92B9-DA8AAE619FAD}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{5B3A6DB8-1E7E-40D7-92B9-DA8AAE619FAD}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{5B3A6DB8-1E7E-40D7-92B9-DA8AAE619FAD}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{5B3A6DB8-1E7E-40D7-92B9-DA8AAE619FAD}.Release|Win32.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,15 @@
|
|||
# This is the official list of The ANGLE Project Authors
|
||||
# for copyright purposes.
|
||||
# This file is distinct from the CONTRIBUTORS files.
|
||||
# See the latter for an explanation.
|
||||
|
||||
# Names should be added to this file as
|
||||
# Name or Organization <email address>
|
||||
# The email address is not required for organizations.
|
||||
|
||||
TransGaming Inc.
|
||||
|
||||
Google Inc.
|
||||
|
||||
3DLabs Inc. Ltd.
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# This is the official list of people who can contribute
|
||||
# (and who have contributed) code to the ANGLE project
|
||||
# repository.
|
||||
# The AUTHORS file lists the copyright holders; this file
|
||||
# lists people. For example, Google employees are listed here
|
||||
# but not in AUTHORS, because Google holds the copyright.
|
||||
#
|
||||
|
||||
TransGaming Inc.
|
||||
Nicolas Capens
|
||||
Daniel Koch
|
||||
Andrew Lewycky
|
||||
Gavriel State
|
||||
Shannon Woods
|
||||
|
||||
Google Inc.
|
||||
Henry Bridge
|
||||
Vangelis Kokkevis
|
|
@ -0,0 +1,36 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// debug.cpp: Debugging utilities.
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
namespace gl
|
||||
{
|
||||
void trace(const char *format, ...)
|
||||
{
|
||||
if (true)
|
||||
{
|
||||
if (format)
|
||||
{
|
||||
FILE *file = fopen("debug.txt", "a");
|
||||
|
||||
if (file)
|
||||
{
|
||||
va_list vararg;
|
||||
va_start(vararg, format);
|
||||
vfprintf(file, format, vararg);
|
||||
va_end(vararg);
|
||||
|
||||
fclose(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,130 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _BASICTYPES_INCLUDED_
|
||||
#define _BASICTYPES_INCLUDED_
|
||||
|
||||
//
|
||||
// Precision qualifiers
|
||||
//
|
||||
enum TPrecision
|
||||
{
|
||||
EbpHigh,
|
||||
EbpMedium,
|
||||
EbpLow,
|
||||
};
|
||||
|
||||
__inline const char* getPrecisionString(TPrecision p)
|
||||
{
|
||||
switch(p)
|
||||
{
|
||||
case EbpHigh: return "highp"; break;
|
||||
case EbpMedium: return "mediump"; break;
|
||||
case EbpLow: return "lowp"; break;
|
||||
default: return "unknown precision";
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Basic type. Arrays, vectors, etc., are orthogonal to this.
|
||||
//
|
||||
enum TBasicType
|
||||
{
|
||||
EbtVoid,
|
||||
EbtFloat,
|
||||
EbtInt,
|
||||
EbtBool,
|
||||
EbtGuardSamplerBegin, // non type: see implementation of IsSampler()
|
||||
EbtSampler2D,
|
||||
EbtSamplerCube,
|
||||
EbtGuardSamplerEnd, // non type: see implementation of IsSampler()
|
||||
EbtStruct,
|
||||
EbtAddress, // should be deprecated??
|
||||
};
|
||||
|
||||
__inline bool IsSampler(TBasicType type)
|
||||
{
|
||||
return type > EbtGuardSamplerBegin && type < EbtGuardSamplerEnd;
|
||||
}
|
||||
|
||||
//
|
||||
// Qualifiers and built-ins. These are mainly used to see what can be read
|
||||
// or written, and by the machine dependent translator to know which registers
|
||||
// to allocate variables in. Since built-ins tend to go to different registers
|
||||
// than varying or uniform, it makes sense they are peers, not sub-classes.
|
||||
//
|
||||
enum TQualifier
|
||||
{
|
||||
EvqTemporary, // For temporaries (within a function), read/write
|
||||
EvqGlobal, // For globals read/write
|
||||
EvqConst, // User defined constants and non-output parameters in functions
|
||||
EvqAttribute, // Readonly
|
||||
EvqVaryingIn, // readonly, fragment shaders only
|
||||
EvqVaryingOut, // vertex shaders only read/write
|
||||
EvqInvariantVaryingIn, // readonly, fragment shaders only
|
||||
EvqInvariantVaryingOut, // vertex shaders only read/write
|
||||
EvqUniform, // Readonly, vertex and fragment
|
||||
|
||||
// pack/unpack input and output
|
||||
EvqInput,
|
||||
EvqOutput,
|
||||
|
||||
// parameters
|
||||
EvqIn,
|
||||
EvqOut,
|
||||
EvqInOut,
|
||||
EvqConstReadOnly,
|
||||
|
||||
// built-ins written by vertex shader
|
||||
EvqPosition,
|
||||
EvqPointSize,
|
||||
|
||||
// built-ins read by fragment shader
|
||||
EvqFragCoord,
|
||||
EvqFrontFacing,
|
||||
EvqPointCoord,
|
||||
|
||||
// built-ins written by fragment shader
|
||||
EvqFragColor,
|
||||
EvqFragData,
|
||||
|
||||
// end of list
|
||||
EvqLast,
|
||||
};
|
||||
|
||||
//
|
||||
// This is just for debug print out, carried along with the definitions above.
|
||||
//
|
||||
__inline const char* getQualifierString(TQualifier q)
|
||||
{
|
||||
switch(q)
|
||||
{
|
||||
case EvqTemporary: return "Temporary"; break;
|
||||
case EvqGlobal: return "Global"; break;
|
||||
case EvqConst: return "const"; break;
|
||||
case EvqConstReadOnly: return "const"; break;
|
||||
case EvqAttribute: return "attribute"; break;
|
||||
case EvqVaryingIn: return "varying"; break;
|
||||
case EvqVaryingOut: return "varying"; break;
|
||||
case EvqInvariantVaryingIn: return "invariant varying"; break;
|
||||
case EvqInvariantVaryingOut:return "invariant varying"; break;
|
||||
case EvqUniform: return "uniform"; break;
|
||||
case EvqIn: return "in"; break;
|
||||
case EvqOut: return "out"; break;
|
||||
case EvqInOut: return "inout"; break;
|
||||
case EvqInput: return "input"; break;
|
||||
case EvqOutput: return "output"; break;
|
||||
case EvqPosition: return "Position"; break;
|
||||
case EvqPointSize: return "PointSize"; break;
|
||||
case EvqFragCoord: return "FragCoord"; break;
|
||||
case EvqFrontFacing: return "FrontFacing"; break;
|
||||
case EvqFragColor: return "FragColor"; break;
|
||||
case EvqFragData: return "FragData"; break;
|
||||
default: return "unknown qualifier";
|
||||
}
|
||||
}
|
||||
|
||||
#endif // _BASICTYPES_INCLUDED_
|
|
@ -0,0 +1,47 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#include "Common.h"
|
||||
#include "ShHandle.h"
|
||||
|
||||
//
|
||||
// Here is where real machine specific high-level data would be defined.
|
||||
//
|
||||
class TGenericCompiler : public TCompiler {
|
||||
public:
|
||||
TGenericCompiler(EShLanguage l, int dOptions) : TCompiler(l, infoSink), debugOptions(dOptions) { }
|
||||
virtual bool compile(TIntermNode* root);
|
||||
TInfoSink infoSink;
|
||||
int debugOptions;
|
||||
};
|
||||
|
||||
//
|
||||
// This function must be provided to create the actual
|
||||
// compile object used by higher level code. It returns
|
||||
// a subclass of TCompiler.
|
||||
//
|
||||
TCompiler* ConstructCompiler(EShLanguage language, int debugOptions)
|
||||
{
|
||||
return new TGenericCompiler(language, debugOptions);
|
||||
}
|
||||
|
||||
//
|
||||
// Delete the compiler made by ConstructCompiler
|
||||
//
|
||||
void DeleteCompiler(TCompiler* compiler)
|
||||
{
|
||||
delete compiler;
|
||||
}
|
||||
|
||||
//
|
||||
// Generate code from the given parse tree
|
||||
//
|
||||
bool TGenericCompiler::compile(TIntermNode *root)
|
||||
{
|
||||
haveValidObjectCode = true;
|
||||
|
||||
return haveValidObjectCode;
|
||||
}
|
|
@ -0,0 +1,164 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _COMMON_INCLUDED_
|
||||
#define _COMMON_INCLUDED_
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <basetsd.h>
|
||||
#elif defined (solaris)
|
||||
#include <sys/int_types.h>
|
||||
#define UINT_PTR uintptr_t
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#define UINT_PTR uintptr_t
|
||||
#endif
|
||||
|
||||
/* windows only pragma */
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4786) // Don't warn about too long identifiers
|
||||
#pragma warning(disable : 4514) // unused inline method
|
||||
#pragma warning(disable : 4201) // nameless union
|
||||
#endif
|
||||
|
||||
//
|
||||
// Doing the push and pop below for warnings does not leave the warning state
|
||||
// the way it was. This seems like a defect in the compiler. We would like
|
||||
// to do this, but since it does not work correctly right now, it is turned
|
||||
// off.
|
||||
//
|
||||
//??#pragma warning(push, 3)
|
||||
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <stdio.h>
|
||||
|
||||
//??#pragma warning(pop)
|
||||
|
||||
typedef int TSourceLoc;
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include "PoolAlloc.h"
|
||||
|
||||
//
|
||||
// Put POOL_ALLOCATOR_NEW_DELETE in base classes to make them use this scheme.
|
||||
//
|
||||
#define POOL_ALLOCATOR_NEW_DELETE(A) \
|
||||
void* operator new(size_t s) { return (A).allocate(s); } \
|
||||
void* operator new(size_t, void *_Where) { return (_Where); } \
|
||||
void operator delete(void*) { } \
|
||||
void operator delete(void *, void *) { } \
|
||||
void* operator new[](size_t s) { return (A).allocate(s); } \
|
||||
void* operator new[](size_t, void *_Where) { return (_Where); } \
|
||||
void operator delete[](void*) { } \
|
||||
void operator delete[](void *, void *) { }
|
||||
|
||||
#define TBaseMap std::map
|
||||
#define TBaseList std::list
|
||||
#define TBaseSet std::set
|
||||
|
||||
//
|
||||
// Pool version of string.
|
||||
//
|
||||
typedef pool_allocator<char> TStringAllocator;
|
||||
typedef std::basic_string <char, std::char_traits<char>, TStringAllocator > TString;
|
||||
inline TString* NewPoolTString(const char* s)
|
||||
{
|
||||
void* memory = GlobalPoolAllocator.allocate(sizeof(TString));
|
||||
return new(memory) TString(s);
|
||||
}
|
||||
|
||||
//
|
||||
// Pool allocator versions of vectors, lists, and maps
|
||||
//
|
||||
template <class T> class TVector : public std::vector<T, pool_allocator<T> > {
|
||||
public:
|
||||
typedef typename std::vector<T, pool_allocator<T> >::size_type size_type;
|
||||
TVector() : std::vector<T, pool_allocator<T> >() {}
|
||||
TVector(const pool_allocator<T>& a) : std::vector<T, pool_allocator<T> >(a) {}
|
||||
TVector(size_type i): std::vector<T, pool_allocator<T> >(i) {}
|
||||
};
|
||||
|
||||
template <class T> class TList : public TBaseList <T, pool_allocator<T> > {
|
||||
public:
|
||||
typedef typename TBaseList<T, pool_allocator<T> >::size_type size_type;
|
||||
TList() : TBaseList<T, pool_allocator<T> >() {}
|
||||
TList(const pool_allocator<T>& a) : TBaseList<T, pool_allocator<T> >(a) {}
|
||||
TList(size_type i): TBaseList<T, pool_allocator<T> >(i) {}
|
||||
};
|
||||
|
||||
// This is called TStlSet, because TSet is taken by an existing compiler class.
|
||||
template <class T, class CMP> class TStlSet : public std::set<T, CMP, pool_allocator<T> > {
|
||||
// No pool allocator versions of constructors in std::set.
|
||||
};
|
||||
|
||||
|
||||
template <class K, class D, class CMP = std::less<K> >
|
||||
class TMap : public TBaseMap<K, D, CMP, pool_allocator<std::pair<K, D> > > {
|
||||
public:
|
||||
typedef pool_allocator<std::pair <K, D> > tAllocator;
|
||||
|
||||
TMap() : TBaseMap<K, D, CMP, tAllocator >() {}
|
||||
// use correct two-stage name lookup supported in gcc 3.4 and above
|
||||
TMap(const tAllocator& a) : TBaseMap<K, D, CMP, tAllocator>(TBaseMap<K, D, CMP, tAllocator >::key_compare(), a) {}
|
||||
};
|
||||
|
||||
//
|
||||
// Persistent string memory. Should only be used for strings that survive
|
||||
// across compiles/links.
|
||||
//
|
||||
typedef std::basic_string<char> TPersistString;
|
||||
|
||||
//
|
||||
// templatized min and max functions.
|
||||
//
|
||||
template <class T> T Min(const T a, const T b) { return a < b ? a : b; }
|
||||
template <class T> T Max(const T a, const T b) { return a > b ? a : b; }
|
||||
|
||||
//
|
||||
// Create a TString object from an integer.
|
||||
//
|
||||
inline const TString String(const int i, const int base = 10)
|
||||
{
|
||||
char text[16]; // 32 bit ints are at most 10 digits in base 10
|
||||
|
||||
#ifdef _WIN32
|
||||
_itoa(i, text, base);
|
||||
#else
|
||||
// we assume base 10 for all cases
|
||||
sprintf(text, "%d", i);
|
||||
#endif
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
const unsigned int SourceLocLineMask = 0xffff;
|
||||
const unsigned int SourceLocStringShift = 16;
|
||||
|
||||
__inline TPersistString FormatSourceLoc(const TSourceLoc loc)
|
||||
{
|
||||
char locText[64];
|
||||
|
||||
int string = loc >> SourceLocStringShift;
|
||||
int line = loc & SourceLocLineMask;
|
||||
|
||||
if (line)
|
||||
sprintf(locText, "%d:%d", string, line);
|
||||
else
|
||||
sprintf(locText, "%d:? ", string);
|
||||
|
||||
return TPersistString(locText);
|
||||
}
|
||||
|
||||
|
||||
typedef TMap<TString, TString> TPragmaTable;
|
||||
typedef TMap<TString, TString>::tAllocator TPragmaTableAllocator;
|
||||
|
||||
#endif // _COMMON_INCLUDED_
|
|
@ -0,0 +1,474 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9.00"
|
||||
Name="Compiler"
|
||||
ProjectGUID="{5B3A6DB8-1E7E-40D7-92B9-DA8AAE619FAD}"
|
||||
RootNamespace="Compiler"
|
||||
Keyword="Win32Proj"
|
||||
TargetFrameworkVersion="131072"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="0"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="./; ../Include/"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="false"
|
||||
DebugInformationFormat="4"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="0"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="./; ../Include/"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE"
|
||||
RuntimeLibrary="0"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="false"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\CodeGen.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\glslang.l"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Executing flex on $(InputPath)"
|
||||
CommandLine="if EXIST $(InputDir)Gen_glslang.cpp del $(InputDir)Gen_glslang.cpp
$(InputDir)Tools\flex.exe $(InputPath)
"
|
||||
AdditionalDependencies="glslang_tab.h"
|
||||
Outputs="$(InputDir)Gen_glslang.cpp"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Executing flex on $(InputPath)"
|
||||
CommandLine="if EXIST $(InputDir)Gen_glslang.cpp del $(InputDir)Gen_glslang.cpp
$(InputDir)Tools\flex.exe $(InputPath)
"
|
||||
AdditionalDependencies="glslang_tab.h"
|
||||
Outputs="$(InputDir)Gen_glslang.cpp"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\glslang.y"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Executing Bison on $(InputPath)"
|
||||
CommandLine="SET BISON_SIMPLE=$(InputDir)Tools\bison.simple
SET BISON_HAIRY=$(InputDir)Tools\bison.simple
if EXIST $(InputDir)Gen_$(InputName)_tab.cpp del $(InputDir)Gen_$(InputName)_tab.cpp
$(InputDir)Tools\bison.exe -d -t -v $(InputName).y
rename $(InputDir)$(InputName)_tab.c Gen_$(InputName)_tab.cpp
"
|
||||
Outputs="$(InputDir)Gen_$(InputName)_tab.cpp"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Executing Bison on $(InputPath)"
|
||||
CommandLine="SET BISON_SIMPLE=$(InputDir)Tools\bison.simple
SET BISON_HAIRY=$(InputDir)Tools\bison.simple
if EXIST $(InputDir)Gen_$(InputName)_tab.cpp del $(InputDir)Gen_$(InputName)_tab.cpp
$(InputDir)Tools\bison.exe -d -t -v $(InputName).y
rename $(InputDir)$(InputName)_tab.c Gen_$(InputName)_tab.cpp
"
|
||||
Outputs="$(InputDir)Gen_$(InputName)_tab.cpp"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InfoSink.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Initialize.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InitializeDll.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Intermediate.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\intermOut.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\IntermTraverse.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Link.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ossource.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\OutputHLSL.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\parseConst.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ParseHelper.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\PoolAlloc.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\QualifierAlive.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\RemoveTree.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ShaderLang.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\SymbolTable.cpp"
|
||||
>
|
||||
</File>
|
||||
<Filter
|
||||
Name="Preprocessor"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\atom.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\cpp.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\cppstruct.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\memory.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\scanner.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\symbols.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\tokens.c"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Generated"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\Gen_glslang.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Gen_glslang_tab.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\BaseTypes.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Common.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ConstantUnion.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InfoSink.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Initialize.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InitializeDll.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InitializeGlobals.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\InitializeParseContext.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\intermediate.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\localintermediate.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\MMap.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\osinclude.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\OutputHLSL.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ParseHelper.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\PoolAlloc.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\QualifierAlive.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\RemoveTree.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ResourceLimits.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ShaderLang.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ShHandle.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\SymbolTable.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Types.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\unistd.h"
|
||||
>
|
||||
</File>
|
||||
<Filter
|
||||
Name="Preprocessor"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\atom.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\compile.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\cpp.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\memory.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\parser.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\preprocess.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\scanner.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\slglobals.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\symbols.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Preprocessor\tokens.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Generated"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\glslang_tab.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||
>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
|
@ -0,0 +1,287 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _CONSTANT_UNION_INCLUDED_
|
||||
#define _CONSTANT_UNION_INCLUDED_
|
||||
|
||||
|
||||
class constUnion {
|
||||
public:
|
||||
|
||||
POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
|
||||
void setIConst(int i) {iConst = i; type = EbtInt; }
|
||||
void setFConst(float f) {fConst = f; type = EbtFloat; }
|
||||
void setBConst(bool b) {bConst = b; type = EbtBool; }
|
||||
|
||||
int getIConst() { return iConst; }
|
||||
float getFConst() { return fConst; }
|
||||
bool getBConst() { return bConst; }
|
||||
int getIConst() const { return iConst; }
|
||||
float getFConst() const { return fConst; }
|
||||
bool getBConst() const { return bConst; }
|
||||
|
||||
bool operator==(const int i) const
|
||||
{
|
||||
if (i == iConst)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool operator==(const float f) const
|
||||
{
|
||||
if (f == fConst)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool operator==(const bool b) const
|
||||
{
|
||||
if (b == bConst)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool operator==(const constUnion& constant) const
|
||||
{
|
||||
if (constant.type != type)
|
||||
return false;
|
||||
|
||||
switch (type) {
|
||||
case EbtInt:
|
||||
if (constant.iConst == iConst)
|
||||
return true;
|
||||
|
||||
break;
|
||||
case EbtFloat:
|
||||
if (constant.fConst == fConst)
|
||||
return true;
|
||||
|
||||
break;
|
||||
case EbtBool:
|
||||
if (constant.bConst == bConst)
|
||||
return true;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool operator!=(const int i) const
|
||||
{
|
||||
return !operator==(i);
|
||||
}
|
||||
|
||||
bool operator!=(const float f) const
|
||||
{
|
||||
return !operator==(f);
|
||||
}
|
||||
|
||||
bool operator!=(const bool b) const
|
||||
{
|
||||
return !operator==(b);
|
||||
}
|
||||
|
||||
bool operator!=(const constUnion& constant) const
|
||||
{
|
||||
return !operator==(constant);
|
||||
}
|
||||
|
||||
bool operator>(const constUnion& constant) const
|
||||
{
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt:
|
||||
if (iConst > constant.iConst)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
case EbtFloat:
|
||||
if (fConst > constant.fConst)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
default:
|
||||
assert(false && "Default missing");
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool operator<(const constUnion& constant) const
|
||||
{
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt:
|
||||
if (iConst < constant.iConst)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
case EbtFloat:
|
||||
if (fConst < constant.fConst)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
default:
|
||||
assert(false && "Default missing");
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
constUnion operator+(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt: returnValue.setIConst(iConst + constant.iConst); break;
|
||||
case EbtFloat: returnValue.setFConst(fConst + constant.fConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
constUnion operator-(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt: returnValue.setIConst(iConst - constant.iConst); break;
|
||||
case EbtFloat: returnValue.setFConst(fConst - constant.fConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
constUnion operator*(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt: returnValue.setIConst(iConst * constant.iConst); break;
|
||||
case EbtFloat: returnValue.setFConst(fConst * constant.fConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
constUnion operator%(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt: returnValue.setIConst(iConst % constant.iConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
constUnion operator>>(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
constUnion operator<<(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt: returnValue.setIConst(iConst << constant.iConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
constUnion operator&(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt: returnValue.setIConst(iConst & constant.iConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
constUnion operator|(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt: returnValue.setIConst(iConst | constant.iConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
constUnion operator^(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
constUnion operator&&(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtBool: returnValue.setBConst(bConst && constant.bConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
constUnion operator||(const constUnion& constant) const
|
||||
{
|
||||
constUnion returnValue;
|
||||
assert(type == constant.type);
|
||||
switch (type) {
|
||||
case EbtBool: returnValue.setBConst(bConst || constant.bConst); break;
|
||||
default: assert(false && "Default missing");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
TBasicType getType() { return type; }
|
||||
private:
|
||||
|
||||
union {
|
||||
int iConst; // used for ivec, scalar ints
|
||||
bool bConst; // used for bvec, scalar bools
|
||||
float fConst; // used for vec, mat, scalar floats
|
||||
} ;
|
||||
|
||||
TBasicType type;
|
||||
};
|
||||
|
||||
#endif // _CONSTANT_UNION_INCLUDED_
|
|
@ -0,0 +1,79 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#include "InfoSink.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
void TInfoSinkBase::append(const char *s)
|
||||
{
|
||||
if (outputStream & EString) {
|
||||
checkMem(strlen(s));
|
||||
sink.append(s);
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if (outputStream & EDebugger)
|
||||
OutputDebugString(s);
|
||||
#endif
|
||||
|
||||
if (outputStream & EStdOut)
|
||||
fprintf(stdout, "%s", s);
|
||||
}
|
||||
|
||||
void TInfoSinkBase::append(int count, char c)
|
||||
{
|
||||
if (outputStream & EString) {
|
||||
checkMem(count);
|
||||
sink.append(count, c);
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if (outputStream & EDebugger) {
|
||||
char str[2];
|
||||
str[0] = c;
|
||||
str[1] = '\0';
|
||||
OutputDebugString(str);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (outputStream & EStdOut)
|
||||
fprintf(stdout, "%c", c);
|
||||
}
|
||||
|
||||
void TInfoSinkBase::append(const TPersistString& t)
|
||||
{
|
||||
if (outputStream & EString) {
|
||||
checkMem(t.size());
|
||||
sink.append(t);
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if (outputStream & EDebugger)
|
||||
OutputDebugString(t.c_str());
|
||||
#endif
|
||||
|
||||
if (outputStream & EStdOut)
|
||||
fprintf(stdout, "%s", t.c_str());
|
||||
}
|
||||
|
||||
void TInfoSinkBase::append(const TString& t)
|
||||
{
|
||||
if (outputStream & EString) {
|
||||
checkMem(t.size());
|
||||
sink.append(t.c_str());
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if (outputStream & EDebugger)
|
||||
OutputDebugString(t.c_str());
|
||||
#endif
|
||||
|
||||
if (outputStream & EStdOut)
|
||||
fprintf(stdout, "%s", t.c_str());
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _INFOSINK_INCLUDED_
|
||||
#define _INFOSINK_INCLUDED_
|
||||
|
||||
#include "Common.h"
|
||||
#include <math.h>
|
||||
|
||||
//
|
||||
// TPrefixType is used to centralize how info log messages start.
|
||||
// See below.
|
||||
//
|
||||
enum TPrefixType {
|
||||
EPrefixNone,
|
||||
EPrefixWarning,
|
||||
EPrefixError,
|
||||
EPrefixInternalError,
|
||||
EPrefixUnimplemented,
|
||||
EPrefixNote
|
||||
};
|
||||
|
||||
enum TOutputStream {
|
||||
ENull = 0,
|
||||
EDebugger = 0x01,
|
||||
EStdOut = 0x02,
|
||||
EString = 0x04,
|
||||
};
|
||||
//
|
||||
// Encapsulate info logs for all objects that have them.
|
||||
//
|
||||
// The methods are a general set of tools for getting a variety of
|
||||
// messages and types inserted into the log.
|
||||
//
|
||||
class TInfoSinkBase {
|
||||
public:
|
||||
TInfoSinkBase() : outputStream(4) {}
|
||||
void erase() { sink.erase(); }
|
||||
TInfoSinkBase& operator<<(const TPersistString& t) { append(t); return *this; }
|
||||
TInfoSinkBase& operator<<(char c) { append(1, c); return *this; }
|
||||
TInfoSinkBase& operator<<(const char* s) { append(s); return *this; }
|
||||
TInfoSinkBase& operator<<(int n) { append(String(n)); return *this; }
|
||||
TInfoSinkBase& operator<<(const unsigned int n) { append(String(n)); return *this; }
|
||||
TInfoSinkBase& operator<<(float n) { char buf[40];
|
||||
sprintf(buf, "%.8g", n);
|
||||
append(buf);
|
||||
return *this; }
|
||||
TInfoSinkBase& operator+(const TPersistString& t) { append(t); return *this; }
|
||||
TInfoSinkBase& operator+(const TString& t) { append(t); return *this; }
|
||||
TInfoSinkBase& operator<<(const TString& t) { append(t); return *this; }
|
||||
TInfoSinkBase& operator+(const char* s) { append(s); return *this; }
|
||||
const char* c_str() const { return sink.c_str(); }
|
||||
void prefix(TPrefixType message) {
|
||||
switch(message) {
|
||||
case EPrefixNone: break;
|
||||
case EPrefixWarning: append("WARNING: "); break;
|
||||
case EPrefixError: append("ERROR: "); break;
|
||||
case EPrefixInternalError: append("INTERNAL ERROR: "); break;
|
||||
case EPrefixUnimplemented: append("UNIMPLEMENTED: "); break;
|
||||
case EPrefixNote: append("NOTE: "); break;
|
||||
default: append("UNKOWN ERROR: "); break;
|
||||
}
|
||||
}
|
||||
void location(TSourceLoc loc) {
|
||||
append(FormatSourceLoc(loc).c_str());
|
||||
append(": ");
|
||||
}
|
||||
void message(TPrefixType message, const char* s) {
|
||||
prefix(message);
|
||||
append(s);
|
||||
append("\n");
|
||||
}
|
||||
void message(TPrefixType message, const char* s, TSourceLoc loc) {
|
||||
prefix(message);
|
||||
location(loc);
|
||||
append(s);
|
||||
append("\n");
|
||||
}
|
||||
|
||||
void setOutputStream(int output = 4)
|
||||
{
|
||||
outputStream = output;
|
||||
}
|
||||
|
||||
protected:
|
||||
void append(const char *s);
|
||||
|
||||
void append(int count, char c);
|
||||
void append(const TPersistString& t);
|
||||
void append(const TString& t);
|
||||
|
||||
void checkMem(size_t growth) { if (sink.capacity() < sink.size() + growth + 2)
|
||||
sink.reserve(sink.capacity() + sink.capacity() / 2); }
|
||||
void appendToStream(const char* s);
|
||||
TPersistString sink;
|
||||
int outputStream;
|
||||
};
|
||||
|
||||
class TInfoSink {
|
||||
public:
|
||||
TInfoSinkBase info;
|
||||
TInfoSinkBase debug;
|
||||
TInfoSinkBase obj;
|
||||
};
|
||||
|
||||
#endif // _INFOSINK_INCLUDED_
|
|
@ -0,0 +1,616 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
//
|
||||
// Create strings that declare built-in definitions, add built-ins that
|
||||
// cannot be expressed in the files, and establish mappings between
|
||||
// built-in functions and operators.
|
||||
//
|
||||
|
||||
#include "intermediate.h"
|
||||
#include "Initialize.h"
|
||||
|
||||
void TBuiltIns::initialize()
|
||||
{
|
||||
//
|
||||
// Initialize all the built-in strings for parsing.
|
||||
//
|
||||
TString BuiltInFunctions;
|
||||
TString BuiltInFunctionsVertex;
|
||||
TString BuiltInFunctionsFragment;
|
||||
TString StandardUniforms;
|
||||
|
||||
{
|
||||
//============================================================================
|
||||
//
|
||||
// Prototypes for built-in functions seen by both vertex and fragment shaders.
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
TString& s = BuiltInFunctions;
|
||||
|
||||
//
|
||||
// Angle and Trigonometric Functions.
|
||||
//
|
||||
s.append(TString("float radians(float degrees);"));
|
||||
s.append(TString("vec2 radians(vec2 degrees);"));
|
||||
s.append(TString("vec3 radians(vec3 degrees);"));
|
||||
s.append(TString("vec4 radians(vec4 degrees);"));
|
||||
|
||||
s.append(TString("float degrees(float radians);"));
|
||||
s.append(TString("vec2 degrees(vec2 radians);"));
|
||||
s.append(TString("vec3 degrees(vec3 radians);"));
|
||||
s.append(TString("vec4 degrees(vec4 radians);"));
|
||||
|
||||
s.append(TString("float sin(float angle);"));
|
||||
s.append(TString("vec2 sin(vec2 angle);"));
|
||||
s.append(TString("vec3 sin(vec3 angle);"));
|
||||
s.append(TString("vec4 sin(vec4 angle);"));
|
||||
|
||||
s.append(TString("float cos(float angle);"));
|
||||
s.append(TString("vec2 cos(vec2 angle);"));
|
||||
s.append(TString("vec3 cos(vec3 angle);"));
|
||||
s.append(TString("vec4 cos(vec4 angle);"));
|
||||
|
||||
s.append(TString("float tan(float angle);"));
|
||||
s.append(TString("vec2 tan(vec2 angle);"));
|
||||
s.append(TString("vec3 tan(vec3 angle);"));
|
||||
s.append(TString("vec4 tan(vec4 angle);"));
|
||||
|
||||
s.append(TString("float asin(float x);"));
|
||||
s.append(TString("vec2 asin(vec2 x);"));
|
||||
s.append(TString("vec3 asin(vec3 x);"));
|
||||
s.append(TString("vec4 asin(vec4 x);"));
|
||||
|
||||
s.append(TString("float acos(float x);"));
|
||||
s.append(TString("vec2 acos(vec2 x);"));
|
||||
s.append(TString("vec3 acos(vec3 x);"));
|
||||
s.append(TString("vec4 acos(vec4 x);"));
|
||||
|
||||
s.append(TString("float atan(float y, float x);"));
|
||||
s.append(TString("vec2 atan(vec2 y, vec2 x);"));
|
||||
s.append(TString("vec3 atan(vec3 y, vec3 x);"));
|
||||
s.append(TString("vec4 atan(vec4 y, vec4 x);"));
|
||||
|
||||
s.append(TString("float atan(float y_over_x);"));
|
||||
s.append(TString("vec2 atan(vec2 y_over_x);"));
|
||||
s.append(TString("vec3 atan(vec3 y_over_x);"));
|
||||
s.append(TString("vec4 atan(vec4 y_over_x);"));
|
||||
|
||||
//
|
||||
// Exponential Functions.
|
||||
//
|
||||
s.append(TString("float pow(float x, float y);"));
|
||||
s.append(TString("vec2 pow(vec2 x, vec2 y);"));
|
||||
s.append(TString("vec3 pow(vec3 x, vec3 y);"));
|
||||
s.append(TString("vec4 pow(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("float exp(float x);"));
|
||||
s.append(TString("vec2 exp(vec2 x);"));
|
||||
s.append(TString("vec3 exp(vec3 x);"));
|
||||
s.append(TString("vec4 exp(vec4 x);"));
|
||||
|
||||
s.append(TString("float log(float x);"));
|
||||
s.append(TString("vec2 log(vec2 x);"));
|
||||
s.append(TString("vec3 log(vec3 x);"));
|
||||
s.append(TString("vec4 log(vec4 x);"));
|
||||
|
||||
s.append(TString("float exp2(float x);"));
|
||||
s.append(TString("vec2 exp2(vec2 x);"));
|
||||
s.append(TString("vec3 exp2(vec3 x);"));
|
||||
s.append(TString("vec4 exp2(vec4 x);"));
|
||||
|
||||
s.append(TString("float log2(float x);"));
|
||||
s.append(TString("vec2 log2(vec2 x);"));
|
||||
s.append(TString("vec3 log2(vec3 x);"));
|
||||
s.append(TString("vec4 log2(vec4 x);"));
|
||||
|
||||
s.append(TString("float sqrt(float x);"));
|
||||
s.append(TString("vec2 sqrt(vec2 x);"));
|
||||
s.append(TString("vec3 sqrt(vec3 x);"));
|
||||
s.append(TString("vec4 sqrt(vec4 x);"));
|
||||
|
||||
s.append(TString("float inversesqrt(float x);"));
|
||||
s.append(TString("vec2 inversesqrt(vec2 x);"));
|
||||
s.append(TString("vec3 inversesqrt(vec3 x);"));
|
||||
s.append(TString("vec4 inversesqrt(vec4 x);"));
|
||||
|
||||
//
|
||||
// Common Functions.
|
||||
//
|
||||
s.append(TString("float abs(float x);"));
|
||||
s.append(TString("vec2 abs(vec2 x);"));
|
||||
s.append(TString("vec3 abs(vec3 x);"));
|
||||
s.append(TString("vec4 abs(vec4 x);"));
|
||||
|
||||
s.append(TString("float sign(float x);"));
|
||||
s.append(TString("vec2 sign(vec2 x);"));
|
||||
s.append(TString("vec3 sign(vec3 x);"));
|
||||
s.append(TString("vec4 sign(vec4 x);"));
|
||||
|
||||
s.append(TString("float floor(float x);"));
|
||||
s.append(TString("vec2 floor(vec2 x);"));
|
||||
s.append(TString("vec3 floor(vec3 x);"));
|
||||
s.append(TString("vec4 floor(vec4 x);"));
|
||||
|
||||
s.append(TString("float ceil(float x);"));
|
||||
s.append(TString("vec2 ceil(vec2 x);"));
|
||||
s.append(TString("vec3 ceil(vec3 x);"));
|
||||
s.append(TString("vec4 ceil(vec4 x);"));
|
||||
|
||||
s.append(TString("float fract(float x);"));
|
||||
s.append(TString("vec2 fract(vec2 x);"));
|
||||
s.append(TString("vec3 fract(vec3 x);"));
|
||||
s.append(TString("vec4 fract(vec4 x);"));
|
||||
|
||||
s.append(TString("float mod(float x, float y);"));
|
||||
s.append(TString("vec2 mod(vec2 x, float y);"));
|
||||
s.append(TString("vec3 mod(vec3 x, float y);"));
|
||||
s.append(TString("vec4 mod(vec4 x, float y);"));
|
||||
s.append(TString("vec2 mod(vec2 x, vec2 y);"));
|
||||
s.append(TString("vec3 mod(vec3 x, vec3 y);"));
|
||||
s.append(TString("vec4 mod(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("float min(float x, float y);"));
|
||||
s.append(TString("vec2 min(vec2 x, float y);"));
|
||||
s.append(TString("vec3 min(vec3 x, float y);"));
|
||||
s.append(TString("vec4 min(vec4 x, float y);"));
|
||||
s.append(TString("vec2 min(vec2 x, vec2 y);"));
|
||||
s.append(TString("vec3 min(vec3 x, vec3 y);"));
|
||||
s.append(TString("vec4 min(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("float max(float x, float y);"));
|
||||
s.append(TString("vec2 max(vec2 x, float y);"));
|
||||
s.append(TString("vec3 max(vec3 x, float y);"));
|
||||
s.append(TString("vec4 max(vec4 x, float y);"));
|
||||
s.append(TString("vec2 max(vec2 x, vec2 y);"));
|
||||
s.append(TString("vec3 max(vec3 x, vec3 y);"));
|
||||
s.append(TString("vec4 max(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("float clamp(float x, float minVal, float maxVal);"));
|
||||
s.append(TString("vec2 clamp(vec2 x, float minVal, float maxVal);"));
|
||||
s.append(TString("vec3 clamp(vec3 x, float minVal, float maxVal);"));
|
||||
s.append(TString("vec4 clamp(vec4 x, float minVal, float maxVal);"));
|
||||
s.append(TString("vec2 clamp(vec2 x, vec2 minVal, vec2 maxVal);"));
|
||||
s.append(TString("vec3 clamp(vec3 x, vec3 minVal, vec3 maxVal);"));
|
||||
s.append(TString("vec4 clamp(vec4 x, vec4 minVal, vec4 maxVal);"));
|
||||
|
||||
s.append(TString("float mix(float x, float y, float a);"));
|
||||
s.append(TString("vec2 mix(vec2 x, vec2 y, float a);"));
|
||||
s.append(TString("vec3 mix(vec3 x, vec3 y, float a);"));
|
||||
s.append(TString("vec4 mix(vec4 x, vec4 y, float a);"));
|
||||
s.append(TString("vec2 mix(vec2 x, vec2 y, vec2 a);"));
|
||||
s.append(TString("vec3 mix(vec3 x, vec3 y, vec3 a);"));
|
||||
s.append(TString("vec4 mix(vec4 x, vec4 y, vec4 a);"));
|
||||
|
||||
s.append(TString("float step(float edge, float x);"));
|
||||
s.append(TString("vec2 step(vec2 edge, vec2 x);"));
|
||||
s.append(TString("vec3 step(vec3 edge, vec3 x);"));
|
||||
s.append(TString("vec4 step(vec4 edge, vec4 x);"));
|
||||
s.append(TString("vec2 step(float edge, vec2 x);"));
|
||||
s.append(TString("vec3 step(float edge, vec3 x);"));
|
||||
s.append(TString("vec4 step(float edge, vec4 x);"));
|
||||
|
||||
s.append(TString("float smoothstep(float edge0, float edge1, float x);"));
|
||||
s.append(TString("vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x);"));
|
||||
s.append(TString("vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x);"));
|
||||
s.append(TString("vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x);"));
|
||||
s.append(TString("vec2 smoothstep(float edge0, float edge1, vec2 x);"));
|
||||
s.append(TString("vec3 smoothstep(float edge0, float edge1, vec3 x);"));
|
||||
s.append(TString("vec4 smoothstep(float edge0, float edge1, vec4 x);"));
|
||||
|
||||
//
|
||||
// Geometric Functions.
|
||||
//
|
||||
s.append(TString("float length(float x);"));
|
||||
s.append(TString("float length(vec2 x);"));
|
||||
s.append(TString("float length(vec3 x);"));
|
||||
s.append(TString("float length(vec4 x);"));
|
||||
|
||||
s.append(TString("float distance(float p0, float p1);"));
|
||||
s.append(TString("float distance(vec2 p0, vec2 p1);"));
|
||||
s.append(TString("float distance(vec3 p0, vec3 p1);"));
|
||||
s.append(TString("float distance(vec4 p0, vec4 p1);"));
|
||||
|
||||
s.append(TString("float dot(float x, float y);"));
|
||||
s.append(TString("float dot(vec2 x, vec2 y);"));
|
||||
s.append(TString("float dot(vec3 x, vec3 y);"));
|
||||
s.append(TString("float dot(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("vec3 cross(vec3 x, vec3 y);"));
|
||||
s.append(TString("float normalize(float x);"));
|
||||
s.append(TString("vec2 normalize(vec2 x);"));
|
||||
s.append(TString("vec3 normalize(vec3 x);"));
|
||||
s.append(TString("vec4 normalize(vec4 x);"));
|
||||
|
||||
s.append(TString("float faceforward(float N, float I, float Nref);"));
|
||||
s.append(TString("vec2 faceforward(vec2 N, vec2 I, vec2 Nref);"));
|
||||
s.append(TString("vec3 faceforward(vec3 N, vec3 I, vec3 Nref);"));
|
||||
s.append(TString("vec4 faceforward(vec4 N, vec4 I, vec4 Nref);"));
|
||||
|
||||
s.append(TString("float reflect(float I, float N);"));
|
||||
s.append(TString("vec2 reflect(vec2 I, vec2 N);"));
|
||||
s.append(TString("vec3 reflect(vec3 I, vec3 N);"));
|
||||
s.append(TString("vec4 reflect(vec4 I, vec4 N);"));
|
||||
|
||||
s.append(TString("float refract(float I, float N, float eta);"));
|
||||
s.append(TString("vec2 refract(vec2 I, vec2 N, float eta);"));
|
||||
s.append(TString("vec3 refract(vec3 I, vec3 N, float eta);"));
|
||||
s.append(TString("vec4 refract(vec4 I, vec4 N, float eta);"));
|
||||
|
||||
//
|
||||
// Matrix Functions.
|
||||
//
|
||||
s.append(TString("mat2 matrixCompMult(mat2 x, mat2 y);"));
|
||||
s.append(TString("mat3 matrixCompMult(mat3 x, mat3 y);"));
|
||||
s.append(TString("mat4 matrixCompMult(mat4 x, mat4 y);"));
|
||||
|
||||
//
|
||||
// Vector relational functions.
|
||||
//
|
||||
s.append(TString("bvec2 lessThan(vec2 x, vec2 y);"));
|
||||
s.append(TString("bvec3 lessThan(vec3 x, vec3 y);"));
|
||||
s.append(TString("bvec4 lessThan(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 lessThan(ivec2 x, ivec2 y);"));
|
||||
s.append(TString("bvec3 lessThan(ivec3 x, ivec3 y);"));
|
||||
s.append(TString("bvec4 lessThan(ivec4 x, ivec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 lessThanEqual(vec2 x, vec2 y);"));
|
||||
s.append(TString("bvec3 lessThanEqual(vec3 x, vec3 y);"));
|
||||
s.append(TString("bvec4 lessThanEqual(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 lessThanEqual(ivec2 x, ivec2 y);"));
|
||||
s.append(TString("bvec3 lessThanEqual(ivec3 x, ivec3 y);"));
|
||||
s.append(TString("bvec4 lessThanEqual(ivec4 x, ivec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 greaterThan(vec2 x, vec2 y);"));
|
||||
s.append(TString("bvec3 greaterThan(vec3 x, vec3 y);"));
|
||||
s.append(TString("bvec4 greaterThan(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 greaterThan(ivec2 x, ivec2 y);"));
|
||||
s.append(TString("bvec3 greaterThan(ivec3 x, ivec3 y);"));
|
||||
s.append(TString("bvec4 greaterThan(ivec4 x, ivec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 greaterThanEqual(vec2 x, vec2 y);"));
|
||||
s.append(TString("bvec3 greaterThanEqual(vec3 x, vec3 y);"));
|
||||
s.append(TString("bvec4 greaterThanEqual(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 greaterThanEqual(ivec2 x, ivec2 y);"));
|
||||
s.append(TString("bvec3 greaterThanEqual(ivec3 x, ivec3 y);"));
|
||||
s.append(TString("bvec4 greaterThanEqual(ivec4 x, ivec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 equal(vec2 x, vec2 y);"));
|
||||
s.append(TString("bvec3 equal(vec3 x, vec3 y);"));
|
||||
s.append(TString("bvec4 equal(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 equal(ivec2 x, ivec2 y);"));
|
||||
s.append(TString("bvec3 equal(ivec3 x, ivec3 y);"));
|
||||
s.append(TString("bvec4 equal(ivec4 x, ivec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 equal(bvec2 x, bvec2 y);"));
|
||||
s.append(TString("bvec3 equal(bvec3 x, bvec3 y);"));
|
||||
s.append(TString("bvec4 equal(bvec4 x, bvec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 notEqual(vec2 x, vec2 y);"));
|
||||
s.append(TString("bvec3 notEqual(vec3 x, vec3 y);"));
|
||||
s.append(TString("bvec4 notEqual(vec4 x, vec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 notEqual(ivec2 x, ivec2 y);"));
|
||||
s.append(TString("bvec3 notEqual(ivec3 x, ivec3 y);"));
|
||||
s.append(TString("bvec4 notEqual(ivec4 x, ivec4 y);"));
|
||||
|
||||
s.append(TString("bvec2 notEqual(bvec2 x, bvec2 y);"));
|
||||
s.append(TString("bvec3 notEqual(bvec3 x, bvec3 y);"));
|
||||
s.append(TString("bvec4 notEqual(bvec4 x, bvec4 y);"));
|
||||
|
||||
s.append(TString("bool any(bvec2 x);"));
|
||||
s.append(TString("bool any(bvec3 x);"));
|
||||
s.append(TString("bool any(bvec4 x);"));
|
||||
|
||||
s.append(TString("bool all(bvec2 x);"));
|
||||
s.append(TString("bool all(bvec3 x);"));
|
||||
s.append(TString("bool all(bvec4 x);"));
|
||||
|
||||
s.append(TString("bvec2 not(bvec2 x);"));
|
||||
s.append(TString("bvec3 not(bvec3 x);"));
|
||||
s.append(TString("bvec4 not(bvec4 x);"));
|
||||
|
||||
//
|
||||
// Texture Functions.
|
||||
//
|
||||
s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord);"));
|
||||
s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord);"));
|
||||
s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord);"));
|
||||
|
||||
s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord);"));
|
||||
|
||||
//
|
||||
// Noise functions.
|
||||
//
|
||||
// s.append(TString("float noise1(float x);"));
|
||||
// s.append(TString("float noise1(vec2 x);"));
|
||||
// s.append(TString("float noise1(vec3 x);"));
|
||||
// s.append(TString("float noise1(vec4 x);"));
|
||||
|
||||
// s.append(TString("vec2 noise2(float x);"));
|
||||
// s.append(TString("vec2 noise2(vec2 x);"));
|
||||
// s.append(TString("vec2 noise2(vec3 x);"));
|
||||
// s.append(TString("vec2 noise2(vec4 x);"));
|
||||
|
||||
// s.append(TString("vec3 noise3(float x);"));
|
||||
// s.append(TString("vec3 noise3(vec2 x);"));
|
||||
// s.append(TString("vec3 noise3(vec3 x);"));
|
||||
// s.append(TString("vec3 noise3(vec4 x);"));
|
||||
|
||||
// s.append(TString("vec4 noise4(float x);"));
|
||||
// s.append(TString("vec4 noise4(vec2 x);"));
|
||||
// s.append(TString("vec4 noise4(vec3 x);"));
|
||||
// s.append(TString("vec4 noise4(vec4 x);"));
|
||||
|
||||
s.append(TString("\n"));
|
||||
}
|
||||
{
|
||||
//============================================================================
|
||||
//
|
||||
// Prototypes for built-in functions seen by vertex shaders only.
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
TString& s = BuiltInFunctionsVertex;
|
||||
|
||||
//
|
||||
// Geometric Functions.
|
||||
//
|
||||
s.append(TString("vec4 ftransform();"));
|
||||
|
||||
//
|
||||
// Texture Functions.
|
||||
//
|
||||
s.append(TString("vec4 texture2DLod(sampler2D sampler, vec2 coord, float lod);"));
|
||||
s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec3 coord, float lod);"));
|
||||
s.append(TString("vec4 texture2DProjLod(sampler2D sampler, vec4 coord, float lod);"));
|
||||
|
||||
s.append(TString("vec4 textureCubeLod(samplerCube sampler, vec3 coord, float lod);"));
|
||||
|
||||
s.append(TString("\n"));
|
||||
}
|
||||
{
|
||||
//============================================================================
|
||||
//
|
||||
// Prototypes for built-in functions seen by fragment shaders only.
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
TString& s = BuiltInFunctionsFragment;
|
||||
|
||||
//
|
||||
// Texture Functions.
|
||||
//
|
||||
s.append(TString("vec4 texture2D(sampler2D sampler, vec2 coord, float bias);"));
|
||||
s.append(TString("vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);"));
|
||||
s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);"));
|
||||
|
||||
s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord, float bias);"));
|
||||
|
||||
// s.append(TString("float dFdx(float p);"));
|
||||
// s.append(TString("vec2 dFdx(vec2 p);"));
|
||||
// s.append(TString("vec3 dFdx(vec3 p);"));
|
||||
// s.append(TString("vec4 dFdx(vec4 p);"));
|
||||
|
||||
// s.append(TString("float dFdy(float p);"));
|
||||
// s.append(TString("vec2 dFdy(vec2 p);"));
|
||||
// s.append(TString("vec3 dFdy(vec3 p);"));
|
||||
// s.append(TString("vec4 dFdy(vec4 p);"));
|
||||
|
||||
s.append(TString("float fwidth(float p);"));
|
||||
s.append(TString("vec2 fwidth(vec2 p);"));
|
||||
s.append(TString("vec3 fwidth(vec3 p);"));
|
||||
s.append(TString("vec4 fwidth(vec4 p);"));
|
||||
|
||||
s.append(TString("\n"));
|
||||
}
|
||||
{
|
||||
//============================================================================
|
||||
//
|
||||
// Standard Uniforms
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
TString& s = StandardUniforms;
|
||||
|
||||
//
|
||||
// Depth range in window coordinates
|
||||
//
|
||||
s.append(TString("struct gl_DepthRangeParameters {"));
|
||||
s.append(TString(" float near;")); // n // FIXME: highp
|
||||
s.append(TString(" float far;")); // f // FIXME: highp
|
||||
s.append(TString(" float diff;")); // f - n // FIXME: highp
|
||||
s.append(TString("};"));
|
||||
s.append(TString("uniform gl_DepthRangeParameters gl_DepthRange;"));
|
||||
|
||||
s.append(TString("\n"));
|
||||
}
|
||||
|
||||
builtInStrings[EShLangFragment].push_back(BuiltInFunctions.c_str());
|
||||
builtInStrings[EShLangFragment].push_back(BuiltInFunctionsFragment);
|
||||
builtInStrings[EShLangFragment].push_back(StandardUniforms);
|
||||
|
||||
builtInStrings[EShLangVertex].push_back(BuiltInFunctions);
|
||||
builtInStrings[EShLangVertex].push_back(BuiltInFunctionsVertex);
|
||||
builtInStrings[EShLangVertex].push_back(StandardUniforms);
|
||||
}
|
||||
|
||||
void TBuiltIns::initialize(const TBuiltInResource &resources)
|
||||
{
|
||||
TString builtIns;
|
||||
|
||||
// Implementation dependent constants
|
||||
char builtInConstant[80];
|
||||
|
||||
sprintf(builtInConstant, "const int gl_MaxVertexAttribs = %d;", resources.maxVertexAttribs);
|
||||
builtIns.append(TString(builtInConstant));
|
||||
|
||||
sprintf(builtInConstant, "const int gl_MaxVertexUniformVectors = %d;", resources.maxVertexUniformVectors);
|
||||
builtIns.append(TString(builtInConstant));
|
||||
|
||||
sprintf(builtInConstant, "const int gl_MaxVaryingVectors = %d;", resources.maxVaryingVectors);
|
||||
builtIns.append(TString(builtInConstant));
|
||||
|
||||
sprintf(builtInConstant, "const int gl_MaxVertexTextureImageUnits = %d;", resources.maxVertexTextureImageUnits);
|
||||
builtIns.append(TString(builtInConstant));
|
||||
|
||||
sprintf(builtInConstant, "const int gl_MaxCombinedTextureImageUnits = %d;", resources.maxCombinedTextureImageUnits);
|
||||
builtIns.append(TString(builtInConstant));
|
||||
|
||||
sprintf(builtInConstant, "const int gl_MaxTextureImageUnits = %d;", resources.maxTextureImageUnits);
|
||||
builtIns.append(TString(builtInConstant));
|
||||
|
||||
sprintf(builtInConstant, "const int gl_MaxFragmentUniformVectors = %d;", resources.maxFragmentUniformVectors);
|
||||
builtIns.append(TString(builtInConstant));
|
||||
|
||||
sprintf(builtInConstant, "const int gl_MaxDrawBuffers = %d;", resources.maxDrawBuffers);
|
||||
builtIns.append(TString(builtInConstant));
|
||||
|
||||
builtInStrings[EShLangFragment].push_back(builtIns);
|
||||
builtInStrings[EShLangVertex].push_back(builtIns);
|
||||
}
|
||||
|
||||
void IdentifyBuiltIns(EShLanguage language, TSymbolTable& symbolTable)
|
||||
{
|
||||
//
|
||||
// First, insert some special built-in variables that are not in
|
||||
// the built-in header files.
|
||||
//
|
||||
switch(language) {
|
||||
|
||||
case EShLangFragment: {
|
||||
symbolTable.insert(*new TVariable(NewPoolTString("gl_FragCoord"), TType(EbtFloat, EvqFragCoord, 4))); // FIXME: mediump
|
||||
symbolTable.insert(*new TVariable(NewPoolTString("gl_FrontFacing"), TType(EbtBool, EvqFrontFacing, 1)));
|
||||
symbolTable.insert(*new TVariable(NewPoolTString("gl_FragColor"), TType(EbtFloat, EvqFragColor, 4))); // FIXME: mediump
|
||||
symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]"), TType(EbtFloat, EvqFragData, 4))); // FIXME: mediump
|
||||
symbolTable.insert(*new TVariable(NewPoolTString("gl_PointCoord"), TType(EbtFloat, EvqPointCoord, 2))); // FIXME: mediump
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case EShLangVertex:
|
||||
symbolTable.insert(*new TVariable(NewPoolTString("gl_Position"), TType(EbtFloat, EvqPosition, 4))); // FIXME: highp
|
||||
symbolTable.insert(*new TVariable(NewPoolTString("gl_PointSize"), TType(EbtFloat, EvqPointSize, 1))); // FIXME: mediump
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
//
|
||||
// Next, identify which built-ins from the already loaded headers have
|
||||
// a mapping to an operator. Those that are not identified as such are
|
||||
// expected to be resolved through a library of functions, versus as
|
||||
// operations.
|
||||
//
|
||||
symbolTable.relateToOperator("not", EOpVectorLogicalNot);
|
||||
|
||||
symbolTable.relateToOperator("matrixCompMult", EOpMul);
|
||||
symbolTable.relateToOperator("mod", EOpMod);
|
||||
|
||||
symbolTable.relateToOperator("equal", EOpVectorEqual);
|
||||
symbolTable.relateToOperator("notEqual", EOpVectorNotEqual);
|
||||
symbolTable.relateToOperator("lessThan", EOpLessThan);
|
||||
symbolTable.relateToOperator("greaterThan", EOpGreaterThan);
|
||||
symbolTable.relateToOperator("lessThanEqual", EOpLessThanEqual);
|
||||
symbolTable.relateToOperator("greaterThanEqual", EOpGreaterThanEqual);
|
||||
|
||||
symbolTable.relateToOperator("radians", EOpRadians);
|
||||
symbolTable.relateToOperator("degrees", EOpDegrees);
|
||||
symbolTable.relateToOperator("sin", EOpSin);
|
||||
symbolTable.relateToOperator("cos", EOpCos);
|
||||
symbolTable.relateToOperator("tan", EOpTan);
|
||||
symbolTable.relateToOperator("asin", EOpAsin);
|
||||
symbolTable.relateToOperator("acos", EOpAcos);
|
||||
symbolTable.relateToOperator("atan", EOpAtan);
|
||||
|
||||
symbolTable.relateToOperator("pow", EOpPow);
|
||||
symbolTable.relateToOperator("exp2", EOpExp2);
|
||||
symbolTable.relateToOperator("log", EOpLog);
|
||||
symbolTable.relateToOperator("exp", EOpExp);
|
||||
symbolTable.relateToOperator("log2", EOpLog2);
|
||||
symbolTable.relateToOperator("sqrt", EOpSqrt);
|
||||
symbolTable.relateToOperator("inversesqrt", EOpInverseSqrt);
|
||||
|
||||
symbolTable.relateToOperator("abs", EOpAbs);
|
||||
symbolTable.relateToOperator("sign", EOpSign);
|
||||
symbolTable.relateToOperator("floor", EOpFloor);
|
||||
symbolTable.relateToOperator("ceil", EOpCeil);
|
||||
symbolTable.relateToOperator("fract", EOpFract);
|
||||
symbolTable.relateToOperator("min", EOpMin);
|
||||
symbolTable.relateToOperator("max", EOpMax);
|
||||
symbolTable.relateToOperator("clamp", EOpClamp);
|
||||
symbolTable.relateToOperator("mix", EOpMix);
|
||||
symbolTable.relateToOperator("step", EOpStep);
|
||||
symbolTable.relateToOperator("smoothstep", EOpSmoothStep);
|
||||
|
||||
symbolTable.relateToOperator("length", EOpLength);
|
||||
symbolTable.relateToOperator("distance", EOpDistance);
|
||||
symbolTable.relateToOperator("dot", EOpDot);
|
||||
symbolTable.relateToOperator("cross", EOpCross);
|
||||
symbolTable.relateToOperator("normalize", EOpNormalize);
|
||||
symbolTable.relateToOperator("forward", EOpFaceForward);
|
||||
symbolTable.relateToOperator("reflect", EOpReflect);
|
||||
symbolTable.relateToOperator("refract", EOpRefract);
|
||||
|
||||
symbolTable.relateToOperator("any", EOpAny);
|
||||
symbolTable.relateToOperator("all", EOpAll);
|
||||
|
||||
switch(language)
|
||||
{
|
||||
case EShLangVertex:
|
||||
break;
|
||||
case EShLangFragment:
|
||||
// symbolTable.relateToOperator("dFdx", EOpDPdx);
|
||||
// symbolTable.relateToOperator("dFdy", EOpDPdy);
|
||||
// symbolTable.relateToOperator("fwidth", EOpFwidth);
|
||||
break;
|
||||
case EShLangPack:
|
||||
case EShLangUnpack:
|
||||
symbolTable.relateToOperator("itof", EOpItof);
|
||||
symbolTable.relateToOperator("ftoi", EOpFtoi);
|
||||
symbolTable.relateToOperator("skipPixels", EOpSkipPixels);
|
||||
symbolTable.relateToOperator("readInput", EOpReadInput);
|
||||
symbolTable.relateToOperator("writePixel", EOpWritePixel);
|
||||
symbolTable.relateToOperator("bitmapLSB", EOpBitmapLsb);
|
||||
symbolTable.relateToOperator("bitmapMSB", EOpBitmapMsb);
|
||||
symbolTable.relateToOperator("writeOutput", EOpWriteOutput);
|
||||
symbolTable.relateToOperator("readPixel", EOpReadPixel);
|
||||
break;
|
||||
default: assert(false && "Language not supported");
|
||||
}
|
||||
}
|
||||
|
||||
void IdentifyBuiltIns(EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources)
|
||||
{
|
||||
//
|
||||
// First, insert some special built-in variables that are not in
|
||||
// the built-in header files.
|
||||
//
|
||||
switch(language) {
|
||||
|
||||
case EShLangFragment: {
|
||||
// Set up gl_FragData. The array size.
|
||||
TType fragData(EbtFloat, EvqFragColor, 4, false, true);
|
||||
fragData.setArraySize(resources.maxDrawBuffers);
|
||||
symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData"), fragData));
|
||||
}
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
const char* GetPreprocessorBuiltinString()
|
||||
{
|
||||
static const char *PreprocessorBuiltinString = "";
|
||||
|
||||
return PreprocessorBuiltinString;
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _INITIALIZE_INCLUDED_
|
||||
#define _INITIALIZE_INCLUDED_
|
||||
|
||||
#include "ResourceLimits.h"
|
||||
#include "Common.h"
|
||||
#include "ShHandle.h"
|
||||
#include "SymbolTable.h"
|
||||
|
||||
typedef TVector<TString> TBuiltInStrings;
|
||||
|
||||
class TBuiltIns {
|
||||
public:
|
||||
POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
|
||||
void initialize();
|
||||
void initialize(const TBuiltInResource& resources);
|
||||
TBuiltInStrings* getBuiltInStrings() { return builtInStrings; }
|
||||
protected:
|
||||
TBuiltInStrings builtInStrings[EShLangCount];
|
||||
};
|
||||
|
||||
void IdentifyBuiltIns(EShLanguage, TSymbolTable&);
|
||||
void IdentifyBuiltIns(EShLanguage, TSymbolTable&, const TBuiltInResource &resources);
|
||||
bool GenerateBuiltInSymbolTable(const TBuiltInResource* resources, TInfoSink&, TSymbolTable*, EShLanguage language = EShLangCount);
|
||||
bool InitializeSymbolTable(TBuiltInStrings* BuiltInStrings, EShLanguage language, TInfoSink& infoSink, const TBuiltInResource *resources, TSymbolTable*);
|
||||
const char* GetPreprocessorBuiltinString();
|
||||
extern "C" int InitPreprocessor(void);
|
||||
extern "C" int FinalizePreprocessor(void);
|
||||
|
||||
#endif // _INITIALIZE_INCLUDED_
|
|
@ -0,0 +1,119 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#include "InitializeDll.h"
|
||||
#include "InitializeGlobals.h"
|
||||
#include "InitializeParseContext.h"
|
||||
|
||||
#include "ShaderLang.h"
|
||||
|
||||
OS_TLSIndex ThreadInitializeIndex = OS_INVALID_TLS_INDEX;
|
||||
|
||||
bool InitProcess()
|
||||
{
|
||||
if (ThreadInitializeIndex != OS_INVALID_TLS_INDEX) {
|
||||
//
|
||||
// Function is re-entrant.
|
||||
//
|
||||
return true;
|
||||
}
|
||||
|
||||
ThreadInitializeIndex = OS_AllocTLSIndex();
|
||||
|
||||
if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) {
|
||||
assert(0 && "InitProcess(): Failed to allocate TLS area for init flag");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (!InitializePoolIndex()) {
|
||||
assert(0 && "InitProcess(): Failed to initalize global pool");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!InitializeParseContextIndex()) {
|
||||
assert(0 && "InitProcess(): Failed to initalize parse context");
|
||||
return false;
|
||||
}
|
||||
|
||||
InitThread();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool InitThread()
|
||||
{
|
||||
//
|
||||
// This function is re-entrant
|
||||
//
|
||||
if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) {
|
||||
assert(0 && "InitThread(): Process hasn't been initalised.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (OS_GetTLSValue(ThreadInitializeIndex) != 0)
|
||||
return true;
|
||||
|
||||
InitializeGlobalPools();
|
||||
|
||||
if (!InitializeGlobalParseContext())
|
||||
return false;
|
||||
|
||||
if (!OS_SetTLSValue(ThreadInitializeIndex, (void *)1)) {
|
||||
assert(0 && "InitThread(): Unable to set init flag.");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool DetachThread()
|
||||
{
|
||||
bool success = true;
|
||||
|
||||
if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX)
|
||||
return true;
|
||||
|
||||
//
|
||||
// Function is re-entrant and this thread may not have been initalised.
|
||||
//
|
||||
if (OS_GetTLSValue(ThreadInitializeIndex) != 0) {
|
||||
if (!OS_SetTLSValue(ThreadInitializeIndex, (void *)0)) {
|
||||
assert(0 && "DetachThread(): Unable to clear init flag.");
|
||||
success = false;
|
||||
}
|
||||
|
||||
FreeGlobalPools();
|
||||
|
||||
if (!FreeParseContext())
|
||||
success = false;
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
bool DetachProcess()
|
||||
{
|
||||
bool success = true;
|
||||
|
||||
if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX)
|
||||
return true;
|
||||
|
||||
ShFinalize();
|
||||
|
||||
success = DetachThread();
|
||||
|
||||
FreePoolIndex();
|
||||
|
||||
if (!FreeParseContextIndex())
|
||||
success = false;
|
||||
|
||||
OS_FreeTLSIndex(ThreadInitializeIndex);
|
||||
ThreadInitializeIndex = OS_INVALID_TLS_INDEX;
|
||||
|
||||
return success;
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
#ifndef __INITIALIZEDLL_H
|
||||
#define __INITIALIZEDLL_H
|
||||
|
||||
|
||||
#include "osinclude.h"
|
||||
|
||||
|
||||
bool InitProcess();
|
||||
bool InitThread();
|
||||
bool DetachThread();
|
||||
bool DetachProcess();
|
||||
|
||||
#endif // __INITIALIZEDLL_H
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef __INITIALIZE_GLOBALS_INCLUDED_
|
||||
#define __INITIALIZE_GLOBALS_INCLUDED_
|
||||
|
||||
void InitializeGlobalPools();
|
||||
void FreeGlobalPools();
|
||||
bool InitializePoolIndex();
|
||||
void FreePoolIndex();
|
||||
|
||||
#endif // __INITIALIZE_GLOBALS_INCLUDED_
|
|
@ -0,0 +1,17 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef __INITIALIZE_PARSE_CONTEXT_INCLUDED_
|
||||
#define __INITIALIZE_PARSE_CONTEXT_INCLUDED_
|
||||
#include "osinclude.h"
|
||||
|
||||
bool InitializeParseContextIndex();
|
||||
bool InitializeGlobalParseContext();
|
||||
bool FreeParseContext();
|
||||
bool FreeParseContextIndex();
|
||||
|
||||
|
||||
#endif // __INITIALIZE_PARSE_CONTEXT_INCLUDED_
|
|
@ -0,0 +1,293 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#include "intermediate.h"
|
||||
|
||||
//
|
||||
// Traverse the intermediate representation tree, and
|
||||
// call a node type specific function for each node.
|
||||
// Done recursively through the member function Traverse().
|
||||
// Node types can be skipped if their function to call is 0,
|
||||
// but their subtree will still be traversed.
|
||||
// Nodes with children can have their whole subtree skipped
|
||||
// if preVisit is turned on and the type specific function
|
||||
// returns false.
|
||||
//
|
||||
// preVisit, postVisit, and rightToLeft control what order
|
||||
// nodes are visited in.
|
||||
//
|
||||
|
||||
//
|
||||
// Traversal functions for terminals are straighforward....
|
||||
//
|
||||
void TIntermSymbol::traverse(TIntermTraverser* it)
|
||||
{
|
||||
it->visitSymbol(this);
|
||||
}
|
||||
|
||||
void TIntermConstantUnion::traverse(TIntermTraverser* it)
|
||||
{
|
||||
it->visitConstantUnion(this);
|
||||
}
|
||||
|
||||
//
|
||||
// Traverse a binary node.
|
||||
//
|
||||
void TIntermBinary::traverse(TIntermTraverser* it)
|
||||
{
|
||||
bool visit = true;
|
||||
|
||||
//
|
||||
// visit the node before children if pre-visiting.
|
||||
//
|
||||
if(it->preVisit)
|
||||
{
|
||||
visit = it->visitBinary(PreVisit, this);
|
||||
}
|
||||
|
||||
//
|
||||
// Visit the children, in the right order.
|
||||
//
|
||||
if(visit)
|
||||
{
|
||||
it->incrementDepth();
|
||||
|
||||
if(it->rightToLeft)
|
||||
{
|
||||
if(right)
|
||||
{
|
||||
right->traverse(it);
|
||||
}
|
||||
|
||||
if(it->inVisit)
|
||||
{
|
||||
visit = it->visitBinary(InVisit, this);
|
||||
}
|
||||
|
||||
if(visit && left)
|
||||
{
|
||||
left->traverse(it);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(left)
|
||||
{
|
||||
left->traverse(it);
|
||||
}
|
||||
|
||||
if(it->inVisit)
|
||||
{
|
||||
visit = it->visitBinary(InVisit, this);
|
||||
}
|
||||
|
||||
if(visit && right)
|
||||
{
|
||||
right->traverse(it);
|
||||
}
|
||||
}
|
||||
|
||||
it->decrementDepth();
|
||||
}
|
||||
|
||||
//
|
||||
// Visit the node after the children, if requested and the traversal
|
||||
// hasn't been cancelled yet.
|
||||
//
|
||||
if(visit && it->postVisit)
|
||||
{
|
||||
it->visitBinary(PostVisit, this);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Traverse a unary node. Same comments in binary node apply here.
|
||||
//
|
||||
void TIntermUnary::traverse(TIntermTraverser* it)
|
||||
{
|
||||
bool visit = true;
|
||||
|
||||
if (it->preVisit)
|
||||
visit = it->visitUnary(PreVisit, this);
|
||||
|
||||
if (visit) {
|
||||
it->incrementDepth();
|
||||
operand->traverse(it);
|
||||
it->decrementDepth();
|
||||
}
|
||||
|
||||
if (visit && it->postVisit)
|
||||
it->visitUnary(PostVisit, this);
|
||||
}
|
||||
|
||||
//
|
||||
// Traverse an aggregate node. Same comments in binary node apply here.
|
||||
//
|
||||
void TIntermAggregate::traverse(TIntermTraverser* it)
|
||||
{
|
||||
bool visit = true;
|
||||
|
||||
if(it->preVisit)
|
||||
{
|
||||
visit = it->visitAggregate(PreVisit, this);
|
||||
}
|
||||
|
||||
if(visit)
|
||||
{
|
||||
it->incrementDepth();
|
||||
|
||||
if(it->rightToLeft)
|
||||
{
|
||||
for(TIntermSequence::reverse_iterator sit = sequence.rbegin(); sit != sequence.rend(); sit++)
|
||||
{
|
||||
(*sit)->traverse(it);
|
||||
|
||||
if(visit && it->inVisit)
|
||||
{
|
||||
if(*sit != sequence.front())
|
||||
{
|
||||
visit = it->visitAggregate(InVisit, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for(TIntermSequence::iterator sit = sequence.begin(); sit != sequence.end(); sit++)
|
||||
{
|
||||
(*sit)->traverse(it);
|
||||
|
||||
if(visit && it->inVisit)
|
||||
{
|
||||
if(*sit != sequence.back())
|
||||
{
|
||||
visit = it->visitAggregate(InVisit, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
it->decrementDepth();
|
||||
}
|
||||
|
||||
if(visit && it->postVisit)
|
||||
{
|
||||
it->visitAggregate(PostVisit, this);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Traverse a selection node. Same comments in binary node apply here.
|
||||
//
|
||||
void TIntermSelection::traverse(TIntermTraverser* it)
|
||||
{
|
||||
bool visit = true;
|
||||
|
||||
if (it->preVisit)
|
||||
visit = it->visitSelection(PreVisit, this);
|
||||
|
||||
if (visit) {
|
||||
it->incrementDepth();
|
||||
if (it->rightToLeft) {
|
||||
if (falseBlock)
|
||||
falseBlock->traverse(it);
|
||||
if (trueBlock)
|
||||
trueBlock->traverse(it);
|
||||
condition->traverse(it);
|
||||
} else {
|
||||
condition->traverse(it);
|
||||
if (trueBlock)
|
||||
trueBlock->traverse(it);
|
||||
if (falseBlock)
|
||||
falseBlock->traverse(it);
|
||||
}
|
||||
it->decrementDepth();
|
||||
}
|
||||
|
||||
if (visit && it->postVisit)
|
||||
it->visitSelection(PostVisit, this);
|
||||
}
|
||||
|
||||
//
|
||||
// Traverse a loop node. Same comments in binary node apply here.
|
||||
//
|
||||
void TIntermLoop::traverse(TIntermTraverser* it)
|
||||
{
|
||||
bool visit = true;
|
||||
|
||||
if(it->preVisit)
|
||||
{
|
||||
visit = it->visitLoop(PreVisit, this);
|
||||
}
|
||||
|
||||
if(visit)
|
||||
{
|
||||
it->incrementDepth();
|
||||
|
||||
if(it->rightToLeft)
|
||||
{
|
||||
if(terminal)
|
||||
{
|
||||
terminal->traverse(it);
|
||||
}
|
||||
|
||||
if(body)
|
||||
{
|
||||
body->traverse(it);
|
||||
}
|
||||
|
||||
if(test)
|
||||
{
|
||||
test->traverse(it);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(test)
|
||||
{
|
||||
test->traverse(it);
|
||||
}
|
||||
|
||||
if(body)
|
||||
{
|
||||
body->traverse(it);
|
||||
}
|
||||
|
||||
if(terminal)
|
||||
{
|
||||
terminal->traverse(it);
|
||||
}
|
||||
}
|
||||
|
||||
it->decrementDepth();
|
||||
}
|
||||
|
||||
if(visit && it->postVisit)
|
||||
{
|
||||
it->visitLoop(PostVisit, this);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Traverse a branch node. Same comments in binary node apply here.
|
||||
//
|
||||
void TIntermBranch::traverse(TIntermTraverser* it)
|
||||
{
|
||||
bool visit = true;
|
||||
|
||||
if (it->preVisit)
|
||||
visit = it->visitBranch(PreVisit, this);
|
||||
|
||||
if (visit && expression) {
|
||||
it->incrementDepth();
|
||||
expression->traverse(it);
|
||||
it->decrementDepth();
|
||||
}
|
||||
|
||||
if (visit && it->postVisit)
|
||||
it->visitBranch(PostVisit, this);
|
||||
}
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,63 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
//
|
||||
// The top level algorithms for linking multiple
|
||||
// shaders together.
|
||||
//
|
||||
#include "Common.h"
|
||||
#include "ShHandle.h"
|
||||
|
||||
//
|
||||
// Actual link object, derived from the shader handle base classes.
|
||||
//
|
||||
class TGenericLinker : public TLinker {
|
||||
public:
|
||||
TGenericLinker(EShExecutable e, int dOptions) : TLinker(e, infoSink), debugOptions(dOptions) { }
|
||||
bool link(TCompilerList&, TUniformMap*) { return true; }
|
||||
void getAttributeBindings(ShBindingTable const **t) const { }
|
||||
TInfoSink infoSink;
|
||||
int debugOptions;
|
||||
};
|
||||
|
||||
//
|
||||
// The internal view of a uniform/float object exchanged with the driver.
|
||||
//
|
||||
class TUniformLinkedMap : public TUniformMap {
|
||||
public:
|
||||
TUniformLinkedMap() { }
|
||||
virtual int getLocation(const char* name) { return 0; }
|
||||
};
|
||||
|
||||
TShHandleBase* ConstructLinker(EShExecutable executable, int debugOptions)
|
||||
{
|
||||
return new TGenericLinker(executable, debugOptions);
|
||||
}
|
||||
|
||||
void DeleteLinker(TShHandleBase* linker)
|
||||
{
|
||||
delete linker;
|
||||
}
|
||||
|
||||
TUniformMap* ConstructUniformMap()
|
||||
{
|
||||
return new TUniformLinkedMap();
|
||||
}
|
||||
|
||||
void DeleteUniformMap(TUniformMap* map)
|
||||
{
|
||||
delete map;
|
||||
}
|
||||
|
||||
TShHandleBase* ConstructBindings()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void DeleteBindingList(TShHandleBase* bindingList)
|
||||
{
|
||||
delete bindingList;
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _MMAP_INCLUDED_
|
||||
#define _MMAP_INCLUDED_
|
||||
|
||||
//
|
||||
// Encapsulate memory mapped files
|
||||
//
|
||||
|
||||
class TMMap {
|
||||
public:
|
||||
TMMap(const char* fileName) :
|
||||
fSize(-1), // -1 is the error value returned by GetFileSize()
|
||||
fp(NULL),
|
||||
fBuff(0) // 0 is the error value returned by MapViewOfFile()
|
||||
{
|
||||
if ((fp = fopen(fileName, "r")) == NULL)
|
||||
return;
|
||||
char c = getc(fp);
|
||||
fSize = 0;
|
||||
while (c != EOF) {
|
||||
fSize++;
|
||||
c = getc(fp);
|
||||
}
|
||||
if (c == EOF)
|
||||
fSize++;
|
||||
rewind(fp);
|
||||
fBuff = (char*)malloc(sizeof(char) * fSize);
|
||||
int count = 0;
|
||||
c = getc(fp);
|
||||
while (c != EOF) {
|
||||
fBuff[count++] = c;
|
||||
c = getc(fp);
|
||||
}
|
||||
fBuff[count++] = c;
|
||||
}
|
||||
|
||||
char* getData() { return fBuff; }
|
||||
int getSize() { return fSize; }
|
||||
|
||||
~TMMap() {
|
||||
if (fp != NULL)
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
private:
|
||||
int fSize; // size of file to map in
|
||||
FILE *fp;
|
||||
char* fBuff; // the actual data;
|
||||
};
|
||||
|
||||
#endif // _MMAP_INCLUDED_
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,42 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef COMPILER_OUTPUTHLSL_H_
|
||||
#define COMPILER_OUTPUTHLSL_H_
|
||||
|
||||
#include "intermediate.h"
|
||||
#include "ParseHelper.h"
|
||||
|
||||
namespace sh
|
||||
{
|
||||
class OutputHLSL : public TIntermTraverser
|
||||
{
|
||||
public:
|
||||
OutputHLSL(TParseContext &context);
|
||||
|
||||
void header();
|
||||
|
||||
protected:
|
||||
void visitSymbol(TIntermSymbol*);
|
||||
void visitConstantUnion(TIntermConstantUnion*);
|
||||
bool visitBinary(Visit visit, TIntermBinary*);
|
||||
bool visitUnary(Visit visit, TIntermUnary*);
|
||||
bool visitSelection(Visit visit, TIntermSelection*);
|
||||
bool visitAggregate(Visit visit, TIntermAggregate*);
|
||||
bool visitLoop(Visit visit, TIntermLoop*);
|
||||
bool visitBranch(Visit visit, TIntermBranch*);
|
||||
|
||||
void outputTriplet(Visit visit, const char *preString, const char *inString, const char *postString);
|
||||
|
||||
static TString typeString(const TType &type);
|
||||
static TString arrayString(const TType &type);
|
||||
static TString initializer(const TType &type);
|
||||
|
||||
TParseContext &context;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // COMPILER_OUTPUTHLSL_H_
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,121 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
#ifndef _PARSER_HELPER_INCLUDED_
|
||||
#define _PARSER_HELPER_INCLUDED_
|
||||
|
||||
#include "ShHandle.h"
|
||||
#include "SymbolTable.h"
|
||||
#include "localintermediate.h"
|
||||
|
||||
struct TMatrixFields {
|
||||
bool wholeRow;
|
||||
bool wholeCol;
|
||||
int row;
|
||||
int col;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
EBhRequire,
|
||||
EBhEnable,
|
||||
EBhWarn,
|
||||
EBhDisable
|
||||
} TBehavior;
|
||||
|
||||
struct TPragma {
|
||||
TPragma(bool o, bool d) : optimize(o), debug(d) { }
|
||||
bool optimize;
|
||||
bool debug;
|
||||
TPragmaTable pragmaTable;
|
||||
};
|
||||
|
||||
//
|
||||
// The following are extra variables needed during parsing, grouped together so
|
||||
// they can be passed to the parser without needing a global.
|
||||
//
|
||||
struct TParseContext {
|
||||
TParseContext(TSymbolTable& symt, TIntermediate& interm, EShLanguage L, TInfoSink& is) :
|
||||
intermediate(interm), symbolTable(symt), infoSink(is), language(L), treeRoot(0),
|
||||
recoveredFromError(false), numErrors(0), lexAfterType(false), loopNestingLevel(0),
|
||||
inTypeParen(false), contextPragma(true, false) { }
|
||||
TIntermediate& intermediate; // to hold and build a parse tree
|
||||
TSymbolTable& symbolTable; // symbol table that goes with the language currently being parsed
|
||||
TInfoSink& infoSink;
|
||||
EShLanguage language; // vertex or fragment language (future: pack or unpack)
|
||||
TIntermNode* treeRoot; // root of parse tree being created
|
||||
bool recoveredFromError; // true if a parse error has occurred, but we continue to parse
|
||||
int numErrors;
|
||||
bool lexAfterType; // true if we've recognized a type, so can only be looking for an identifier
|
||||
int loopNestingLevel; // 0 if outside all loops
|
||||
bool inTypeParen; // true if in parentheses, looking only for an identifier
|
||||
const TType* currentFunctionType; // the return type of the function that's currently being parsed
|
||||
bool functionReturnsValue; // true if a non-void function has a return
|
||||
TMap<TString, TBehavior> extensionBehavior;
|
||||
void initializeExtensionBehavior();
|
||||
|
||||
void C_DECL error(TSourceLoc, const char *szReason, const char *szToken,
|
||||
const char *szExtraInfoFormat, ...);
|
||||
bool reservedErrorCheck(int line, const TString& identifier);
|
||||
void recover();
|
||||
|
||||
bool parseVectorFields(const TString&, int vecSize, TVectorFields&, int line);
|
||||
bool parseMatrixFields(const TString&, int matSize, TMatrixFields&, int line);
|
||||
void assignError(int line, const char* op, TString left, TString right);
|
||||
void unaryOpError(int line, const char* op, TString operand);
|
||||
void binaryOpError(int line, const char* op, TString left, TString right);
|
||||
bool lValueErrorCheck(int line, const char* op, TIntermTyped*);
|
||||
bool constErrorCheck(TIntermTyped* node);
|
||||
bool integerErrorCheck(TIntermTyped* node, const char* token);
|
||||
bool globalErrorCheck(int line, bool global, const char* token);
|
||||
bool constructorErrorCheck(int line, TIntermNode*, TFunction&, TOperator, TType*);
|
||||
bool arraySizeErrorCheck(int line, TIntermTyped* expr, int& size);
|
||||
bool arrayQualifierErrorCheck(int line, TPublicType type);
|
||||
bool arrayTypeErrorCheck(int line, TPublicType type);
|
||||
bool arrayErrorCheck(int line, TString& identifier, TPublicType type, TVariable*& variable);
|
||||
bool voidErrorCheck(int, const TString&, const TPublicType&);
|
||||
bool boolErrorCheck(int, const TIntermTyped*);
|
||||
bool boolErrorCheck(int, const TPublicType&);
|
||||
bool samplerErrorCheck(int line, const TPublicType& pType, const char* reason);
|
||||
bool structQualifierErrorCheck(int line, const TPublicType& pType);
|
||||
bool parameterSamplerErrorCheck(int line, TQualifier qualifier, const TType& type);
|
||||
bool containsSampler(TType& type);
|
||||
bool nonInitConstErrorCheck(int line, TString& identifier, TPublicType& type);
|
||||
bool nonInitErrorCheck(int line, TString& identifier, TPublicType& type);
|
||||
bool paramErrorCheck(int line, TQualifier qualifier, TQualifier paramQualifier, TType* type);
|
||||
bool extensionErrorCheck(int line, const char*);
|
||||
const TFunction* findFunction(int line, TFunction* pfnCall, bool *builtIn = 0);
|
||||
bool executeInitializer(TSourceLoc line, TString& identifier, TPublicType& pType,
|
||||
TIntermTyped* initializer, TIntermNode*& intermNode, TVariable* variable = 0);
|
||||
bool areAllChildConst(TIntermAggregate* aggrNode);
|
||||
TIntermTyped* addConstructor(TIntermNode*, const TType*, TOperator, TFunction*, TSourceLoc);
|
||||
TIntermTyped* foldConstConstructor(TIntermAggregate* aggrNode, const TType& type);
|
||||
TIntermTyped* constructStruct(TIntermNode*, TType*, int, TSourceLoc, bool subset);
|
||||
TIntermTyped* constructBuiltIn(const TType*, TOperator, TIntermNode*, TSourceLoc, bool subset);
|
||||
TIntermTyped* addConstVectorNode(TVectorFields&, TIntermTyped*, TSourceLoc);
|
||||
TIntermTyped* addConstMatrixNode(int , TIntermTyped*, TSourceLoc);
|
||||
TIntermTyped* addConstArrayNode(int index, TIntermTyped* node, TSourceLoc line);
|
||||
TIntermTyped* addConstStruct(TString& , TIntermTyped*, TSourceLoc);
|
||||
bool arraySetMaxSize(TIntermSymbol*, TType*, int, bool, TSourceLoc);
|
||||
struct TPragma contextPragma;
|
||||
TString HashErrMsg;
|
||||
bool AfterEOF;
|
||||
};
|
||||
|
||||
int PaParseStrings(char* argv[], int strLen[], int argc, TParseContext&);
|
||||
void PaReservedWord();
|
||||
int PaIdentOrType(TString& id, TParseContext&, TSymbol*&);
|
||||
int PaParseComment(int &lineno, TParseContext&);
|
||||
void setInitialState();
|
||||
|
||||
typedef TParseContext* TParseContextPointer;
|
||||
extern TParseContextPointer& GetGlobalParseContext();
|
||||
#define GlobalParseContext GetGlobalParseContext()
|
||||
|
||||
typedef struct TThreadParseContextRec
|
||||
{
|
||||
TParseContext *lpGlobalParseContext;
|
||||
} TThreadParseContext;
|
||||
|
||||
#endif // _PARSER_HELPER_INCLUDED_
|
|
@ -0,0 +1,314 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#include "PoolAlloc.h"
|
||||
#include "Common.h"
|
||||
|
||||
#include "InitializeGlobals.h"
|
||||
#include "osinclude.h"
|
||||
|
||||
OS_TLSIndex PoolIndex = TLS_OUT_OF_INDEXES;
|
||||
|
||||
void InitializeGlobalPools()
|
||||
{
|
||||
TThreadGlobalPools* globalPools= static_cast<TThreadGlobalPools*>(OS_GetTLSValue(PoolIndex));
|
||||
if (globalPools)
|
||||
return;
|
||||
|
||||
TPoolAllocator *globalPoolAllocator = new TPoolAllocator(true);
|
||||
|
||||
TThreadGlobalPools* threadData = new TThreadGlobalPools();
|
||||
|
||||
threadData->globalPoolAllocator = globalPoolAllocator;
|
||||
|
||||
OS_SetTLSValue(PoolIndex, threadData);
|
||||
globalPoolAllocator->push();
|
||||
}
|
||||
|
||||
void FreeGlobalPools()
|
||||
{
|
||||
// Release the allocated memory for this thread.
|
||||
TThreadGlobalPools* globalPools= static_cast<TThreadGlobalPools*>(OS_GetTLSValue(PoolIndex));
|
||||
if (!globalPools)
|
||||
return;
|
||||
|
||||
GlobalPoolAllocator.popAll();
|
||||
delete &GlobalPoolAllocator;
|
||||
delete globalPools;
|
||||
}
|
||||
|
||||
bool InitializePoolIndex()
|
||||
{
|
||||
// Allocate a TLS index.
|
||||
if ((PoolIndex = OS_AllocTLSIndex()) == OS_INVALID_TLS_INDEX)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void FreePoolIndex()
|
||||
{
|
||||
// Release the TLS index.
|
||||
OS_FreeTLSIndex(PoolIndex);
|
||||
}
|
||||
|
||||
TPoolAllocator& GetGlobalPoolAllocator()
|
||||
{
|
||||
TThreadGlobalPools* threadData = static_cast<TThreadGlobalPools*>(OS_GetTLSValue(PoolIndex));
|
||||
|
||||
return *threadData->globalPoolAllocator;
|
||||
}
|
||||
|
||||
void SetGlobalPoolAllocatorPtr(TPoolAllocator* poolAllocator)
|
||||
{
|
||||
TThreadGlobalPools* threadData = static_cast<TThreadGlobalPools*>(OS_GetTLSValue(PoolIndex));
|
||||
|
||||
threadData->globalPoolAllocator = poolAllocator;
|
||||
}
|
||||
|
||||
//
|
||||
// Implement the functionality of the TPoolAllocator class, which
|
||||
// is documented in PoolAlloc.h.
|
||||
//
|
||||
TPoolAllocator::TPoolAllocator(bool g, int growthIncrement, int allocationAlignment) :
|
||||
global(g),
|
||||
pageSize(growthIncrement),
|
||||
alignment(allocationAlignment),
|
||||
freeList(0),
|
||||
inUseList(0),
|
||||
numCalls(0)
|
||||
{
|
||||
//
|
||||
// Don't allow page sizes we know are smaller than all common
|
||||
// OS page sizes.
|
||||
//
|
||||
if (pageSize < 4*1024)
|
||||
pageSize = 4*1024;
|
||||
|
||||
//
|
||||
// A large currentPageOffset indicates a new page needs to
|
||||
// be obtained to allocate memory.
|
||||
//
|
||||
currentPageOffset = pageSize;
|
||||
|
||||
//
|
||||
// Adjust alignment to be at least pointer aligned and
|
||||
// power of 2.
|
||||
//
|
||||
size_t minAlign = sizeof(void*);
|
||||
alignment &= ~(minAlign - 1);
|
||||
if (alignment < minAlign)
|
||||
alignment = minAlign;
|
||||
size_t a = 1;
|
||||
while (a < alignment)
|
||||
a <<= 1;
|
||||
alignment = a;
|
||||
alignmentMask = a - 1;
|
||||
|
||||
//
|
||||
// Align header skip
|
||||
//
|
||||
headerSkip = minAlign;
|
||||
if (headerSkip < sizeof(tHeader)) {
|
||||
headerSkip = (sizeof(tHeader) + alignmentMask) & ~alignmentMask;
|
||||
}
|
||||
}
|
||||
|
||||
TPoolAllocator::~TPoolAllocator()
|
||||
{
|
||||
if (!global) {
|
||||
//
|
||||
// Then we know that this object is not being
|
||||
// allocated after other, globally scoped objects
|
||||
// that depend on it. So we can delete the "in use" memory.
|
||||
//
|
||||
while (inUseList) {
|
||||
tHeader* next = inUseList->nextPage;
|
||||
inUseList->~tHeader();
|
||||
delete [] reinterpret_cast<char*>(inUseList);
|
||||
inUseList = next;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Always delete the free list memory - it can't be being
|
||||
// (correctly) referenced, whether the pool allocator was
|
||||
// global or not. We should not check the guard blocks
|
||||
// here, because we did it already when the block was
|
||||
// placed into the free list.
|
||||
//
|
||||
while (freeList) {
|
||||
tHeader* next = freeList->nextPage;
|
||||
delete [] reinterpret_cast<char*>(freeList);
|
||||
freeList = next;
|
||||
}
|
||||
}
|
||||
|
||||
// Support MSVC++ 6.0
|
||||
const unsigned char TAllocation::guardBlockBeginVal = 0xfb;
|
||||
const unsigned char TAllocation::guardBlockEndVal = 0xfe;
|
||||
const unsigned char TAllocation::userDataFill = 0xcd;
|
||||
|
||||
# ifdef GUARD_BLOCKS
|
||||
const size_t TAllocation::guardBlockSize = 16;
|
||||
# else
|
||||
const size_t TAllocation::guardBlockSize = 0;
|
||||
# endif
|
||||
|
||||
//
|
||||
// Check a single guard block for damage
|
||||
//
|
||||
void TAllocation::checkGuardBlock(unsigned char* blockMem, unsigned char val, const char* locText) const
|
||||
{
|
||||
for (size_t x = 0; x < guardBlockSize; x++) {
|
||||
if (blockMem[x] != val) {
|
||||
char assertMsg[80];
|
||||
|
||||
// We don't print the assert message. It's here just to be helpful.
|
||||
sprintf(assertMsg, "PoolAlloc: Damage %s %lu byte allocation at 0x%p\n",
|
||||
locText, size, data());
|
||||
assert(0 && "PoolAlloc: Damage in guard block");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TPoolAllocator::push()
|
||||
{
|
||||
tAllocState state = { currentPageOffset, inUseList };
|
||||
|
||||
stack.push_back(state);
|
||||
|
||||
//
|
||||
// Indicate there is no current page to allocate from.
|
||||
//
|
||||
currentPageOffset = pageSize;
|
||||
}
|
||||
|
||||
//
|
||||
// Do a mass-deallocation of all the individual allocations
|
||||
// that have occurred since the last push(), or since the
|
||||
// last pop(), or since the object's creation.
|
||||
//
|
||||
// The deallocated pages are saved for future allocations.
|
||||
//
|
||||
void TPoolAllocator::pop()
|
||||
{
|
||||
if (stack.size() < 1)
|
||||
return;
|
||||
|
||||
tHeader* page = stack.back().page;
|
||||
currentPageOffset = stack.back().offset;
|
||||
|
||||
while (inUseList != page) {
|
||||
// invoke destructor to free allocation list
|
||||
inUseList->~tHeader();
|
||||
|
||||
tHeader* nextInUse = inUseList->nextPage;
|
||||
if (inUseList->pageCount > 1)
|
||||
delete [] reinterpret_cast<char*>(inUseList);
|
||||
else {
|
||||
inUseList->nextPage = freeList;
|
||||
freeList = inUseList;
|
||||
}
|
||||
inUseList = nextInUse;
|
||||
}
|
||||
|
||||
stack.pop_back();
|
||||
}
|
||||
|
||||
//
|
||||
// Do a mass-deallocation of all the individual allocations
|
||||
// that have occurred.
|
||||
//
|
||||
void TPoolAllocator::popAll()
|
||||
{
|
||||
while (stack.size() > 0)
|
||||
pop();
|
||||
}
|
||||
|
||||
void* TPoolAllocator::allocate(size_t numBytes)
|
||||
{
|
||||
// If we are using guard blocks, all allocations are bracketed by
|
||||
// them: [guardblock][allocation][guardblock]. numBytes is how
|
||||
// much memory the caller asked for. allocationSize is the total
|
||||
// size including guard blocks. In release build,
|
||||
// guardBlockSize=0 and this all gets optimized away.
|
||||
size_t allocationSize = TAllocation::allocationSize(numBytes);
|
||||
|
||||
//
|
||||
// Just keep some interesting statistics.
|
||||
//
|
||||
++numCalls;
|
||||
totalBytes += numBytes;
|
||||
|
||||
//
|
||||
// Do the allocation, most likely case first, for efficiency.
|
||||
// This step could be moved to be inline sometime.
|
||||
//
|
||||
if (currentPageOffset + allocationSize <= pageSize) {
|
||||
//
|
||||
// Safe to allocate from currentPageOffset.
|
||||
//
|
||||
unsigned char* memory = reinterpret_cast<unsigned char *>(inUseList) + currentPageOffset;
|
||||
currentPageOffset += allocationSize;
|
||||
currentPageOffset = (currentPageOffset + alignmentMask) & ~alignmentMask;
|
||||
|
||||
return initializeAllocation(inUseList, memory, numBytes);
|
||||
}
|
||||
|
||||
if (allocationSize + headerSkip > pageSize) {
|
||||
//
|
||||
// Do a multi-page allocation. Don't mix these with the others.
|
||||
// The OS is efficient and allocating and free-ing multiple pages.
|
||||
//
|
||||
size_t numBytesToAlloc = allocationSize + headerSkip;
|
||||
tHeader* memory = reinterpret_cast<tHeader*>(::new char[numBytesToAlloc]);
|
||||
if (memory == 0)
|
||||
return 0;
|
||||
|
||||
// Use placement-new to initialize header
|
||||
new(memory) tHeader(inUseList, (numBytesToAlloc + pageSize - 1) / pageSize);
|
||||
inUseList = memory;
|
||||
|
||||
currentPageOffset = pageSize; // make next allocation come from a new page
|
||||
|
||||
// No guard blocks for multi-page allocations (yet)
|
||||
return reinterpret_cast<void*>(reinterpret_cast<UINT_PTR>(memory) + headerSkip);
|
||||
}
|
||||
|
||||
//
|
||||
// Need a simple page to allocate from.
|
||||
//
|
||||
tHeader* memory;
|
||||
if (freeList) {
|
||||
memory = freeList;
|
||||
freeList = freeList->nextPage;
|
||||
} else {
|
||||
memory = reinterpret_cast<tHeader*>(::new char[pageSize]);
|
||||
if (memory == 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Use placement-new to initialize header
|
||||
new(memory) tHeader(inUseList, 1);
|
||||
inUseList = memory;
|
||||
|
||||
unsigned char* ret = reinterpret_cast<unsigned char *>(inUseList) + headerSkip;
|
||||
currentPageOffset = (headerSkip + allocationSize + alignmentMask) & ~alignmentMask;
|
||||
|
||||
return initializeAllocation(inUseList, ret, numBytes);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Check all allocations in a list for damage by calling check on each.
|
||||
//
|
||||
void TAllocation::checkAllocList() const
|
||||
{
|
||||
for (const TAllocation* alloc = this; alloc != 0; alloc = alloc->prevAlloc)
|
||||
alloc->check();
|
||||
}
|
|
@ -0,0 +1,321 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _POOLALLOC_INCLUDED_
|
||||
#define _POOLALLOC_INCLUDED_
|
||||
|
||||
#ifdef _DEBUG
|
||||
# define GUARD_BLOCKS // define to enable guard block sanity checking
|
||||
#endif
|
||||
|
||||
//
|
||||
// This header defines an allocator that can be used to efficiently
|
||||
// allocate a large number of small requests for heap memory, with the
|
||||
// intention that they are not individually deallocated, but rather
|
||||
// collectively deallocated at one time.
|
||||
//
|
||||
// This simultaneously
|
||||
//
|
||||
// * Makes each individual allocation much more efficient; the
|
||||
// typical allocation is trivial.
|
||||
// * Completely avoids the cost of doing individual deallocation.
|
||||
// * Saves the trouble of tracking down and plugging a large class of leaks.
|
||||
//
|
||||
// Individual classes can use this allocator by supplying their own
|
||||
// new and delete methods.
|
||||
//
|
||||
// STL containers can use this allocator by using the pool_allocator
|
||||
// class as the allocator (second) template argument.
|
||||
//
|
||||
|
||||
#include <stddef.h>
|
||||
#include <vector>
|
||||
|
||||
// If we are using guard blocks, we must track each indivual
|
||||
// allocation. If we aren't using guard blocks, these
|
||||
// never get instantiated, so won't have any impact.
|
||||
//
|
||||
|
||||
class TAllocation {
|
||||
public:
|
||||
TAllocation(size_t size, unsigned char* mem, TAllocation* prev = 0) :
|
||||
size(size), mem(mem), prevAlloc(prev) {
|
||||
// Allocations are bracketed:
|
||||
// [allocationHeader][initialGuardBlock][userData][finalGuardBlock]
|
||||
// This would be cleaner with if (guardBlockSize)..., but that
|
||||
// makes the compiler print warnings about 0 length memsets,
|
||||
// even with the if() protecting them.
|
||||
# ifdef GUARD_BLOCKS
|
||||
memset(preGuard(), guardBlockBeginVal, guardBlockSize);
|
||||
memset(data(), userDataFill, size);
|
||||
memset(postGuard(), guardBlockEndVal, guardBlockSize);
|
||||
# endif
|
||||
}
|
||||
|
||||
void check() const {
|
||||
checkGuardBlock(preGuard(), guardBlockBeginVal, "before");
|
||||
checkGuardBlock(postGuard(), guardBlockEndVal, "after");
|
||||
}
|
||||
|
||||
void checkAllocList() const;
|
||||
|
||||
// Return total size needed to accomodate user buffer of 'size',
|
||||
// plus our tracking data.
|
||||
inline static size_t allocationSize(size_t size) {
|
||||
return size + 2 * guardBlockSize + headerSize();
|
||||
}
|
||||
|
||||
// Offset from surrounding buffer to get to user data buffer.
|
||||
inline static unsigned char* offsetAllocation(unsigned char* m) {
|
||||
return m + guardBlockSize + headerSize();
|
||||
}
|
||||
|
||||
private:
|
||||
void checkGuardBlock(unsigned char* blockMem, unsigned char val, const char* locText) const;
|
||||
|
||||
// Find offsets to pre and post guard blocks, and user data buffer
|
||||
unsigned char* preGuard() const { return mem + headerSize(); }
|
||||
unsigned char* data() const { return preGuard() + guardBlockSize; }
|
||||
unsigned char* postGuard() const { return data() + size; }
|
||||
|
||||
size_t size; // size of the user data area
|
||||
unsigned char* mem; // beginning of our allocation (pts to header)
|
||||
TAllocation* prevAlloc; // prior allocation in the chain
|
||||
|
||||
// Support MSVC++ 6.0
|
||||
const static unsigned char guardBlockBeginVal;
|
||||
const static unsigned char guardBlockEndVal;
|
||||
const static unsigned char userDataFill;
|
||||
|
||||
const static size_t guardBlockSize;
|
||||
# ifdef GUARD_BLOCKS
|
||||
inline static size_t headerSize() { return sizeof(TAllocation); }
|
||||
# else
|
||||
inline static size_t headerSize() { return 0; }
|
||||
# endif
|
||||
};
|
||||
|
||||
//
|
||||
// There are several stacks. One is to track the pushing and popping
|
||||
// of the user, and not yet implemented. The others are simply a
|
||||
// repositories of free pages or used pages.
|
||||
//
|
||||
// Page stacks are linked together with a simple header at the beginning
|
||||
// of each allocation obtained from the underlying OS. Multi-page allocations
|
||||
// are returned to the OS. Individual page allocations are kept for future
|
||||
// re-use.
|
||||
//
|
||||
// The "page size" used is not, nor must it match, the underlying OS
|
||||
// page size. But, having it be about that size or equal to a set of
|
||||
// pages is likely most optimal.
|
||||
//
|
||||
class TPoolAllocator {
|
||||
public:
|
||||
TPoolAllocator(bool global = false, int growthIncrement = 8*1024, int allocationAlignment = 16);
|
||||
|
||||
//
|
||||
// Don't call the destructor just to free up the memory, call pop()
|
||||
//
|
||||
~TPoolAllocator();
|
||||
|
||||
//
|
||||
// Call push() to establish a new place to pop memory too. Does not
|
||||
// have to be called to get things started.
|
||||
//
|
||||
void push();
|
||||
|
||||
//
|
||||
// Call pop() to free all memory allocated since the last call to push(),
|
||||
// or if no last call to push, frees all memory since first allocation.
|
||||
//
|
||||
void pop();
|
||||
|
||||
//
|
||||
// Call popAll() to free all memory allocated.
|
||||
//
|
||||
void popAll();
|
||||
|
||||
//
|
||||
// Call allocate() to actually acquire memory. Returns 0 if no memory
|
||||
// available, otherwise a properly aligned pointer to 'numBytes' of memory.
|
||||
//
|
||||
void* allocate(size_t numBytes);
|
||||
|
||||
//
|
||||
// There is no deallocate. The point of this class is that
|
||||
// deallocation can be skipped by the user of it, as the model
|
||||
// of use is to simultaneously deallocate everything at once
|
||||
// by calling pop(), and to not have to solve memory leak problems.
|
||||
//
|
||||
|
||||
protected:
|
||||
friend struct tHeader;
|
||||
|
||||
struct tHeader {
|
||||
tHeader(tHeader* nextPage, size_t pageCount) :
|
||||
#ifdef GUARD_BLOCKS
|
||||
lastAllocation(0),
|
||||
#endif
|
||||
nextPage(nextPage), pageCount(pageCount) { }
|
||||
|
||||
~tHeader() {
|
||||
#ifdef GUARD_BLOCKS
|
||||
if (lastAllocation)
|
||||
lastAllocation->checkAllocList();
|
||||
#endif
|
||||
}
|
||||
|
||||
tHeader* nextPage;
|
||||
size_t pageCount;
|
||||
#ifdef GUARD_BLOCKS
|
||||
TAllocation* lastAllocation;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct tAllocState {
|
||||
size_t offset;
|
||||
tHeader* page;
|
||||
};
|
||||
typedef std::vector<tAllocState> tAllocStack;
|
||||
|
||||
// Track allocations if and only if we're using guard blocks
|
||||
void* initializeAllocation(tHeader* block, unsigned char* memory, size_t numBytes) {
|
||||
# ifdef GUARD_BLOCKS
|
||||
new(memory) TAllocation(numBytes, memory, block->lastAllocation);
|
||||
block->lastAllocation = reinterpret_cast<TAllocation*>(memory);
|
||||
# endif
|
||||
|
||||
// This is optimized entirely away if GUARD_BLOCKS is not defined.
|
||||
return TAllocation::offsetAllocation(memory);
|
||||
}
|
||||
|
||||
bool global; // should be true if this object is globally scoped
|
||||
size_t pageSize; // granularity of allocation from the OS
|
||||
size_t alignment; // all returned allocations will be aligned at
|
||||
// this granularity, which will be a power of 2
|
||||
size_t alignmentMask;
|
||||
size_t headerSkip; // amount of memory to skip to make room for the
|
||||
// header (basically, size of header, rounded
|
||||
// up to make it aligned
|
||||
size_t currentPageOffset; // next offset in top of inUseList to allocate from
|
||||
tHeader* freeList; // list of popped memory
|
||||
tHeader* inUseList; // list of all memory currently being used
|
||||
tAllocStack stack; // stack of where to allocate from, to partition pool
|
||||
|
||||
int numCalls; // just an interesting statistic
|
||||
size_t totalBytes; // just an interesting statistic
|
||||
private:
|
||||
TPoolAllocator& operator=(const TPoolAllocator&); // dont allow assignment operator
|
||||
TPoolAllocator(const TPoolAllocator&); // dont allow default copy constructor
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// There could potentially be many pools with pops happening at
|
||||
// different times. But a simple use is to have a global pop
|
||||
// with everyone using the same global allocator.
|
||||
//
|
||||
typedef TPoolAllocator* PoolAllocatorPointer;
|
||||
extern TPoolAllocator& GetGlobalPoolAllocator();
|
||||
#define GlobalPoolAllocator GetGlobalPoolAllocator()
|
||||
|
||||
|
||||
struct TThreadGlobalPools
|
||||
{
|
||||
TPoolAllocator* globalPoolAllocator;
|
||||
};
|
||||
|
||||
void SetGlobalPoolAllocatorPtr(TPoolAllocator* poolAllocator);
|
||||
|
||||
//
|
||||
// This STL compatible allocator is intended to be used as the allocator
|
||||
// parameter to templatized STL containers, like vector and map.
|
||||
//
|
||||
// It will use the pools for allocation, and not
|
||||
// do any deallocation, but will still do destruction.
|
||||
//
|
||||
template<class T>
|
||||
class pool_allocator {
|
||||
public:
|
||||
typedef size_t size_type;
|
||||
typedef ptrdiff_t difference_type;
|
||||
typedef T *pointer;
|
||||
typedef const T *const_pointer;
|
||||
typedef T& reference;
|
||||
typedef const T& const_reference;
|
||||
typedef T value_type;
|
||||
template<class Other>
|
||||
struct rebind {
|
||||
typedef pool_allocator<Other> other;
|
||||
};
|
||||
pointer address(reference x) const { return &x; }
|
||||
const_pointer address(const_reference x) const { return &x; }
|
||||
|
||||
#ifdef USING_SGI_STL
|
||||
pool_allocator() { }
|
||||
#else
|
||||
pool_allocator() : allocator(GlobalPoolAllocator) { }
|
||||
pool_allocator(TPoolAllocator& a) : allocator(a) { }
|
||||
pool_allocator(const pool_allocator<T>& p) : allocator(p.allocator) { }
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1300
|
||||
template<class Other>
|
||||
#ifdef USING_SGI_STL
|
||||
pool_allocator(const pool_allocator<Other>& p) /*: allocator(p.getAllocator())*/ { }
|
||||
#else
|
||||
pool_allocator(const pool_allocator<Other>& p) : allocator(p.getAllocator()) { }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32
|
||||
template<class Other>
|
||||
pool_allocator(const pool_allocator<Other>& p) : allocator(p.getAllocator()) { }
|
||||
#endif
|
||||
|
||||
#ifdef USING_SGI_STL
|
||||
static pointer allocate(size_type n) {
|
||||
return reinterpret_cast<pointer>(getAllocator().allocate(n)); }
|
||||
pointer allocate(size_type n, const void*) {
|
||||
return reinterpret_cast<pointer>(getAllocator().allocate(n)); }
|
||||
|
||||
static void deallocate(void*, size_type) { }
|
||||
static void deallocate(pointer, size_type) { }
|
||||
#else
|
||||
pointer allocate(size_type n) {
|
||||
return reinterpret_cast<pointer>(getAllocator().allocate(n * sizeof(T))); }
|
||||
pointer allocate(size_type n, const void*) {
|
||||
return reinterpret_cast<pointer>(getAllocator().allocate(n * sizeof(T))); }
|
||||
|
||||
void deallocate(void*, size_type) { }
|
||||
void deallocate(pointer, size_type) { }
|
||||
#endif
|
||||
|
||||
pointer _Charalloc(size_t n) {
|
||||
return reinterpret_cast<pointer>(getAllocator().allocate(n)); }
|
||||
|
||||
void construct(pointer p, const T& val) { new ((void *)p) T(val); }
|
||||
void destroy(pointer p) { p->T::~T(); }
|
||||
|
||||
bool operator==(const pool_allocator& rhs) const { return &getAllocator() == &rhs.getAllocator(); }
|
||||
bool operator!=(const pool_allocator& rhs) const { return &getAllocator() != &rhs.getAllocator(); }
|
||||
|
||||
size_type max_size() const { return static_cast<size_type>(-1) / sizeof(T); }
|
||||
size_type max_size(int size) const { return static_cast<size_type>(-1) / size; }
|
||||
|
||||
#ifdef USING_SGI_STL
|
||||
//void setAllocator(TPoolAllocator* a) { allocator = a; }
|
||||
static TPoolAllocator& getAllocator() { return GlobalPoolAllocator; }
|
||||
#else
|
||||
void setAllocator(TPoolAllocator* a) { allocator = *a; }
|
||||
TPoolAllocator& getAllocator() const { return allocator; }
|
||||
|
||||
protected:
|
||||
TPoolAllocator& allocator;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // _POOLALLOC_INCLUDED_
|
|
@ -0,0 +1,740 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
|
||||
//
|
||||
// atom.c
|
||||
//
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "slglobals.h"
|
||||
|
||||
#undef malloc
|
||||
#undef realloc
|
||||
#undef free
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////// String table: //////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static const struct {
|
||||
int val;
|
||||
const char *str;
|
||||
} tokens[] = {
|
||||
{ CPP_AND_OP, "&&" },
|
||||
{ CPP_AND_ASSIGN, "&=" },
|
||||
{ CPP_SUB_ASSIGN, "-=" },
|
||||
{ CPP_MOD_ASSIGN, "%=" },
|
||||
{ CPP_ADD_ASSIGN, "+=" },
|
||||
{ CPP_DIV_ASSIGN, "/=" },
|
||||
{ CPP_MUL_ASSIGN, "*=" },
|
||||
{ CPP_RIGHT_BRACKET, ":>" },
|
||||
{ CPP_EQ_OP, "==" },
|
||||
{ CPP_XOR_OP, "^^" },
|
||||
{ CPP_XOR_ASSIGN, "^=" },
|
||||
{ CPP_FLOATCONSTANT, "<float-const>" },
|
||||
{ CPP_GE_OP, ">=" },
|
||||
{ CPP_RIGHT_OP, ">>" },
|
||||
{ CPP_RIGHT_ASSIGN, ">>=" },
|
||||
{ CPP_IDENTIFIER, "<ident>" },
|
||||
{ CPP_INTCONSTANT, "<int-const>" },
|
||||
{ CPP_LE_OP, "<=" },
|
||||
{ CPP_LEFT_OP, "<<" },
|
||||
{ CPP_LEFT_ASSIGN, "<<=" },
|
||||
{ CPP_LEFT_BRACKET, "<:" },
|
||||
{ CPP_LEFT_BRACE, "<%" },
|
||||
{ CPP_DEC_OP, "--" },
|
||||
{ CPP_RIGHT_BRACE, "%>" },
|
||||
{ CPP_NE_OP, "!=" },
|
||||
{ CPP_OR_OP, "||" },
|
||||
{ CPP_OR_ASSIGN, "|=" },
|
||||
{ CPP_INC_OP, "++" },
|
||||
{ CPP_STRCONSTANT, "<string-const>" },
|
||||
{ CPP_TYPEIDENTIFIER, "<type-ident>" },
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////// String table: //////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define INIT_STRING_TABLE_SIZE 16384
|
||||
|
||||
typedef struct StringTable_Rec {
|
||||
char *strings;
|
||||
int nextFree;
|
||||
int size;
|
||||
} StringTable;
|
||||
|
||||
/*
|
||||
* InitStringTable() - Initialize the string table.
|
||||
*
|
||||
*/
|
||||
|
||||
static int InitStringTable(StringTable *stable)
|
||||
{
|
||||
stable->strings = (char *) malloc(INIT_STRING_TABLE_SIZE);
|
||||
if (!stable->strings)
|
||||
return 0;
|
||||
// Zero-th offset means "empty" so don't use it.
|
||||
stable->nextFree = 1;
|
||||
stable->size = INIT_STRING_TABLE_SIZE;
|
||||
return 1;
|
||||
} // InitStringTable
|
||||
|
||||
/*
|
||||
* FreeStringTable() - Free the string table.
|
||||
*
|
||||
*/
|
||||
|
||||
static void FreeStringTable(StringTable *stable)
|
||||
{
|
||||
if (stable->strings)
|
||||
free(stable->strings);
|
||||
stable->strings = NULL;
|
||||
stable->nextFree = 0;
|
||||
stable->size = 0;
|
||||
} // FreeStringTable
|
||||
|
||||
/*
|
||||
* HashString() - Hash a string with the base hash function.
|
||||
*
|
||||
*/
|
||||
|
||||
static int HashString(const char *s)
|
||||
{
|
||||
int hval = 0;
|
||||
|
||||
while (*s) {
|
||||
hval = (hval*13507 + *s*197) ^ (hval >> 2);
|
||||
s++;
|
||||
}
|
||||
return hval & 0x7fffffff;
|
||||
} // HashString
|
||||
|
||||
/*
|
||||
* HashString2() - Hash a string with the incrimenting hash function.
|
||||
*
|
||||
*/
|
||||
|
||||
static int HashString2(const char *s)
|
||||
{
|
||||
int hval = 0;
|
||||
|
||||
while (*s) {
|
||||
hval = (hval*729 + *s*37) ^ (hval >> 1);
|
||||
s++;
|
||||
}
|
||||
return hval;
|
||||
} // HashString2
|
||||
|
||||
/*
|
||||
* AddString() - Add a string to a string table. Return it's offset.
|
||||
*
|
||||
*/
|
||||
|
||||
static int AddString(StringTable *stable, const char *s)
|
||||
{
|
||||
int len, loc;
|
||||
char *str;
|
||||
|
||||
len = (int) strlen(s);
|
||||
if (stable->nextFree + len + 1 >= stable->size) {
|
||||
assert(stable->size < 1000000);
|
||||
str = (char *) malloc(stable->size*2);
|
||||
memcpy(str, stable->strings, stable->size);
|
||||
free(stable->strings);
|
||||
stable->strings = str;
|
||||
}
|
||||
loc = stable->nextFree;
|
||||
strcpy(&stable->strings[loc], s);
|
||||
stable->nextFree += len + 1;
|
||||
return loc;
|
||||
} // AddString
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////// Hash table: ///////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define INIT_HASH_TABLE_SIZE 2047
|
||||
#define HASH_TABLE_MAX_COLLISIONS 3
|
||||
|
||||
typedef struct HashEntry_Rec {
|
||||
int index; // String table offset of string representation
|
||||
int value; // Atom (symbol) value
|
||||
} HashEntry;
|
||||
|
||||
typedef struct HashTable_Rec {
|
||||
HashEntry *entry;
|
||||
int size;
|
||||
int entries;
|
||||
int counts[HASH_TABLE_MAX_COLLISIONS + 1];
|
||||
} HashTable;
|
||||
|
||||
/*
|
||||
* InitHashTable() - Initialize the hash table.
|
||||
*
|
||||
*/
|
||||
|
||||
static int InitHashTable(HashTable *htable, int fsize)
|
||||
{
|
||||
int ii;
|
||||
|
||||
htable->entry = (HashEntry *) malloc(sizeof(HashEntry)*fsize);
|
||||
if (!htable->entry)
|
||||
return 0;
|
||||
htable->size = fsize;
|
||||
for (ii = 0; ii < fsize; ii++) {
|
||||
htable->entry[ii].index = 0;
|
||||
htable->entry[ii].value = 0;
|
||||
}
|
||||
htable->entries = 0;
|
||||
for (ii = 0; ii <= HASH_TABLE_MAX_COLLISIONS; ii++)
|
||||
htable->counts[ii] = 0;
|
||||
return 1;
|
||||
} // InitHashTable
|
||||
|
||||
/*
|
||||
* FreeHashTable() - Free the hash table.
|
||||
*
|
||||
*/
|
||||
|
||||
static void FreeHashTable(HashTable *htable)
|
||||
{
|
||||
if (htable->entry)
|
||||
free(htable->entry);
|
||||
htable->entry = NULL;
|
||||
htable->size = 0;
|
||||
htable->entries = 0;
|
||||
} // FreeHashTable
|
||||
|
||||
/*
|
||||
* Empty() - See if a hash table entry is empty.
|
||||
*
|
||||
*/
|
||||
|
||||
static int Empty(HashTable *htable, int hashloc)
|
||||
{
|
||||
assert(hashloc >= 0 && hashloc < htable->size);
|
||||
if (htable->entry[hashloc].index == 0) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} // Empty
|
||||
|
||||
/*
|
||||
* Match() - See if a hash table entry is matches a string.
|
||||
*
|
||||
*/
|
||||
|
||||
static int Match(HashTable *htable, StringTable *stable, const char *s, int hashloc)
|
||||
{
|
||||
int strloc;
|
||||
|
||||
strloc = htable->entry[hashloc].index;
|
||||
if (!strcmp(s, &stable->strings[strloc])) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} // Match
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////// Atom table: ///////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define INIT_ATOM_TABLE_SIZE 1024
|
||||
|
||||
|
||||
struct AtomTable_Rec {
|
||||
StringTable stable; // String table.
|
||||
HashTable htable; // Hashes string to atom number and token value. Multiple strings can
|
||||
// have the same token value but each unique string is a unique atom.
|
||||
int *amap; // Maps atom value to offset in string table. Atoms all map to unique
|
||||
// strings except for some undefined values in the lower, fixed part
|
||||
// of the atom table that map to "<undefined>". The lowest 256 atoms
|
||||
// correspond to single character ASCII values except for alphanumeric
|
||||
// characters and '_', which can be other tokens. Next come the
|
||||
// language tokens with their atom values equal to the token value.
|
||||
// Then come predefined atoms, followed by user specified identifiers.
|
||||
int *arev; // Reversed atom for symbol table use.
|
||||
int nextFree;
|
||||
int size;
|
||||
};
|
||||
|
||||
static AtomTable latable = { { 0 } };
|
||||
AtomTable *atable = &latable;
|
||||
|
||||
static int AddAtomFixed(AtomTable *atable, const char *s, int atom);
|
||||
|
||||
/*
|
||||
* GrowAtomTable() - Grow the atom table to at least "size" if it's smaller.
|
||||
*
|
||||
*/
|
||||
|
||||
static int GrowAtomTable(AtomTable *atable, int size)
|
||||
{
|
||||
int *newmap, *newrev;
|
||||
|
||||
if (atable->size < size) {
|
||||
if (atable->amap) {
|
||||
newmap = realloc(atable->amap, sizeof(int)*size);
|
||||
newrev = realloc(atable->arev, sizeof(int)*size);
|
||||
} else {
|
||||
newmap = malloc(sizeof(int)*size);
|
||||
newrev = malloc(sizeof(int)*size);
|
||||
atable->size = 0;
|
||||
}
|
||||
if (!newmap || !newrev) {
|
||||
/* failed to grow -- error */
|
||||
if (newmap)
|
||||
atable->amap = newmap;
|
||||
if (newrev)
|
||||
atable->amap = newrev;
|
||||
return -1;
|
||||
}
|
||||
memset(&newmap[atable->size], 0, (size - atable->size) * sizeof(int));
|
||||
memset(&newrev[atable->size], 0, (size - atable->size) * sizeof(int));
|
||||
atable->amap = newmap;
|
||||
atable->arev = newrev;
|
||||
atable->size = size;
|
||||
}
|
||||
return 0;
|
||||
} // GrowAtomTable
|
||||
|
||||
/*
|
||||
* lReverse() - Reverse the bottom 20 bits of a 32 bit int.
|
||||
*
|
||||
*/
|
||||
|
||||
static int lReverse(int fval)
|
||||
{
|
||||
unsigned int in = fval;
|
||||
int result = 0, cnt = 0;
|
||||
|
||||
while(in) {
|
||||
result <<= 1;
|
||||
result |= in&1;
|
||||
in >>= 1;
|
||||
cnt++;
|
||||
}
|
||||
|
||||
// Don't use all 31 bits. One million atoms is plenty and sometimes the
|
||||
// upper bits are used for other things.
|
||||
|
||||
if (cnt < 20)
|
||||
result <<= 20 - cnt;
|
||||
return result;
|
||||
} // lReverse
|
||||
|
||||
/*
|
||||
* AllocateAtom() - Allocate a new atom. Associated with the "undefined" value of -1.
|
||||
*
|
||||
*/
|
||||
|
||||
static int AllocateAtom(AtomTable *atable)
|
||||
{
|
||||
if (atable->nextFree >= atable->size)
|
||||
GrowAtomTable(atable, atable->nextFree*2);
|
||||
atable->amap[atable->nextFree] = -1;
|
||||
atable->arev[atable->nextFree] = lReverse(atable->nextFree);
|
||||
atable->nextFree++;
|
||||
return atable->nextFree - 1;
|
||||
} // AllocateAtom
|
||||
|
||||
/*
|
||||
* SetAtomValue() - Allocate a new atom associated with "hashindex".
|
||||
*
|
||||
*/
|
||||
|
||||
static void SetAtomValue(AtomTable *atable, int atomnumber, int hashindex)
|
||||
{
|
||||
atable->amap[atomnumber] = atable->htable.entry[hashindex].index;
|
||||
atable->htable.entry[hashindex].value = atomnumber;
|
||||
} // SetAtomValue
|
||||
|
||||
/*
|
||||
* FindHashLoc() - Find the hash location for this string. Return -1 it hash table is full.
|
||||
*
|
||||
*/
|
||||
|
||||
static int FindHashLoc(AtomTable *atable, const char *s)
|
||||
{
|
||||
int hashloc, hashdelta, count;
|
||||
int FoundEmptySlot = 0;
|
||||
int collision[HASH_TABLE_MAX_COLLISIONS + 1];
|
||||
|
||||
hashloc = HashString(s) % atable->htable.size;
|
||||
if (!Empty(&atable->htable, hashloc)) {
|
||||
if (Match(&atable->htable, &atable->stable, s, hashloc))
|
||||
return hashloc;
|
||||
collision[0] = hashloc;
|
||||
hashdelta = HashString2(s);
|
||||
count = 0;
|
||||
while (count < HASH_TABLE_MAX_COLLISIONS) {
|
||||
hashloc = ((hashloc + hashdelta) & 0x7fffffff) % atable->htable.size;
|
||||
if (!Empty(&atable->htable, hashloc)) {
|
||||
if (Match(&atable->htable, &atable->stable, s, hashloc)) {
|
||||
return hashloc;
|
||||
}
|
||||
} else {
|
||||
FoundEmptySlot = 1;
|
||||
break;
|
||||
}
|
||||
count++;
|
||||
collision[count] = hashloc;
|
||||
}
|
||||
|
||||
if (!FoundEmptySlot) {
|
||||
if (cpp->options.DumpAtomTable) {
|
||||
int ii;
|
||||
char str[200];
|
||||
sprintf(str, "*** Hash failed with more than %d collisions. Must increase hash table size. ***",
|
||||
HASH_TABLE_MAX_COLLISIONS);
|
||||
CPPShInfoLogMsg(str);
|
||||
|
||||
sprintf(str, "*** New string \"%s\", hash=%04x, delta=%04x", s, collision[0], hashdelta);
|
||||
CPPShInfoLogMsg(str);
|
||||
for (ii = 0; ii <= HASH_TABLE_MAX_COLLISIONS; ii++) {
|
||||
sprintf(str, "*** Collides on try %d at hash entry %04x with \"%s\"",
|
||||
ii + 1, collision[ii], GetAtomString(atable, atable->htable.entry[collision[ii]].value));
|
||||
CPPShInfoLogMsg(str);
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
} else {
|
||||
atable->htable.counts[count]++;
|
||||
}
|
||||
}
|
||||
return hashloc;
|
||||
} // FindHashLoc
|
||||
|
||||
/*
|
||||
* IncreaseHashTableSize()
|
||||
*
|
||||
*/
|
||||
|
||||
static int IncreaseHashTableSize(AtomTable *atable)
|
||||
{
|
||||
int ii, strloc, oldhashloc, value, size;
|
||||
AtomTable oldtable;
|
||||
char *s;
|
||||
|
||||
// Save the old atom table and create a new one:
|
||||
|
||||
oldtable = *atable;
|
||||
size = oldtable.htable.size*2 + 1;
|
||||
if (!InitAtomTable(atable, size))
|
||||
return 0;
|
||||
|
||||
// Add all the existing values to the new atom table preserving their atom values:
|
||||
|
||||
for (ii = atable->nextFree; ii < oldtable.nextFree; ii++) {
|
||||
strloc = oldtable.amap[ii];
|
||||
s = &oldtable.stable.strings[strloc];
|
||||
oldhashloc = FindHashLoc(&oldtable, s);
|
||||
assert(oldhashloc >= 0);
|
||||
value = oldtable.htable.entry[oldhashloc].value;
|
||||
AddAtomFixed(atable, s, value);
|
||||
}
|
||||
FreeAtomTable(&oldtable);
|
||||
return 1;
|
||||
} // IncreaseHashTableSize
|
||||
|
||||
/*
|
||||
* LookUpAddStringHash() - Lookup a string in the hash table. If it's not there, add it and
|
||||
* initialize the atom value in the hash table to 0. Return the hash table index.
|
||||
*/
|
||||
|
||||
static int LookUpAddStringHash(AtomTable *atable, const char *s)
|
||||
{
|
||||
int hashloc, strloc;
|
||||
|
||||
while(1) {
|
||||
hashloc = FindHashLoc(atable, s);
|
||||
if (hashloc >= 0)
|
||||
break;
|
||||
IncreaseHashTableSize(atable);
|
||||
}
|
||||
|
||||
if (Empty(&atable->htable, hashloc)) {
|
||||
atable->htable.entries++;
|
||||
strloc = AddString(&atable->stable, s);
|
||||
atable->htable.entry[hashloc].index = strloc;
|
||||
atable->htable.entry[hashloc].value = 0;
|
||||
}
|
||||
return hashloc;
|
||||
} // LookUpAddStringHash
|
||||
|
||||
/*
|
||||
* LookUpAddString() - Lookup a string in the hash table. If it's not there, add it and
|
||||
* initialize the atom value in the hash table to the next atom number.
|
||||
* Return the atom value of string.
|
||||
*/
|
||||
|
||||
int LookUpAddString(AtomTable *atable, const char *s)
|
||||
{
|
||||
int hashindex, atom;
|
||||
|
||||
hashindex = LookUpAddStringHash(atable, s);
|
||||
atom = atable->htable.entry[hashindex].value;
|
||||
if (atom == 0) {
|
||||
atom = AllocateAtom(atable);
|
||||
SetAtomValue(atable, atom, hashindex);
|
||||
}
|
||||
return atom;
|
||||
} // LookUpAddString
|
||||
|
||||
/*
|
||||
* GetAtomString()
|
||||
*
|
||||
*/
|
||||
|
||||
const char *GetAtomString(AtomTable *atable, int atom)
|
||||
{
|
||||
int soffset;
|
||||
|
||||
if (atom > 0 && atom < atable->nextFree) {
|
||||
soffset = atable->amap[atom];
|
||||
if (soffset > 0 && soffset < atable->stable.nextFree) {
|
||||
return &atable->stable.strings[soffset];
|
||||
} else {
|
||||
return "<internal error: bad soffset>";
|
||||
}
|
||||
} else {
|
||||
if (atom == 0) {
|
||||
return "<null atom>";
|
||||
} else {
|
||||
if (atom == EOF) {
|
||||
return "<EOF>";
|
||||
} else {
|
||||
return "<invalid atom>";
|
||||
}
|
||||
}
|
||||
}
|
||||
} // GetAtomString
|
||||
|
||||
/*
|
||||
* GetReversedAtom()
|
||||
*
|
||||
*/
|
||||
|
||||
int GetReversedAtom(AtomTable *atable, int atom)
|
||||
{
|
||||
if (atom > 0 && atom < atable->nextFree) {
|
||||
return atable->arev[atom];
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} // GetReversedAtom
|
||||
|
||||
/*
|
||||
* AddAtom() - Add a string to the atom, hash and string tables if it isn't already there.
|
||||
* Return it's atom index.
|
||||
*/
|
||||
|
||||
int AddAtom(AtomTable *atable, const char *s)
|
||||
{
|
||||
int atom;
|
||||
|
||||
atom = LookUpAddString(atable, s);
|
||||
return atom;
|
||||
} // AddAtom
|
||||
|
||||
/*
|
||||
* AddAtomFixed() - Add an atom to the hash and string tables if it isn't already there.
|
||||
* Assign it the atom value of "atom".
|
||||
*/
|
||||
|
||||
static int AddAtomFixed(AtomTable *atable, const char *s, int atom)
|
||||
{
|
||||
int hashindex, lsize;
|
||||
|
||||
hashindex = LookUpAddStringHash(atable, s);
|
||||
if (atable->nextFree >= atable->size || atom >= atable->size) {
|
||||
lsize = atable->size*2;
|
||||
if (lsize <= atom)
|
||||
lsize = atom + 1;
|
||||
GrowAtomTable(atable, lsize);
|
||||
}
|
||||
atable->amap[atom] = atable->htable.entry[hashindex].index;
|
||||
atable->htable.entry[hashindex].value = atom;
|
||||
//if (atom >= atable->nextFree)
|
||||
// atable->nextFree = atom + 1;
|
||||
while (atom >= atable->nextFree) {
|
||||
atable->arev[atable->nextFree] = lReverse(atable->nextFree);
|
||||
atable->nextFree++;
|
||||
}
|
||||
return atom;
|
||||
} // AddAtomFixed
|
||||
|
||||
/*
|
||||
* InitAtomTable() - Initialize the atom table.
|
||||
*
|
||||
*/
|
||||
|
||||
int InitAtomTable(AtomTable *atable, int htsize)
|
||||
{
|
||||
int ii;
|
||||
|
||||
htsize = htsize <= 0 ? INIT_HASH_TABLE_SIZE : htsize;
|
||||
if (!InitStringTable(&atable->stable))
|
||||
return 0;
|
||||
if (!InitHashTable(&atable->htable, htsize))
|
||||
return 0;
|
||||
|
||||
atable->nextFree = 0;
|
||||
atable->amap = NULL;
|
||||
atable->size = 0;
|
||||
GrowAtomTable(atable, INIT_ATOM_TABLE_SIZE);
|
||||
if (!atable->amap)
|
||||
return 0;
|
||||
|
||||
// Initialize lower part of atom table to "<undefined>" atom:
|
||||
|
||||
AddAtomFixed(atable, "<undefined>", 0);
|
||||
for (ii = 0; ii < FIRST_USER_TOKEN_SY; ii++)
|
||||
atable->amap[ii] = atable->amap[0];
|
||||
|
||||
// Add single character tokens to the atom table:
|
||||
|
||||
{
|
||||
const char *s = "~!%^&*()-+=|,.<>/?;:[]{}#";
|
||||
char t[2];
|
||||
|
||||
t[1] = '\0';
|
||||
while (*s) {
|
||||
t[0] = *s;
|
||||
AddAtomFixed(atable, t, s[0]);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
// Add multiple character scanner tokens :
|
||||
|
||||
for (ii = 0; ii < sizeof(tokens)/sizeof(tokens[0]); ii++)
|
||||
AddAtomFixed(atable, tokens[ii].str, tokens[ii].val);
|
||||
|
||||
// Add error symbol if running in error mode:
|
||||
|
||||
if (cpp->options.ErrorMode)
|
||||
AddAtomFixed(atable, "error", ERROR_SY);
|
||||
|
||||
AddAtom(atable, "<*** end fixed atoms ***>");
|
||||
|
||||
return 1;
|
||||
} // InitAtomTable
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////// Debug Printing Functions: //////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
* PrintAtomTable()
|
||||
*
|
||||
*/
|
||||
|
||||
void PrintAtomTable(AtomTable *atable)
|
||||
{
|
||||
int ii;
|
||||
char str[200];
|
||||
|
||||
for (ii = 0; ii < atable->nextFree; ii++) {
|
||||
sprintf(str, "%d: \"%s\"", ii, &atable->stable.strings[atable->amap[ii]]);
|
||||
CPPDebugLogMsg(str);
|
||||
}
|
||||
sprintf(str, "Hash table: size=%d, entries=%d, collisions=",
|
||||
atable->htable.size, atable->htable.entries);
|
||||
CPPDebugLogMsg(str);
|
||||
for (ii = 0; ii < HASH_TABLE_MAX_COLLISIONS; ii++) {
|
||||
sprintf(str, " %d", atable->htable.counts[ii]);
|
||||
CPPDebugLogMsg(str);
|
||||
}
|
||||
|
||||
} // PrintAtomTable
|
||||
|
||||
|
||||
/*
|
||||
* GetStringOfAtom()
|
||||
*
|
||||
*/
|
||||
|
||||
char* GetStringOfAtom(AtomTable *atable, int atom)
|
||||
{
|
||||
char* chr_str;
|
||||
chr_str=&atable->stable.strings[atable->amap[atom]];
|
||||
return chr_str;
|
||||
} // GetStringOfAtom
|
||||
|
||||
/*
|
||||
* FreeAtomTable() - Free the atom table and associated memory
|
||||
*
|
||||
*/
|
||||
|
||||
void FreeAtomTable(AtomTable *atable)
|
||||
{
|
||||
FreeStringTable(&atable->stable);
|
||||
FreeHashTable(&atable->htable);
|
||||
if (atable->amap)
|
||||
free(atable->amap);
|
||||
if (atable->arev)
|
||||
free(atable->arev);
|
||||
atable->amap = NULL;
|
||||
atable->arev = NULL;
|
||||
atable->nextFree = 0;
|
||||
atable->size = 0;
|
||||
} // FreeAtomTable
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////// End of atom.c ///////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// atom.h
|
||||
//
|
||||
|
||||
#if !defined(__ATOM_H)
|
||||
#define __ATOM_H 1
|
||||
|
||||
typedef struct AtomTable_Rec AtomTable;
|
||||
|
||||
extern AtomTable *atable;
|
||||
|
||||
int InitAtomTable(AtomTable *atable, int htsize);
|
||||
void FreeAtomTable(AtomTable *atable);
|
||||
int AddAtom(AtomTable *atable, const char *s);
|
||||
void PrintAtomTable(AtomTable *atable);
|
||||
int LookUpAddString(AtomTable *atable, const char *s);
|
||||
const char *GetAtomString(AtomTable *atable, int atom);
|
||||
int GetReversedAtom(AtomTable *atable, int atom);
|
||||
char* GetStringOfAtom(AtomTable *atable, int atom);
|
||||
#endif // !defined(__ATOM_H)
|
|
@ -0,0 +1,104 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// compile.h
|
||||
//
|
||||
|
||||
#if !defined(__COMPILE_H)
|
||||
#define __COMPILE_H 1
|
||||
|
||||
int InitCPPStruct(void);
|
||||
|
||||
typedef struct Options_Rec{
|
||||
const char *profileString;
|
||||
int ErrorMode;
|
||||
int Quiet;
|
||||
|
||||
// Debug The Compiler options:
|
||||
int DumpAtomTable;
|
||||
} Options;
|
||||
|
||||
struct CPPStruct_Rec {
|
||||
// Public members
|
||||
SourceLoc *pLastSourceLoc; // Set at the start of each statement by the tree walkers
|
||||
Options options; // Compile options and parameters
|
||||
|
||||
// Private members
|
||||
SourceLoc lastSourceLoc;
|
||||
|
||||
// Scanner data:
|
||||
|
||||
SourceLoc *tokenLoc; // Source location of most recent token seen by the scanner
|
||||
int mostRecentToken; // Most recent token seen by the scanner
|
||||
InputSrc *currentInput;
|
||||
int previous_token;
|
||||
int notAVersionToken; // used to make sure that #version is the first token seen in the file, if present
|
||||
|
||||
void *pC; // storing the parseContext of the compile object in cpp.
|
||||
|
||||
// Private members:
|
||||
SourceLoc ltokenLoc;
|
||||
int ifdepth; //current #if-#else-#endif nesting in the cpp.c file (pre-processor)
|
||||
int elsedepth[64]; //Keep a track of #if depth..Max allowed is 64.
|
||||
int elsetracker; //#if-#else and #endif constructs...Counter.
|
||||
const char *ErrMsg;
|
||||
int CompileError; //Indicate compile error when #error, #else,#elif mismatch.
|
||||
|
||||
//
|
||||
// Globals used to communicate between PaParseStrings() and yy_input()and
|
||||
// also across the files.(gen_glslang.cpp and scanner.c)
|
||||
//
|
||||
int PaWhichStr; // which string we're parsing
|
||||
int* PaStrLen; // array of lengths of the PaArgv strings
|
||||
int PaArgc; // count of strings in the array
|
||||
char** PaArgv; // our array of strings to parse
|
||||
unsigned int tokensBeforeEOF : 1;
|
||||
};
|
||||
|
||||
#endif // !defined(__COMPILE_H)
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,91 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// cpp.h
|
||||
//
|
||||
|
||||
#if !defined(__CPP_H)
|
||||
#define __CPP_H 1
|
||||
|
||||
#include "parser.h"
|
||||
#include "tokens.h"
|
||||
|
||||
int InitCPP(void);
|
||||
int FinalCPP(void);
|
||||
int readCPPline(yystypepp * yylvalpp);
|
||||
int MacroExpand(int atom, yystypepp * yylvalpp);
|
||||
int ChkCorrectElseNesting(void);
|
||||
|
||||
typedef struct MacroSymbol {
|
||||
int argc;
|
||||
int *args;
|
||||
TokenStream *body;
|
||||
unsigned busy:1;
|
||||
unsigned undef:1;
|
||||
} MacroSymbol;
|
||||
|
||||
void FreeMacro(MacroSymbol *);
|
||||
int PredefineMacro(char *);
|
||||
|
||||
void CPPDebugLogMsg(const char *msg); // Prints information into debug log
|
||||
void CPPShInfoLogMsg(const char*); // Store cpp Err Msg into Sh.Info.Log
|
||||
void CPPWarningToInfoLog(const char *msg); // Prints warning messages into info log
|
||||
void HandlePragma(const char**, int numTokens); // #pragma directive container.
|
||||
void ResetTString(void); // #error Message as TString.
|
||||
void CPPErrorToInfoLog(char*); // Stick all cpp errors into Sh.Info.log .
|
||||
void StoreStr(char*); // Store the TString in Parse Context.
|
||||
void SetLineNumber(int); // Set line number.
|
||||
void SetStringNumber(int); // Set string number.
|
||||
int GetLineNumber(void); // Get the current String Number.
|
||||
int GetStringNumber(void); // Get the current String Number.
|
||||
const char* GetStrfromTStr(void); // Convert TString to String.
|
||||
void updateExtensionBehavior(const char* extName, const char* behavior);
|
||||
int FreeCPP(void);
|
||||
|
||||
#endif // !(defined(__CPP_H)
|
|
@ -0,0 +1,157 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// cppstruct.c
|
||||
//
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "slglobals.h"
|
||||
|
||||
CPPStruct *cpp = NULL;
|
||||
static int refCount = 0;
|
||||
|
||||
int InitPreprocessor(void);
|
||||
int ResetPreprocessor(void);
|
||||
int FreeCPPStruct(void);
|
||||
int FinalizePreprocessor(void);
|
||||
|
||||
/*
|
||||
* InitCPPStruct() - Initilaize the CPP structure.
|
||||
*
|
||||
*/
|
||||
|
||||
int InitCPPStruct(void)
|
||||
{
|
||||
int len;
|
||||
char *p;
|
||||
|
||||
cpp = (CPPStruct *) malloc(sizeof(CPPStruct));
|
||||
if (cpp == NULL)
|
||||
return 0;
|
||||
|
||||
refCount++;
|
||||
|
||||
// Initialize public members:
|
||||
cpp->pLastSourceLoc = &cpp->lastSourceLoc;
|
||||
|
||||
p = (char *) &cpp->options;
|
||||
len = sizeof(cpp->options);
|
||||
while (--len >= 0)
|
||||
p[len] = 0;
|
||||
|
||||
ResetPreprocessor();
|
||||
return 1;
|
||||
} // InitCPPStruct
|
||||
|
||||
int ResetPreprocessor(void)
|
||||
{
|
||||
// Initialize private members:
|
||||
|
||||
cpp->lastSourceLoc.file = 0;
|
||||
cpp->lastSourceLoc.line = 0;
|
||||
cpp->pC=0;
|
||||
cpp->CompileError=0;
|
||||
cpp->ifdepth=0;
|
||||
for(cpp->elsetracker=0; cpp->elsetracker<64; cpp->elsetracker++)
|
||||
cpp->elsedepth[cpp->elsetracker]=0;
|
||||
cpp->elsetracker=0;
|
||||
cpp->tokensBeforeEOF = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
//Intializing the Preprocessor.
|
||||
|
||||
int InitPreprocessor(void)
|
||||
{
|
||||
# define CPP_STUFF true
|
||||
# ifdef CPP_STUFF
|
||||
FreeCPPStruct();
|
||||
InitCPPStruct();
|
||||
cpp->options.Quiet = 1;
|
||||
cpp->options.profileString = "generic";
|
||||
if (!InitAtomTable(atable, 0))
|
||||
return 1;
|
||||
if (!InitScanner(cpp))
|
||||
return 1;
|
||||
# endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
//FreeCPPStruct() - Free the CPP structure.
|
||||
|
||||
int FreeCPPStruct(void)
|
||||
{
|
||||
if (refCount)
|
||||
{
|
||||
free(cpp);
|
||||
refCount--;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//Finalizing the Preprocessor.
|
||||
|
||||
int FinalizePreprocessor(void)
|
||||
{
|
||||
# define CPP_STUFF true
|
||||
# ifdef CPP_STUFF
|
||||
FreeAtomTable(atable);
|
||||
FreeCPPStruct();
|
||||
FreeScanner();
|
||||
# endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////// End of cppstruct.c //////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
@ -0,0 +1,163 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef __STDC99__
|
||||
#include <stdint.h>
|
||||
#elif defined (_WIN64)
|
||||
typedef unsigned __int64 uintptr_t;
|
||||
#else
|
||||
typedef unsigned int uintptr_t;
|
||||
#endif
|
||||
|
||||
#include "memory.h"
|
||||
|
||||
// default alignment and chunksize, if called with 0 arguments
|
||||
#define CHUNKSIZE (64*1024)
|
||||
#define ALIGN 8
|
||||
|
||||
// we need to call the `real' malloc and free, not our replacements
|
||||
#undef malloc
|
||||
#undef free
|
||||
|
||||
struct chunk {
|
||||
struct chunk *next;
|
||||
};
|
||||
|
||||
struct cleanup {
|
||||
struct cleanup *next;
|
||||
void (*fn)(void *);
|
||||
void *arg;
|
||||
};
|
||||
|
||||
struct MemoryPool_rec {
|
||||
struct chunk *next;
|
||||
uintptr_t free, end;
|
||||
size_t chunksize;
|
||||
uintptr_t alignmask;
|
||||
struct cleanup *cleanup;
|
||||
};
|
||||
|
||||
MemoryPool *mem_CreatePool(size_t chunksize, unsigned int align)
|
||||
{
|
||||
MemoryPool *pool;
|
||||
|
||||
if (align == 0) align = ALIGN;
|
||||
if (chunksize == 0) chunksize = CHUNKSIZE;
|
||||
if (align & (align-1)) return 0;
|
||||
if (chunksize < sizeof(MemoryPool)) return 0;
|
||||
if (chunksize & (align-1)) return 0;
|
||||
if (!(pool = malloc(chunksize))) return 0;
|
||||
pool->next = 0;
|
||||
pool->chunksize = chunksize;
|
||||
pool->alignmask = (uintptr_t)(align)-1;
|
||||
pool->free = ((uintptr_t)(pool + 1) + pool->alignmask) & ~pool->alignmask;
|
||||
pool->end = (uintptr_t)pool + chunksize;
|
||||
pool->cleanup = 0;
|
||||
return pool;
|
||||
}
|
||||
|
||||
void mem_FreePool(MemoryPool *pool)
|
||||
{
|
||||
struct cleanup *cleanup;
|
||||
struct chunk *p, *next;
|
||||
|
||||
for (cleanup = pool->cleanup; cleanup; cleanup = cleanup->next) {
|
||||
cleanup->fn(cleanup->arg);
|
||||
}
|
||||
for (p = (struct chunk *)pool; p; p = next) {
|
||||
next = p->next;
|
||||
free(p);
|
||||
}
|
||||
}
|
||||
|
||||
void *mem_Alloc(MemoryPool *pool, size_t size)
|
||||
{
|
||||
struct chunk *ch;
|
||||
void *rv = (void *)pool->free;
|
||||
size = (size + pool->alignmask) & ~pool->alignmask;
|
||||
if (size <= 0) size = pool->alignmask;
|
||||
pool->free += size;
|
||||
if (pool->free > pool->end || pool->free < (uintptr_t)rv) {
|
||||
size_t minreq = (size + sizeof(struct chunk) + pool->alignmask)
|
||||
& ~pool->alignmask;
|
||||
pool->free = (uintptr_t)rv;
|
||||
if (minreq >= pool->chunksize) {
|
||||
// request size is too big for the chunksize, so allocate it as
|
||||
// a single chunk of the right size
|
||||
ch = malloc(minreq);
|
||||
if (!ch) return 0;
|
||||
} else {
|
||||
ch = malloc(pool->chunksize);
|
||||
if (!ch) return 0;
|
||||
pool->free = (uintptr_t)ch + minreq;
|
||||
pool->end = (uintptr_t)ch + pool->chunksize;
|
||||
}
|
||||
ch->next = pool->next;
|
||||
pool->next = ch;
|
||||
rv = (void *)(((uintptr_t)(ch+1) + pool->alignmask) & ~pool->alignmask);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
int mem_AddCleanup(MemoryPool *pool, void (*fn)(void *), void *arg) {
|
||||
struct cleanup *cleanup;
|
||||
|
||||
pool->free = (pool->free + sizeof(void *) - 1) & ~(sizeof(void *)-1);
|
||||
cleanup = mem_Alloc(pool, sizeof(struct cleanup));
|
||||
if (!cleanup) return -1;
|
||||
cleanup->next = pool->cleanup;
|
||||
cleanup->fn = fn;
|
||||
cleanup->arg = arg;
|
||||
pool->cleanup = cleanup;
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
#ifndef __MEMORY_H
|
||||
#define __MEMORY_H
|
||||
|
||||
typedef struct MemoryPool_rec MemoryPool;
|
||||
|
||||
extern MemoryPool *mem_CreatePool(size_t chunksize, unsigned align);
|
||||
extern void mem_FreePool(MemoryPool *);
|
||||
extern void *mem_Alloc(MemoryPool *p, size_t size);
|
||||
extern void *mem_Realloc(MemoryPool *p, void *old, size_t oldsize, size_t newsize);
|
||||
extern int mem_AddCleanup(MemoryPool *p, void (*fn)(void *), void *arg);
|
||||
|
||||
#endif /* __MEMORY_H */
|
|
@ -0,0 +1,98 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
|
||||
#ifndef BISON_PARSER_H
|
||||
# define BISON_PARSER_H
|
||||
|
||||
#ifndef yystypepp
|
||||
typedef struct {
|
||||
int sc_int;
|
||||
float sc_fval;
|
||||
int sc_ident;
|
||||
char symbol_name[MAX_SYMBOL_NAME_LEN+1];
|
||||
} yystypepp;
|
||||
|
||||
# define YYSTYPE_IS_TRIVIAL 1
|
||||
#endif
|
||||
# define CPP_AND_OP 257
|
||||
# define CPP_SUB_ASSIGN 259
|
||||
# define CPP_MOD_ASSIGN 260
|
||||
# define CPP_ADD_ASSIGN 261
|
||||
# define CPP_DIV_ASSIGN 262
|
||||
# define CPP_MUL_ASSIGN 263
|
||||
# define CPP_EQ_OP 264
|
||||
# define CPP_XOR_OP 265
|
||||
# define ERROR_SY 266
|
||||
# define CPP_FLOATCONSTANT 267
|
||||
# define CPP_GE_OP 268
|
||||
# define CPP_RIGHT_OP 269
|
||||
# define CPP_IDENTIFIER 270
|
||||
# define CPP_INTCONSTANT 271
|
||||
# define CPP_LE_OP 272
|
||||
# define CPP_LEFT_OP 273
|
||||
# define CPP_DEC_OP 274
|
||||
# define CPP_NE_OP 275
|
||||
# define CPP_OR_OP 276
|
||||
# define CPP_INC_OP 277
|
||||
# define CPP_STRCONSTANT 278
|
||||
# define CPP_TYPEIDENTIFIER 279
|
||||
|
||||
# define FIRST_USER_TOKEN_SY 289
|
||||
|
||||
# define CPP_RIGHT_ASSIGN 280
|
||||
# define CPP_LEFT_ASSIGN 281
|
||||
# define CPP_AND_ASSIGN 282
|
||||
# define CPP_OR_ASSIGN 283
|
||||
# define CPP_XOR_ASSIGN 284
|
||||
# define CPP_LEFT_BRACKET 285
|
||||
# define CPP_RIGHT_BRACKET 286
|
||||
# define CPP_LEFT_BRACE 287
|
||||
# define CPP_RIGHT_BRACE 288
|
||||
|
||||
#endif /* not BISON_PARSER_H */
|
|
@ -0,0 +1,56 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
|
||||
# include "slglobals.h"
|
||||
extern CPPStruct *cpp;
|
||||
int InitCPPStruct(void);
|
||||
int InitScanner(CPPStruct *cpp);
|
||||
int InitAtomTable(AtomTable *atable, int htsize);
|
||||
int ScanFromString(char *s);
|
||||
char* GetStringOfAtom(AtomTable *atable, int atom);
|
|
@ -0,0 +1,766 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// scanner.c
|
||||
//
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#if 0
|
||||
#include <ieeefp.h>
|
||||
#else
|
||||
#define isinff(x) (((*(int *)&(x) & 0x7f800000L)==0x7f800000L) && \
|
||||
((*(int *)&(x) & 0x007fffffL)==0000000000L))
|
||||
#endif
|
||||
|
||||
#include "slglobals.h"
|
||||
|
||||
|
||||
typedef struct StringInputSrc {
|
||||
InputSrc base;
|
||||
char *p;
|
||||
} StringInputSrc;
|
||||
|
||||
static int eof_scan(InputSrc *is, yystypepp * yylvalpp)
|
||||
{
|
||||
return EOF;
|
||||
} // eof_scan
|
||||
|
||||
static void noop(InputSrc *in, int ch, yystypepp * yylvalpp) {}
|
||||
|
||||
static InputSrc eof_inputsrc = { 0, &eof_scan, &eof_scan, &noop };
|
||||
|
||||
static int byte_scan(InputSrc *, yystypepp * yylvalpp);
|
||||
|
||||
#define EOL_SY '\n'
|
||||
|
||||
#if defined(_WIN32)
|
||||
#define DBG_BREAKPOINT() __asm int 3
|
||||
#elif defined(_M_AMD64)
|
||||
#define DBG_BREAKPOINT() assert(!"Dbg_Breakpoint");
|
||||
#else
|
||||
#define DBG_BREAKPOINT()
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) && !defined(_M_AMD64)
|
||||
__int64 RDTSC ( void ) {
|
||||
|
||||
__int64 v;
|
||||
|
||||
__asm __emit 0x0f
|
||||
__asm __emit 0x31
|
||||
__asm mov dword ptr v, eax
|
||||
__asm mov dword ptr v+4, edx
|
||||
|
||||
return v;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
int InitScanner(CPPStruct *cpp)
|
||||
{
|
||||
// Add various atoms needed by the CPP line scanner:
|
||||
if (!InitCPP())
|
||||
return 0;
|
||||
|
||||
cpp->mostRecentToken = 0;
|
||||
cpp->tokenLoc = &cpp->ltokenLoc;
|
||||
|
||||
cpp->ltokenLoc.file = 0;
|
||||
cpp->ltokenLoc.line = 0;
|
||||
|
||||
cpp->currentInput = &eof_inputsrc;
|
||||
cpp->previous_token = '\n';
|
||||
cpp->notAVersionToken = 0;
|
||||
|
||||
return 1;
|
||||
} // InitScanner
|
||||
|
||||
int FreeScanner(void)
|
||||
{
|
||||
return (FreeCPP());
|
||||
}
|
||||
|
||||
/*
|
||||
* str_getch()
|
||||
* takes care of reading from multiple strings.
|
||||
* returns the next-char from the input stream.
|
||||
* returns EOF when the complete shader is parsed.
|
||||
*/
|
||||
static int str_getch(StringInputSrc *in)
|
||||
{
|
||||
for(;;){
|
||||
if (*in->p){
|
||||
if (*in->p == '\n') {
|
||||
in->base.line++;
|
||||
IncLineNumber();
|
||||
}
|
||||
return *in->p++;
|
||||
}
|
||||
if(++(cpp->PaWhichStr) < cpp->PaArgc){
|
||||
free(in);
|
||||
SetStringNumber(cpp->PaWhichStr);
|
||||
SetLineNumber(1);
|
||||
ScanFromString(cpp->PaArgv[cpp->PaWhichStr]);
|
||||
in=(StringInputSrc*)cpp->currentInput;
|
||||
continue;
|
||||
}
|
||||
else{
|
||||
cpp->currentInput = in->base.prev;
|
||||
cpp->PaWhichStr=0;
|
||||
free(in);
|
||||
return EOF;
|
||||
}
|
||||
}
|
||||
} // str_getch
|
||||
|
||||
static void str_ungetch(StringInputSrc *in, int ch, yystypepp *type) {
|
||||
if (in->p[-1] == ch)in->p--;
|
||||
else {
|
||||
*(in->p)='\0'; //this would take care of shifting to the previous string.
|
||||
cpp->PaWhichStr--;
|
||||
}
|
||||
if (ch == '\n') {
|
||||
in->base.line--;
|
||||
DecLineNumber();
|
||||
}
|
||||
} // str_ungetch
|
||||
|
||||
int ScanFromString(char *s)
|
||||
{
|
||||
|
||||
StringInputSrc *in = malloc(sizeof(StringInputSrc));
|
||||
memset(in, 0, sizeof(StringInputSrc));
|
||||
in->p = s;
|
||||
in->base.line = 1;
|
||||
in->base.scan = byte_scan;
|
||||
in->base.getch = (int (*)(InputSrc *, yystypepp *))str_getch;
|
||||
in->base.ungetch = (void (*)(InputSrc *, int, yystypepp *))str_ungetch;
|
||||
in->base.prev = cpp->currentInput;
|
||||
cpp->currentInput = &in->base;
|
||||
|
||||
return 1;
|
||||
} // ScanFromString;
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////// Floating point constants: /////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
* lBuildFloatValue() - Quick and dirty conversion to floating point. Since all
|
||||
* we need is single precision this should be quite precise.
|
||||
*/
|
||||
|
||||
static float lBuildFloatValue(const char *str, int len, int exp)
|
||||
{
|
||||
double val, expval, ten;
|
||||
int ii, llen, absexp;
|
||||
float rv;
|
||||
|
||||
val = 0.0;
|
||||
llen = len;
|
||||
for (ii = 0; ii < len; ii++)
|
||||
val = val*10.0 + (str[ii] - '0');
|
||||
if (exp != 0) {
|
||||
absexp = exp > 0 ? exp : -exp;
|
||||
expval = 1.0f;
|
||||
ten = 10.0;
|
||||
while (absexp) {
|
||||
if (absexp & 1)
|
||||
expval *= ten;
|
||||
ten *= ten;
|
||||
absexp >>= 1;
|
||||
}
|
||||
if (exp >= 0) {
|
||||
val *= expval;
|
||||
} else {
|
||||
val /= expval;
|
||||
}
|
||||
}
|
||||
rv = (float)val;
|
||||
if (isinff(rv)) {
|
||||
CPPErrorToInfoLog(" ERROR___FP_CONST_OVERFLOW");
|
||||
}
|
||||
return rv;
|
||||
} // lBuildFloatValue
|
||||
|
||||
|
||||
/*
|
||||
* lFloatConst() - Scan a floating point constant. Assumes that the scanner
|
||||
* has seen at least one digit, followed by either a decimal '.' or the
|
||||
* letter 'e'.
|
||||
*/
|
||||
|
||||
static int lFloatConst(char *str, int len, int ch, yystypepp * yylvalpp)
|
||||
{
|
||||
int HasDecimal, declen, exp, ExpSign;
|
||||
int str_len;
|
||||
float lval;
|
||||
|
||||
HasDecimal = 0;
|
||||
declen = 0;
|
||||
exp = 0;
|
||||
|
||||
str_len=len;
|
||||
if (ch == '.') {
|
||||
str[len++]=ch;
|
||||
HasDecimal = 1;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
while (ch >= '0' && ch <= '9') {
|
||||
if (len < MAX_SYMBOL_NAME_LEN) {
|
||||
declen++;
|
||||
if (len > 0 || ch != '0') {
|
||||
str[len] = ch;
|
||||
len++;str_len++;
|
||||
}
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
} else {
|
||||
CPPErrorToInfoLog("ERROR___FP_CONST_TOO_LONG");
|
||||
len = 1,str_len=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Exponent:
|
||||
|
||||
if (ch == 'e' || ch == 'E') {
|
||||
ExpSign = 1;
|
||||
str[len++]=ch;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '+') {
|
||||
str[len++]=ch;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
} else if (ch == '-') {
|
||||
ExpSign = -1;
|
||||
str[len++]=ch;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
}
|
||||
if (ch >= '0' && ch <= '9') {
|
||||
while (ch >= '0' && ch <= '9') {
|
||||
exp = exp*10 + ch - '0';
|
||||
str[len++]=ch;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
}
|
||||
} else {
|
||||
CPPErrorToInfoLog("ERROR___ERROR_IN_EXPONENT");
|
||||
}
|
||||
exp *= ExpSign;
|
||||
}
|
||||
|
||||
if (len == 0) {
|
||||
lval = 0.0f;
|
||||
strcpy(str,"0.0");
|
||||
} else {
|
||||
str[len]='\0';
|
||||
lval = lBuildFloatValue(str, str_len, exp - declen);
|
||||
}
|
||||
// Suffix:
|
||||
|
||||
yylvalpp->sc_fval = lval;
|
||||
strcpy(yylvalpp->symbol_name,str);
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return CPP_FLOATCONSTANT;
|
||||
} // lFloatConst
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////// Normal Scanner //////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static int byte_scan(InputSrc *in, yystypepp * yylvalpp)
|
||||
{
|
||||
char symbol_name[MAX_SYMBOL_NAME_LEN + 1];
|
||||
char string_val[MAX_STRING_LEN + 1];
|
||||
int AlreadyComplained;
|
||||
int len, ch, ii, ival = 0;
|
||||
|
||||
for (;;) {
|
||||
yylvalpp->sc_int = 0;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
|
||||
while (ch == ' ' || ch == '\t' || ch == '\r') {
|
||||
yylvalpp->sc_int = 1;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
}
|
||||
|
||||
cpp->ltokenLoc.file = cpp->currentInput->name;
|
||||
cpp->ltokenLoc.line = cpp->currentInput->line;
|
||||
len = 0;
|
||||
switch (ch) {
|
||||
default:
|
||||
return ch; // Single character token
|
||||
case EOF:
|
||||
return -1;
|
||||
case 'A': case 'B': case 'C': case 'D': case 'E':
|
||||
case 'F': case 'G': case 'H': case 'I': case 'J':
|
||||
case 'K': case 'L': case 'M': case 'N': case 'O':
|
||||
case 'P': case 'Q': case 'R': case 'S': case 'T':
|
||||
case 'U': case 'V': case 'W': case 'X': case 'Y':
|
||||
case 'Z': case '_':
|
||||
case 'a': case 'b': case 'c': case 'd': case 'e':
|
||||
case 'f': case 'g': case 'h': case 'i': case 'j':
|
||||
case 'k': case 'l': case 'm': case 'n': case 'o':
|
||||
case 'p': case 'q': case 'r': case 's': case 't':
|
||||
case 'u': case 'v': case 'w': case 'x': case 'y':
|
||||
case 'z':
|
||||
do {
|
||||
if (len < MAX_SYMBOL_NAME_LEN) {
|
||||
symbol_name[len] = ch;
|
||||
len++;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
} else {
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
}
|
||||
} while ((ch >= 'a' && ch <= 'z') ||
|
||||
(ch >= 'A' && ch <= 'Z') ||
|
||||
(ch >= '0' && ch <= '9') ||
|
||||
ch == '_');
|
||||
if (len >= MAX_SYMBOL_NAME_LEN)
|
||||
len = MAX_SYMBOL_NAME_LEN - 1;
|
||||
symbol_name[len] = '\0';
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
yylvalpp->sc_ident = LookUpAddString(atable, symbol_name);
|
||||
return CPP_IDENTIFIER;
|
||||
break;
|
||||
case '0':
|
||||
yylvalpp->symbol_name[len++] = ch;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == 'x' || ch == 'X') {
|
||||
yylvalpp->symbol_name[len++] = ch;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if ((ch >= '0' && ch <= '9') ||
|
||||
(ch >= 'A' && ch <= 'F') ||
|
||||
(ch >= 'a' && ch <= 'f'))
|
||||
{
|
||||
AlreadyComplained = 0;
|
||||
ival = 0;
|
||||
do {
|
||||
yylvalpp->symbol_name[len++] = ch;
|
||||
if (ival <= 0x0fffffff) {
|
||||
if (ch >= '0' && ch <= '9') {
|
||||
ii = ch - '0';
|
||||
} else if (ch >= 'A' && ch <= 'F') {
|
||||
ii = ch - 'A' + 10;
|
||||
} else {
|
||||
ii = ch - 'a' + 10;
|
||||
}
|
||||
ival = (ival << 4) | ii;
|
||||
} else {
|
||||
if (!AlreadyComplained)
|
||||
CPPErrorToInfoLog("ERROR___HEX_CONST_OVERFLOW");
|
||||
AlreadyComplained = 1;
|
||||
}
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
} while ((ch >= '0' && ch <= '9') ||
|
||||
(ch >= 'A' && ch <= 'F') ||
|
||||
(ch >= 'a' && ch <= 'f'));
|
||||
} else {
|
||||
CPPErrorToInfoLog("ERROR___ERROR_IN_HEX_CONSTANT");
|
||||
}
|
||||
yylvalpp->symbol_name[len] = '\0';
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
yylvalpp->sc_int = ival;
|
||||
return CPP_INTCONSTANT;
|
||||
} else if (ch >= '0' && ch <= '7') { // octal integer constants
|
||||
AlreadyComplained = 0;
|
||||
ival = 0;
|
||||
do {
|
||||
yylvalpp->symbol_name[len++] = ch;
|
||||
if (ival <= 0x1fffffff) {
|
||||
ii = ch - '0';
|
||||
ival = (ival << 3) | ii;
|
||||
} else {
|
||||
if (!AlreadyComplained)
|
||||
CPPErrorToInfoLog("ERROR___OCT_CONST_OVERFLOW");
|
||||
AlreadyComplained = 1;
|
||||
}
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
} while (ch >= '0' && ch <= '7');
|
||||
if (ch == '.' || ch == 'e' || ch == 'f' || ch == 'h' || ch == 'x'|| ch == 'E')
|
||||
return lFloatConst(yylvalpp->symbol_name, len, ch, yylvalpp);
|
||||
yylvalpp->symbol_name[len] = '\0';
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
yylvalpp->sc_int = ival;
|
||||
return CPP_INTCONSTANT;
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
ch = '0';
|
||||
}
|
||||
// Fall through...
|
||||
case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7': case '8': case '9':
|
||||
do {
|
||||
if (len < MAX_SYMBOL_NAME_LEN) {
|
||||
if (len > 0 || ch != '0') {
|
||||
yylvalpp->symbol_name[len] = ch;
|
||||
len++;
|
||||
}
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
}
|
||||
} while (ch >= '0' && ch <= '9');
|
||||
if (ch == '.' || ch == 'e' || ch == 'f' || ch == 'h' || ch == 'x'|| ch == 'E') {
|
||||
return lFloatConst(yylvalpp->symbol_name, len, ch, yylvalpp);
|
||||
} else {
|
||||
yylvalpp->symbol_name[len] = '\0';
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
ival = 0;
|
||||
AlreadyComplained = 0;
|
||||
for (ii = 0; ii < len; ii++) {
|
||||
ch = yylvalpp->symbol_name[ii] - '0';
|
||||
if ((ival > 214748364) || (ival == 214748364 && ch >= 8)) {
|
||||
if (!AlreadyComplained)
|
||||
CPPErrorToInfoLog("ERROR___INTEGER_CONST_OVERFLOW");
|
||||
AlreadyComplained = 1;
|
||||
}
|
||||
ival = ival*10 + ch;
|
||||
}
|
||||
yylvalpp->sc_int = ival;
|
||||
if(ival==0)
|
||||
strcpy(yylvalpp->symbol_name,"0");
|
||||
return CPP_INTCONSTANT;
|
||||
}
|
||||
break;
|
||||
case '-':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '-') {
|
||||
return CPP_DEC_OP;
|
||||
} else if (ch == '=') {
|
||||
return CPP_SUB_ASSIGN;
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '-';
|
||||
}
|
||||
case '+':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '+') {
|
||||
return CPP_INC_OP;
|
||||
} else if (ch == '=') {
|
||||
return CPP_ADD_ASSIGN;
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '+';
|
||||
}
|
||||
case '*':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '=') {
|
||||
return CPP_MUL_ASSIGN;
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '*';
|
||||
}
|
||||
case '%':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '=') {
|
||||
return CPP_MOD_ASSIGN;
|
||||
} else if (ch == '>'){
|
||||
return CPP_RIGHT_BRACE;
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '%';
|
||||
}
|
||||
case ':':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '>') {
|
||||
return CPP_RIGHT_BRACKET;
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return ':';
|
||||
}
|
||||
case '^':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '^') {
|
||||
return CPP_XOR_OP;
|
||||
} else {
|
||||
if (ch == '=')
|
||||
return CPP_XOR_ASSIGN;
|
||||
else{
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '^';
|
||||
}
|
||||
}
|
||||
|
||||
case '=':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '=') {
|
||||
return CPP_EQ_OP;
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '=';
|
||||
}
|
||||
case '!':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '=') {
|
||||
return CPP_NE_OP;
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '!';
|
||||
}
|
||||
case '|':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '|') {
|
||||
return CPP_OR_OP;
|
||||
} else {
|
||||
if (ch == '=')
|
||||
return CPP_OR_ASSIGN;
|
||||
else{
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '|';
|
||||
}
|
||||
}
|
||||
case '&':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '&') {
|
||||
return CPP_AND_OP;
|
||||
} else {
|
||||
if (ch == '=')
|
||||
return CPP_AND_ASSIGN;
|
||||
else{
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '&';
|
||||
}
|
||||
}
|
||||
case '<':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '<') {
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if(ch == '=')
|
||||
return CPP_LEFT_ASSIGN;
|
||||
else{
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return CPP_LEFT_OP;
|
||||
}
|
||||
} else {
|
||||
if (ch == '=') {
|
||||
return CPP_LE_OP;
|
||||
} else {
|
||||
if (ch == '%')
|
||||
return CPP_LEFT_BRACE;
|
||||
else if (ch == ':')
|
||||
return CPP_LEFT_BRACKET;
|
||||
else{
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '<';
|
||||
}
|
||||
}
|
||||
}
|
||||
case '>':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '>') {
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if(ch == '=')
|
||||
return CPP_RIGHT_ASSIGN;
|
||||
else{
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return CPP_RIGHT_OP;
|
||||
}
|
||||
} else {
|
||||
if (ch == '=') {
|
||||
return CPP_GE_OP;
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '>';
|
||||
}
|
||||
}
|
||||
case '.':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch >= '0' && ch <= '9') {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return lFloatConst(yylvalpp->symbol_name, 0, '.', yylvalpp);
|
||||
} else {
|
||||
if (ch == '.') {
|
||||
return -1; // Special EOF hack
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '.';
|
||||
}
|
||||
}
|
||||
case '/':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '/') {
|
||||
do {
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
} while (ch != '\n' && ch != EOF);
|
||||
if (ch == EOF)
|
||||
return -1;
|
||||
return '\n';
|
||||
} else if (ch == '*') {
|
||||
int nlcount = 0;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
do {
|
||||
while (ch != '*') {
|
||||
if (ch == '\n') nlcount++;
|
||||
if (ch == EOF) {
|
||||
CPPErrorToInfoLog("ERROR___EOF_IN_COMMENT");
|
||||
return -1;
|
||||
}
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
}
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == EOF) {
|
||||
CPPErrorToInfoLog("ERROR___EOF_IN_COMMENT");
|
||||
return -1;
|
||||
}
|
||||
} while (ch != '/');
|
||||
if (nlcount) {
|
||||
return '\n';
|
||||
}
|
||||
// Go try it again...
|
||||
} else if (ch == '=') {
|
||||
return CPP_DIV_ASSIGN;
|
||||
} else {
|
||||
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
|
||||
return '/';
|
||||
}
|
||||
break;
|
||||
case '"':
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
while (ch != '"' && ch != '\n' && ch != EOF) {
|
||||
if (ch == '\\') {
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
if (ch == '\n' || ch == EOF) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (len < MAX_STRING_LEN) {
|
||||
string_val[len] = ch;
|
||||
len++;
|
||||
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
|
||||
}
|
||||
};
|
||||
string_val[len] = '\0';
|
||||
if (ch == '"') {
|
||||
yylvalpp->sc_ident = LookUpAddString(atable, string_val);
|
||||
return CPP_STRCONSTANT;
|
||||
} else {
|
||||
CPPErrorToInfoLog("ERROR___CPP_EOL_IN_STRING");
|
||||
return ERROR_SY;
|
||||
}
|
||||
}
|
||||
}
|
||||
} // byte_scan
|
||||
|
||||
int yylex_CPP(char* buf, int maxSize)
|
||||
{
|
||||
yystypepp yylvalpp;
|
||||
int token = '\n';
|
||||
|
||||
for(;;) {
|
||||
|
||||
char* tokenString = 0;
|
||||
token = cpp->currentInput->scan(cpp->currentInput, &yylvalpp);
|
||||
if(check_EOF(token))
|
||||
return 0;
|
||||
if (token == '#') {
|
||||
if (cpp->previous_token == '\n'|| cpp->previous_token == 0) {
|
||||
token = readCPPline(&yylvalpp);
|
||||
if(check_EOF(token))
|
||||
return 0;
|
||||
continue;
|
||||
} else {
|
||||
CPPErrorToInfoLog("preprocessor command must not be preceded by any other statement in that line");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
cpp->previous_token = token;
|
||||
// expand macros
|
||||
if (token == CPP_IDENTIFIER && MacroExpand(yylvalpp.sc_ident, &yylvalpp)) {
|
||||
cpp->notAVersionToken = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (token == '\n')
|
||||
continue;
|
||||
|
||||
if (token == CPP_IDENTIFIER) {
|
||||
cpp->notAVersionToken = 1;
|
||||
tokenString = GetStringOfAtom(atable,yylvalpp.sc_ident);
|
||||
} else if (token == CPP_FLOATCONSTANT||token == CPP_INTCONSTANT){
|
||||
cpp->notAVersionToken = 1;
|
||||
tokenString = yylvalpp.symbol_name;
|
||||
} else {
|
||||
cpp->notAVersionToken = 1;
|
||||
tokenString = GetStringOfAtom(atable,token);
|
||||
}
|
||||
|
||||
if (tokenString) {
|
||||
if ((signed)strlen(tokenString) >= maxSize) {
|
||||
cpp->tokensBeforeEOF = 1;
|
||||
return maxSize;
|
||||
} else if (strlen(tokenString) > 0) {
|
||||
strcpy(buf, tokenString);
|
||||
cpp->tokensBeforeEOF = 1;
|
||||
return (int)strlen(tokenString);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
} // yylex
|
||||
|
||||
//Checks if the token just read is EOF or not.
|
||||
int check_EOF(int token)
|
||||
{
|
||||
if(token==-1){
|
||||
if(cpp->ifdepth >0){
|
||||
CPPErrorToInfoLog("#endif missing!! Compilation stopped");
|
||||
cpp->CompileError=1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////// End of scanner.c //////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// scanner.h
|
||||
//
|
||||
|
||||
#if !defined(__SCANNER_H)
|
||||
#define __SCANNER_H 1
|
||||
|
||||
#define MAX_SYMBOL_NAME_LEN 128
|
||||
#define MAX_STRING_LEN 512
|
||||
|
||||
#include "parser.h"
|
||||
|
||||
// Not really atom table stuff but needed first...
|
||||
|
||||
typedef struct SourceLoc_Rec {
|
||||
unsigned short file, line;
|
||||
} SourceLoc;
|
||||
|
||||
int yyparse (void);
|
||||
|
||||
int yylex_CPP(char* buf, int maxSize);
|
||||
|
||||
typedef struct InputSrc {
|
||||
struct InputSrc *prev;
|
||||
int (*scan)(struct InputSrc *, yystypepp *);
|
||||
int (*getch)(struct InputSrc *, yystypepp *);
|
||||
void (*ungetch)(struct InputSrc *, int, yystypepp *);
|
||||
int name; /* atom */
|
||||
int line;
|
||||
} InputSrc;
|
||||
|
||||
int InitScanner(CPPStruct *cpp); // Intialise the cpp scanner.
|
||||
int ScanFromString(char *); // Start scanning the input from the string mentioned.
|
||||
int check_EOF(int); // check if we hit a EOF abruptly
|
||||
void CPPErrorToInfoLog(char *); // sticking the msg,line into the Shader's.Info.log
|
||||
void SetLineNumber(int);
|
||||
void SetStringNumber(int);
|
||||
void IncLineNumber(void);
|
||||
void DecLineNumber(void);
|
||||
int FreeScanner(void); // Free the cpp scanner
|
||||
#endif // !(defined(__SCANNER_H)
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// slglobals.h
|
||||
//
|
||||
|
||||
#if !defined(__SLGLOBALS_H)
|
||||
#define __SLGLOBALS_H 1
|
||||
|
||||
typedef struct CPPStruct_Rec CPPStruct;
|
||||
|
||||
extern CPPStruct *cpp;
|
||||
|
||||
#undef CPPC_DEBUG_THE_COMPILER
|
||||
#if defined(_DEBUG)
|
||||
#define CPPC_DEBUG_THE_COMPILER 1
|
||||
#endif
|
||||
|
||||
#undef CPPC_ENABLE_TOOLS
|
||||
#define CPPC_ENABLE_TOOLS 1
|
||||
|
||||
#include "memory.h"
|
||||
#include "atom.h"
|
||||
#include "scanner.h"
|
||||
#include "cpp.h"
|
||||
#include "tokens.h"
|
||||
#include "symbols.h"
|
||||
#include "compile.h"
|
||||
#if !defined(NO_PARSER)
|
||||
#include "parser.h"
|
||||
#endif
|
||||
|
||||
#if !defined(NULL)
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
#endif // !(defined(__SLGLOBALS_H)
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,290 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// symbols.c
|
||||
//
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "slglobals.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////// Symbol Table Variables: ///////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Scope *ScopeList = NULL;
|
||||
Scope *CurrentScope = NULL;
|
||||
Scope *GlobalScope = NULL;
|
||||
|
||||
static void unlinkScope(void *_scope) {
|
||||
Scope *scope = _scope;
|
||||
|
||||
if (scope->next)
|
||||
scope->next->prev = scope->prev;
|
||||
if (scope->prev)
|
||||
scope->prev->next = scope->next;
|
||||
else
|
||||
ScopeList = scope->next;
|
||||
}
|
||||
|
||||
/*
|
||||
* NewScope()
|
||||
*
|
||||
*/
|
||||
Scope *NewScopeInPool(MemoryPool *pool)
|
||||
{
|
||||
Scope *lScope;
|
||||
|
||||
lScope = mem_Alloc(pool, sizeof(Scope));
|
||||
lScope->pool = pool;
|
||||
lScope->parent = NULL;
|
||||
lScope->funScope = NULL;
|
||||
lScope->symbols = NULL;
|
||||
|
||||
lScope->level = 0;
|
||||
|
||||
lScope->programs = NULL;
|
||||
if ((lScope->next = ScopeList))
|
||||
ScopeList->prev = lScope;
|
||||
lScope->prev = 0;
|
||||
ScopeList = lScope;
|
||||
mem_AddCleanup(pool, unlinkScope, lScope);
|
||||
return lScope;
|
||||
} // NewScope
|
||||
|
||||
/*
|
||||
* PushScope()
|
||||
*
|
||||
*/
|
||||
|
||||
void PushScope(Scope *fScope)
|
||||
{
|
||||
Scope *lScope;
|
||||
|
||||
if (CurrentScope) {
|
||||
fScope->level = CurrentScope->level + 1;
|
||||
if (fScope->level == 1) {
|
||||
if (!GlobalScope) {
|
||||
/* HACK - CTD -- if GlobalScope==NULL and level==1, we're
|
||||
* defining a function in the superglobal scope. Things
|
||||
* will break if we leave the level as 1, so we arbitrarily
|
||||
* set it to 2 */
|
||||
fScope->level = 2;
|
||||
}
|
||||
}
|
||||
if (fScope->level >= 2) {
|
||||
lScope = fScope;
|
||||
while (lScope->level > 2)
|
||||
lScope = lScope->next;
|
||||
fScope->funScope = lScope;
|
||||
}
|
||||
} else {
|
||||
fScope->level = 0;
|
||||
}
|
||||
fScope->parent = CurrentScope;
|
||||
CurrentScope = fScope;
|
||||
} // PushScope
|
||||
|
||||
/*
|
||||
* PopScope()
|
||||
*
|
||||
*/
|
||||
|
||||
Scope *PopScope(void)
|
||||
{
|
||||
Scope *lScope;
|
||||
|
||||
lScope = CurrentScope;
|
||||
if (CurrentScope)
|
||||
CurrentScope = CurrentScope->parent;
|
||||
return lScope;
|
||||
} // PopScope
|
||||
|
||||
/*
|
||||
* NewSymbol() - Allocate a new symbol node;
|
||||
*
|
||||
*/
|
||||
|
||||
Symbol *NewSymbol(SourceLoc *loc, Scope *fScope, int name, symbolkind kind)
|
||||
{
|
||||
Symbol *lSymb;
|
||||
char *pch;
|
||||
int ii;
|
||||
|
||||
lSymb = (Symbol *) mem_Alloc(fScope->pool, sizeof(Symbol));
|
||||
lSymb->left = NULL;
|
||||
lSymb->right = NULL;
|
||||
lSymb->next = NULL;
|
||||
lSymb->name = name;
|
||||
lSymb->loc = *loc;
|
||||
lSymb->kind = kind;
|
||||
|
||||
// Clear union area:
|
||||
|
||||
pch = (char *) &lSymb->details;
|
||||
for (ii = 0; ii < sizeof(lSymb->details); ii++)
|
||||
*pch++ = 0;
|
||||
return lSymb;
|
||||
} // NewSymbol
|
||||
|
||||
/*
|
||||
* lAddToTree() - Using a binary tree is not a good idea for basic atom values because they
|
||||
* are generated in order. We'll fix this later (by reversing the bit pattern).
|
||||
*/
|
||||
|
||||
static void lAddToTree(Symbol **fSymbols, Symbol *fSymb)
|
||||
{
|
||||
Symbol *lSymb;
|
||||
int lrev, frev;
|
||||
|
||||
lSymb = *fSymbols;
|
||||
if (lSymb) {
|
||||
frev = GetReversedAtom(atable, fSymb->name);
|
||||
while (lSymb) {
|
||||
lrev = GetReversedAtom(atable, lSymb->name);
|
||||
if (lrev == frev) {
|
||||
CPPErrorToInfoLog("GetAtomString(atable, fSymb->name)");
|
||||
break;
|
||||
} else {
|
||||
if (lrev > frev) {
|
||||
if (lSymb->left) {
|
||||
lSymb = lSymb->left;
|
||||
} else {
|
||||
lSymb->left = fSymb;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if (lSymb->right) {
|
||||
lSymb = lSymb->right;
|
||||
} else {
|
||||
lSymb->right = fSymb;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
*fSymbols = fSymb;
|
||||
}
|
||||
} // lAddToTree
|
||||
|
||||
|
||||
/*
|
||||
* AddSymbol() - Add a variable, type, or function name to a scope.
|
||||
*
|
||||
*/
|
||||
|
||||
Symbol *AddSymbol(SourceLoc *loc, Scope *fScope, int atom, symbolkind kind)
|
||||
{
|
||||
Symbol *lSymb;
|
||||
|
||||
if (!fScope)
|
||||
fScope = CurrentScope;
|
||||
lSymb = NewSymbol(loc, fScope, atom, kind);
|
||||
lAddToTree(&fScope->symbols, lSymb);
|
||||
return lSymb;
|
||||
} // AddSymbol
|
||||
|
||||
|
||||
/*********************************************************************************************/
|
||||
/************************************ Symbol Semantic Functions ******************************/
|
||||
/*********************************************************************************************/
|
||||
|
||||
/*
|
||||
* LookUpLocalSymbol()
|
||||
*
|
||||
*/
|
||||
|
||||
Symbol *LookUpLocalSymbol(Scope *fScope, int atom)
|
||||
{
|
||||
Symbol *lSymb;
|
||||
int rname, ratom;
|
||||
|
||||
ratom = GetReversedAtom(atable, atom);
|
||||
if (!fScope)
|
||||
fScope = CurrentScope;
|
||||
lSymb = fScope->symbols;
|
||||
while (lSymb) {
|
||||
rname = GetReversedAtom(atable, lSymb->name);
|
||||
if (rname == ratom) {
|
||||
return lSymb;
|
||||
} else {
|
||||
if (rname > ratom) {
|
||||
lSymb = lSymb->left;
|
||||
} else {
|
||||
lSymb = lSymb->right;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
} // LookUpLocalSymbol
|
||||
|
||||
/*
|
||||
* LookUpSymbol()
|
||||
*
|
||||
*/
|
||||
|
||||
Symbol *LookUpSymbol(Scope *fScope, int atom)
|
||||
{
|
||||
Symbol *lSymb;
|
||||
|
||||
if (!fScope)
|
||||
fScope = CurrentScope;
|
||||
while (fScope) {
|
||||
lSymb = LookUpLocalSymbol(fScope, atom);
|
||||
if (lSymb)
|
||||
return lSymb;
|
||||
fScope = fScope->parent;
|
||||
}
|
||||
return NULL;
|
||||
} // LookUpSymbol
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// symbols.h
|
||||
//
|
||||
|
||||
#if !defined(__SYMBOLS_H)
|
||||
#define __SYMBOLS_H 1
|
||||
|
||||
#include "memory.h"
|
||||
|
||||
typedef enum symbolkind {
|
||||
MACRO_S
|
||||
} symbolkind;
|
||||
|
||||
// Typedefs for things defined here in "symbols.h":
|
||||
|
||||
typedef struct Scope_Rec Scope;
|
||||
typedef struct Symbol_Rec Symbol;
|
||||
|
||||
typedef struct SymbolList_Rec {
|
||||
struct SymbolList_Rec *next;
|
||||
Symbol *symb;
|
||||
} SymbolList;
|
||||
|
||||
struct Scope_Rec {
|
||||
Scope *next, *prev; // doubly-linked list of all scopes
|
||||
Scope *parent;
|
||||
Scope *funScope; // Points to base scope of enclosing function
|
||||
MemoryPool *pool; // pool used for allocation in this scope
|
||||
Symbol *symbols;
|
||||
|
||||
int level; // 0 = super globals, 1 = globals, etc.
|
||||
|
||||
// Only used at global scope (level 1):
|
||||
SymbolList *programs; // List of programs for this compilation.
|
||||
};
|
||||
|
||||
|
||||
// Symbol table is a simple binary tree.
|
||||
|
||||
#include "cpp.h" // to get MacroSymbol def
|
||||
|
||||
struct Symbol_Rec {
|
||||
Symbol *left, *right;
|
||||
Symbol *next;
|
||||
int name; // Name atom
|
||||
SourceLoc loc;
|
||||
symbolkind kind;
|
||||
union {
|
||||
MacroSymbol mac;
|
||||
} details;
|
||||
};
|
||||
|
||||
extern Scope *CurrentScope;
|
||||
extern Scope *GlobalScope;
|
||||
extern Scope *ScopeList;
|
||||
|
||||
Scope *NewScopeInPool(MemoryPool *);
|
||||
#define NewScope() NewScopeInPool(CurrentScope->pool)
|
||||
void PushScope(Scope *fScope);
|
||||
Scope *PopScope(void);
|
||||
Symbol *NewSymbol(SourceLoc *loc, Scope *fScope, int name, symbolkind kind);
|
||||
Symbol *AddSymbol(SourceLoc *loc, Scope *fScope, int atom, symbolkind kind);
|
||||
Symbol *LookUpLocalSymbol(Scope *fScope, int atom);
|
||||
Symbol *LookUpSymbol(Scope *fScope, int atom);
|
||||
void CPPErrorToInfoLog(char *);
|
||||
|
||||
|
||||
#endif // !defined(__SYMBOLS_H)
|
||||
|
|
@ -0,0 +1,444 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// tokens.c
|
||||
//
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "slglobals.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////// Preprocessor and Token Recorder and Playback: ////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
* idstr()
|
||||
* Copy a string to a malloc'ed block and convert it into something suitable
|
||||
* for an ID
|
||||
*
|
||||
*/
|
||||
|
||||
static char *idstr(const char *fstr, MemoryPool *pool)
|
||||
{
|
||||
size_t len;
|
||||
char *str, *t;
|
||||
const char *f;
|
||||
|
||||
len = strlen(fstr);
|
||||
if (!pool)
|
||||
str = (char *) malloc(len + 1);
|
||||
else
|
||||
str = (char *) mem_Alloc(pool, len + 1);
|
||||
|
||||
for (f=fstr, t=str; *f; f++) {
|
||||
if (isalnum(*f)) *t++ = *f;
|
||||
else if (*f == '.' || *f == '/') *t++ = '_';
|
||||
}
|
||||
*t = 0;
|
||||
return str;
|
||||
} // idstr
|
||||
|
||||
|
||||
/*
|
||||
* lNewBlock()
|
||||
*
|
||||
*/
|
||||
|
||||
static TokenBlock *lNewBlock(TokenStream *fTok, MemoryPool *pool)
|
||||
{
|
||||
TokenBlock *lBlock;
|
||||
|
||||
if (!pool)
|
||||
lBlock = (TokenBlock *) malloc(sizeof(TokenBlock) + 256);
|
||||
else
|
||||
lBlock = (TokenBlock *) mem_Alloc(pool, sizeof(TokenBlock) + 256);
|
||||
lBlock->count = 0;
|
||||
lBlock->current = 0;
|
||||
lBlock->data = (unsigned char *) lBlock + sizeof(TokenBlock);
|
||||
lBlock->max = 256;
|
||||
lBlock->next = NULL;
|
||||
if (fTok->head) {
|
||||
fTok->current->next = lBlock;
|
||||
} else {
|
||||
fTok->head = lBlock;
|
||||
}
|
||||
fTok->current = lBlock;
|
||||
return lBlock;
|
||||
} // lNewBlock
|
||||
|
||||
/*
|
||||
* lAddByte()
|
||||
*
|
||||
*/
|
||||
|
||||
static void lAddByte(TokenStream *fTok, unsigned char fVal)
|
||||
{
|
||||
TokenBlock *lBlock;
|
||||
lBlock = fTok->current;
|
||||
if (lBlock->count >= lBlock->max)
|
||||
lBlock = lNewBlock(fTok, 0);
|
||||
lBlock->data[lBlock->count++] = fVal;
|
||||
} // lAddByte
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* lReadByte() - Get the next byte from a stream.
|
||||
*
|
||||
*/
|
||||
|
||||
static int lReadByte(TokenStream *pTok)
|
||||
{
|
||||
TokenBlock *lBlock;
|
||||
int lval = -1;
|
||||
|
||||
lBlock = pTok->current;
|
||||
if (lBlock) {
|
||||
if (lBlock->current >= lBlock->count) {
|
||||
lBlock = lBlock->next;
|
||||
if (lBlock)
|
||||
lBlock->current = 0;
|
||||
pTok->current = lBlock;
|
||||
}
|
||||
if (lBlock)
|
||||
lval = lBlock->data[lBlock->current++];
|
||||
}
|
||||
return lval;
|
||||
} // lReadByte
|
||||
|
||||
/////////////////////////////////////// Global Functions://////////////////////////////////////
|
||||
|
||||
/*
|
||||
* NewTokenStream()
|
||||
*
|
||||
*/
|
||||
|
||||
TokenStream *NewTokenStream(const char *name, MemoryPool *pool)
|
||||
{
|
||||
TokenStream *pTok;
|
||||
|
||||
if (!pool)
|
||||
pTok = (TokenStream *) malloc(sizeof(TokenStream));
|
||||
else
|
||||
pTok = (TokenStream*)mem_Alloc(pool, sizeof(TokenStream));
|
||||
pTok->next = NULL;
|
||||
pTok->name = idstr(name, pool);
|
||||
pTok->head = NULL;
|
||||
pTok->current = NULL;
|
||||
lNewBlock(pTok, pool);
|
||||
return pTok;
|
||||
} // NewTokenStream
|
||||
|
||||
/*
|
||||
* DeleteTokenStream()
|
||||
*
|
||||
*/
|
||||
|
||||
void DeleteTokenStream(TokenStream *pTok)
|
||||
{
|
||||
TokenBlock *pBlock, *nBlock;
|
||||
|
||||
if (pTok) {
|
||||
pBlock = pTok->head;
|
||||
while (pBlock) {
|
||||
nBlock = pBlock->next;
|
||||
free(pBlock);
|
||||
pBlock = nBlock;
|
||||
}
|
||||
if (pTok->name)
|
||||
free(pTok->name);
|
||||
free(pTok);
|
||||
}
|
||||
} // DeleteTokenStream
|
||||
|
||||
/*
|
||||
* RecordToken() - Add a token to the end of a list for later playback or printout.
|
||||
*
|
||||
*/
|
||||
|
||||
void RecordToken(TokenStream *pTok, int token, yystypepp * yylvalpp)
|
||||
{
|
||||
const char *s;
|
||||
unsigned char *str=NULL;
|
||||
|
||||
if (token > 256)
|
||||
lAddByte(pTok, (unsigned char)((token & 0x7f) + 0x80));
|
||||
else
|
||||
lAddByte(pTok, (unsigned char)(token & 0x7f));
|
||||
switch (token) {
|
||||
case CPP_IDENTIFIER:
|
||||
case CPP_TYPEIDENTIFIER:
|
||||
case CPP_STRCONSTANT:
|
||||
s = GetAtomString(atable, yylvalpp->sc_ident);
|
||||
while (*s)
|
||||
lAddByte(pTok, (unsigned char) *s++);
|
||||
lAddByte(pTok, 0);
|
||||
break;
|
||||
case CPP_FLOATCONSTANT:
|
||||
case CPP_INTCONSTANT:
|
||||
str=yylvalpp->symbol_name;
|
||||
while (*str){
|
||||
lAddByte(pTok,(unsigned char) *str);
|
||||
*str++;
|
||||
}
|
||||
lAddByte(pTok, 0);
|
||||
break;
|
||||
case '(':
|
||||
lAddByte(pTok, (unsigned char)(yylvalpp->sc_int ? 1 : 0));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} // RecordToken
|
||||
|
||||
/*
|
||||
* RewindTokenStream() - Reset a token stream in preperation for reading.
|
||||
*
|
||||
*/
|
||||
|
||||
void RewindTokenStream(TokenStream *pTok)
|
||||
{
|
||||
if (pTok->head) {
|
||||
pTok->current = pTok->head;
|
||||
pTok->current->current = 0;
|
||||
}
|
||||
} // RewindTokenStream
|
||||
|
||||
/*
|
||||
* ReadToken() - Read the next token from a stream.
|
||||
*
|
||||
*/
|
||||
|
||||
int ReadToken(TokenStream *pTok, yystypepp * yylvalpp)
|
||||
{
|
||||
char symbol_name[MAX_SYMBOL_NAME_LEN + 1];
|
||||
char string_val[MAX_STRING_LEN + 1];
|
||||
int ltoken, len;
|
||||
char ch;
|
||||
|
||||
ltoken = lReadByte(pTok);
|
||||
if (ltoken >= 0) {
|
||||
if (ltoken > 127)
|
||||
ltoken += 128;
|
||||
switch (ltoken) {
|
||||
case CPP_IDENTIFIER:
|
||||
case CPP_TYPEIDENTIFIER:
|
||||
len = 0;
|
||||
ch = lReadByte(pTok);
|
||||
while ((ch >= 'a' && ch <= 'z') ||
|
||||
(ch >= 'A' && ch <= 'Z') ||
|
||||
(ch >= '0' && ch <= '9') ||
|
||||
ch == '_')
|
||||
{
|
||||
if (len < MAX_SYMBOL_NAME_LEN) {
|
||||
symbol_name[len] = ch;
|
||||
len++;
|
||||
ch = lReadByte(pTok);
|
||||
}
|
||||
}
|
||||
symbol_name[len] = '\0';
|
||||
assert(ch == '\0');
|
||||
yylvalpp->sc_ident = LookUpAddString(atable, symbol_name);
|
||||
return CPP_IDENTIFIER;
|
||||
break;
|
||||
case CPP_STRCONSTANT:
|
||||
len = 0;
|
||||
while ((ch = lReadByte(pTok)) != 0)
|
||||
if (len < MAX_STRING_LEN)
|
||||
string_val[len++] = ch;
|
||||
string_val[len] = 0;
|
||||
yylvalpp->sc_ident = LookUpAddString(atable, string_val);
|
||||
break;
|
||||
case CPP_FLOATCONSTANT:
|
||||
len = 0;
|
||||
ch = lReadByte(pTok);
|
||||
while ((ch >= '0' && ch <= '9')||(ch=='e'||ch=='E'||ch=='.')||(ch=='+'||ch=='-'))
|
||||
{
|
||||
if (len < MAX_SYMBOL_NAME_LEN) {
|
||||
symbol_name[len] = ch;
|
||||
len++;
|
||||
ch = lReadByte(pTok);
|
||||
}
|
||||
}
|
||||
symbol_name[len] = '\0';
|
||||
assert(ch == '\0');
|
||||
strcpy(yylvalpp->symbol_name,symbol_name);
|
||||
yylvalpp->sc_fval=(float)atof(yylvalpp->symbol_name);
|
||||
break;
|
||||
case CPP_INTCONSTANT:
|
||||
len = 0;
|
||||
ch = lReadByte(pTok);
|
||||
while ((ch >= '0' && ch <= '9'))
|
||||
{
|
||||
if (len < MAX_SYMBOL_NAME_LEN) {
|
||||
symbol_name[len] = ch;
|
||||
len++;
|
||||
ch = lReadByte(pTok);
|
||||
}
|
||||
}
|
||||
symbol_name[len] = '\0';
|
||||
assert(ch == '\0');
|
||||
strcpy(yylvalpp->symbol_name,symbol_name);
|
||||
yylvalpp->sc_int=atoi(yylvalpp->symbol_name);
|
||||
break;
|
||||
case '(':
|
||||
yylvalpp->sc_int = lReadByte(pTok);
|
||||
break;
|
||||
}
|
||||
return ltoken;
|
||||
}
|
||||
return EOF_SY;
|
||||
} // ReadToken
|
||||
|
||||
typedef struct TokenInputSrc {
|
||||
InputSrc base;
|
||||
TokenStream *tokens;
|
||||
int (*final)(CPPStruct *);
|
||||
} TokenInputSrc;
|
||||
|
||||
static int scan_token(TokenInputSrc *in, yystypepp * yylvalpp)
|
||||
{
|
||||
int token = ReadToken(in->tokens, yylvalpp);
|
||||
int (*final)(CPPStruct *);
|
||||
cpp->tokenLoc->file = cpp->currentInput->name;
|
||||
cpp->tokenLoc->line = cpp->currentInput->line;
|
||||
if (token == '\n') {
|
||||
in->base.line++;
|
||||
return token;
|
||||
}
|
||||
if (token > 0) return token;
|
||||
cpp->currentInput = in->base.prev;
|
||||
final = in->final;
|
||||
free(in);
|
||||
if (final && !final(cpp)) return -1;
|
||||
return cpp->currentInput->scan(cpp->currentInput, yylvalpp);
|
||||
}
|
||||
|
||||
int ReadFromTokenStream(TokenStream *ts, int name, int (*final)(CPPStruct *))
|
||||
{
|
||||
TokenInputSrc *in = malloc(sizeof(TokenInputSrc));
|
||||
memset(in, 0, sizeof(TokenInputSrc));
|
||||
in->base.name = name;
|
||||
in->base.prev = cpp->currentInput;
|
||||
in->base.scan = (int (*)(InputSrc *, yystypepp *))scan_token;
|
||||
in->base.line = 1;
|
||||
in->tokens = ts;
|
||||
in->final = final;
|
||||
RewindTokenStream(ts);
|
||||
cpp->currentInput = &in->base;
|
||||
return 1;
|
||||
}
|
||||
|
||||
typedef struct UngotToken {
|
||||
InputSrc base;
|
||||
int token;
|
||||
yystypepp lval;
|
||||
} UngotToken;
|
||||
|
||||
static int reget_token(UngotToken *t, yystypepp * yylvalpp)
|
||||
{
|
||||
int token = t->token;
|
||||
*yylvalpp = t->lval;
|
||||
cpp->currentInput = t->base.prev;
|
||||
free(t);
|
||||
return token;
|
||||
}
|
||||
|
||||
void UngetToken(int token, yystypepp * yylvalpp) {
|
||||
UngotToken *t = malloc(sizeof(UngotToken));
|
||||
memset(t, 0, sizeof(UngotToken));
|
||||
t->token = token;
|
||||
t->lval = *yylvalpp;
|
||||
t->base.scan = (void *)reget_token;
|
||||
t->base.prev = cpp->currentInput;
|
||||
t->base.name = cpp->currentInput->name;
|
||||
t->base.line = cpp->currentInput->line;
|
||||
cpp->currentInput = &t->base;
|
||||
}
|
||||
|
||||
|
||||
void DumpTokenStream(FILE *fp, TokenStream *s, yystypepp * yylvalpp) {
|
||||
int token;
|
||||
char str[100];
|
||||
|
||||
if (fp == 0) fp = stdout;
|
||||
RewindTokenStream(s);
|
||||
while ((token = ReadToken(s, yylvalpp)) > 0) {
|
||||
switch (token) {
|
||||
case CPP_IDENTIFIER:
|
||||
case CPP_TYPEIDENTIFIER:
|
||||
sprintf(str, "%s ", GetAtomString(atable, yylvalpp->sc_ident));
|
||||
break;
|
||||
case CPP_STRCONSTANT:
|
||||
sprintf(str, "\"%s\"", GetAtomString(atable, yylvalpp->sc_ident));
|
||||
break;
|
||||
case CPP_FLOATCONSTANT:
|
||||
//printf("%g9.6 ", yylvalpp->sc_fval);
|
||||
break;
|
||||
case CPP_INTCONSTANT:
|
||||
//printf("%d ", yylvalpp->sc_int);
|
||||
break;
|
||||
default:
|
||||
if (token >= 127)
|
||||
sprintf(str, "%s ", GetAtomString(atable, token));
|
||||
else
|
||||
sprintf(str, "%c", token);
|
||||
break;
|
||||
}
|
||||
CPPDebugLogMsg(str);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////// End of tokens.c ///////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
@ -0,0 +1,94 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
/****************************************************************************\
|
||||
Copyright (c) 2002, NVIDIA Corporation.
|
||||
|
||||
NVIDIA Corporation("NVIDIA") supplies this software to you in
|
||||
consideration of your agreement to the following terms, and your use,
|
||||
installation, modification or redistribution of this NVIDIA software
|
||||
constitutes acceptance of these terms. If you do not agree with these
|
||||
terms, please do not use, install, modify or redistribute this NVIDIA
|
||||
software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and
|
||||
subject to these terms, NVIDIA grants you a personal, non-exclusive
|
||||
license, under NVIDIA's copyrights in this original NVIDIA software (the
|
||||
"NVIDIA Software"), to use, reproduce, modify and redistribute the
|
||||
NVIDIA Software, with or without modifications, in source and/or binary
|
||||
forms; provided that if you redistribute the NVIDIA Software, you must
|
||||
retain the copyright notice of NVIDIA, this notice and the following
|
||||
text and disclaimers in all such redistributions of the NVIDIA Software.
|
||||
Neither the name, trademarks, service marks nor logos of NVIDIA
|
||||
Corporation may be used to endorse or promote products derived from the
|
||||
NVIDIA Software without specific prior written permission from NVIDIA.
|
||||
Except as expressly stated in this notice, no other rights or licenses
|
||||
express or implied, are granted by NVIDIA herein, including but not
|
||||
limited to any patent rights that may be infringed by your derivative
|
||||
works or by other works in which the NVIDIA Software may be
|
||||
incorporated. No hardware is licensed hereunder.
|
||||
|
||||
THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
||||
INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE,
|
||||
NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
|
||||
ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER
|
||||
PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT,
|
||||
INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY
|
||||
OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE
|
||||
NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
|
||||
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
|
||||
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
\****************************************************************************/
|
||||
//
|
||||
// tokens.h
|
||||
//
|
||||
|
||||
#if !defined(__TOKENS_H)
|
||||
#define __TOKENS_H 1
|
||||
|
||||
#include "parser.h"
|
||||
|
||||
#define EOF_SY (-1)
|
||||
|
||||
typedef struct TokenBlock_Rec TokenBlock;
|
||||
|
||||
typedef struct TokenStream_Rec {
|
||||
struct TokenStream_Rec *next;
|
||||
char *name;
|
||||
TokenBlock *head;
|
||||
TokenBlock *current;
|
||||
} TokenStream;
|
||||
|
||||
struct TokenBlock_Rec {
|
||||
TokenBlock *next;
|
||||
int current;
|
||||
int count;
|
||||
int max;
|
||||
unsigned char *data;
|
||||
};
|
||||
|
||||
extern TokenStream stdlib_cpp_stream;
|
||||
|
||||
|
||||
TokenStream *NewTokenStream(const char *name, MemoryPool *pool);
|
||||
void DeleteTokenStream(TokenStream *pTok);
|
||||
void RecordToken(TokenStream *pTok, int token, yystypepp * yylvalpp);
|
||||
void RewindTokenStream(TokenStream *pTok);
|
||||
int ReadToken(TokenStream *pTok, yystypepp * yylvalpp);
|
||||
int ReadFromTokenStream(TokenStream *pTok, int name, int (*final)(CPPStruct *));
|
||||
void UngetToken(int, yystypepp * yylvalpp);
|
||||
|
||||
#if defined(CPPC_ENABLE_TOOLS)
|
||||
|
||||
void DumpTokenStream(FILE *, TokenStream *, yystypepp * yylvalpp);
|
||||
|
||||
#endif // defined(CPPC_ENABLE_TOOLS)
|
||||
|
||||
#endif // !defined(__TOKENS_H)
|
|
@ -0,0 +1,58 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#include "intermediate.h"
|
||||
|
||||
class TAliveTraverser : public TIntermTraverser {
|
||||
public:
|
||||
TAliveTraverser(TQualifier q) : TIntermTraverser(true, false, false, true), found(false), qualifier(q)
|
||||
{
|
||||
}
|
||||
|
||||
bool wasFound() { return found; }
|
||||
|
||||
protected:
|
||||
bool found;
|
||||
TQualifier qualifier;
|
||||
|
||||
void visitSymbol(TIntermSymbol*);
|
||||
bool visitSelection(Visit, TIntermSelection*);
|
||||
};
|
||||
|
||||
//
|
||||
// Report whether or not a variable of the given qualifier type
|
||||
// is guaranteed written. Not always possible to determine if
|
||||
// it is written conditionally.
|
||||
//
|
||||
// ?? It does not do this well yet, this is just a place holder
|
||||
// that simply determines if it was reference at all, anywhere.
|
||||
//
|
||||
bool QualifierWritten(TIntermNode* node, TQualifier qualifier)
|
||||
{
|
||||
TAliveTraverser it(qualifier);
|
||||
|
||||
if (node)
|
||||
node->traverse(&it);
|
||||
|
||||
return it.wasFound();
|
||||
}
|
||||
|
||||
void TAliveTraverser::visitSymbol(TIntermSymbol* node)
|
||||
{
|
||||
//
|
||||
// If it's what we're looking for, record it.
|
||||
//
|
||||
if (node->getQualifier() == qualifier)
|
||||
found = true;
|
||||
}
|
||||
|
||||
bool TAliveTraverser::visitSelection(Visit preVisit, TIntermSelection* node)
|
||||
{
|
||||
if (wasFound())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
bool QualifierWritten(TIntermNode* root, TQualifier);
|
|
@ -0,0 +1,76 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#include "intermediate.h"
|
||||
#include "RemoveTree.h"
|
||||
//
|
||||
// Code to recursively delete the intermediate tree.
|
||||
//
|
||||
|
||||
class RemoveTree : public TIntermTraverser
|
||||
{
|
||||
public:
|
||||
RemoveTree() : TIntermTraverser(false, false, true)
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
void visitSymbol(TIntermSymbol*);
|
||||
void visitConstantUnion(TIntermConstantUnion*);
|
||||
bool visitBinary(Visit visit, TIntermBinary*);
|
||||
bool visitUnary(Visit visit, TIntermUnary*);
|
||||
bool visitSelection(Visit visit, TIntermSelection*);
|
||||
bool visitAggregate(Visit visit, TIntermAggregate*);
|
||||
};
|
||||
|
||||
void RemoveTree::visitSymbol(TIntermSymbol* node)
|
||||
{
|
||||
delete node;
|
||||
}
|
||||
|
||||
bool RemoveTree::visitBinary(Visit visit, TIntermBinary* node)
|
||||
{
|
||||
delete node;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RemoveTree::visitUnary(Visit visit, TIntermUnary* node)
|
||||
{
|
||||
delete node;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RemoveTree::visitAggregate(Visit visit, TIntermAggregate* node)
|
||||
{
|
||||
delete node;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RemoveTree::visitSelection(Visit visit, TIntermSelection* node)
|
||||
{
|
||||
delete node;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void RemoveTree::visitConstantUnion(TIntermConstantUnion* node)
|
||||
{
|
||||
delete node;
|
||||
}
|
||||
|
||||
//
|
||||
// Entry point.
|
||||
//
|
||||
void RemoveAllTreeNodes(TIntermNode* root)
|
||||
{
|
||||
RemoveTree it;
|
||||
|
||||
root->traverse(&it);
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
void RemoveAllTreeNodes(TIntermNode*);
|
|
@ -0,0 +1,21 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _RESOURCE_LIMITS_INCLUDED_
|
||||
#define _RESOURCE_LIMITS_INCLUDED_
|
||||
|
||||
struct TBuiltInResource
|
||||
{
|
||||
int maxVertexAttribs;
|
||||
int maxVertexUniformVectors;
|
||||
int maxVaryingVectors;
|
||||
int maxVertexTextureImageUnits;
|
||||
int maxCombinedTextureImageUnits;
|
||||
int maxTextureImageUnits;
|
||||
int maxFragmentUniformVectors;
|
||||
int maxDrawBuffers;
|
||||
};
|
||||
#endif // _RESOURCE_LIMITS_INCLUDED_
|
|
@ -0,0 +1,139 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _SHHANDLE_INCLUDED_
|
||||
#define _SHHANDLE_INCLUDED_
|
||||
|
||||
//
|
||||
// Machine independent part of the compiler private objects
|
||||
// sent as ShHandle to the driver.
|
||||
//
|
||||
// This should not be included by driver code.
|
||||
//
|
||||
|
||||
#include "ShaderLang.h"
|
||||
|
||||
#include "InfoSink.h"
|
||||
|
||||
class TCompiler;
|
||||
class TLinker;
|
||||
class TUniformMap;
|
||||
|
||||
|
||||
//
|
||||
// The base class used to back handles returned to the driver.
|
||||
//
|
||||
class TShHandleBase {
|
||||
public:
|
||||
TShHandleBase() { }
|
||||
virtual ~TShHandleBase() { }
|
||||
virtual TCompiler* getAsCompiler() { return 0; }
|
||||
virtual TLinker* getAsLinker() { return 0; }
|
||||
virtual TUniformMap* getAsUniformMap() { return 0; }
|
||||
};
|
||||
|
||||
//
|
||||
// The base class for the machine dependent linker to derive from
|
||||
// for managing where uniforms live.
|
||||
//
|
||||
class TUniformMap : public TShHandleBase {
|
||||
public:
|
||||
TUniformMap() { }
|
||||
virtual ~TUniformMap() { }
|
||||
virtual TUniformMap* getAsUniformMap() { return this; }
|
||||
virtual int getLocation(const char* name) = 0;
|
||||
virtual TInfoSink& getInfoSink() { return infoSink; }
|
||||
TInfoSink infoSink;
|
||||
};
|
||||
class TIntermNode;
|
||||
|
||||
//
|
||||
// The base class for the machine dependent compiler to derive from
|
||||
// for managing object code from the compile.
|
||||
//
|
||||
class TCompiler : public TShHandleBase {
|
||||
public:
|
||||
TCompiler(EShLanguage l, TInfoSink& sink) : infoSink(sink) , language(l), haveValidObjectCode(false) { }
|
||||
virtual ~TCompiler() { }
|
||||
EShLanguage getLanguage() { return language; }
|
||||
virtual TInfoSink& getInfoSink() { return infoSink; }
|
||||
|
||||
virtual bool compile(TIntermNode* root) = 0;
|
||||
|
||||
virtual TCompiler* getAsCompiler() { return this; }
|
||||
virtual bool linkable() { return haveValidObjectCode; }
|
||||
|
||||
TInfoSink& infoSink;
|
||||
protected:
|
||||
EShLanguage language;
|
||||
bool haveValidObjectCode;
|
||||
};
|
||||
|
||||
//
|
||||
// Link operations are base on a list of compile results...
|
||||
//
|
||||
typedef TVector<TCompiler*> TCompilerList;
|
||||
typedef TVector<TShHandleBase*> THandleList;
|
||||
|
||||
//
|
||||
// The base class for the machine dependent linker to derive from
|
||||
// to manage the resulting executable.
|
||||
//
|
||||
|
||||
class TLinker : public TShHandleBase {
|
||||
public:
|
||||
TLinker(EShExecutable e, TInfoSink& iSink) :
|
||||
infoSink(iSink),
|
||||
executable(e),
|
||||
haveReturnableObjectCode(false),
|
||||
appAttributeBindings(0),
|
||||
fixedAttributeBindings(0),
|
||||
excludedAttributes(0),
|
||||
excludedCount(0),
|
||||
uniformBindings(0) { }
|
||||
virtual TLinker* getAsLinker() { return this; }
|
||||
virtual ~TLinker() { }
|
||||
virtual bool link(TCompilerList&, TUniformMap*) = 0;
|
||||
virtual bool link(THandleList&) { return false; }
|
||||
virtual void setAppAttributeBindings(const ShBindingTable* t) { appAttributeBindings = t; }
|
||||
virtual void setFixedAttributeBindings(const ShBindingTable* t) { fixedAttributeBindings = t; }
|
||||
virtual void getAttributeBindings(ShBindingTable const **t) const = 0;
|
||||
virtual void setExcludedAttributes(const int* attributes, int count) { excludedAttributes = attributes; excludedCount = count; }
|
||||
virtual ShBindingTable* getUniformBindings() const { return uniformBindings; }
|
||||
virtual const void* getObjectCode() const { return 0; } // a real compiler would be returning object code here
|
||||
virtual TInfoSink& getInfoSink() { return infoSink; }
|
||||
TInfoSink& infoSink;
|
||||
protected:
|
||||
EShExecutable executable;
|
||||
bool haveReturnableObjectCode; // true when objectCode is acceptable to send to driver
|
||||
|
||||
const ShBindingTable* appAttributeBindings;
|
||||
const ShBindingTable* fixedAttributeBindings;
|
||||
const int* excludedAttributes;
|
||||
int excludedCount;
|
||||
ShBindingTable* uniformBindings; // created by the linker
|
||||
};
|
||||
|
||||
//
|
||||
// This is the interface between the machine independent code
|
||||
// and the machine dependent code.
|
||||
//
|
||||
// The machine dependent code should derive from the classes
|
||||
// above. Then Construct*() and Delete*() will create and
|
||||
// destroy the machine dependent objects, which contain the
|
||||
// above machine independent information.
|
||||
//
|
||||
TCompiler* ConstructCompiler(EShLanguage, int);
|
||||
|
||||
TShHandleBase* ConstructLinker(EShExecutable, int);
|
||||
void DeleteLinker(TShHandleBase*);
|
||||
|
||||
TUniformMap* ConstructUniformMap();
|
||||
void DeleteCompiler(TCompiler*);
|
||||
|
||||
void DeleteUniformMap(TUniformMap*);
|
||||
|
||||
#endif // _SHHANDLE_INCLUDED_
|
|
@ -0,0 +1,587 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
//
|
||||
// Implement the top-level of interface to the compiler/linker,
|
||||
// as defined in ShaderLang.h
|
||||
//
|
||||
#include "SymbolTable.h"
|
||||
#include "ParseHelper.h"
|
||||
|
||||
#include "ShHandle.h"
|
||||
#include "InitializeDll.h"
|
||||
|
||||
#include "ShaderLang.h"
|
||||
#include "Initialize.h"
|
||||
|
||||
#include "OutputHLSL.h"
|
||||
|
||||
//
|
||||
// A symbol table for each language. Each has a different
|
||||
// set of built-ins, and we want to preserve that from
|
||||
// compile to compile.
|
||||
//
|
||||
TSymbolTable SymbolTables[EShLangCount];
|
||||
|
||||
|
||||
TPoolAllocator* PerProcessGPA = 0;
|
||||
//
|
||||
// This is the platform independent interface between an OGL driver
|
||||
// and the shading language compiler/linker.
|
||||
//
|
||||
|
||||
//
|
||||
// Driver must call this first, once, before doing any other
|
||||
// compiler/linker operations.
|
||||
//
|
||||
int ShInitialize()
|
||||
{
|
||||
TInfoSink infoSink;
|
||||
bool ret = true;
|
||||
|
||||
if (!InitProcess())
|
||||
return 0;
|
||||
|
||||
// This method should be called once per process. If its called by multiple threads, then
|
||||
// we need to have thread synchronization code around the initialization of per process
|
||||
// global pool allocator
|
||||
if (!PerProcessGPA) {
|
||||
TPoolAllocator *builtInPoolAllocator = new TPoolAllocator(true);
|
||||
builtInPoolAllocator->push();
|
||||
TPoolAllocator* gPoolAllocator = &GlobalPoolAllocator;
|
||||
SetGlobalPoolAllocatorPtr(builtInPoolAllocator);
|
||||
|
||||
TSymbolTable symTables[EShLangCount];
|
||||
GenerateBuiltInSymbolTable(0, infoSink, symTables);
|
||||
|
||||
PerProcessGPA = new TPoolAllocator(true);
|
||||
PerProcessGPA->push();
|
||||
SetGlobalPoolAllocatorPtr(PerProcessGPA);
|
||||
|
||||
SymbolTables[EShLangVertex].copyTable(symTables[EShLangVertex]);
|
||||
SymbolTables[EShLangFragment].copyTable(symTables[EShLangFragment]);
|
||||
|
||||
SetGlobalPoolAllocatorPtr(gPoolAllocator);
|
||||
|
||||
symTables[EShLangVertex].pop();
|
||||
symTables[EShLangFragment].pop();
|
||||
|
||||
builtInPoolAllocator->popAll();
|
||||
delete builtInPoolAllocator;
|
||||
|
||||
}
|
||||
|
||||
return ret ? 1 : 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Driver calls these to create and destroy compiler/linker
|
||||
// objects.
|
||||
//
|
||||
|
||||
ShHandle ShConstructCompiler(const EShLanguage language, int debugOptions)
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = static_cast<TShHandleBase*>(ConstructCompiler(language, debugOptions));
|
||||
|
||||
return reinterpret_cast<void*>(base);
|
||||
}
|
||||
|
||||
ShHandle ShConstructLinker(const EShExecutable executable, int debugOptions)
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = static_cast<TShHandleBase*>(ConstructLinker(executable, debugOptions));
|
||||
|
||||
return reinterpret_cast<void*>(base);
|
||||
}
|
||||
|
||||
ShHandle ShConstructUniformMap()
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = static_cast<TShHandleBase*>(ConstructUniformMap());
|
||||
|
||||
return reinterpret_cast<void*>(base);
|
||||
}
|
||||
|
||||
void ShDestruct(ShHandle handle)
|
||||
{
|
||||
if (handle == 0)
|
||||
return;
|
||||
|
||||
TShHandleBase* base = static_cast<TShHandleBase*>(handle);
|
||||
|
||||
if (base->getAsCompiler())
|
||||
DeleteCompiler(base->getAsCompiler());
|
||||
else if (base->getAsLinker())
|
||||
DeleteLinker(base->getAsLinker());
|
||||
else if (base->getAsUniformMap())
|
||||
DeleteUniformMap(base->getAsUniformMap());
|
||||
}
|
||||
|
||||
//
|
||||
// Cleanup symbol tables
|
||||
//
|
||||
int __fastcall ShFinalize()
|
||||
{
|
||||
if (PerProcessGPA) {
|
||||
PerProcessGPA->popAll();
|
||||
delete PerProcessGPA;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool GenerateBuiltInSymbolTable(const TBuiltInResource* resources, TInfoSink& infoSink, TSymbolTable* symbolTables, EShLanguage language)
|
||||
{
|
||||
TBuiltIns builtIns;
|
||||
|
||||
if (resources) {
|
||||
builtIns.initialize(*resources);
|
||||
InitializeSymbolTable(builtIns.getBuiltInStrings(), language, infoSink, resources, symbolTables);
|
||||
} else {
|
||||
builtIns.initialize();
|
||||
InitializeSymbolTable(builtIns.getBuiltInStrings(), EShLangVertex, infoSink, resources, symbolTables);
|
||||
InitializeSymbolTable(builtIns.getBuiltInStrings(), EShLangFragment, infoSink, resources, symbolTables);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool InitializeSymbolTable(TBuiltInStrings* BuiltInStrings, EShLanguage language, TInfoSink& infoSink, const TBuiltInResource* resources, TSymbolTable* symbolTables)
|
||||
{
|
||||
TIntermediate intermediate(infoSink);
|
||||
TSymbolTable* symbolTable;
|
||||
|
||||
if (resources)
|
||||
symbolTable = symbolTables;
|
||||
else
|
||||
symbolTable = &symbolTables[language];
|
||||
|
||||
TParseContext parseContext(*symbolTable, intermediate, language, infoSink);
|
||||
|
||||
GlobalParseContext = &parseContext;
|
||||
|
||||
setInitialState();
|
||||
|
||||
assert(symbolTable->isEmpty() || symbolTable->atSharedBuiltInLevel());
|
||||
|
||||
//
|
||||
// Parse the built-ins. This should only happen once per
|
||||
// language symbol table.
|
||||
//
|
||||
// Push the symbol table to give it an initial scope. This
|
||||
// push should not have a corresponding pop, so that built-ins
|
||||
// are preserved, and the test for an empty table fails.
|
||||
//
|
||||
|
||||
symbolTable->push();
|
||||
|
||||
//Initialize the Preprocessor
|
||||
int ret = InitPreprocessor();
|
||||
if (ret) {
|
||||
infoSink.info.message(EPrefixInternalError, "Unable to intialize the Preprocessor");
|
||||
return false;
|
||||
}
|
||||
|
||||
for (TBuiltInStrings::iterator i = BuiltInStrings[parseContext.language].begin();
|
||||
i != BuiltInStrings[parseContext.language].end();
|
||||
++i) {
|
||||
const char* builtInShaders[1];
|
||||
int builtInLengths[1];
|
||||
|
||||
builtInShaders[0] = (*i).c_str();
|
||||
builtInLengths[0] = (int) (*i).size();
|
||||
|
||||
if (PaParseStrings(const_cast<char**>(builtInShaders), builtInLengths, 1, parseContext) != 0) {
|
||||
infoSink.info.message(EPrefixInternalError, "Unable to parse built-ins");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (resources) {
|
||||
IdentifyBuiltIns(parseContext.language, *symbolTable, *resources);
|
||||
} else {
|
||||
IdentifyBuiltIns(parseContext.language, *symbolTable);
|
||||
}
|
||||
|
||||
FinalizePreprocessor();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//
|
||||
// Do an actual compile on the given strings. The result is left
|
||||
// in the given compile object.
|
||||
//
|
||||
// Return: The return value of ShCompile is really boolean, indicating
|
||||
// success or failure.
|
||||
//
|
||||
int ShCompile(
|
||||
const ShHandle handle,
|
||||
const char* const shaderStrings[],
|
||||
const int numStrings,
|
||||
const EShOptimizationLevel optLevel,
|
||||
const TBuiltInResource* resources,
|
||||
int debugOptions
|
||||
)
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
if (handle == 0)
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
|
||||
TCompiler* compiler = base->getAsCompiler();
|
||||
if (compiler == 0)
|
||||
return 0;
|
||||
|
||||
GlobalPoolAllocator.push();
|
||||
compiler->infoSink.info.erase();
|
||||
compiler->infoSink.debug.erase();
|
||||
compiler->infoSink.obj.erase();
|
||||
|
||||
if (numStrings == 0)
|
||||
return 1;
|
||||
|
||||
TIntermediate intermediate(compiler->infoSink);
|
||||
TSymbolTable symbolTable(SymbolTables[compiler->getLanguage()]);
|
||||
|
||||
GenerateBuiltInSymbolTable(resources, compiler->infoSink, &symbolTable, compiler->getLanguage());
|
||||
|
||||
TParseContext parseContext(symbolTable, intermediate, compiler->getLanguage(), compiler->infoSink);
|
||||
parseContext.initializeExtensionBehavior();
|
||||
|
||||
GlobalParseContext = &parseContext;
|
||||
|
||||
setInitialState();
|
||||
|
||||
InitPreprocessor();
|
||||
//
|
||||
// Parse the application's shaders. All the following symbol table
|
||||
// work will be throw-away, so push a new allocation scope that can
|
||||
// be thrown away, then push a scope for the current shader's globals.
|
||||
//
|
||||
bool success = true;
|
||||
|
||||
symbolTable.push();
|
||||
if (!symbolTable.atGlobalLevel())
|
||||
parseContext.infoSink.info.message(EPrefixInternalError, "Wrong symbol table level");
|
||||
|
||||
int ret = PaParseStrings(const_cast<char**>(shaderStrings), 0, numStrings, parseContext);
|
||||
if (ret)
|
||||
success = false;
|
||||
|
||||
if (success && parseContext.treeRoot) {
|
||||
if (optLevel == EShOptNoGeneration)
|
||||
parseContext.infoSink.info.message(EPrefixNone, "No errors. No code generation or linking was requested.");
|
||||
else {
|
||||
success = intermediate.postProcess(parseContext.treeRoot, parseContext.language);
|
||||
|
||||
if (success) {
|
||||
|
||||
if (debugOptions & EDebugOpIntermediate)
|
||||
intermediate.outputTree(parseContext.treeRoot);
|
||||
|
||||
if(debugOptions & EDebugOpObjectCode)
|
||||
{
|
||||
sh::OutputHLSL outputHLSL(parseContext);
|
||||
|
||||
outputHLSL.header();
|
||||
parseContext.treeRoot->traverse(&outputHLSL);
|
||||
}
|
||||
|
||||
//
|
||||
// Call the machine dependent compiler
|
||||
//
|
||||
if (! compiler->compile(parseContext.treeRoot))
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
} else if (!success) {
|
||||
parseContext.infoSink.info.prefix(EPrefixError);
|
||||
parseContext.infoSink.info << parseContext.numErrors << " compilation errors. No code generated.\n\n";
|
||||
success = false;
|
||||
if (debugOptions & EDebugOpIntermediate)
|
||||
intermediate.outputTree(parseContext.treeRoot);
|
||||
}
|
||||
|
||||
intermediate.remove(parseContext.treeRoot);
|
||||
|
||||
//
|
||||
// Ensure symbol table is returned to the built-in level,
|
||||
// throwing away all but the built-ins.
|
||||
//
|
||||
while (! symbolTable.atSharedBuiltInLevel())
|
||||
symbolTable.pop();
|
||||
|
||||
FinalizePreprocessor();
|
||||
//
|
||||
// Throw away all the temporary memory used by the compilation process.
|
||||
//
|
||||
GlobalPoolAllocator.pop();
|
||||
|
||||
return success ? 1 : 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Do an actual link on the given compile objects.
|
||||
//
|
||||
// Return: The return value of is really boolean, indicating
|
||||
// success or failure.
|
||||
//
|
||||
int ShLink(
|
||||
const ShHandle linkHandle,
|
||||
const ShHandle compHandles[],
|
||||
const int numHandles,
|
||||
ShHandle uniformMapHandle,
|
||||
short int** uniformsAccessed,
|
||||
int* numUniformsAccessed)
|
||||
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = reinterpret_cast<TShHandleBase*>(linkHandle);
|
||||
TLinker* linker = static_cast<TLinker*>(base->getAsLinker());
|
||||
if (linker == 0)
|
||||
return 0;
|
||||
|
||||
int returnValue;
|
||||
GlobalPoolAllocator.push();
|
||||
returnValue = ShLinkExt(linkHandle, compHandles, numHandles);
|
||||
GlobalPoolAllocator.pop();
|
||||
|
||||
if (returnValue)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
//
|
||||
// This link method will be eventually used once the ICD supports the new linker interface
|
||||
//
|
||||
int ShLinkExt(
|
||||
const ShHandle linkHandle,
|
||||
const ShHandle compHandles[],
|
||||
const int numHandles)
|
||||
{
|
||||
if (linkHandle == 0 || numHandles == 0)
|
||||
return 0;
|
||||
|
||||
THandleList cObjects;
|
||||
|
||||
{// support MSVC++6.0
|
||||
for (int i = 0; i < numHandles; ++i) {
|
||||
if (compHandles[i] == 0)
|
||||
return 0;
|
||||
TShHandleBase* base = reinterpret_cast<TShHandleBase*>(compHandles[i]);
|
||||
if (base->getAsLinker()) {
|
||||
cObjects.push_back(base->getAsLinker());
|
||||
}
|
||||
if (base->getAsCompiler())
|
||||
cObjects.push_back(base->getAsCompiler());
|
||||
|
||||
|
||||
if (cObjects[i] == 0)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
TShHandleBase* base = reinterpret_cast<TShHandleBase*>(linkHandle);
|
||||
TLinker* linker = static_cast<TLinker*>(base->getAsLinker());
|
||||
|
||||
if (linker == 0)
|
||||
return 0;
|
||||
|
||||
linker->infoSink.info.erase();
|
||||
linker->infoSink.obj.erase();
|
||||
|
||||
{// support MSVC++6.0
|
||||
for (int i = 0; i < numHandles; ++i) {
|
||||
if (cObjects[i]->getAsCompiler()) {
|
||||
if (! cObjects[i]->getAsCompiler()->linkable()) {
|
||||
linker->infoSink.info.message(EPrefixError, "Not all shaders have valid object code.");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool ret = linker->link(cObjects);
|
||||
|
||||
return ret ? 1 : 0;
|
||||
}
|
||||
|
||||
//
|
||||
// ShSetEncrpytionMethod is a place-holder for specifying
|
||||
// how source code is encrypted.
|
||||
//
|
||||
void ShSetEncryptionMethod(ShHandle handle)
|
||||
{
|
||||
if (handle == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Return any compiler/linker/uniformmap log of messages for the application.
|
||||
//
|
||||
const char* ShGetInfoLog(const ShHandle handle)
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
if (handle == 0)
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = static_cast<TShHandleBase*>(handle);
|
||||
TInfoSink* infoSink;
|
||||
|
||||
if (base->getAsCompiler())
|
||||
infoSink = &(base->getAsCompiler()->getInfoSink());
|
||||
else if (base->getAsLinker())
|
||||
infoSink = &(base->getAsLinker()->getInfoSink());
|
||||
|
||||
infoSink->info << infoSink->debug.c_str();
|
||||
return infoSink->info.c_str();
|
||||
}
|
||||
|
||||
//
|
||||
// Return any unlinked object code.
|
||||
//
|
||||
const char* ShGetObjectCode(const ShHandle handle)
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
if (handle == 0)
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = static_cast<TShHandleBase*>(handle);
|
||||
TInfoSink* infoSink;
|
||||
|
||||
if (base->getAsCompiler())
|
||||
infoSink = &(base->getAsCompiler()->getInfoSink());
|
||||
|
||||
return infoSink->obj.c_str();
|
||||
}
|
||||
|
||||
//
|
||||
// Return the resulting binary code from the link process. Structure
|
||||
// is machine dependent.
|
||||
//
|
||||
const void* ShGetExecutable(const ShHandle handle)
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
if (handle == 0)
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
|
||||
|
||||
TLinker* linker = static_cast<TLinker*>(base->getAsLinker());
|
||||
if (linker == 0)
|
||||
return 0;
|
||||
|
||||
return linker->getObjectCode();
|
||||
}
|
||||
|
||||
//
|
||||
// Let the linker know where the application said it's attributes are bound.
|
||||
// The linker does not use these values, they are remapped by the ICD or
|
||||
// hardware. It just needs them to know what's aliased.
|
||||
//
|
||||
// Return: The return value of is really boolean, indicating
|
||||
// success or failure.
|
||||
//
|
||||
int ShSetVirtualAttributeBindings(const ShHandle handle, const ShBindingTable* table)
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
if (handle == 0)
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
|
||||
TLinker* linker = static_cast<TLinker*>(base->getAsLinker());
|
||||
|
||||
if (linker == 0)
|
||||
return 0;
|
||||
|
||||
linker->setAppAttributeBindings(table);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//
|
||||
// Let the linker know where the predefined attributes have to live.
|
||||
//
|
||||
int ShSetFixedAttributeBindings(const ShHandle handle, const ShBindingTable* table)
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
if (handle == 0)
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
|
||||
TLinker* linker = static_cast<TLinker*>(base->getAsLinker());
|
||||
|
||||
if (linker == 0)
|
||||
return 0;
|
||||
|
||||
linker->setFixedAttributeBindings(table);
|
||||
return 1;
|
||||
}
|
||||
|
||||
//
|
||||
// Some attribute locations are off-limits to the linker...
|
||||
//
|
||||
int ShExcludeAttributes(const ShHandle handle, int *attributes, int count)
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
if (handle == 0)
|
||||
return 0;
|
||||
|
||||
TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
|
||||
TLinker* linker = static_cast<TLinker*>(base->getAsLinker());
|
||||
if (linker == 0)
|
||||
return 0;
|
||||
|
||||
linker->setExcludedAttributes(attributes, count);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//
|
||||
// Return the index for OpenGL to use for knowing where a uniform lives.
|
||||
//
|
||||
// Return: The return value of is really boolean, indicating
|
||||
// success or failure.
|
||||
//
|
||||
int ShGetUniformLocation(const ShHandle handle, const char* name)
|
||||
{
|
||||
if (!InitThread())
|
||||
return 0;
|
||||
|
||||
if (handle == 0)
|
||||
return -1;
|
||||
|
||||
TShHandleBase* base = reinterpret_cast<TShHandleBase*>(handle);
|
||||
TUniformMap* uniformMap= base->getAsUniformMap();
|
||||
if (uniformMap == 0)
|
||||
return -1;
|
||||
|
||||
return uniformMap->getLocation(name);
|
||||
}
|
||||
|
|
@ -0,0 +1,179 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
#ifndef _COMPILER_INTERFACE_INCLUDED_
|
||||
#define _COMPILER_INTERFACE_INCLUDED_
|
||||
|
||||
#include "ResourceLimits.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#define C_DECL __cdecl
|
||||
#else
|
||||
#define __fastcall
|
||||
#define C_DECL
|
||||
#endif
|
||||
|
||||
//
|
||||
// This is the platform independent interface between an OGL driver
|
||||
// and the shading language compiler/linker.
|
||||
//
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
//
|
||||
// Driver must call this first, once, before doing any other
|
||||
// compiler/linker operations.
|
||||
//
|
||||
int ShInitialize();
|
||||
//
|
||||
// Driver should call this at shutdown.
|
||||
//
|
||||
int __fastcall ShFinalize();
|
||||
//
|
||||
// Types of languages the compiler can consume.
|
||||
//
|
||||
typedef enum {
|
||||
EShLangVertex,
|
||||
EShLangFragment,
|
||||
EShLangPack,
|
||||
EShLangUnpack,
|
||||
EShLangCount,
|
||||
} EShLanguage;
|
||||
|
||||
//
|
||||
// Types of output the linker will create.
|
||||
//
|
||||
typedef enum {
|
||||
EShExVertexFragment,
|
||||
EShExPackFragment,
|
||||
EShExUnpackFragment,
|
||||
EShExFragment
|
||||
} EShExecutable;
|
||||
|
||||
//
|
||||
// Optimization level for the compiler.
|
||||
//
|
||||
typedef enum {
|
||||
EShOptNoGeneration,
|
||||
EShOptNone,
|
||||
EShOptSimple, // Optimizations that can be done quickly
|
||||
EShOptFull, // Optimizations that will take more time
|
||||
} EShOptimizationLevel;
|
||||
|
||||
//
|
||||
// Build a table for bindings. This can be used for locating
|
||||
// attributes, uniforms, globals, etc., as needed.
|
||||
//
|
||||
typedef struct {
|
||||
const char* name;
|
||||
int binding;
|
||||
} ShBinding;
|
||||
|
||||
typedef struct {
|
||||
int numBindings;
|
||||
ShBinding* bindings; // array of bindings
|
||||
} ShBindingTable;
|
||||
|
||||
//
|
||||
// ShHandle held by but opaque to the driver. It is allocated,
|
||||
// managed, and de-allocated by the compiler/linker. It's contents
|
||||
// are defined by and used by the compiler and linker. For example,
|
||||
// symbol table information and object code passed from the compiler
|
||||
// to the linker can be stored where ShHandle points.
|
||||
//
|
||||
// If handle creation fails, 0 will be returned.
|
||||
//
|
||||
typedef void* ShHandle;
|
||||
|
||||
//
|
||||
// Driver calls these to create and destroy compiler/linker
|
||||
// objects.
|
||||
//
|
||||
ShHandle ShConstructCompiler(const EShLanguage, int debugOptions); // one per shader
|
||||
ShHandle ShConstructLinker(const EShExecutable, int debugOptions); // one per shader pair
|
||||
ShHandle ShConstructUniformMap(); // one per uniform namespace (currently entire program object)
|
||||
void ShDestruct(ShHandle);
|
||||
|
||||
//
|
||||
// The return value of ShCompile is boolean, indicating
|
||||
// success or failure.
|
||||
//
|
||||
// The info-log should be written by ShCompile into
|
||||
// ShHandle, so it can answer future queries.
|
||||
//
|
||||
int ShCompile(
|
||||
const ShHandle,
|
||||
const char* const shaderStrings[],
|
||||
const int numStrings,
|
||||
const EShOptimizationLevel,
|
||||
const TBuiltInResource *resources,
|
||||
int debugOptions
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// Similar to ShCompile, but accepts an opaque handle to an
|
||||
// intermediate language structure.
|
||||
//
|
||||
int ShCompileIntermediate(
|
||||
ShHandle compiler,
|
||||
ShHandle intermediate,
|
||||
const EShOptimizationLevel,
|
||||
int debuggable // boolean
|
||||
);
|
||||
|
||||
int ShLink(
|
||||
const ShHandle, // linker object
|
||||
const ShHandle h[], // compiler objects to link together
|
||||
const int numHandles,
|
||||
ShHandle uniformMap, // updated with new uniforms
|
||||
short int** uniformsAccessed, // returned with indexes of uniforms accessed
|
||||
int* numUniformsAccessed);
|
||||
|
||||
int ShLinkExt(
|
||||
const ShHandle, // linker object
|
||||
const ShHandle h[], // compiler objects to link together
|
||||
const int numHandles);
|
||||
|
||||
//
|
||||
// ShSetEncrpytionMethod is a place-holder for specifying
|
||||
// how source code is encrypted.
|
||||
//
|
||||
void ShSetEncryptionMethod(ShHandle);
|
||||
|
||||
//
|
||||
// All the following return 0 if the information is not
|
||||
// available in the object passed down, or the object is bad.
|
||||
//
|
||||
const char* ShGetInfoLog(const ShHandle);
|
||||
const char* ShGetObjectCode(const ShHandle);
|
||||
const void* ShGetExecutable(const ShHandle);
|
||||
int ShSetVirtualAttributeBindings(const ShHandle, const ShBindingTable*); // to detect user aliasing
|
||||
int ShSetFixedAttributeBindings(const ShHandle, const ShBindingTable*); // to force any physical mappings
|
||||
int ShGetPhysicalAttributeBindings(const ShHandle, const ShBindingTable**); // for all attributes
|
||||
//
|
||||
// Tell the linker to never assign a vertex attribute to this list of physical attributes
|
||||
//
|
||||
int ShExcludeAttributes(const ShHandle, int *attributes, int count);
|
||||
|
||||
//
|
||||
// Returns the location ID of the named uniform.
|
||||
// Returns -1 if error.
|
||||
//
|
||||
int ShGetUniformLocation(const ShHandle uniformMap, const char* name);
|
||||
|
||||
enum TDebugOptions {
|
||||
EDebugOpNone = 0x000,
|
||||
EDebugOpIntermediate = 0x001,
|
||||
EDebugOpAssembly = 0x002,
|
||||
EDebugOpObjectCode = 0x004,
|
||||
EDebugOpLinkMaps = 0x008
|
||||
};
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // _COMPILER_INTERFACE_INCLUDED_
|
|
@ -0,0 +1,211 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
//
|
||||
// Symbol table for parsing. Most functionaliy and main ideas
|
||||
// are documented in the header file.
|
||||
//
|
||||
|
||||
#include "SymbolTable.h"
|
||||
|
||||
//
|
||||
// TType helper function needs a place to live.
|
||||
//
|
||||
|
||||
//
|
||||
// Recursively generate mangled names.
|
||||
//
|
||||
void TType::buildMangledName(TString& mangledName)
|
||||
{
|
||||
if (isMatrix())
|
||||
mangledName += 'm';
|
||||
else if (isVector())
|
||||
mangledName += 'v';
|
||||
|
||||
switch (type) {
|
||||
case EbtFloat: mangledName += 'f'; break;
|
||||
case EbtInt: mangledName += 'i'; break;
|
||||
case EbtBool: mangledName += 'b'; break;
|
||||
case EbtSampler2D: mangledName += "s2"; break;
|
||||
case EbtSamplerCube: mangledName += "sC"; break;
|
||||
case EbtStruct:
|
||||
mangledName += "struct-";
|
||||
if (typeName)
|
||||
mangledName += *typeName;
|
||||
{// support MSVC++6.0
|
||||
for (unsigned int i = 0; i < structure->size(); ++i) {
|
||||
mangledName += '-';
|
||||
(*structure)[i].type->buildMangledName(mangledName);
|
||||
}
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
mangledName += static_cast<char>('0' + getNominalSize());
|
||||
if (isArray()) {
|
||||
char buf[10];
|
||||
sprintf(buf, "%d", arraySize);
|
||||
mangledName += '[';
|
||||
mangledName += buf;
|
||||
mangledName += ']';
|
||||
}
|
||||
}
|
||||
|
||||
int TType::getStructSize() const
|
||||
{
|
||||
if (!getStruct()) {
|
||||
assert(false && "Not a struct");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (structureSize == 0)
|
||||
for (TTypeList::iterator tl = getStruct()->begin(); tl != getStruct()->end(); tl++)
|
||||
structureSize += ((*tl).type)->getObjectSize();
|
||||
|
||||
return structureSize;
|
||||
}
|
||||
|
||||
//
|
||||
// Dump functions.
|
||||
//
|
||||
|
||||
void TVariable::dump(TInfoSink& infoSink) const
|
||||
{
|
||||
infoSink.debug << getName().c_str() << ": " << type.getQualifierString() << " " << type.getBasicString();
|
||||
if (type.isArray()) {
|
||||
infoSink.debug << "[0]";
|
||||
}
|
||||
infoSink.debug << "\n";
|
||||
}
|
||||
|
||||
void TFunction::dump(TInfoSink &infoSink) const
|
||||
{
|
||||
infoSink.debug << getName().c_str() << ": " << returnType.getBasicString() << " " << getMangledName().c_str() << "\n";
|
||||
}
|
||||
|
||||
void TSymbolTableLevel::dump(TInfoSink &infoSink) const
|
||||
{
|
||||
tLevel::const_iterator it;
|
||||
for (it = level.begin(); it != level.end(); ++it)
|
||||
(*it).second->dump(infoSink);
|
||||
}
|
||||
|
||||
void TSymbolTable::dump(TInfoSink &infoSink) const
|
||||
{
|
||||
for (int level = currentLevel(); level >= 0; --level) {
|
||||
infoSink.debug << "LEVEL " << level << "\n";
|
||||
table[level]->dump(infoSink);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Functions have buried pointers to delete.
|
||||
//
|
||||
TFunction::~TFunction()
|
||||
{
|
||||
for (TParamList::iterator i = parameters.begin(); i != parameters.end(); ++i)
|
||||
delete (*i).type;
|
||||
}
|
||||
|
||||
//
|
||||
// Symbol table levels are a map of pointers to symbols that have to be deleted.
|
||||
//
|
||||
TSymbolTableLevel::~TSymbolTableLevel()
|
||||
{
|
||||
for (tLevel::iterator it = level.begin(); it != level.end(); ++it)
|
||||
delete (*it).second;
|
||||
}
|
||||
|
||||
//
|
||||
// Change all function entries in the table with the non-mangled name
|
||||
// to be related to the provided built-in operation. This is a low
|
||||
// performance operation, and only intended for symbol tables that
|
||||
// live across a large number of compiles.
|
||||
//
|
||||
void TSymbolTableLevel::relateToOperator(const char* name, TOperator op)
|
||||
{
|
||||
tLevel::iterator it;
|
||||
for (it = level.begin(); it != level.end(); ++it) {
|
||||
if ((*it).second->isFunction()) {
|
||||
TFunction* function = static_cast<TFunction*>((*it).second);
|
||||
if (function->getName() == name)
|
||||
function->relateToOperator(op);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TSymbol::TSymbol(const TSymbol& copyOf)
|
||||
{
|
||||
name = NewPoolTString(copyOf.name->c_str());
|
||||
uniqueId = copyOf.uniqueId;
|
||||
}
|
||||
|
||||
TVariable::TVariable(const TVariable& copyOf, TStructureMap& remapper) : TSymbol(copyOf)
|
||||
{
|
||||
type.copyType(copyOf.type, remapper);
|
||||
userType = copyOf.userType;
|
||||
// for builtIn symbol table level, unionArray and arrayInformation pointers should be NULL
|
||||
assert(copyOf.arrayInformationType == 0);
|
||||
arrayInformationType = 0;
|
||||
|
||||
if (copyOf.unionArray) {
|
||||
assert(!copyOf.type.getStruct());
|
||||
assert(copyOf.type.getObjectSize() == 1);
|
||||
unionArray = new constUnion[1];
|
||||
unionArray[0] = copyOf.unionArray[0];
|
||||
} else
|
||||
unionArray = 0;
|
||||
}
|
||||
|
||||
TVariable* TVariable::clone(TStructureMap& remapper)
|
||||
{
|
||||
TVariable *variable = new TVariable(*this, remapper);
|
||||
|
||||
return variable;
|
||||
}
|
||||
|
||||
TFunction::TFunction(const TFunction& copyOf, TStructureMap& remapper) : TSymbol(copyOf)
|
||||
{
|
||||
for (unsigned int i = 0; i < copyOf.parameters.size(); ++i) {
|
||||
TParameter param;
|
||||
parameters.push_back(param);
|
||||
parameters.back().copyParam(copyOf.parameters[i], remapper);
|
||||
}
|
||||
|
||||
returnType.copyType(copyOf.returnType, remapper);
|
||||
mangledName = copyOf.mangledName;
|
||||
op = copyOf.op;
|
||||
defined = copyOf.defined;
|
||||
}
|
||||
|
||||
TFunction* TFunction::clone(TStructureMap& remapper)
|
||||
{
|
||||
TFunction *function = new TFunction(*this, remapper);
|
||||
|
||||
return function;
|
||||
}
|
||||
|
||||
TSymbolTableLevel* TSymbolTableLevel::clone(TStructureMap& remapper)
|
||||
{
|
||||
TSymbolTableLevel *symTableLevel = new TSymbolTableLevel();
|
||||
tLevel::iterator iter;
|
||||
for (iter = level.begin(); iter != level.end(); ++iter) {
|
||||
symTableLevel->insert(*iter->second->clone(remapper));
|
||||
}
|
||||
|
||||
return symTableLevel;
|
||||
}
|
||||
|
||||
void TSymbolTable::copyTable(const TSymbolTable& copyOf)
|
||||
{
|
||||
TStructureMap remapper;
|
||||
uniqueId = copyOf.uniqueId;
|
||||
for (unsigned int i = 0; i < copyOf.table.size(); ++i) {
|
||||
table.push_back(copyOf.table[i]->clone(remapper));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,300 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _SYMBOL_TABLE_INCLUDED_
|
||||
#define _SYMBOL_TABLE_INCLUDED_
|
||||
|
||||
//
|
||||
// Symbol table for parsing. Has these design characteristics:
|
||||
//
|
||||
// * Same symbol table can be used to compile many shaders, to preserve
|
||||
// effort of creating and loading with the large numbers of built-in
|
||||
// symbols.
|
||||
//
|
||||
// * Name mangling will be used to give each function a unique name
|
||||
// so that symbol table lookups are never ambiguous. This allows
|
||||
// a simpler symbol table structure.
|
||||
//
|
||||
// * Pushing and popping of scope, so symbol table will really be a stack
|
||||
// of symbol tables. Searched from the top, with new inserts going into
|
||||
// the top.
|
||||
//
|
||||
// * Constants: Compile time constant symbols will keep their values
|
||||
// in the symbol table. The parser can substitute constants at parse
|
||||
// time, including doing constant folding and constant propagation.
|
||||
//
|
||||
// * No temporaries: Temporaries made from operations (+, --, .xy, etc.)
|
||||
// are tracked in the intermediate representation, not the symbol table.
|
||||
//
|
||||
|
||||
#include "Common.h"
|
||||
#include "intermediate.h"
|
||||
#include "InfoSink.h"
|
||||
|
||||
//
|
||||
// Symbol base class. (Can build functions or variables out of these...)
|
||||
//
|
||||
class TSymbol {
|
||||
public:
|
||||
POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
|
||||
TSymbol(const TString *n) : name(n) { }
|
||||
virtual ~TSymbol() { /* don't delete name, it's from the pool */ }
|
||||
const TString& getName() const { return *name; }
|
||||
virtual const TString& getMangledName() const { return getName(); }
|
||||
virtual bool isFunction() const { return false; }
|
||||
virtual bool isVariable() const { return false; }
|
||||
void setUniqueId(int id) { uniqueId = id; }
|
||||
int getUniqueId() const { return uniqueId; }
|
||||
virtual void dump(TInfoSink &infoSink) const = 0;
|
||||
TSymbol(const TSymbol&);
|
||||
virtual TSymbol* clone(TStructureMap& remapper) = 0;
|
||||
|
||||
protected:
|
||||
const TString *name;
|
||||
unsigned int uniqueId; // For real comparing during code generation
|
||||
};
|
||||
|
||||
//
|
||||
// Variable class, meaning a symbol that's not a function.
|
||||
//
|
||||
// There could be a separate class heirarchy for Constant variables;
|
||||
// Only one of int, bool, or float, (or none) is correct for
|
||||
// any particular use, but it's easy to do this way, and doesn't
|
||||
// seem worth having separate classes, and "getConst" can't simply return
|
||||
// different values for different types polymorphically, so this is
|
||||
// just simple and pragmatic.
|
||||
//
|
||||
class TVariable : public TSymbol {
|
||||
public:
|
||||
TVariable(const TString *name, const TType& t, bool uT = false ) : TSymbol(name), type(t), userType(uT), unionArray(0), arrayInformationType(0) { }
|
||||
virtual ~TVariable() { }
|
||||
virtual bool isVariable() const { return true; }
|
||||
TType& getType() { return type; }
|
||||
const TType& getType() const { return type; }
|
||||
bool isUserType() const { return userType; }
|
||||
void changeQualifier(TQualifier qualifier) { type.changeQualifier(qualifier); }
|
||||
void updateArrayInformationType(TType *t) { arrayInformationType = t; }
|
||||
TType* getArrayInformationType() { return arrayInformationType; }
|
||||
|
||||
virtual void dump(TInfoSink &infoSink) const;
|
||||
|
||||
constUnion* getConstPointer() {
|
||||
if (!unionArray)
|
||||
unionArray = new constUnion[type.getObjectSize()];
|
||||
|
||||
return unionArray;
|
||||
}
|
||||
|
||||
constUnion* getConstPointer() const { return unionArray; }
|
||||
|
||||
void shareConstPointer( constUnion *constArray)
|
||||
{
|
||||
delete unionArray;
|
||||
unionArray = constArray;
|
||||
}
|
||||
TVariable(const TVariable&, TStructureMap& remapper); // copy constructor
|
||||
virtual TVariable* clone(TStructureMap& remapper);
|
||||
|
||||
protected:
|
||||
TType type;
|
||||
bool userType;
|
||||
// we are assuming that Pool Allocator will free the memory allocated to unionArray
|
||||
// when this object is destroyed
|
||||
constUnion *unionArray;
|
||||
TType *arrayInformationType; // this is used for updating maxArraySize in all the references to a given symbol
|
||||
};
|
||||
|
||||
//
|
||||
// The function sub-class of symbols and the parser will need to
|
||||
// share this definition of a function parameter.
|
||||
//
|
||||
struct TParameter {
|
||||
TString *name;
|
||||
TType* type;
|
||||
void copyParam(const TParameter& param, TStructureMap& remapper) {
|
||||
name = NewPoolTString(param.name->c_str());
|
||||
type = param.type->clone(remapper);
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// The function sub-class of a symbol.
|
||||
//
|
||||
class TFunction : public TSymbol {
|
||||
public:
|
||||
TFunction(TOperator o) :
|
||||
TSymbol(0),
|
||||
returnType(TType(EbtVoid)),
|
||||
op(o),
|
||||
defined(false) { }
|
||||
TFunction(const TString *name, TType& retType, TOperator tOp = EOpNull) :
|
||||
TSymbol(name),
|
||||
returnType(retType),
|
||||
mangledName(*name + '('),
|
||||
op(tOp),
|
||||
defined(false) { }
|
||||
virtual ~TFunction();
|
||||
virtual bool isFunction() const { return true; }
|
||||
|
||||
void addParameter(TParameter& p)
|
||||
{
|
||||
parameters.push_back(p);
|
||||
mangledName = mangledName + p.type->getMangledName();
|
||||
}
|
||||
|
||||
const TString& getMangledName() const { return mangledName; }
|
||||
const TType& getReturnType() const { return returnType; }
|
||||
void relateToOperator(TOperator o) { op = o; }
|
||||
TOperator getBuiltInOp() const { return op; }
|
||||
void setDefined() { defined = true; }
|
||||
bool isDefined() { return defined; }
|
||||
|
||||
int getParamCount() const { return static_cast<int>(parameters.size()); }
|
||||
TParameter& operator [](int i) { return parameters[i]; }
|
||||
const TParameter& operator [](int i) const { return parameters[i]; }
|
||||
|
||||
virtual void dump(TInfoSink &infoSink) const;
|
||||
TFunction(const TFunction&, TStructureMap& remapper);
|
||||
virtual TFunction* clone(TStructureMap& remapper);
|
||||
|
||||
protected:
|
||||
typedef TVector<TParameter> TParamList;
|
||||
TParamList parameters;
|
||||
TType returnType;
|
||||
TString mangledName;
|
||||
TOperator op;
|
||||
bool defined;
|
||||
};
|
||||
|
||||
|
||||
class TSymbolTableLevel {
|
||||
public:
|
||||
typedef std::map<TString, TSymbol*, std::less<TString>, pool_allocator<std::pair<const TString, TSymbol*> > > tLevel;
|
||||
typedef tLevel::const_iterator const_iterator;
|
||||
typedef const tLevel::value_type tLevelPair;
|
||||
typedef std::pair<tLevel::iterator, bool> tInsertResult;
|
||||
|
||||
POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
|
||||
TSymbolTableLevel() { }
|
||||
~TSymbolTableLevel();
|
||||
|
||||
bool insert(TSymbol& symbol)
|
||||
{
|
||||
//
|
||||
// returning true means symbol was added to the table
|
||||
//
|
||||
tInsertResult result;
|
||||
result = level.insert(tLevelPair(symbol.getMangledName(), &symbol));
|
||||
|
||||
return result.second;
|
||||
}
|
||||
|
||||
TSymbol* find(const TString& name) const
|
||||
{
|
||||
tLevel::const_iterator it = level.find(name);
|
||||
if (it == level.end())
|
||||
return 0;
|
||||
else
|
||||
return (*it).second;
|
||||
}
|
||||
|
||||
const_iterator begin() const
|
||||
{
|
||||
return level.begin();
|
||||
}
|
||||
|
||||
const_iterator end() const
|
||||
{
|
||||
return level.end();
|
||||
}
|
||||
|
||||
void relateToOperator(const char* name, TOperator op);
|
||||
void dump(TInfoSink &infoSink) const;
|
||||
TSymbolTableLevel* clone(TStructureMap& remapper);
|
||||
|
||||
protected:
|
||||
tLevel level;
|
||||
};
|
||||
|
||||
class TSymbolTable {
|
||||
public:
|
||||
TSymbolTable() : uniqueId(0)
|
||||
{
|
||||
//
|
||||
// The symbol table cannot be used until push() is called, but
|
||||
// the lack of an initial call to push() can be used to detect
|
||||
// that the symbol table has not been preloaded with built-ins.
|
||||
//
|
||||
}
|
||||
|
||||
TSymbolTable(TSymbolTable& symTable)
|
||||
{
|
||||
table.push_back(symTable.table[0]);
|
||||
uniqueId = symTable.uniqueId;
|
||||
}
|
||||
|
||||
~TSymbolTable()
|
||||
{
|
||||
// level 0 is always built In symbols, so we never pop that out
|
||||
while (table.size() > 1)
|
||||
pop();
|
||||
}
|
||||
|
||||
//
|
||||
// When the symbol table is initialized with the built-ins, there should
|
||||
// 'push' calls, so that built-ins are at level 0 and the shader
|
||||
// globals are at level 1.
|
||||
//
|
||||
bool isEmpty() { return table.size() == 0; }
|
||||
bool atBuiltInLevel() { return atSharedBuiltInLevel() || atDynamicBuiltInLevel(); }
|
||||
bool atSharedBuiltInLevel() { return table.size() == 1; }
|
||||
bool atGlobalLevel() { return table.size() <= 3; }
|
||||
void push() {
|
||||
table.push_back(new TSymbolTableLevel);
|
||||
}
|
||||
|
||||
void pop() {
|
||||
delete table[currentLevel()];
|
||||
table.pop_back();
|
||||
}
|
||||
|
||||
bool insert(TSymbol& symbol)
|
||||
{
|
||||
symbol.setUniqueId(++uniqueId);
|
||||
return table[currentLevel()]->insert(symbol);
|
||||
}
|
||||
|
||||
TSymbol* find(const TString& name, bool* builtIn = 0, bool *sameScope = 0)
|
||||
{
|
||||
int level = currentLevel();
|
||||
TSymbol* symbol;
|
||||
do {
|
||||
symbol = table[level]->find(name);
|
||||
--level;
|
||||
} while (symbol == 0 && level >= 0);
|
||||
level++;
|
||||
if (builtIn)
|
||||
*builtIn = level == 0;
|
||||
if (sameScope)
|
||||
*sameScope = level == currentLevel();
|
||||
return symbol;
|
||||
}
|
||||
|
||||
TSymbolTableLevel* getGlobalLevel() { assert(table.size() >= 3); return table[2]; }
|
||||
void relateToOperator(const char* name, TOperator op) { table[0]->relateToOperator(name, op); }
|
||||
int getMaxSymbolId() { return uniqueId; }
|
||||
void dump(TInfoSink &infoSink) const;
|
||||
void copyTable(const TSymbolTable& copyOf);
|
||||
|
||||
protected:
|
||||
int currentLevel() const { return static_cast<int>(table.size()) - 1; }
|
||||
bool atDynamicBuiltInLevel() { return table.size() == 2; }
|
||||
|
||||
std::vector<TSymbolTableLevel*> table;
|
||||
int uniqueId; // for unique identification in code generation
|
||||
};
|
||||
|
||||
#endif // _SYMBOL_TABLE_INCLUDED_
|
Двоичный файл не отображается.
|
@ -0,0 +1,334 @@
|
|||
|
||||
extern int timeclock;
|
||||
|
||||
|
||||
int yyerror; /* Yyerror and yycost are set by guards. */
|
||||
int yycost; /* If yyerror is set to a nonzero value by a */
|
||||
/* guard, the reduction with which the guard */
|
||||
/* is associated is not performed, and the */
|
||||
/* error recovery mechanism is invoked. */
|
||||
/* Yycost indicates the cost of performing */
|
||||
/* the reduction given the attributes of the */
|
||||
/* symbols. */
|
||||
|
||||
|
||||
/* YYMAXDEPTH indicates the size of the parser's state and value */
|
||||
/* stacks. */
|
||||
|
||||
#ifndef YYMAXDEPTH
|
||||
#define YYMAXDEPTH 500
|
||||
#endif
|
||||
|
||||
/* YYMAXRULES must be at least as large as the number of rules that */
|
||||
/* could be placed in the rule queue. That number could be determined */
|
||||
/* from the grammar and the size of the stack, but, as yet, it is not. */
|
||||
|
||||
#ifndef YYMAXRULES
|
||||
#define YYMAXRULES 100
|
||||
#endif
|
||||
|
||||
#ifndef YYMAXBACKUP
|
||||
#define YYMAXBACKUP 100
|
||||
#endif
|
||||
|
||||
|
||||
short yyss[YYMAXDEPTH]; /* the state stack */
|
||||
YYSTYPE yyvs[YYMAXDEPTH]; /* the semantic value stack */
|
||||
YYLTYPE yyls[YYMAXDEPTH]; /* the location stack */
|
||||
short yyrq[YYMAXRULES]; /* the rule queue */
|
||||
int yychar; /* the lookahead symbol */
|
||||
|
||||
YYSTYPE yylval; /* the semantic value of the */
|
||||
/* lookahead symbol */
|
||||
|
||||
YYSTYPE yytval; /* the semantic value for the state */
|
||||
/* at the top of the state stack. */
|
||||
|
||||
YYSTYPE yyval; /* the variable used to return */
|
||||
/* semantic values from the action */
|
||||
/* routines */
|
||||
|
||||
YYLTYPE yylloc; /* location data for the lookahead */
|
||||
/* symbol */
|
||||
|
||||
YYLTYPE yytloc; /* location data for the state at the */
|
||||
/* top of the state stack */
|
||||
|
||||
|
||||
int yynunlexed;
|
||||
short yyunchar[YYMAXBACKUP];
|
||||
YYSTYPE yyunval[YYMAXBACKUP];
|
||||
YYLTYPE yyunloc[YYMAXBACKUP];
|
||||
|
||||
short *yygssp; /* a pointer to the top of the state */
|
||||
/* stack; only set during error */
|
||||
/* recovery. */
|
||||
|
||||
YYSTYPE *yygvsp; /* a pointer to the top of the value */
|
||||
/* stack; only set during error */
|
||||
/* recovery. */
|
||||
|
||||
YYLTYPE *yyglsp; /* a pointer to the top of the */
|
||||
/* location stack; only set during */
|
||||
/* error recovery. */
|
||||
|
||||
|
||||
/* Yyget is an interface between the parser and the lexical analyzer. */
|
||||
/* It is costly to provide such an interface, but it avoids requiring */
|
||||
/* the lexical analyzer to be able to back up the scan. */
|
||||
|
||||
yyget()
|
||||
{
|
||||
if (yynunlexed > 0)
|
||||
{
|
||||
yynunlexed--;
|
||||
yychar = yyunchar[yynunlexed];
|
||||
yylval = yyunval[yynunlexed];
|
||||
yylloc = yyunloc[yynunlexed];
|
||||
}
|
||||
else if (yychar <= 0)
|
||||
yychar = 0;
|
||||
else
|
||||
{
|
||||
yychar = yylex();
|
||||
if (yychar < 0)
|
||||
yychar = 0;
|
||||
else yychar = YYTRANSLATE(yychar);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
yyunlex(chr, val, loc)
|
||||
int chr;
|
||||
YYSTYPE val;
|
||||
YYLTYPE loc;
|
||||
{
|
||||
yyunchar[yynunlexed] = chr;
|
||||
yyunval[yynunlexed] = val;
|
||||
yyunloc[yynunlexed] = loc;
|
||||
yynunlexed++;
|
||||
}
|
||||
|
||||
|
||||
|
||||
yyrestore(first, last)
|
||||
register short *first;
|
||||
register short *last;
|
||||
{
|
||||
register short *ssp;
|
||||
register short *rp;
|
||||
register int symbol;
|
||||
register int state;
|
||||
register int tvalsaved;
|
||||
|
||||
ssp = yygssp;
|
||||
yyunlex(yychar, yylval, yylloc);
|
||||
|
||||
tvalsaved = 0;
|
||||
while (first != last)
|
||||
{
|
||||
symbol = yystos[*ssp];
|
||||
if (symbol < YYNTBASE)
|
||||
{
|
||||
yyunlex(symbol, yytval, yytloc);
|
||||
tvalsaved = 1;
|
||||
ssp--;
|
||||
}
|
||||
|
||||
ssp--;
|
||||
|
||||
if (first == yyrq)
|
||||
first = yyrq + YYMAXRULES;
|
||||
|
||||
first--;
|
||||
|
||||
for (rp = yyrhs + yyprhs[*first]; symbol = *rp; rp++)
|
||||
{
|
||||
if (symbol < YYNTBASE)
|
||||
state = yytable[yypact[*ssp] + symbol];
|
||||
else
|
||||
{
|
||||
state = yypgoto[symbol - YYNTBASE] + *ssp;
|
||||
|
||||
if (state >= 0 && state <= YYLAST && yycheck[state] == *ssp)
|
||||
state = yytable[state];
|
||||
else
|
||||
state = yydefgoto[symbol - YYNTBASE];
|
||||
}
|
||||
|
||||
*++ssp = state;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! tvalsaved && ssp > yyss)
|
||||
{
|
||||
yyunlex(yystos[*ssp], yytval, yytloc);
|
||||
ssp--;
|
||||
}
|
||||
|
||||
yygssp = ssp;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int
|
||||
yyparse()
|
||||
{
|
||||
register int yystate;
|
||||
register int yyn;
|
||||
register short *yyssp;
|
||||
register short *yyrq0;
|
||||
register short *yyptr;
|
||||
register YYSTYPE *yyvsp;
|
||||
|
||||
int yylen;
|
||||
YYLTYPE *yylsp;
|
||||
short *yyrq1;
|
||||
short *yyrq2;
|
||||
|
||||
yystate = 0;
|
||||
yyssp = yyss - 1;
|
||||
yyvsp = yyvs - 1;
|
||||
yylsp = yyls - 1;
|
||||
yyrq0 = yyrq;
|
||||
yyrq1 = yyrq0;
|
||||
yyrq2 = yyrq0;
|
||||
|
||||
yychar = yylex();
|
||||
if (yychar < 0)
|
||||
yychar = 0;
|
||||
else yychar = YYTRANSLATE(yychar);
|
||||
|
||||
yynewstate:
|
||||
|
||||
if (yyssp >= yyss + YYMAXDEPTH - 1)
|
||||
{
|
||||
yyabort("Parser Stack Overflow");
|
||||
YYABORT;
|
||||
}
|
||||
|
||||
*++yyssp = yystate;
|
||||
|
||||
yyresume:
|
||||
|
||||
yyn = yypact[yystate];
|
||||
if (yyn == YYFLAG)
|
||||
goto yydefault;
|
||||
|
||||
yyn += yychar;
|
||||
if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar)
|
||||
goto yydefault;
|
||||
|
||||
yyn = yytable[yyn];
|
||||
if (yyn < 0)
|
||||
{
|
||||
yyn = -yyn;
|
||||
goto yyreduce;
|
||||
}
|
||||
else if (yyn == 0)
|
||||
goto yyerrlab;
|
||||
|
||||
yystate = yyn;
|
||||
|
||||
yyptr = yyrq2;
|
||||
while (yyptr != yyrq1)
|
||||
{
|
||||
yyn = *yyptr++;
|
||||
yylen = yyr2[yyn];
|
||||
yyvsp -= yylen;
|
||||
yylsp -= yylen;
|
||||
|
||||
yyguard(yyn, yyvsp, yylsp);
|
||||
if (yyerror)
|
||||
goto yysemerr;
|
||||
|
||||
yyaction(yyn, yyvsp, yylsp);
|
||||
*++yyvsp = yyval;
|
||||
|
||||
yylsp++;
|
||||
if (yylen == 0)
|
||||
{
|
||||
yylsp->timestamp = timeclock;
|
||||
yylsp->first_line = yytloc.first_line;
|
||||
yylsp->first_column = yytloc.first_column;
|
||||
yylsp->last_line = (yylsp-1)->last_line;
|
||||
yylsp->last_column = (yylsp-1)->last_column;
|
||||
yylsp->text = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
yylsp->last_line = (yylsp+yylen-1)->last_line;
|
||||
yylsp->last_column = (yylsp+yylen-1)->last_column;
|
||||
}
|
||||
|
||||
if (yyptr == yyrq + YYMAXRULES)
|
||||
yyptr = yyrq;
|
||||
}
|
||||
|
||||
if (yystate == YYFINAL)
|
||||
YYACCEPT;
|
||||
|
||||
yyrq2 = yyptr;
|
||||
yyrq1 = yyrq0;
|
||||
|
||||
*++yyvsp = yytval;
|
||||
*++yylsp = yytloc;
|
||||
yytval = yylval;
|
||||
yytloc = yylloc;
|
||||
yyget();
|
||||
|
||||
goto yynewstate;
|
||||
|
||||
yydefault:
|
||||
|
||||
yyn = yydefact[yystate];
|
||||
if (yyn == 0)
|
||||
goto yyerrlab;
|
||||
|
||||
yyreduce:
|
||||
|
||||
*yyrq0++ = yyn;
|
||||
|
||||
if (yyrq0 == yyrq + YYMAXRULES)
|
||||
yyrq0 = yyrq;
|
||||
|
||||
if (yyrq0 == yyrq2)
|
||||
{
|
||||
yyabort("Parser Rule Queue Overflow");
|
||||
YYABORT;
|
||||
}
|
||||
|
||||
yyssp -= yyr2[yyn];
|
||||
yyn = yyr1[yyn];
|
||||
|
||||
yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
|
||||
if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
|
||||
yystate = yytable[yystate];
|
||||
else
|
||||
yystate = yydefgoto[yyn - YYNTBASE];
|
||||
|
||||
goto yynewstate;
|
||||
|
||||
yysemerr:
|
||||
*--yyptr = yyn;
|
||||
yyrq2 = yyptr;
|
||||
yyvsp += yyr2[yyn];
|
||||
|
||||
yyerrlab:
|
||||
|
||||
yygssp = yyssp;
|
||||
yygvsp = yyvsp;
|
||||
yyglsp = yylsp;
|
||||
yyrestore(yyrq0, yyrq2);
|
||||
yyrecover();
|
||||
yystate = *yygssp;
|
||||
yyssp = yygssp;
|
||||
yyvsp = yygvsp;
|
||||
yyrq0 = yyrq;
|
||||
yyrq1 = yyrq0;
|
||||
yyrq2 = yyrq0;
|
||||
goto yyresume;
|
||||
}
|
||||
|
||||
$
|
|
@ -0,0 +1,699 @@
|
|||
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
|
||||
|
||||
/* Skeleton output parser for bison,
|
||||
Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* As a special exception, when this file is copied by Bison into a
|
||||
Bison output file, you may use that output file without restriction.
|
||||
This special exception was added by the Free Software Foundation
|
||||
in version 1.24 of Bison. */
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define alloca __builtin_alloca
|
||||
#else /* not __GNUC__ */
|
||||
#if HAVE_ALLOCA_H
|
||||
#include <alloca.h>
|
||||
#else /* not HAVE_ALLOCA_H */
|
||||
#ifdef _AIX
|
||||
#pragma alloca
|
||||
#else /* not _AIX */
|
||||
char *alloca ();
|
||||
#endif /* not _AIX */
|
||||
#endif /* not HAVE_ALLOCA_H */
|
||||
#endif /* not __GNUC__ */
|
||||
|
||||
extern void yyerror(char* s);
|
||||
|
||||
#ifndef alloca
|
||||
#ifdef __GNUC__
|
||||
#define alloca __builtin_alloca
|
||||
#else /* not GNU C. */
|
||||
#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
|
||||
#include <alloca.h>
|
||||
#else /* not sparc */
|
||||
#if (defined (MSDOS) && !defined (__TURBOC__)) || defined (WIN32)
|
||||
#include <malloc.h>
|
||||
#else /* not MSDOS, or __TURBOC__ */
|
||||
#if defined(_AIX)
|
||||
#include <malloc.h>
|
||||
#pragma alloca
|
||||
#else /* not MSDOS, __TURBOC__, or _AIX */
|
||||
#ifdef __hpux
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
void *alloca (unsigned int);
|
||||
};
|
||||
#else /* not __cplusplus */
|
||||
void *alloca ();
|
||||
#endif /* not __cplusplus */
|
||||
#endif /* __hpux */
|
||||
#endif /* not _AIX */
|
||||
#endif /* not MSDOS, or __TURBOC__ */
|
||||
#endif /* not sparc. */
|
||||
#endif /* not GNU C. */
|
||||
#endif /* alloca not defined. */
|
||||
|
||||
/* This is the parser code that is written into each bison parser
|
||||
when the %semantic_parser declaration is not specified in the grammar.
|
||||
It was written by Richard Stallman by simplifying the hairy parser
|
||||
used when %semantic_parser is specified. */
|
||||
|
||||
/* Note: there must be only one dollar sign in this file.
|
||||
It is replaced by the list of actions, each action
|
||||
as one case of the switch. */
|
||||
|
||||
#define yyerrok (yyerrstatus = 0)
|
||||
#define yyclearin (yychar = YYEMPTY)
|
||||
#define YYEMPTY -2
|
||||
#define YYEOF 0
|
||||
#define YYACCEPT return(0)
|
||||
#define YYABORT return(1)
|
||||
#define YYERROR goto yyerrlab1
|
||||
/* Like YYERROR except do call yyerror.
|
||||
This remains here temporarily to ease the
|
||||
transition to the new meaning of YYERROR, for GCC.
|
||||
Once GCC version 2 has supplanted version 1, this can go. */
|
||||
#define YYFAIL goto yyerrlab
|
||||
#define YYRECOVERING() (!!yyerrstatus)
|
||||
#define YYBACKUP(token, value) \
|
||||
do \
|
||||
if (yychar == YYEMPTY && yylen == 1) \
|
||||
{ yychar = (token), yylval = (value); \
|
||||
yychar1 = YYTRANSLATE (yychar); \
|
||||
YYPOPSTACK; \
|
||||
goto yybackup; \
|
||||
} \
|
||||
else \
|
||||
{ yyerror ("syntax error: cannot back up"); YYERROR; } \
|
||||
while (0)
|
||||
|
||||
#define YYTERROR 1
|
||||
#define YYERRCODE 256
|
||||
|
||||
#ifndef YYPURE
|
||||
#define YYLEX yylex()
|
||||
#endif
|
||||
|
||||
#ifdef YYPURE
|
||||
#ifdef YYLSP_NEEDED
|
||||
#ifdef YYLEX_PARAM
|
||||
#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM)
|
||||
#else
|
||||
#define YYLEX yylex(&yylval, &yylloc)
|
||||
#endif
|
||||
#else /* not YYLSP_NEEDED */
|
||||
#ifdef YYLEX_PARAM
|
||||
#define YYLEX yylex(&yylval, YYLEX_PARAM)
|
||||
#else
|
||||
#define YYLEX yylex(&yylval)
|
||||
#endif
|
||||
#endif /* not YYLSP_NEEDED */
|
||||
#endif
|
||||
|
||||
/* If nonreentrant, generate the variables here */
|
||||
|
||||
#ifndef YYPURE
|
||||
|
||||
int yychar; /* the lookahead symbol */
|
||||
YYSTYPE yylval; /* the semantic value of the */
|
||||
/* lookahead symbol */
|
||||
|
||||
#ifdef YYLSP_NEEDED
|
||||
YYLTYPE yylloc; /* location data for the lookahead */
|
||||
/* symbol */
|
||||
#endif
|
||||
|
||||
int yynerrs; /* number of parse errors so far */
|
||||
#endif /* not YYPURE */
|
||||
|
||||
#if YYDEBUG != 0
|
||||
int yydebug; /* nonzero means print parse trace */
|
||||
/* Since this is uninitialized, it does not stop multiple parsers
|
||||
from coexisting. */
|
||||
#endif
|
||||
|
||||
/* YYINITDEPTH indicates the initial size of the parser's stacks */
|
||||
|
||||
#ifndef YYINITDEPTH
|
||||
#define YYINITDEPTH 200
|
||||
#endif
|
||||
|
||||
/* YYMAXDEPTH is the maximum size the stacks can grow to
|
||||
(effective only if the built-in stack extension method is used). */
|
||||
|
||||
#if YYMAXDEPTH == 0
|
||||
#undef YYMAXDEPTH
|
||||
#endif
|
||||
|
||||
#ifndef YYMAXDEPTH
|
||||
#define YYMAXDEPTH 10000
|
||||
#endif
|
||||
|
||||
/* Prevent warning if -Wstrict-prototypes. */
|
||||
#ifdef __GNUC__
|
||||
int yyparse (void);
|
||||
#endif
|
||||
|
||||
#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
|
||||
#define __yy_memcpy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT)
|
||||
#else /* not GNU C or C++ */
|
||||
#ifndef __cplusplus
|
||||
|
||||
/* This is the most reliable way to avoid incompatibilities
|
||||
in available built-in functions on various systems. */
|
||||
static void
|
||||
__yy_memcpy (from, to, count)
|
||||
char *from;
|
||||
char *to;
|
||||
size_t count;
|
||||
{
|
||||
register char *f = from;
|
||||
register char *t = to;
|
||||
register size_t i = count;
|
||||
|
||||
while (i-- > 0)
|
||||
*t++ = *f++;
|
||||
}
|
||||
|
||||
#else /* __cplusplus */
|
||||
|
||||
/* This is the most reliable way to avoid incompatibilities
|
||||
in available built-in functions on various systems. */
|
||||
static void
|
||||
__yy_memcpy (char *from, char *to, size_t count)
|
||||
{
|
||||
register char *f = from;
|
||||
register char *t = to;
|
||||
register size_t i = count;
|
||||
|
||||
while (i-- > 0)
|
||||
*t++ = *f++;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* The user can define YYPARSE_PARAM as the name of an argument to be passed
|
||||
into yyparse. The argument should have type void *.
|
||||
It should actually point to an object.
|
||||
Grammar actions can access the variable by casting it
|
||||
to the proper pointer type. */
|
||||
|
||||
#ifdef YYPARSE_PARAM
|
||||
#ifndef YYPARSE_PARAM_DECL
|
||||
#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
|
||||
#endif
|
||||
#else
|
||||
#define YYPARSE_PARAM
|
||||
#define YYPARSE_PARAM_DECL
|
||||
#endif
|
||||
|
||||
extern YY_DECL;
|
||||
|
||||
int
|
||||
yyparse(YYPARSE_PARAM_DECL YYPARSE_PARAM) {
|
||||
register int yystate;
|
||||
register int yyn;
|
||||
register short *yyssp;
|
||||
register YYSTYPE *yyvsp;
|
||||
int yyerrstatus; /* number of tokens to shift before error messages enabled */
|
||||
int yychar1 = 0; /* lookahead token as an internal (translated) token number */
|
||||
|
||||
short yyssa[YYINITDEPTH]; /* the state stack */
|
||||
YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */
|
||||
|
||||
short *yyss = yyssa; /* refer to the stacks thru separate pointers */
|
||||
YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */
|
||||
|
||||
#ifdef YYLSP_NEEDED
|
||||
YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */
|
||||
YYLTYPE *yyls = yylsa;
|
||||
YYLTYPE *yylsp;
|
||||
|
||||
#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
|
||||
#else
|
||||
#define YYPOPSTACK (yyvsp--, yyssp--)
|
||||
#endif
|
||||
|
||||
size_t yystacksize = YYINITDEPTH;
|
||||
|
||||
#ifdef YYPURE
|
||||
int yychar;
|
||||
YYSTYPE yylval;
|
||||
int yynerrs;
|
||||
#ifdef YYLSP_NEEDED
|
||||
YYLTYPE yylloc;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
YYSTYPE yyval; /* the variable used to return */
|
||||
/* semantic values from the action */
|
||||
/* routines */
|
||||
|
||||
int yylen;
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
fprintf(stderr, "Starting parse\n");
|
||||
#endif
|
||||
|
||||
yystate = 0;
|
||||
yyerrstatus = 0;
|
||||
yynerrs = 0;
|
||||
yychar = YYEMPTY; /* Cause a token to be read. */
|
||||
|
||||
/* Initialize stack pointers.
|
||||
Waste one element of value and location stack
|
||||
so that they stay on the same level as the state stack.
|
||||
The wasted elements are never initialized. */
|
||||
|
||||
yyssp = yyss - 1;
|
||||
yyvsp = yyvs;
|
||||
#ifdef YYLSP_NEEDED
|
||||
yylsp = yyls;
|
||||
#endif
|
||||
|
||||
/* Push a new state, which is found in yystate . */
|
||||
/* In all cases, when you get here, the value and location stacks
|
||||
have just been pushed. so pushing a state here evens the stacks. */
|
||||
yynewstate:
|
||||
|
||||
*++yyssp = yystate;
|
||||
|
||||
if (yyssp >= yyss + yystacksize - 1)
|
||||
{
|
||||
/* Give user a chance to reallocate the stack */
|
||||
/* Use copies of these so that the &'s don't force the real ones into memory. */
|
||||
YYSTYPE *yyvs1 = yyvs;
|
||||
short *yyss1 = yyss;
|
||||
#ifdef YYLSP_NEEDED
|
||||
YYLTYPE *yyls1 = yyls;
|
||||
#endif
|
||||
|
||||
/* Get the current used size of the three stacks, in elements. */
|
||||
size_t size = yyssp - yyss + 1;
|
||||
|
||||
#ifdef yyoverflow
|
||||
/* Each stack pointer address is followed by the size of
|
||||
the data in use in that stack, in bytes. */
|
||||
#ifdef YYLSP_NEEDED
|
||||
/* This used to be a conditional around just the two extra args,
|
||||
but that might be undefined if yyoverflow is a macro. */
|
||||
yyoverflow("parser stack overflow",
|
||||
&yyss1, size * sizeof (*yyssp),
|
||||
&yyvs1, size * sizeof (*yyvsp),
|
||||
&yyls1, size * sizeof (*yylsp),
|
||||
&yystacksize);
|
||||
#else
|
||||
yyoverflow("parser stack overflow",
|
||||
&yyss1, size * sizeof (*yyssp),
|
||||
&yyvs1, size * sizeof (*yyvsp),
|
||||
&yystacksize);
|
||||
#endif
|
||||
|
||||
yyss = yyss1; yyvs = yyvs1;
|
||||
#ifdef YYLSP_NEEDED
|
||||
yyls = yyls1;
|
||||
#endif
|
||||
#else /* no yyoverflow */
|
||||
/* Extend the stack our own way. */
|
||||
if (yystacksize >= YYMAXDEPTH)
|
||||
{
|
||||
yyerror("parser stack overflow");
|
||||
return 2;
|
||||
}
|
||||
yystacksize *= 2;
|
||||
if (yystacksize > YYMAXDEPTH)
|
||||
yystacksize = YYMAXDEPTH;
|
||||
yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
|
||||
__yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
|
||||
yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
|
||||
__yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
|
||||
#ifdef YYLSP_NEEDED
|
||||
yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
|
||||
__yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
|
||||
#endif
|
||||
#endif /* no yyoverflow */
|
||||
|
||||
yyssp = yyss + size - 1;
|
||||
yyvsp = yyvs + size - 1;
|
||||
#ifdef YYLSP_NEEDED
|
||||
yylsp = yyls + size - 1;
|
||||
#endif
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
fprintf(stderr, "Stack size increased to %d\n", yystacksize);
|
||||
#endif
|
||||
|
||||
if (yyssp >= yyss + yystacksize - 1)
|
||||
YYABORT;
|
||||
}
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
fprintf(stderr, "Entering state %d\n", yystate);
|
||||
#endif
|
||||
|
||||
goto yybackup;
|
||||
yybackup:
|
||||
|
||||
/* Do appropriate processing given the current state. */
|
||||
/* Read a lookahead token if we need one and don't already have one. */
|
||||
/* yyresume: */
|
||||
|
||||
/* First try to decide what to do without reference to lookahead token. */
|
||||
|
||||
yyn = yypact[yystate];
|
||||
if (yyn == YYFLAG)
|
||||
goto yydefault;
|
||||
|
||||
/* Not known => get a lookahead token if don't already have one. */
|
||||
|
||||
/* yychar is either YYEMPTY or YYEOF
|
||||
or a valid token in external form. */
|
||||
|
||||
if (yychar == YYEMPTY)
|
||||
{
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
fprintf(stderr, "Reading a token: ");
|
||||
#endif
|
||||
yychar = YYLEX;
|
||||
}
|
||||
|
||||
/* Convert token to internal form (in yychar1) for indexing tables with */
|
||||
|
||||
if (yychar <= 0) /* This means end of input. */
|
||||
{
|
||||
yychar1 = 0;
|
||||
yychar = YYEOF; /* Don't call YYLEX any more */
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
fprintf(stderr, "Now at end of input.\n");
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
yychar1 = YYTRANSLATE(yychar);
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
{
|
||||
fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
|
||||
/* Give the individual parser a way to print the precise meaning
|
||||
of a token, for further debugging info. */
|
||||
#ifdef YYPRINT
|
||||
YYPRINT (stderr, yychar, yylval);
|
||||
#endif
|
||||
fprintf (stderr, ")\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
yyn += yychar1;
|
||||
if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
|
||||
goto yydefault;
|
||||
|
||||
yyn = yytable[yyn];
|
||||
|
||||
/* yyn is what to do for this token type in this state.
|
||||
Negative => reduce, -yyn is rule number.
|
||||
Positive => shift, yyn is new state.
|
||||
New state is final state => don't bother to shift,
|
||||
just return success.
|
||||
0, or most negative number => error. */
|
||||
|
||||
if (yyn < 0)
|
||||
{
|
||||
if (yyn == YYFLAG)
|
||||
goto yyerrlab;
|
||||
yyn = -yyn;
|
||||
goto yyreduce;
|
||||
}
|
||||
else if (yyn == 0)
|
||||
goto yyerrlab;
|
||||
|
||||
if (yyn == YYFINAL)
|
||||
YYACCEPT;
|
||||
|
||||
/* Shift the lookahead token. */
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
|
||||
#endif
|
||||
|
||||
/* Discard the token being shifted unless it is eof. */
|
||||
if (yychar != YYEOF)
|
||||
yychar = YYEMPTY;
|
||||
|
||||
*++yyvsp = yylval;
|
||||
#ifdef YYLSP_NEEDED
|
||||
*++yylsp = yylloc;
|
||||
#endif
|
||||
|
||||
/* count tokens shifted since error; after three, turn off error status. */
|
||||
if (yyerrstatus) yyerrstatus--;
|
||||
|
||||
yystate = yyn;
|
||||
goto yynewstate;
|
||||
|
||||
/* Do the default action for the current state. */
|
||||
yydefault:
|
||||
|
||||
yyn = yydefact[yystate];
|
||||
if (yyn == 0)
|
||||
goto yyerrlab;
|
||||
|
||||
/* Do a reduction. yyn is the number of a rule to reduce with. */
|
||||
yyreduce:
|
||||
yylen = yyr2[yyn];
|
||||
if (yylen > 0)
|
||||
yyval = yyvsp[1-yylen]; /* implement default value of the action */
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
{
|
||||
int i;
|
||||
|
||||
fprintf (stderr, "Reducing via rule %d (line %d), ",
|
||||
yyn, yyrline[yyn]);
|
||||
|
||||
/* Print the symbols being reduced, and their result. */
|
||||
for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
|
||||
fprintf (stderr, "%s ", yytname[yyrhs[i]]);
|
||||
fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
|
||||
}
|
||||
#endif
|
||||
|
||||
$ /* the action file gets copied in in place of this dollarsign */
|
||||
yyvsp -= yylen;
|
||||
yyssp -= yylen;
|
||||
#ifdef YYLSP_NEEDED
|
||||
yylsp -= yylen;
|
||||
#endif
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
{
|
||||
short *ssp1 = yyss - 1;
|
||||
fprintf (stderr, "state stack now");
|
||||
while (ssp1 != yyssp)
|
||||
fprintf (stderr, " %d", *++ssp1);
|
||||
fprintf (stderr, "\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
*++yyvsp = yyval;
|
||||
|
||||
#ifdef YYLSP_NEEDED
|
||||
yylsp++;
|
||||
if (yylen == 0)
|
||||
{
|
||||
yylsp->first_line = yylloc.first_line;
|
||||
yylsp->first_column = yylloc.first_column;
|
||||
yylsp->last_line = (yylsp-1)->last_line;
|
||||
yylsp->last_column = (yylsp-1)->last_column;
|
||||
yylsp->text = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
yylsp->last_line = (yylsp+yylen-1)->last_line;
|
||||
yylsp->last_column = (yylsp+yylen-1)->last_column;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Now "shift" the result of the reduction.
|
||||
Determine what state that goes to,
|
||||
based on the state we popped back to
|
||||
and the rule number reduced by. */
|
||||
|
||||
yyn = yyr1[yyn];
|
||||
|
||||
yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
|
||||
if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
|
||||
yystate = yytable[yystate];
|
||||
else
|
||||
yystate = yydefgoto[yyn - YYNTBASE];
|
||||
|
||||
goto yynewstate;
|
||||
|
||||
yyerrlab: /* here on detecting error */
|
||||
|
||||
if (! yyerrstatus)
|
||||
/* If not already recovering from an error, report this error. */
|
||||
{
|
||||
++yynerrs;
|
||||
|
||||
#ifdef YYERROR_VERBOSE
|
||||
yyn = yypact[yystate];
|
||||
|
||||
if (yyn > YYFLAG && yyn < YYLAST)
|
||||
{
|
||||
int size = 0;
|
||||
char *msg;
|
||||
int x, count;
|
||||
|
||||
count = 0;
|
||||
/* Start X at -yyn if nec to avoid negative indexes in yycheck. */
|
||||
for (x = (yyn < 0 ? -yyn : 0);
|
||||
x < (sizeof(yytname) / sizeof(char *)); x++)
|
||||
if (yycheck[x + yyn] == x)
|
||||
size += strlen(yytname[x]) + 15, count++;
|
||||
msg = (char *) malloc(size + 15);
|
||||
if (msg != 0)
|
||||
{
|
||||
strcpy(msg, "parse error");
|
||||
|
||||
if (count < 5)
|
||||
{
|
||||
count = 0;
|
||||
for (x = (yyn < 0 ? -yyn : 0);
|
||||
x < (sizeof(yytname) / sizeof(char *)); x++)
|
||||
if (yycheck[x + yyn] == x)
|
||||
{
|
||||
strcat(msg, count == 0 ? ", expecting `" : " or `");
|
||||
strcat(msg, yytname[x]);
|
||||
strcat(msg, "'");
|
||||
count++;
|
||||
}
|
||||
}
|
||||
yyerror(msg);
|
||||
free(msg);
|
||||
}
|
||||
else
|
||||
yyerror ("parse error; also virtual memory exceeded");
|
||||
}
|
||||
else
|
||||
#endif /* YYERROR_VERBOSE */
|
||||
yyerror("parse error");
|
||||
}
|
||||
|
||||
goto yyerrlab1;
|
||||
yyerrlab1: /* here on error raised explicitly by an action */
|
||||
|
||||
if (yyerrstatus == 3)
|
||||
{
|
||||
/* if just tried and failed to reuse lookahead token after an error, discard it. */
|
||||
|
||||
/* return failure if at end of input */
|
||||
if (yychar == YYEOF)
|
||||
YYABORT;
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
|
||||
#endif
|
||||
|
||||
yychar = YYEMPTY;
|
||||
}
|
||||
|
||||
/* Else will try to reuse lookahead token
|
||||
after shifting the error token. */
|
||||
|
||||
yyerrstatus = 3; /* Each real token shifted decrements this */
|
||||
|
||||
goto yyerrhandle;
|
||||
|
||||
yyerrdefault: /* current state does not do anything special for the error token. */
|
||||
|
||||
#if 0
|
||||
/* This is wrong; only states that explicitly want error tokens
|
||||
should shift them. */
|
||||
yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/
|
||||
if (yyn) goto yydefault;
|
||||
#endif
|
||||
|
||||
yyerrpop: /* pop the current state because it cannot handle the error token */
|
||||
|
||||
if (yyssp == yyss) YYABORT;
|
||||
yyvsp--;
|
||||
yystate = *--yyssp;
|
||||
#ifdef YYLSP_NEEDED
|
||||
yylsp--;
|
||||
#endif
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
{
|
||||
short *ssp1 = yyss - 1;
|
||||
fprintf (stderr, "Error: state stack now");
|
||||
while (ssp1 != yyssp)
|
||||
fprintf (stderr, " %d", *++ssp1);
|
||||
fprintf (stderr, "\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
yyerrhandle:
|
||||
|
||||
yyn = yypact[yystate];
|
||||
if (yyn == YYFLAG)
|
||||
goto yyerrdefault;
|
||||
|
||||
yyn += YYTERROR;
|
||||
if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
|
||||
goto yyerrdefault;
|
||||
|
||||
yyn = yytable[yyn];
|
||||
if (yyn < 0)
|
||||
{
|
||||
if (yyn == YYFLAG)
|
||||
goto yyerrpop;
|
||||
yyn = -yyn;
|
||||
goto yyreduce;
|
||||
}
|
||||
else if (yyn == 0)
|
||||
goto yyerrpop;
|
||||
|
||||
if (yyn == YYFINAL)
|
||||
YYACCEPT;
|
||||
|
||||
#if YYDEBUG != 0
|
||||
if (yydebug)
|
||||
fprintf(stderr, "Shifting error token, ");
|
||||
#endif
|
||||
|
||||
*++yyvsp = yylval;
|
||||
#ifdef YYLSP_NEEDED
|
||||
*++yylsp = yylloc;
|
||||
#endif
|
||||
|
||||
yystate = yyn;
|
||||
goto yynewstate;
|
||||
}
|
Двоичный файл не отображается.
|
@ -0,0 +1,300 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _TYPES_INCLUDED
|
||||
#define _TYPES_INCLUDED
|
||||
|
||||
#include "Common.h"
|
||||
#include "BaseTypes.h"
|
||||
|
||||
//
|
||||
// Need to have association of line numbers to types in a list for building structs.
|
||||
//
|
||||
class TType;
|
||||
struct TTypeLine {
|
||||
TType* type;
|
||||
int line;
|
||||
};
|
||||
typedef TVector<TTypeLine> TTypeList;
|
||||
|
||||
inline TTypeList* NewPoolTTypeList()
|
||||
{
|
||||
void* memory = GlobalPoolAllocator.allocate(sizeof(TTypeList));
|
||||
return new(memory) TTypeList;
|
||||
}
|
||||
|
||||
//
|
||||
// This is a workaround for a problem with the yacc stack, It can't have
|
||||
// types that it thinks have non-trivial constructors. It should
|
||||
// just be used while recognizing the grammar, not anything else. Pointers
|
||||
// could be used, but also trying to avoid lots of memory management overhead.
|
||||
//
|
||||
// Not as bad as it looks, there is no actual assumption that the fields
|
||||
// match up or are name the same or anything like that.
|
||||
//
|
||||
class TPublicType {
|
||||
public:
|
||||
TBasicType type;
|
||||
TQualifier qualifier;
|
||||
TPrecision precision;
|
||||
int size; // size of vector or matrix, not size of array
|
||||
bool matrix;
|
||||
bool array;
|
||||
int arraySize;
|
||||
TType* userDef;
|
||||
int line;
|
||||
|
||||
void setBasic(TBasicType bt, TQualifier q, int ln = 0)
|
||||
{
|
||||
type = bt;
|
||||
qualifier = q;
|
||||
precision = EbpHigh;
|
||||
size = 1;
|
||||
matrix = false;
|
||||
array = false;
|
||||
arraySize = 0;
|
||||
userDef = 0;
|
||||
line = ln;
|
||||
}
|
||||
|
||||
void setPrecision(TPrecision pcs)
|
||||
{
|
||||
precision = pcs;
|
||||
}
|
||||
|
||||
void setAggregate(int s, bool m = false)
|
||||
{
|
||||
size = s;
|
||||
matrix = m;
|
||||
}
|
||||
|
||||
void setArray(bool a, int s = 0)
|
||||
{
|
||||
array = a;
|
||||
arraySize = s;
|
||||
}
|
||||
};
|
||||
|
||||
typedef std::map<TTypeList*, TTypeList*> TStructureMap;
|
||||
typedef std::map<TTypeList*, TTypeList*>::iterator TStructureMapIterator;
|
||||
//
|
||||
// Base class for things that have a type.
|
||||
//
|
||||
class TType {
|
||||
public:
|
||||
POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
|
||||
explicit TType(TBasicType t, TQualifier q = EvqTemporary, int s = 1, bool m = false, bool a = false, TPrecision p = EbpHigh) :
|
||||
type(t), precision(p), qualifier(q), size(s), matrix(m), array(a), arraySize(0),
|
||||
structure(0), structureSize(0), maxArraySize(0), arrayInformationType(0), fieldName(0), mangled(0), typeName(0)
|
||||
{ }
|
||||
explicit TType(const TPublicType &p) :
|
||||
type(p.type), precision(p.precision), qualifier(p.qualifier), size(p.size), matrix(p.matrix), array(p.array), arraySize(p.arraySize),
|
||||
structure(0), structureSize(0), maxArraySize(0), arrayInformationType(0), fieldName(0), mangled(0), typeName(0)
|
||||
{
|
||||
if (p.userDef) {
|
||||
structure = p.userDef->getStruct();
|
||||
typeName = NewPoolTString(p.userDef->getTypeName().c_str());
|
||||
}
|
||||
}
|
||||
explicit TType(TTypeList* userDef, const TString& n, TPrecision p = EbpHigh) :
|
||||
type(EbtStruct), precision(p), qualifier(EvqTemporary), size(1), matrix(false), array(false), arraySize(0),
|
||||
structure(userDef), maxArraySize(0), arrayInformationType(0), fieldName(0), mangled(0) {
|
||||
typeName = NewPoolTString(n.c_str());
|
||||
}
|
||||
explicit TType() {}
|
||||
virtual ~TType() {}
|
||||
|
||||
TType(const TType& type) { *this = type; }
|
||||
|
||||
void copyType(const TType& copyOf, TStructureMap& remapper)
|
||||
{
|
||||
type = copyOf.type;
|
||||
precision = copyOf.precision;
|
||||
qualifier = copyOf.qualifier;
|
||||
size = copyOf.size;
|
||||
matrix = copyOf.matrix;
|
||||
array = copyOf.array;
|
||||
arraySize = copyOf.arraySize;
|
||||
|
||||
TStructureMapIterator iter;
|
||||
if (copyOf.structure) {
|
||||
if ((iter = remapper.find(structure)) == remapper.end()) {
|
||||
// create the new structure here
|
||||
structure = NewPoolTTypeList();
|
||||
for (unsigned int i = 0; i < copyOf.structure->size(); ++i) {
|
||||
TTypeLine typeLine;
|
||||
typeLine.line = (*copyOf.structure)[i].line;
|
||||
typeLine.type = (*copyOf.structure)[i].type->clone(remapper);
|
||||
structure->push_back(typeLine);
|
||||
}
|
||||
} else {
|
||||
structure = iter->second;
|
||||
}
|
||||
} else
|
||||
structure = 0;
|
||||
|
||||
fieldName = 0;
|
||||
if (copyOf.fieldName)
|
||||
fieldName = NewPoolTString(copyOf.fieldName->c_str());
|
||||
typeName = 0;
|
||||
if (copyOf.typeName)
|
||||
typeName = NewPoolTString(copyOf.typeName->c_str());
|
||||
|
||||
mangled = 0;
|
||||
if (copyOf.mangled)
|
||||
mangled = NewPoolTString(copyOf.mangled->c_str());
|
||||
|
||||
structureSize = copyOf.structureSize;
|
||||
maxArraySize = copyOf.maxArraySize;
|
||||
assert(copyOf.arrayInformationType == 0);
|
||||
arrayInformationType = 0; // arrayInformationType should not be set for builtIn symbol table level
|
||||
}
|
||||
|
||||
TType* clone(TStructureMap& remapper)
|
||||
{
|
||||
TType *newType = new TType();
|
||||
newType->copyType(*this, remapper);
|
||||
|
||||
return newType;
|
||||
}
|
||||
|
||||
virtual void setType(TBasicType t, int s, bool m, bool a, int aS = 0)
|
||||
{ type = t; size = s; matrix = m; array = a; arraySize = aS; }
|
||||
virtual void setType(TBasicType t, int s, bool m, TType* userDef = 0)
|
||||
{ type = t;
|
||||
size = s;
|
||||
matrix = m;
|
||||
if (userDef)
|
||||
structure = userDef->getStruct();
|
||||
// leave array information intact.
|
||||
}
|
||||
virtual void setTypeName(const TString& n) { typeName = NewPoolTString(n.c_str()); }
|
||||
virtual void setFieldName(const TString& n) { fieldName = NewPoolTString(n.c_str()); }
|
||||
virtual const TString& getTypeName() const
|
||||
{
|
||||
assert(typeName);
|
||||
return *typeName;
|
||||
}
|
||||
|
||||
virtual const TString& getFieldName() const
|
||||
{
|
||||
assert(fieldName);
|
||||
return *fieldName;
|
||||
}
|
||||
|
||||
virtual TBasicType getBasicType() const { return type; }
|
||||
virtual TPrecision getPrecision() const { return precision; }
|
||||
virtual TQualifier getQualifier() const { return qualifier; }
|
||||
virtual void changePrecision(TPrecision p) { precision = p; }
|
||||
virtual void changeQualifier(TQualifier q) { qualifier = q; }
|
||||
|
||||
// One-dimensional size of single instance type
|
||||
virtual int getNominalSize() const { return size; }
|
||||
|
||||
// Full-dimensional size of single instance of type
|
||||
virtual int getInstanceSize() const
|
||||
{
|
||||
if (matrix)
|
||||
return size * size;
|
||||
else
|
||||
return size;
|
||||
}
|
||||
|
||||
virtual bool isMatrix() const { return matrix ? true : false; }
|
||||
virtual bool isArray() const { return array ? true : false; }
|
||||
int getArraySize() const { return arraySize; }
|
||||
void setArraySize(int s) { array = true; arraySize = s; }
|
||||
void setMaxArraySize (int s) { maxArraySize = s; }
|
||||
int getMaxArraySize () const { return maxArraySize; }
|
||||
void clearArrayness() { array = false; arraySize = 0; maxArraySize = 0; }
|
||||
void setArrayInformationType(TType* t) { arrayInformationType = t; }
|
||||
TType* getArrayInformationType() const { return arrayInformationType; }
|
||||
virtual bool isVector() const { return size > 1 && !matrix; }
|
||||
static const char* getBasicString(TBasicType t) {
|
||||
switch (t) {
|
||||
case EbtVoid: return "void"; break;
|
||||
case EbtFloat: return "float"; break;
|
||||
case EbtInt: return "int"; break;
|
||||
case EbtBool: return "bool"; break;
|
||||
case EbtSampler2D: return "sampler2D"; break;
|
||||
case EbtSamplerCube: return "samplerCube"; break;
|
||||
case EbtStruct: return "structure"; break;
|
||||
default: return "unknown type";
|
||||
}
|
||||
}
|
||||
const char* getBasicString() const { return TType::getBasicString(type); }
|
||||
const char* getPrecisionString() const { return ::getPrecisionString(precision); }
|
||||
const char* getQualifierString() const { return ::getQualifierString(qualifier); }
|
||||
TTypeList* getStruct() { return structure; }
|
||||
|
||||
int getObjectSize() const
|
||||
{
|
||||
int totalSize;
|
||||
|
||||
if (getBasicType() == EbtStruct)
|
||||
totalSize = getStructSize();
|
||||
else if (matrix)
|
||||
totalSize = size * size;
|
||||
else
|
||||
totalSize = size;
|
||||
|
||||
if (isArray())
|
||||
totalSize *= Max(getArraySize(), getMaxArraySize());
|
||||
|
||||
return totalSize;
|
||||
}
|
||||
|
||||
TTypeList* getStruct() const { return structure; }
|
||||
TString& getMangledName() {
|
||||
if (!mangled) {
|
||||
mangled = NewPoolTString("");
|
||||
buildMangledName(*mangled);
|
||||
*mangled += ';' ;
|
||||
}
|
||||
|
||||
return *mangled;
|
||||
}
|
||||
bool sameElementType(const TType& right) const {
|
||||
return type == right.type &&
|
||||
size == right.size &&
|
||||
matrix == right.matrix &&
|
||||
structure == right.structure;
|
||||
}
|
||||
bool operator==(const TType& right) const {
|
||||
return type == right.type &&
|
||||
size == right.size &&
|
||||
matrix == right.matrix &&
|
||||
array == right.array && (!array || arraySize == right.arraySize) &&
|
||||
structure == right.structure;
|
||||
// don't check the qualifier, it's not ever what's being sought after
|
||||
}
|
||||
bool operator!=(const TType& right) const {
|
||||
return !operator==(right);
|
||||
}
|
||||
TString getCompleteString() const;
|
||||
|
||||
protected:
|
||||
void buildMangledName(TString&);
|
||||
int getStructSize() const;
|
||||
|
||||
TBasicType type : 6;
|
||||
TPrecision precision;
|
||||
TQualifier qualifier : 7;
|
||||
int size : 8; // size of vector or matrix, not size of array
|
||||
unsigned int matrix : 1;
|
||||
unsigned int array : 1;
|
||||
int arraySize;
|
||||
|
||||
TTypeList* structure; // 0 unless this is a struct
|
||||
mutable int structureSize;
|
||||
int maxArraySize;
|
||||
TType* arrayInformationType;
|
||||
TString *fieldName; // for structure field names
|
||||
TString *mangled;
|
||||
TString *typeName; // for structure field type name
|
||||
};
|
||||
|
||||
#endif // _TYPES_INCLUDED_
|
|
@ -0,0 +1,605 @@
|
|||
/*
|
||||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
*/
|
||||
/* Based on
|
||||
ANSI C grammar, Lex specification
|
||||
|
||||
In 1985, Jeff Lee published this Lex specification together with a Yacc
|
||||
grammar for the April 30, 1985 ANSI C draft. Tom Stockfisch reposted
|
||||
both to net.sources in 1987; that original, as mentioned in the answer
|
||||
to question 17.25 of the comp.lang.c FAQ, can be ftp'ed from ftp.uu.net,
|
||||
file usenet/net.sources/ansi.c.grammar.Z.
|
||||
|
||||
I intend to keep this version as close to the current C Standard grammar
|
||||
as possible; please let me know if you discover discrepancies.
|
||||
|
||||
Jutta Degener, 1995
|
||||
*/
|
||||
|
||||
D [0-9]
|
||||
L [a-zA-Z_]
|
||||
H [a-fA-F0-9]
|
||||
E [Ee][+-]?{D}+
|
||||
O [0-7]
|
||||
|
||||
%option nounput
|
||||
%{
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "ParseHelper.h"
|
||||
#include "glslang_tab.h"
|
||||
|
||||
/* windows only pragma */
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4102)
|
||||
#endif
|
||||
|
||||
int yy_input(char* buf, int max_size);
|
||||
TSourceLoc yylineno;
|
||||
|
||||
#ifdef _WIN32
|
||||
extern int yyparse(TParseContext&);
|
||||
#define YY_DECL int yylex(YYSTYPE* pyylval, TParseContext& parseContext)
|
||||
#else
|
||||
extern int yyparse(void*);
|
||||
#define YY_DECL int yylex(YYSTYPE* pyylval, void* parseContextLocal)
|
||||
#define parseContext (*((TParseContext*)(parseContextLocal)))
|
||||
#endif
|
||||
|
||||
#define YY_INPUT(buf,result,max_size) (result = yy_input(buf, max_size))
|
||||
|
||||
%}
|
||||
|
||||
%option noyywrap
|
||||
%option never-interactive
|
||||
%option outfile="Gen_glslang.cpp"
|
||||
%x FIELDS
|
||||
|
||||
|
||||
%%
|
||||
<*>"//"[^\n]*"\n" { /* ?? carriage and/or line-feed? */ };
|
||||
|
||||
"invariant" { pyylval->lex.line = yylineno; return(INVARIANT); }
|
||||
"highp" { pyylval->lex.line = yylineno; return(HIGH_PRECISION); }
|
||||
"mediump" { pyylval->lex.line = yylineno; return(MEDIUM_PRECISION); }
|
||||
"lowp" { pyylval->lex.line = yylineno; return(LOW_PRECISION); }
|
||||
"precision" { pyylval->lex.line = yylineno; return(PRECISION); }
|
||||
|
||||
"attribute" { pyylval->lex.line = yylineno; return(ATTRIBUTE); }
|
||||
"const" { pyylval->lex.line = yylineno; return(CONST_QUAL); }
|
||||
"uniform" { pyylval->lex.line = yylineno; return(UNIFORM); }
|
||||
"varying" { pyylval->lex.line = yylineno; return(VARYING); }
|
||||
|
||||
"break" { pyylval->lex.line = yylineno; return(BREAK); }
|
||||
"continue" { pyylval->lex.line = yylineno; return(CONTINUE); }
|
||||
"do" { pyylval->lex.line = yylineno; return(DO); }
|
||||
"for" { pyylval->lex.line = yylineno; return(FOR); }
|
||||
"while" { pyylval->lex.line = yylineno; return(WHILE); }
|
||||
|
||||
"if" { pyylval->lex.line = yylineno; return(IF); }
|
||||
"else" { pyylval->lex.line = yylineno; return(ELSE); }
|
||||
|
||||
"in" { pyylval->lex.line = yylineno; return(IN_QUAL); }
|
||||
"out" { pyylval->lex.line = yylineno; return(OUT_QUAL); }
|
||||
"inout" { pyylval->lex.line = yylineno; return(INOUT_QUAL); }
|
||||
|
||||
"float" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return(FLOAT_TYPE); }
|
||||
"int" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return(INT_TYPE); }
|
||||
"void" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return(VOID_TYPE); }
|
||||
"bool" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return(BOOL_TYPE); }
|
||||
"true" { pyylval->lex.line = yylineno; pyylval->lex.b = true; return(BOOLCONSTANT); }
|
||||
"false" { pyylval->lex.line = yylineno; pyylval->lex.b = false; return(BOOLCONSTANT); }
|
||||
|
||||
"discard" { pyylval->lex.line = yylineno; return(DISCARD); }
|
||||
"return" { pyylval->lex.line = yylineno; return(RETURN); }
|
||||
|
||||
"mat2" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return(MATRIX2); }
|
||||
"mat3" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return(MATRIX3); }
|
||||
"mat4" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return(MATRIX4); }
|
||||
|
||||
"vec2" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return (VEC2); }
|
||||
"vec3" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return (VEC3); }
|
||||
"vec4" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return (VEC4); }
|
||||
"ivec2" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return (IVEC2); }
|
||||
"ivec3" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return (IVEC3); }
|
||||
"ivec4" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return (IVEC4); }
|
||||
"bvec2" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return (BVEC2); }
|
||||
"bvec3" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return (BVEC3); }
|
||||
"bvec4" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return (BVEC4); }
|
||||
|
||||
"sampler2D" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return SAMPLER2D; }
|
||||
"samplerCube" { pyylval->lex.line = yylineno; parseContext.lexAfterType = true; return SAMPLERCUBE; }
|
||||
|
||||
"struct" { pyylval->lex.line = yylineno; return(STRUCT); }
|
||||
|
||||
"asm" { PaReservedWord(); return 0; }
|
||||
|
||||
"class" { PaReservedWord(); return 0; }
|
||||
"union" { PaReservedWord(); return 0; }
|
||||
"enum" { PaReservedWord(); return 0; }
|
||||
"typedef" { PaReservedWord(); return 0; }
|
||||
"template" { PaReservedWord(); return 0; }
|
||||
"this" { PaReservedWord(); return 0; }
|
||||
"packed" { PaReservedWord(); return 0; }
|
||||
|
||||
"goto" { PaReservedWord(); return 0; }
|
||||
"switch" { PaReservedWord(); return 0; }
|
||||
"default" { PaReservedWord(); return 0; }
|
||||
|
||||
"inline" { PaReservedWord(); return 0; }
|
||||
"noinline" { PaReservedWord(); return 0; }
|
||||
"volatile" { PaReservedWord(); return 0; }
|
||||
"public" { PaReservedWord(); return 0; }
|
||||
"static" { PaReservedWord(); return 0; }
|
||||
"extern" { PaReservedWord(); return 0; }
|
||||
"external" { PaReservedWord(); return 0; }
|
||||
"interface" { PaReservedWord(); return 0; }
|
||||
|
||||
"long" { PaReservedWord(); return 0; }
|
||||
"short" { PaReservedWord(); return 0; }
|
||||
"double" { PaReservedWord(); return 0; }
|
||||
"half" { PaReservedWord(); return 0; }
|
||||
"fixed" { PaReservedWord(); return 0; }
|
||||
"unsigned" { PaReservedWord(); return 0; }
|
||||
|
||||
"input" { PaReservedWord(); return 0; }
|
||||
"output" { PaReservedWord(); return 0; }
|
||||
|
||||
"hvec2" { PaReservedWord(); return 0; }
|
||||
"hvec3" { PaReservedWord(); return 0; }
|
||||
"hvec4" { PaReservedWord(); return 0; }
|
||||
"fvec2" { PaReservedWord(); return 0; }
|
||||
"fvec3" { PaReservedWord(); return 0; }
|
||||
"fvec4" { PaReservedWord(); return 0; }
|
||||
"dvec2" { PaReservedWord(); return 0; }
|
||||
"dvec3" { PaReservedWord(); return 0; }
|
||||
"dvec4" { PaReservedWord(); return 0; }
|
||||
|
||||
"sizeof" { PaReservedWord(); return 0; }
|
||||
"cast" { PaReservedWord(); return 0; }
|
||||
|
||||
"namespace" { PaReservedWord(); return 0; }
|
||||
"using" { PaReservedWord(); return 0; }
|
||||
|
||||
{L}({L}|{D})* {
|
||||
pyylval->lex.line = yylineno;
|
||||
pyylval->lex.string = NewPoolTString(yytext);
|
||||
return PaIdentOrType(*pyylval->lex.string, parseContext, pyylval->lex.symbol);
|
||||
}
|
||||
|
||||
0[xX]{H}+ { pyylval->lex.line = yylineno; pyylval->lex.i = strtol(yytext, 0, 0); return(INTCONSTANT); }
|
||||
0{O}+ { pyylval->lex.line = yylineno; pyylval->lex.i = strtol(yytext, 0, 0); return(INTCONSTANT); }
|
||||
0{D}+ { pyylval->lex.line = yylineno; parseContext.error(yylineno, "Invalid Octal number.", yytext, "", ""); parseContext.recover(); return 0;}
|
||||
{D}+ { pyylval->lex.line = yylineno; pyylval->lex.i = strtol(yytext, 0, 0); return(INTCONSTANT); }
|
||||
|
||||
{D}+{E} { pyylval->lex.line = yylineno; pyylval->lex.f = static_cast<float>(atof(yytext)); return(FLOATCONSTANT); }
|
||||
{D}+"."{D}*({E})? { pyylval->lex.line = yylineno; pyylval->lex.f = static_cast<float>(atof(yytext)); return(FLOATCONSTANT); }
|
||||
"."{D}+({E})? { pyylval->lex.line = yylineno; pyylval->lex.f = static_cast<float>(atof(yytext)); return(FLOATCONSTANT); }
|
||||
|
||||
"/*" { int ret = PaParseComment(pyylval->lex.line, parseContext); if (!ret) return ret; }
|
||||
|
||||
"+=" { pyylval->lex.line = yylineno; return(ADD_ASSIGN); }
|
||||
"-=" { pyylval->lex.line = yylineno; return(SUB_ASSIGN); }
|
||||
"*=" { pyylval->lex.line = yylineno; return(MUL_ASSIGN); }
|
||||
"/=" { pyylval->lex.line = yylineno; return(DIV_ASSIGN); }
|
||||
"%=" { pyylval->lex.line = yylineno; return(MOD_ASSIGN); }
|
||||
"<<=" { pyylval->lex.line = yylineno; return(LEFT_ASSIGN); }
|
||||
">>=" { pyylval->lex.line = yylineno; return(RIGHT_ASSIGN); }
|
||||
"&=" { pyylval->lex.line = yylineno; return(AND_ASSIGN); }
|
||||
"^=" { pyylval->lex.line = yylineno; return(XOR_ASSIGN); }
|
||||
"|=" { pyylval->lex.line = yylineno; return(OR_ASSIGN); }
|
||||
|
||||
"++" { pyylval->lex.line = yylineno; return(INC_OP); }
|
||||
"--" { pyylval->lex.line = yylineno; return(DEC_OP); }
|
||||
"&&" { pyylval->lex.line = yylineno; return(AND_OP); }
|
||||
"||" { pyylval->lex.line = yylineno; return(OR_OP); }
|
||||
"^^" { pyylval->lex.line = yylineno; return(XOR_OP); }
|
||||
"<=" { pyylval->lex.line = yylineno; return(LE_OP); }
|
||||
">=" { pyylval->lex.line = yylineno; return(GE_OP); }
|
||||
"==" { pyylval->lex.line = yylineno; return(EQ_OP); }
|
||||
"!=" { pyylval->lex.line = yylineno; return(NE_OP); }
|
||||
"<<" { pyylval->lex.line = yylineno; return(LEFT_OP); }
|
||||
">>" { pyylval->lex.line = yylineno; return(RIGHT_OP); }
|
||||
";" { pyylval->lex.line = yylineno; parseContext.lexAfterType = false; return(SEMICOLON); }
|
||||
("{"|"<%") { pyylval->lex.line = yylineno; parseContext.lexAfterType = false; return(LEFT_BRACE); }
|
||||
("}"|"%>") { pyylval->lex.line = yylineno; return(RIGHT_BRACE); }
|
||||
"," { pyylval->lex.line = yylineno; if (parseContext.inTypeParen) parseContext.lexAfterType = false; return(COMMA); }
|
||||
":" { pyylval->lex.line = yylineno; return(COLON); }
|
||||
"=" { pyylval->lex.line = yylineno; parseContext.lexAfterType = false; return(EQUAL); }
|
||||
"(" { pyylval->lex.line = yylineno; parseContext.lexAfterType = false; parseContext.inTypeParen = true; return(LEFT_PAREN); }
|
||||
")" { pyylval->lex.line = yylineno; parseContext.inTypeParen = false; return(RIGHT_PAREN); }
|
||||
("["|"<:") { pyylval->lex.line = yylineno; return(LEFT_BRACKET); }
|
||||
("]"|":>") { pyylval->lex.line = yylineno; return(RIGHT_BRACKET); }
|
||||
"." { BEGIN(FIELDS); return(DOT); }
|
||||
"!" { pyylval->lex.line = yylineno; return(BANG); }
|
||||
"-" { pyylval->lex.line = yylineno; return(DASH); }
|
||||
"~" { pyylval->lex.line = yylineno; return(TILDE); }
|
||||
"+" { pyylval->lex.line = yylineno; return(PLUS); }
|
||||
"*" { pyylval->lex.line = yylineno; return(STAR); }
|
||||
"/" { pyylval->lex.line = yylineno; return(SLASH); }
|
||||
"%" { pyylval->lex.line = yylineno; return(PERCENT); }
|
||||
"<" { pyylval->lex.line = yylineno; return(LEFT_ANGLE); }
|
||||
">" { pyylval->lex.line = yylineno; return(RIGHT_ANGLE); }
|
||||
"|" { pyylval->lex.line = yylineno; return(VERTICAL_BAR); }
|
||||
"^" { pyylval->lex.line = yylineno; return(CARET); }
|
||||
"&" { pyylval->lex.line = yylineno; return(AMPERSAND); }
|
||||
"?" { pyylval->lex.line = yylineno; return(QUESTION); }
|
||||
|
||||
<FIELDS>{L}({L}|{D})* {
|
||||
BEGIN(INITIAL);
|
||||
pyylval->lex.line = yylineno;
|
||||
pyylval->lex.string = NewPoolTString(yytext);
|
||||
return FIELD_SELECTION; }
|
||||
<FIELDS>[ \t\v\f\r] {}
|
||||
|
||||
[ \t\v\n\f\r] { }
|
||||
<*><<EOF>> { (&parseContext)->AfterEOF = true; yy_delete_buffer(YY_CURRENT_BUFFER); yyterminate();}
|
||||
<*>. { parseContext.infoSink.info << "FLEX: Unknown char " << yytext << "\n";
|
||||
return 0; }
|
||||
|
||||
%%
|
||||
|
||||
|
||||
//Including Pre-processor.
|
||||
extern "C" {
|
||||
#include "./preprocessor/preprocess.h"
|
||||
}
|
||||
|
||||
//
|
||||
// The YY_INPUT macro just calls this. Maybe this could be just put into
|
||||
// the macro directly.
|
||||
//
|
||||
|
||||
int yy_input(char* buf, int max_size)
|
||||
{
|
||||
int len;
|
||||
|
||||
if ((len = yylex_CPP(buf, max_size)) == 0)
|
||||
return 0;
|
||||
if (len >= max_size)
|
||||
YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
|
||||
|
||||
buf[len] = ' ';
|
||||
return len+1;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Parse an array of strings using yyparse. We set up globals used by
|
||||
// yywrap.
|
||||
//
|
||||
// Returns 0 for success, as per yyparse().
|
||||
//
|
||||
int PaParseStrings(char* argv[], int strLen[], int argc, TParseContext& parseContextLocal)
|
||||
{
|
||||
int argv0len;
|
||||
|
||||
ScanFromString(argv[0]);
|
||||
|
||||
//Storing the Current Compiler Parse context into the cpp structure.
|
||||
cpp->pC = (void*)&parseContextLocal;
|
||||
|
||||
if (!argv || argc == 0)
|
||||
return 1;
|
||||
|
||||
for (int i = 0; i < argc; ++i) {
|
||||
if (!argv[i]) {
|
||||
parseContextLocal.error(0, "Null shader source string", "", "");
|
||||
parseContextLocal.recover();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!strLen) {
|
||||
argv0len = (int) strlen(argv[0]);
|
||||
strLen = &argv0len;
|
||||
}
|
||||
yyrestart(0);
|
||||
(&parseContextLocal)->AfterEOF = false;
|
||||
cpp->PaWhichStr = 0;
|
||||
cpp->PaArgv = argv;
|
||||
cpp->PaArgc = argc;
|
||||
cpp->PaStrLen = strLen;
|
||||
cpp->notAVersionToken = 0;
|
||||
yylineno = 1;
|
||||
|
||||
if (*cpp->PaStrLen >= 0) {
|
||||
int ret;
|
||||
#ifdef _WIN32
|
||||
ret = yyparse(parseContextLocal);
|
||||
#else
|
||||
ret = yyparse((void*)(&parseContextLocal));
|
||||
#endif
|
||||
if (cpp->CompileError == 1 || parseContextLocal.recoveredFromError || parseContextLocal.numErrors > 0)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void yyerror(char *s)
|
||||
{
|
||||
if (((TParseContext *)cpp->pC)->AfterEOF) {
|
||||
if (cpp->tokensBeforeEOF == 1) {
|
||||
GlobalParseContext->error(yylineno, "syntax error", "pre-mature EOF", s, "");
|
||||
GlobalParseContext->recover();
|
||||
}
|
||||
} else {
|
||||
GlobalParseContext->error(yylineno, "syntax error", yytext, s, "");
|
||||
GlobalParseContext->recover();
|
||||
}
|
||||
}
|
||||
|
||||
void PaReservedWord()
|
||||
{
|
||||
GlobalParseContext->error(yylineno, "Reserved word.", yytext, "", "");
|
||||
GlobalParseContext->recover();
|
||||
}
|
||||
|
||||
int PaIdentOrType(TString& id, TParseContext& parseContextLocal, TSymbol*& symbol)
|
||||
{
|
||||
symbol = parseContextLocal.symbolTable.find(id);
|
||||
if (parseContextLocal.lexAfterType == false && symbol && symbol->isVariable()) {
|
||||
TVariable* variable = static_cast<TVariable*>(symbol);
|
||||
if (variable->isUserType()) {
|
||||
parseContextLocal.lexAfterType = true;
|
||||
return TYPE_NAME;
|
||||
}
|
||||
}
|
||||
|
||||
return IDENTIFIER;
|
||||
}
|
||||
|
||||
int PaParseComment(int &lineno, TParseContext& parseContextLocal)
|
||||
{
|
||||
int transitionFlag = 0;
|
||||
int nextChar;
|
||||
|
||||
while (transitionFlag != 2) {
|
||||
nextChar = yyinput();
|
||||
if (nextChar == '\n')
|
||||
lineno++;
|
||||
switch (nextChar) {
|
||||
case '*' :
|
||||
transitionFlag = 1;
|
||||
break;
|
||||
case '/' : /* if star is the previous character, then it is the end of comment */
|
||||
if (transitionFlag == 1) {
|
||||
return 1 ;
|
||||
}
|
||||
break;
|
||||
case EOF :
|
||||
/* Raise error message here */
|
||||
parseContextLocal.error(yylineno, "End of shader found before end of comment.", "", "", "");
|
||||
GlobalParseContext->recover();
|
||||
return YY_NULL;
|
||||
default : /* Any other character will be a part of the comment */
|
||||
transitionFlag = 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
||||
void CPPDebugLogMsg(const char *msg)
|
||||
{
|
||||
((TParseContext *)cpp->pC)->infoSink.debug.message(EPrefixNone, msg);
|
||||
}
|
||||
|
||||
void CPPWarningToInfoLog(const char *msg)
|
||||
{
|
||||
((TParseContext *)cpp->pC)->infoSink.info.message(EPrefixWarning, msg, yylineno);
|
||||
}
|
||||
|
||||
void CPPShInfoLogMsg(const char *msg)
|
||||
{
|
||||
((TParseContext *)cpp->pC)->error(yylineno,"", "",msg,"");
|
||||
GlobalParseContext->recover();
|
||||
}
|
||||
|
||||
void CPPErrorToInfoLog(char *msg)
|
||||
{
|
||||
((TParseContext *)cpp->pC)->error(yylineno,"syntax error", "",msg,"");
|
||||
GlobalParseContext->recover();
|
||||
}
|
||||
|
||||
void SetLineNumber(int line)
|
||||
{
|
||||
yylineno &= ~SourceLocLineMask;
|
||||
yylineno |= line;
|
||||
}
|
||||
|
||||
void SetStringNumber(int string)
|
||||
{
|
||||
yylineno = (string << SourceLocStringShift) | (yylineno & SourceLocLineMask);
|
||||
}
|
||||
|
||||
int GetStringNumber(void)
|
||||
{
|
||||
return yylineno >> 16;
|
||||
}
|
||||
|
||||
int GetLineNumber(void)
|
||||
{
|
||||
return yylineno & SourceLocLineMask;
|
||||
}
|
||||
|
||||
void IncLineNumber(void)
|
||||
{
|
||||
if ((yylineno & SourceLocLineMask) <= SourceLocLineMask)
|
||||
++yylineno;
|
||||
}
|
||||
|
||||
void DecLineNumber(void)
|
||||
{
|
||||
if ((yylineno & SourceLocLineMask) > 0)
|
||||
--yylineno;
|
||||
}
|
||||
|
||||
void HandlePragma(const char **tokens, int numTokens)
|
||||
{
|
||||
if (!strcmp(tokens[0], "optimize")) {
|
||||
if (numTokens != 4) {
|
||||
CPPShInfoLogMsg("optimize pragma syntax is incorrect");
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(tokens[1], "(")) {
|
||||
CPPShInfoLogMsg("\"(\" expected after 'optimize' keyword");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(tokens[2], "on"))
|
||||
((TParseContext *)cpp->pC)->contextPragma.optimize = true;
|
||||
else if (!strcmp(tokens[2], "off"))
|
||||
((TParseContext *)cpp->pC)->contextPragma.optimize = false;
|
||||
else {
|
||||
CPPShInfoLogMsg("\"on\" or \"off\" expected after '(' for 'optimize' pragma");
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(tokens[3], ")")) {
|
||||
CPPShInfoLogMsg("\")\" expected to end 'optimize' pragma");
|
||||
return;
|
||||
}
|
||||
} else if (!strcmp(tokens[0], "debug")) {
|
||||
if (numTokens != 4) {
|
||||
CPPShInfoLogMsg("debug pragma syntax is incorrect");
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(tokens[1], "(")) {
|
||||
CPPShInfoLogMsg("\"(\" expected after 'debug' keyword");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(tokens[2], "on"))
|
||||
((TParseContext *)cpp->pC)->contextPragma.debug = true;
|
||||
else if (!strcmp(tokens[2], "off"))
|
||||
((TParseContext *)cpp->pC)->contextPragma.debug = false;
|
||||
else {
|
||||
CPPShInfoLogMsg("\"on\" or \"off\" expected after '(' for 'debug' pragma");
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(tokens[3], ")")) {
|
||||
CPPShInfoLogMsg("\")\" expected to end 'debug' pragma");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
|
||||
#ifdef PRAGMA_TABLE
|
||||
//
|
||||
// implementation specific pragma
|
||||
// use ((TParseContext *)cpp->pC)->contextPragma.pragmaTable to store the information about pragma
|
||||
// For now, just ignore the pragma that the implementation cannot recognize
|
||||
// An Example of one such implementation for a pragma that has a syntax like
|
||||
// #pragma pragmaname(pragmavalue)
|
||||
// This implementation stores the current pragmavalue against the pragma name in pragmaTable.
|
||||
//
|
||||
if (numTokens == 4 && !strcmp(tokens[1], "(") && !strcmp(tokens[3], ")")) {
|
||||
TPragmaTable& pragmaTable = ((TParseContext *)cpp->pC)->contextPragma.pragmaTable;
|
||||
TPragmaTable::iterator iter;
|
||||
iter = pragmaTable.find(TString(tokens[0]));
|
||||
if (iter != pragmaTable.end()) {
|
||||
iter->second = tokens[2];
|
||||
} else {
|
||||
pragmaTable[tokens[0]] = tokens[2];
|
||||
}
|
||||
} else if (numTokens >= 2) {
|
||||
TPragmaTable& pragmaTable = ((TParseContext *)cpp->pC)->contextPragma.pragmaTable;
|
||||
TPragmaTable::iterator iter;
|
||||
iter = pragmaTable.find(TString(tokens[0]));
|
||||
if (iter != pragmaTable.end()) {
|
||||
iter->second = tokens[1];
|
||||
} else {
|
||||
pragmaTable[tokens[0]] = tokens[1];
|
||||
}
|
||||
}
|
||||
#endif // PRAGMA_TABLE
|
||||
}
|
||||
}
|
||||
|
||||
void StoreStr(char *string)
|
||||
{
|
||||
TString strSrc;
|
||||
strSrc = TString(string);
|
||||
|
||||
((TParseContext *)cpp->pC)->HashErrMsg = ((TParseContext *)cpp->pC)->HashErrMsg + " " + strSrc;
|
||||
}
|
||||
|
||||
const char* GetStrfromTStr(void)
|
||||
{
|
||||
cpp->ErrMsg = (((TParseContext *)cpp->pC)->HashErrMsg).c_str();
|
||||
return cpp->ErrMsg;
|
||||
}
|
||||
|
||||
void ResetTString(void)
|
||||
{
|
||||
((TParseContext *)cpp->pC)->HashErrMsg = "";
|
||||
}
|
||||
|
||||
TBehavior GetBehavior(const char* behavior)
|
||||
{
|
||||
if (!strcmp("require", behavior))
|
||||
return EBhRequire;
|
||||
else if (!strcmp("enable", behavior))
|
||||
return EBhEnable;
|
||||
else if (!strcmp("disable", behavior))
|
||||
return EBhDisable;
|
||||
else if (!strcmp("warn", behavior))
|
||||
return EBhWarn;
|
||||
else {
|
||||
CPPShInfoLogMsg((TString("behavior '") + behavior + "' is not supported").c_str());
|
||||
return EBhDisable;
|
||||
}
|
||||
}
|
||||
|
||||
void updateExtensionBehavior(const char* extName, const char* behavior)
|
||||
{
|
||||
TBehavior behaviorVal = GetBehavior(behavior);
|
||||
TMap<TString, TBehavior>:: iterator iter;
|
||||
TString msg;
|
||||
|
||||
// special cased for all extension
|
||||
if (!strcmp(extName, "all")) {
|
||||
if (behaviorVal == EBhRequire || behaviorVal == EBhEnable) {
|
||||
CPPShInfoLogMsg("extension 'all' cannot have 'require' or 'enable' behavior");
|
||||
return;
|
||||
} else {
|
||||
for (iter = ((TParseContext *)cpp->pC)->extensionBehavior.begin(); iter != ((TParseContext *)cpp->pC)->extensionBehavior.end(); ++iter)
|
||||
iter->second = behaviorVal;
|
||||
}
|
||||
} else {
|
||||
iter = ((TParseContext *)cpp->pC)->extensionBehavior.find(TString(extName));
|
||||
if (iter == ((TParseContext *)cpp->pC)->extensionBehavior.end()) {
|
||||
switch (behaviorVal) {
|
||||
case EBhRequire:
|
||||
CPPShInfoLogMsg((TString("extension '") + extName + "' is not supported").c_str());
|
||||
break;
|
||||
case EBhEnable:
|
||||
case EBhWarn:
|
||||
case EBhDisable:
|
||||
msg = TString("extension '") + extName + "' is not supported";
|
||||
((TParseContext *)cpp->pC)->infoSink.info.message(EPrefixWarning, msg.c_str(), yylineno);
|
||||
break;
|
||||
}
|
||||
return;
|
||||
} else
|
||||
iter->second = behaviorVal;
|
||||
}
|
||||
}
|
||||
|
||||
} // extern "C"
|
||||
|
||||
void setInitialState()
|
||||
{
|
||||
yy_start = 1;
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,455 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#include "localintermediate.h"
|
||||
|
||||
//
|
||||
// Two purposes:
|
||||
// 1. Show an example of how to iterate tree. Functions can
|
||||
// also directly call Traverse() on children themselves to
|
||||
// have finer grained control over the process than shown here.
|
||||
// See the last function for how to get started.
|
||||
// 2. Print out a text based description of the tree.
|
||||
//
|
||||
|
||||
//
|
||||
// Use this class to carry along data from node to node in
|
||||
// the traversal
|
||||
//
|
||||
class TOutputTraverser : public TIntermTraverser {
|
||||
public:
|
||||
TOutputTraverser(TInfoSink& i) : infoSink(i) { }
|
||||
TInfoSink& infoSink;
|
||||
|
||||
protected:
|
||||
void visitSymbol(TIntermSymbol*);
|
||||
void visitConstantUnion(TIntermConstantUnion*);
|
||||
bool visitBinary(Visit visit, TIntermBinary*);
|
||||
bool visitUnary(Visit visit, TIntermUnary*);
|
||||
bool visitSelection(Visit visit, TIntermSelection*);
|
||||
bool visitAggregate(Visit visit, TIntermAggregate*);
|
||||
bool visitLoop(Visit visit, TIntermLoop*);
|
||||
bool visitBranch(Visit visit, TIntermBranch*);
|
||||
};
|
||||
|
||||
TString TType::getCompleteString() const
|
||||
{
|
||||
char buf[100];
|
||||
char *p = &buf[0];
|
||||
|
||||
if (qualifier != EvqTemporary && qualifier != EvqGlobal)
|
||||
p += sprintf(p, "%s ", getQualifierString());
|
||||
if (array)
|
||||
p += sprintf(p, "array of ");
|
||||
if (matrix)
|
||||
p += sprintf(p, "%dX%d matrix of ", size, size);
|
||||
else if (size > 1)
|
||||
p += sprintf(p, "%d-component vector of ", size);
|
||||
|
||||
sprintf(p, "%s", getBasicString());
|
||||
|
||||
return TString(buf);
|
||||
}
|
||||
|
||||
//
|
||||
// Helper functions for printing, not part of traversing.
|
||||
//
|
||||
|
||||
void OutputTreeText(TInfoSink& infoSink, TIntermNode* node, const int depth)
|
||||
{
|
||||
int i;
|
||||
|
||||
infoSink.debug << FormatSourceLoc(node->getLine());
|
||||
|
||||
for (i = 0; i < depth; ++i)
|
||||
infoSink.debug << " ";
|
||||
}
|
||||
|
||||
//
|
||||
// The rest of the file are the traversal functions. The last one
|
||||
// is the one that starts the traversal.
|
||||
//
|
||||
// Return true from interior nodes to have the external traversal
|
||||
// continue on to children. If you process children yourself,
|
||||
// return false.
|
||||
//
|
||||
|
||||
void TOutputTraverser::visitSymbol(TIntermSymbol* node)
|
||||
{
|
||||
OutputTreeText(infoSink, node, depth);
|
||||
|
||||
char buf[100];
|
||||
sprintf(buf, "'%s' (%s)\n",
|
||||
node->getSymbol().c_str(),
|
||||
node->getCompleteString().c_str());
|
||||
|
||||
infoSink.debug << buf;
|
||||
}
|
||||
|
||||
bool TOutputTraverser::visitBinary(Visit visit, TIntermBinary* node)
|
||||
{
|
||||
TInfoSink& out = infoSink;
|
||||
|
||||
OutputTreeText(out, node, depth);
|
||||
|
||||
switch (node->getOp()) {
|
||||
case EOpAssign: out.debug << "move second child to first child"; break;
|
||||
case EOpAddAssign: out.debug << "add second child into first child"; break;
|
||||
case EOpSubAssign: out.debug << "subtract second child into first child"; break;
|
||||
case EOpMulAssign: out.debug << "multiply second child into first child"; break;
|
||||
case EOpVectorTimesMatrixAssign: out.debug << "matrix mult second child into first child"; break;
|
||||
case EOpVectorTimesScalarAssign: out.debug << "vector scale second child into first child"; break;
|
||||
case EOpMatrixTimesScalarAssign: out.debug << "matrix scale second child into first child"; break;
|
||||
case EOpMatrixTimesMatrixAssign: out.debug << "matrix mult second child into first child"; break;
|
||||
case EOpDivAssign: out.debug << "divide second child into first child"; break;
|
||||
case EOpModAssign: out.debug << "mod second child into first child"; break;
|
||||
case EOpAndAssign: out.debug << "and second child into first child"; break;
|
||||
case EOpInclusiveOrAssign: out.debug << "or second child into first child"; break;
|
||||
case EOpExclusiveOrAssign: out.debug << "exclusive or second child into first child"; break;
|
||||
case EOpLeftShiftAssign: out.debug << "left shift second child into first child"; break;
|
||||
case EOpRightShiftAssign: out.debug << "right shift second child into first child"; break;
|
||||
|
||||
case EOpIndexDirect: out.debug << "direct index"; break;
|
||||
case EOpIndexIndirect: out.debug << "indirect index"; break;
|
||||
case EOpIndexDirectStruct: out.debug << "direct index for structure"; break;
|
||||
case EOpVectorSwizzle: out.debug << "vector swizzle"; break;
|
||||
|
||||
case EOpAdd: out.debug << "add"; break;
|
||||
case EOpSub: out.debug << "subtract"; break;
|
||||
case EOpMul: out.debug << "component-wise multiply"; break;
|
||||
case EOpDiv: out.debug << "divide"; break;
|
||||
case EOpMod: out.debug << "mod"; break;
|
||||
case EOpRightShift: out.debug << "right-shift"; break;
|
||||
case EOpLeftShift: out.debug << "left-shift"; break;
|
||||
case EOpAnd: out.debug << "bitwise and"; break;
|
||||
case EOpInclusiveOr: out.debug << "inclusive-or"; break;
|
||||
case EOpExclusiveOr: out.debug << "exclusive-or"; break;
|
||||
case EOpEqual: out.debug << "Compare Equal"; break;
|
||||
case EOpNotEqual: out.debug << "Compare Not Equal"; break;
|
||||
case EOpLessThan: out.debug << "Compare Less Than"; break;
|
||||
case EOpGreaterThan: out.debug << "Compare Greater Than"; break;
|
||||
case EOpLessThanEqual: out.debug << "Compare Less Than or Equal"; break;
|
||||
case EOpGreaterThanEqual: out.debug << "Compare Greater Than or Equal"; break;
|
||||
|
||||
case EOpVectorTimesScalar: out.debug << "vector-scale"; break;
|
||||
case EOpVectorTimesMatrix: out.debug << "vector-times-matrix"; break;
|
||||
case EOpMatrixTimesVector: out.debug << "matrix-times-vector"; break;
|
||||
case EOpMatrixTimesScalar: out.debug << "matrix-scale"; break;
|
||||
case EOpMatrixTimesMatrix: out.debug << "matrix-multiply"; break;
|
||||
|
||||
case EOpLogicalOr: out.debug << "logical-or"; break;
|
||||
case EOpLogicalXor: out.debug << "logical-xor"; break;
|
||||
case EOpLogicalAnd: out.debug << "logical-and"; break;
|
||||
default: out.debug << "<unknown op>";
|
||||
}
|
||||
|
||||
out.debug << " (" << node->getCompleteString() << ")";
|
||||
|
||||
out.debug << "\n";
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary* node)
|
||||
{
|
||||
TInfoSink& out = infoSink;
|
||||
|
||||
OutputTreeText(out, node, depth);
|
||||
|
||||
switch (node->getOp()) {
|
||||
case EOpNegative: out.debug << "Negate value"; break;
|
||||
case EOpVectorLogicalNot:
|
||||
case EOpLogicalNot: out.debug << "Negate conditional"; break;
|
||||
case EOpBitwiseNot: out.debug << "Bitwise not"; break;
|
||||
|
||||
case EOpPostIncrement: out.debug << "Post-Increment"; break;
|
||||
case EOpPostDecrement: out.debug << "Post-Decrement"; break;
|
||||
case EOpPreIncrement: out.debug << "Pre-Increment"; break;
|
||||
case EOpPreDecrement: out.debug << "Pre-Decrement"; break;
|
||||
|
||||
case EOpConvIntToBool: out.debug << "Convert int to bool"; break;
|
||||
case EOpConvFloatToBool:out.debug << "Convert float to bool";break;
|
||||
case EOpConvBoolToFloat:out.debug << "Convert bool to float";break;
|
||||
case EOpConvIntToFloat: out.debug << "Convert int to float"; break;
|
||||
case EOpConvFloatToInt: out.debug << "Convert float to int"; break;
|
||||
case EOpConvBoolToInt: out.debug << "Convert bool to int"; break;
|
||||
|
||||
case EOpRadians: out.debug << "radians"; break;
|
||||
case EOpDegrees: out.debug << "degrees"; break;
|
||||
case EOpSin: out.debug << "sine"; break;
|
||||
case EOpCos: out.debug << "cosine"; break;
|
||||
case EOpTan: out.debug << "tangent"; break;
|
||||
case EOpAsin: out.debug << "arc sine"; break;
|
||||
case EOpAcos: out.debug << "arc cosine"; break;
|
||||
case EOpAtan: out.debug << "arc tangent"; break;
|
||||
|
||||
case EOpExp: out.debug << "exp"; break;
|
||||
case EOpLog: out.debug << "log"; break;
|
||||
case EOpExp2: out.debug << "exp2"; break;
|
||||
case EOpLog2: out.debug << "log2"; break;
|
||||
case EOpSqrt: out.debug << "sqrt"; break;
|
||||
case EOpInverseSqrt: out.debug << "inverse sqrt"; break;
|
||||
|
||||
case EOpAbs: out.debug << "Absolute value"; break;
|
||||
case EOpSign: out.debug << "Sign"; break;
|
||||
case EOpFloor: out.debug << "Floor"; break;
|
||||
case EOpCeil: out.debug << "Ceiling"; break;
|
||||
case EOpFract: out.debug << "Fraction"; break;
|
||||
|
||||
case EOpLength: out.debug << "length"; break;
|
||||
case EOpNormalize: out.debug << "normalize"; break;
|
||||
// case EOpDPdx: out.debug << "dPdx"; break;
|
||||
// case EOpDPdy: out.debug << "dPdy"; break;
|
||||
// case EOpFwidth: out.debug << "fwidth"; break;
|
||||
|
||||
case EOpAny: out.debug << "any"; break;
|
||||
case EOpAll: out.debug << "all"; break;
|
||||
|
||||
default: out.debug.message(EPrefixError, "Bad unary op");
|
||||
}
|
||||
|
||||
out.debug << " (" << node->getCompleteString() << ")";
|
||||
|
||||
out.debug << "\n";
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TOutputTraverser::visitAggregate(Visit visit, TIntermAggregate* node)
|
||||
{
|
||||
TInfoSink& out = infoSink;
|
||||
|
||||
if (node->getOp() == EOpNull) {
|
||||
out.debug.message(EPrefixError, "node is still EOpNull!");
|
||||
return true;
|
||||
}
|
||||
|
||||
OutputTreeText(out, node, depth);
|
||||
|
||||
switch (node->getOp()) {
|
||||
case EOpSequence: out.debug << "Sequence\n"; return true;
|
||||
case EOpComma: out.debug << "Comma\n"; return true;
|
||||
case EOpFunction: out.debug << "Function Definition: " << node->getName(); break;
|
||||
case EOpFunctionCall: out.debug << "Function Call: " << node->getName(); break;
|
||||
case EOpParameters: out.debug << "Function Parameters: "; break;
|
||||
|
||||
case EOpConstructFloat: out.debug << "Construct float"; break;
|
||||
case EOpConstructVec2: out.debug << "Construct vec2"; break;
|
||||
case EOpConstructVec3: out.debug << "Construct vec3"; break;
|
||||
case EOpConstructVec4: out.debug << "Construct vec4"; break;
|
||||
case EOpConstructBool: out.debug << "Construct bool"; break;
|
||||
case EOpConstructBVec2: out.debug << "Construct bvec2"; break;
|
||||
case EOpConstructBVec3: out.debug << "Construct bvec3"; break;
|
||||
case EOpConstructBVec4: out.debug << "Construct bvec4"; break;
|
||||
case EOpConstructInt: out.debug << "Construct int"; break;
|
||||
case EOpConstructIVec2: out.debug << "Construct ivec2"; break;
|
||||
case EOpConstructIVec3: out.debug << "Construct ivec3"; break;
|
||||
case EOpConstructIVec4: out.debug << "Construct ivec4"; break;
|
||||
case EOpConstructMat2: out.debug << "Construct mat2"; break;
|
||||
case EOpConstructMat3: out.debug << "Construct mat3"; break;
|
||||
case EOpConstructMat4: out.debug << "Construct mat4"; break;
|
||||
case EOpConstructStruct: out.debug << "Construct structure"; break;
|
||||
|
||||
case EOpLessThan: out.debug << "Compare Less Than"; break;
|
||||
case EOpGreaterThan: out.debug << "Compare Greater Than"; break;
|
||||
case EOpLessThanEqual: out.debug << "Compare Less Than or Equal"; break;
|
||||
case EOpGreaterThanEqual: out.debug << "Compare Greater Than or Equal"; break;
|
||||
case EOpVectorEqual: out.debug << "Equal"; break;
|
||||
case EOpVectorNotEqual: out.debug << "NotEqual"; break;
|
||||
|
||||
case EOpMod: out.debug << "mod"; break;
|
||||
case EOpPow: out.debug << "pow"; break;
|
||||
|
||||
case EOpAtan: out.debug << "arc tangent"; break;
|
||||
|
||||
case EOpMin: out.debug << "min"; break;
|
||||
case EOpMax: out.debug << "max"; break;
|
||||
case EOpClamp: out.debug << "clamp"; break;
|
||||
case EOpMix: out.debug << "mix"; break;
|
||||
case EOpStep: out.debug << "step"; break;
|
||||
case EOpSmoothStep: out.debug << "smoothstep"; break;
|
||||
|
||||
case EOpDistance: out.debug << "distance"; break;
|
||||
case EOpDot: out.debug << "dot-product"; break;
|
||||
case EOpCross: out.debug << "cross-product"; break;
|
||||
case EOpFaceForward: out.debug << "face-forward"; break;
|
||||
case EOpReflect: out.debug << "reflect"; break;
|
||||
case EOpRefract: out.debug << "refract"; break;
|
||||
case EOpMul: out.debug << "component-wise multiply"; break;
|
||||
|
||||
case EOpItof: out.debug << "itof"; break;
|
||||
case EOpFtoi: out.debug << "ftoi"; break;
|
||||
case EOpSkipPixels: out.debug << "skipPixels"; break;
|
||||
case EOpReadInput: out.debug << "readInput"; break;
|
||||
case EOpWritePixel: out.debug << "writePixel"; break;
|
||||
case EOpBitmapLsb: out.debug << "bitmapLSB"; break;
|
||||
case EOpBitmapMsb: out.debug << "bitmapMSB"; break;
|
||||
case EOpWriteOutput: out.debug << "writeOutput"; break;
|
||||
case EOpReadPixel: out.debug << "readPixel"; break;
|
||||
|
||||
default: out.debug.message(EPrefixError, "Bad aggregation op");
|
||||
}
|
||||
|
||||
if (node->getOp() != EOpSequence && node->getOp() != EOpParameters)
|
||||
out.debug << " (" << node->getCompleteString() << ")";
|
||||
|
||||
out.debug << "\n";
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TOutputTraverser::visitSelection(Visit visit, TIntermSelection* node)
|
||||
{
|
||||
TInfoSink& out = infoSink;
|
||||
|
||||
OutputTreeText(out, node, depth);
|
||||
|
||||
out.debug << "Test condition and select";
|
||||
out.debug << " (" << node->getCompleteString() << ")\n";
|
||||
|
||||
++depth;
|
||||
|
||||
OutputTreeText(infoSink, node, depth);
|
||||
out.debug << "Condition\n";
|
||||
node->getCondition()->traverse(this);
|
||||
|
||||
OutputTreeText(infoSink, node, depth);
|
||||
if (node->getTrueBlock()) {
|
||||
out.debug << "true case\n";
|
||||
node->getTrueBlock()->traverse(this);
|
||||
} else
|
||||
out.debug << "true case is null\n";
|
||||
|
||||
if (node->getFalseBlock()) {
|
||||
OutputTreeText(infoSink, node, depth);
|
||||
out.debug << "false case\n";
|
||||
node->getFalseBlock()->traverse(this);
|
||||
}
|
||||
|
||||
--depth;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void TOutputTraverser::visitConstantUnion(TIntermConstantUnion* node)
|
||||
{
|
||||
TInfoSink& out = infoSink;
|
||||
|
||||
int size = node->getType().getObjectSize();
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
OutputTreeText(out, node, depth);
|
||||
switch (node->getUnionArrayPointer()[i].getType()) {
|
||||
case EbtBool:
|
||||
if (node->getUnionArrayPointer()[i].getBConst())
|
||||
out.debug << "true";
|
||||
else
|
||||
out.debug << "false";
|
||||
|
||||
out.debug << " (" << "const bool" << ")";
|
||||
|
||||
out.debug << "\n";
|
||||
break;
|
||||
case EbtFloat:
|
||||
{
|
||||
char buf[300];
|
||||
sprintf(buf, "%f (%s)", node->getUnionArrayPointer()[i].getFConst(), "const float");
|
||||
|
||||
out.debug << buf << "\n";
|
||||
}
|
||||
break;
|
||||
case EbtInt:
|
||||
{
|
||||
char buf[300];
|
||||
sprintf(buf, "%d (%s)", node->getUnionArrayPointer()[i].getIConst(), "const int");
|
||||
|
||||
out.debug << buf << "\n";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
out.info.message(EPrefixInternalError, "Unknown constant", node->getLine());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool TOutputTraverser::visitLoop(Visit visit, TIntermLoop* node)
|
||||
{
|
||||
TInfoSink& out = infoSink;
|
||||
|
||||
OutputTreeText(out, node, depth);
|
||||
|
||||
out.debug << "Loop with condition ";
|
||||
if (! node->testFirst())
|
||||
out.debug << "not ";
|
||||
out.debug << "tested first\n";
|
||||
|
||||
++depth;
|
||||
|
||||
OutputTreeText(infoSink, node, depth);
|
||||
if (node->getTest()) {
|
||||
out.debug << "Loop Condition\n";
|
||||
node->getTest()->traverse(this);
|
||||
} else
|
||||
out.debug << "No loop condition\n";
|
||||
|
||||
OutputTreeText(infoSink, node, depth);
|
||||
if (node->getBody()) {
|
||||
out.debug << "Loop Body\n";
|
||||
node->getBody()->traverse(this);
|
||||
} else
|
||||
out.debug << "No loop body\n";
|
||||
|
||||
if (node->getTerminal()) {
|
||||
OutputTreeText(infoSink, node, depth);
|
||||
out.debug << "Loop Terminal Expression\n";
|
||||
node->getTerminal()->traverse(this);
|
||||
}
|
||||
|
||||
--depth;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TOutputTraverser::visitBranch(Visit visit, TIntermBranch* node)
|
||||
{
|
||||
TInfoSink& out = infoSink;
|
||||
|
||||
OutputTreeText(out, node, depth);
|
||||
|
||||
switch (node->getFlowOp()) {
|
||||
case EOpKill: out.debug << "Branch: Kill"; break;
|
||||
case EOpBreak: out.debug << "Branch: Break"; break;
|
||||
case EOpContinue: out.debug << "Branch: Continue"; break;
|
||||
case EOpReturn: out.debug << "Branch: Return"; break;
|
||||
default: out.debug << "Branch: Unknown Branch"; break;
|
||||
}
|
||||
|
||||
if (node->getExpression()) {
|
||||
out.debug << " with expression\n";
|
||||
++depth;
|
||||
node->getExpression()->traverse(this);
|
||||
--depth;
|
||||
} else
|
||||
out.debug << "\n";
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// This function is the one to call externally to start the traversal.
|
||||
// Individual functions can be initialized to 0 to skip processing of that
|
||||
// type of node. It's children will still be processed.
|
||||
//
|
||||
void TIntermediate::outputTree(TIntermNode* root)
|
||||
{
|
||||
if (root == 0)
|
||||
return;
|
||||
|
||||
TOutputTraverser it(infoSink);
|
||||
|
||||
root->traverse(&it);
|
||||
}
|
|
@ -0,0 +1,508 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
//
|
||||
// Definition of the in-memory high-level intermediate representation
|
||||
// of shaders. This is a tree that parser creates.
|
||||
//
|
||||
// Nodes in the tree are defined as a hierarchy of classes derived from
|
||||
// TIntermNode. Each is a node in a tree. There is no preset branching factor;
|
||||
// each node can have it's own type of list of children.
|
||||
//
|
||||
|
||||
#ifndef __INTERMEDIATE_H
|
||||
#define __INTERMEDIATE_H
|
||||
|
||||
#include "Common.h"
|
||||
#include "Types.h"
|
||||
#include "ConstantUnion.h"
|
||||
|
||||
//
|
||||
// Operators used by the high-level (parse tree) representation.
|
||||
//
|
||||
enum TOperator {
|
||||
EOpNull, // if in a node, should only mean a node is still being built
|
||||
EOpSequence, // denotes a list of statements, or parameters, etc.
|
||||
EOpFunctionCall,
|
||||
EOpFunction, // For function definition
|
||||
EOpParameters, // an aggregate listing the parameters to a function
|
||||
EOpDeclaration,
|
||||
|
||||
//
|
||||
// Unary operators
|
||||
//
|
||||
|
||||
EOpNegative,
|
||||
EOpLogicalNot,
|
||||
EOpVectorLogicalNot,
|
||||
EOpBitwiseNot,
|
||||
|
||||
EOpPostIncrement,
|
||||
EOpPostDecrement,
|
||||
EOpPreIncrement,
|
||||
EOpPreDecrement,
|
||||
|
||||
EOpConvIntToBool,
|
||||
EOpConvFloatToBool,
|
||||
EOpConvBoolToFloat,
|
||||
EOpConvIntToFloat,
|
||||
EOpConvFloatToInt,
|
||||
EOpConvBoolToInt,
|
||||
|
||||
//
|
||||
// binary operations
|
||||
//
|
||||
|
||||
EOpAdd,
|
||||
EOpSub,
|
||||
EOpMul,
|
||||
EOpDiv,
|
||||
EOpMod,
|
||||
EOpRightShift,
|
||||
EOpLeftShift,
|
||||
EOpAnd,
|
||||
EOpInclusiveOr,
|
||||
EOpExclusiveOr,
|
||||
EOpEqual,
|
||||
EOpNotEqual,
|
||||
EOpVectorEqual,
|
||||
EOpVectorNotEqual,
|
||||
EOpLessThan,
|
||||
EOpGreaterThan,
|
||||
EOpLessThanEqual,
|
||||
EOpGreaterThanEqual,
|
||||
EOpComma,
|
||||
|
||||
EOpVectorTimesScalar,
|
||||
EOpVectorTimesMatrix,
|
||||
EOpMatrixTimesVector,
|
||||
EOpMatrixTimesScalar,
|
||||
|
||||
EOpLogicalOr,
|
||||
EOpLogicalXor,
|
||||
EOpLogicalAnd,
|
||||
|
||||
EOpIndexDirect,
|
||||
EOpIndexIndirect,
|
||||
EOpIndexDirectStruct,
|
||||
|
||||
EOpVectorSwizzle,
|
||||
|
||||
//
|
||||
// Built-in functions potentially mapped to operators
|
||||
//
|
||||
|
||||
EOpRadians,
|
||||
EOpDegrees,
|
||||
EOpSin,
|
||||
EOpCos,
|
||||
EOpTan,
|
||||
EOpAsin,
|
||||
EOpAcos,
|
||||
EOpAtan,
|
||||
|
||||
EOpPow,
|
||||
EOpExp,
|
||||
EOpLog,
|
||||
EOpExp2,
|
||||
EOpLog2,
|
||||
EOpSqrt,
|
||||
EOpInverseSqrt,
|
||||
|
||||
EOpAbs,
|
||||
EOpSign,
|
||||
EOpFloor,
|
||||
EOpCeil,
|
||||
EOpFract,
|
||||
EOpMin,
|
||||
EOpMax,
|
||||
EOpClamp,
|
||||
EOpMix,
|
||||
EOpStep,
|
||||
EOpSmoothStep,
|
||||
|
||||
EOpLength,
|
||||
EOpDistance,
|
||||
EOpDot,
|
||||
EOpCross,
|
||||
EOpNormalize,
|
||||
EOpFaceForward,
|
||||
EOpReflect,
|
||||
EOpRefract,
|
||||
|
||||
// EOpDPdx, // Fragment only
|
||||
// EOpDPdy, // Fragment only
|
||||
// EOpFwidth, // Fragment only
|
||||
|
||||
EOpMatrixTimesMatrix,
|
||||
|
||||
EOpAny,
|
||||
EOpAll,
|
||||
|
||||
EOpItof, // pack/unpack only
|
||||
EOpFtoi, // pack/unpack only
|
||||
EOpSkipPixels, // pack/unpack only
|
||||
EOpReadInput, // unpack only
|
||||
EOpWritePixel, // unpack only
|
||||
EOpBitmapLsb, // unpack only
|
||||
EOpBitmapMsb, // unpack only
|
||||
EOpWriteOutput, // pack only
|
||||
EOpReadPixel, // pack only
|
||||
|
||||
//
|
||||
// Branch
|
||||
//
|
||||
|
||||
EOpKill, // Fragment only
|
||||
EOpReturn,
|
||||
EOpBreak,
|
||||
EOpContinue,
|
||||
|
||||
//
|
||||
// Constructors
|
||||
//
|
||||
|
||||
EOpConstructInt,
|
||||
EOpConstructBool,
|
||||
EOpConstructFloat,
|
||||
EOpConstructVec2,
|
||||
EOpConstructVec3,
|
||||
EOpConstructVec4,
|
||||
EOpConstructBVec2,
|
||||
EOpConstructBVec3,
|
||||
EOpConstructBVec4,
|
||||
EOpConstructIVec2,
|
||||
EOpConstructIVec3,
|
||||
EOpConstructIVec4,
|
||||
EOpConstructMat2,
|
||||
EOpConstructMat3,
|
||||
EOpConstructMat4,
|
||||
EOpConstructStruct,
|
||||
|
||||
//
|
||||
// moves
|
||||
//
|
||||
|
||||
EOpAssign,
|
||||
EOpInitialize,
|
||||
EOpAddAssign,
|
||||
EOpSubAssign,
|
||||
EOpMulAssign,
|
||||
EOpVectorTimesMatrixAssign,
|
||||
EOpVectorTimesScalarAssign,
|
||||
EOpMatrixTimesScalarAssign,
|
||||
EOpMatrixTimesMatrixAssign,
|
||||
EOpDivAssign,
|
||||
EOpModAssign,
|
||||
EOpAndAssign,
|
||||
EOpInclusiveOrAssign,
|
||||
EOpExclusiveOrAssign,
|
||||
EOpLeftShiftAssign,
|
||||
EOpRightShiftAssign,
|
||||
|
||||
//
|
||||
// Array operators
|
||||
//
|
||||
|
||||
EOpArrayLength,
|
||||
};
|
||||
|
||||
class TIntermTraverser;
|
||||
class TIntermAggregate;
|
||||
class TIntermBinary;
|
||||
class TIntermConstantUnion;
|
||||
class TIntermSelection;
|
||||
class TIntermTyped;
|
||||
class TIntermSymbol;
|
||||
class TInfoSink;
|
||||
|
||||
//
|
||||
// Base class for the tree nodes
|
||||
//
|
||||
class TIntermNode {
|
||||
public:
|
||||
POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
|
||||
|
||||
TIntermNode() : line(0) {}
|
||||
virtual TSourceLoc getLine() const { return line; }
|
||||
virtual void setLine(TSourceLoc l) { line = l; }
|
||||
virtual void traverse(TIntermTraverser*) = 0;
|
||||
virtual TIntermTyped* getAsTyped() { return 0; }
|
||||
virtual TIntermConstantUnion* getAsConstantUnion() { return 0; }
|
||||
virtual TIntermAggregate* getAsAggregate() { return 0; }
|
||||
virtual TIntermBinary* getAsBinaryNode() { return 0; }
|
||||
virtual TIntermSelection* getAsSelectionNode() { return 0; }
|
||||
virtual TIntermSymbol* getAsSymbolNode() { return 0; }
|
||||
virtual ~TIntermNode() { }
|
||||
protected:
|
||||
TSourceLoc line;
|
||||
};
|
||||
|
||||
//
|
||||
// This is just to help yacc.
|
||||
//
|
||||
struct TIntermNodePair {
|
||||
TIntermNode* node1;
|
||||
TIntermNode* node2;
|
||||
};
|
||||
|
||||
class TIntermSymbol;
|
||||
class TIntermBinary;
|
||||
|
||||
//
|
||||
// Intermediate class for nodes that have a type.
|
||||
//
|
||||
class TIntermTyped : public TIntermNode {
|
||||
public:
|
||||
TIntermTyped(const TType& t) : type(t) { }
|
||||
virtual TIntermTyped* getAsTyped() { return this; }
|
||||
virtual void setType(const TType& t) { type = t; }
|
||||
virtual TType getType() const { return type; }
|
||||
virtual TType* getTypePointer() { return &type; }
|
||||
|
||||
virtual TBasicType getBasicType() const { return type.getBasicType(); }
|
||||
virtual TQualifier getQualifier() const { return type.getQualifier(); }
|
||||
virtual int getNominalSize() const { return type.getNominalSize(); }
|
||||
virtual int getSize() const { return type.getInstanceSize(); }
|
||||
virtual bool isMatrix() const { return type.isMatrix(); }
|
||||
virtual bool isArray() const { return type.isArray(); }
|
||||
virtual bool isVector() const { return type.isVector(); }
|
||||
const char* getBasicString() const { return type.getBasicString(); }
|
||||
const char* getQualifierString() const { return type.getQualifierString(); }
|
||||
TString getCompleteString() const { return type.getCompleteString(); }
|
||||
|
||||
protected:
|
||||
TType type;
|
||||
};
|
||||
|
||||
//
|
||||
// Handle for, do-while, and while loops.
|
||||
//
|
||||
class TIntermLoop : public TIntermNode {
|
||||
public:
|
||||
TIntermLoop(TIntermNode *init, TIntermNode* aBody, TIntermTyped* aTest, TIntermTyped* aTerminal, bool testFirst) :
|
||||
init(init),
|
||||
body(aBody),
|
||||
test(aTest),
|
||||
terminal(aTerminal),
|
||||
first(testFirst) { }
|
||||
virtual void traverse(TIntermTraverser*);
|
||||
TIntermNode *getInit() { return init; }
|
||||
TIntermNode *getBody() { return body; }
|
||||
TIntermTyped *getTest() { return test; }
|
||||
TIntermTyped *getTerminal() { return terminal; }
|
||||
bool testFirst() { return first; }
|
||||
protected:
|
||||
TIntermNode *init;
|
||||
TIntermNode *body; // code to loop over
|
||||
TIntermTyped *test; // exit condition associated with loop, could be 0 for 'for' loops
|
||||
TIntermTyped *terminal; // exists for for-loops
|
||||
bool first; // true for while and for, not for do-while
|
||||
};
|
||||
|
||||
//
|
||||
// Handle break, continue, return, and kill.
|
||||
//
|
||||
class TIntermBranch : public TIntermNode {
|
||||
public:
|
||||
TIntermBranch(TOperator op, TIntermTyped* e) :
|
||||
flowOp(op),
|
||||
expression(e) { }
|
||||
virtual void traverse(TIntermTraverser*);
|
||||
TOperator getFlowOp() { return flowOp; }
|
||||
TIntermTyped* getExpression() { return expression; }
|
||||
protected:
|
||||
TOperator flowOp;
|
||||
TIntermTyped* expression; // non-zero except for "return exp;" statements
|
||||
};
|
||||
|
||||
//
|
||||
// Nodes that correspond to symbols or constants in the source code.
|
||||
//
|
||||
class TIntermSymbol : public TIntermTyped {
|
||||
public:
|
||||
// if symbol is initialized as symbol(sym), the memory comes from the poolallocator of sym. If sym comes from
|
||||
// per process globalpoolallocator, then it causes increased memory usage per compile
|
||||
// it is essential to use "symbol = sym" to assign to symbol
|
||||
TIntermSymbol(int i, const TString& sym, const TType& t) :
|
||||
TIntermTyped(t), id(i) { symbol = sym;}
|
||||
virtual int getId() const { return id; }
|
||||
virtual const TString& getSymbol() const { return symbol; }
|
||||
virtual void traverse(TIntermTraverser*);
|
||||
virtual TIntermSymbol* getAsSymbolNode() { return this; }
|
||||
protected:
|
||||
int id;
|
||||
TString symbol;
|
||||
};
|
||||
|
||||
class TIntermConstantUnion : public TIntermTyped {
|
||||
public:
|
||||
TIntermConstantUnion(constUnion *unionPointer, const TType& t) : TIntermTyped(t), unionArrayPointer(unionPointer) { }
|
||||
constUnion* getUnionArrayPointer() const { return unionArrayPointer; }
|
||||
void setUnionArrayPointer(constUnion *c) { unionArrayPointer = c; }
|
||||
virtual TIntermConstantUnion* getAsConstantUnion() { return this; }
|
||||
virtual void traverse(TIntermTraverser* );
|
||||
virtual TIntermTyped* fold(TOperator, TIntermTyped*, TInfoSink&);
|
||||
protected:
|
||||
constUnion *unionArrayPointer;
|
||||
};
|
||||
|
||||
//
|
||||
// Intermediate class for node types that hold operators.
|
||||
//
|
||||
class TIntermOperator : public TIntermTyped {
|
||||
public:
|
||||
TOperator getOp() const { return op; }
|
||||
bool modifiesState() const;
|
||||
bool isConstructor() const;
|
||||
virtual bool promote(TInfoSink&) { return true; }
|
||||
protected:
|
||||
TIntermOperator(TOperator o) : TIntermTyped(TType(EbtFloat)), op(o) {}
|
||||
TIntermOperator(TOperator o, TType& t) : TIntermTyped(t), op(o) {}
|
||||
TOperator op;
|
||||
};
|
||||
|
||||
//
|
||||
// Nodes for all the basic binary math operators.
|
||||
//
|
||||
class TIntermBinary : public TIntermOperator {
|
||||
public:
|
||||
TIntermBinary(TOperator o) : TIntermOperator(o) {}
|
||||
virtual void traverse(TIntermTraverser*);
|
||||
virtual void setLeft(TIntermTyped* n) { left = n; }
|
||||
virtual void setRight(TIntermTyped* n) { right = n; }
|
||||
virtual TIntermTyped* getLeft() const { return left; }
|
||||
virtual TIntermTyped* getRight() const { return right; }
|
||||
virtual TIntermBinary* getAsBinaryNode() { return this; }
|
||||
virtual bool promote(TInfoSink&);
|
||||
protected:
|
||||
TIntermTyped* left;
|
||||
TIntermTyped* right;
|
||||
};
|
||||
|
||||
//
|
||||
// Nodes for unary math operators.
|
||||
//
|
||||
class TIntermUnary : public TIntermOperator {
|
||||
public:
|
||||
TIntermUnary(TOperator o, TType& t) : TIntermOperator(o, t), operand(0) {}
|
||||
TIntermUnary(TOperator o) : TIntermOperator(o), operand(0) {}
|
||||
virtual void traverse(TIntermTraverser*);
|
||||
virtual void setOperand(TIntermTyped* o) { operand = o; }
|
||||
virtual TIntermTyped* getOperand() { return operand; }
|
||||
virtual bool promote(TInfoSink&);
|
||||
protected:
|
||||
TIntermTyped* operand;
|
||||
};
|
||||
|
||||
typedef TVector<TIntermNode*> TIntermSequence;
|
||||
typedef TVector<int> TQualifierList;
|
||||
//
|
||||
// Nodes that operate on an arbitrary sized set of children.
|
||||
//
|
||||
class TIntermAggregate : public TIntermOperator {
|
||||
public:
|
||||
TIntermAggregate() : TIntermOperator(EOpNull), userDefined(false), pragmaTable(0) { }
|
||||
TIntermAggregate(TOperator o) : TIntermOperator(o), pragmaTable(0) { }
|
||||
~TIntermAggregate() { delete pragmaTable; }
|
||||
virtual TIntermAggregate* getAsAggregate() { return this; }
|
||||
virtual void setOperator(TOperator o) { op = o; }
|
||||
virtual TIntermSequence& getSequence() { return sequence; }
|
||||
virtual void setName(const TString& n) { name = n; }
|
||||
virtual const TString& getName() const { return name; }
|
||||
virtual void traverse(TIntermTraverser*);
|
||||
virtual void setUserDefined() { userDefined = true; }
|
||||
virtual bool isUserDefined() { return userDefined; }
|
||||
virtual TQualifierList& getQualifier() { return qualifier; }
|
||||
void setOptimize(bool o) { optimize = o; }
|
||||
void setDebug(bool d) { debug = d; }
|
||||
bool getOptimize() { return optimize; }
|
||||
bool getDebug() { return debug; }
|
||||
void addToPragmaTable(const TPragmaTable& pTable);
|
||||
const TPragmaTable& getPragmaTable() const { return *pragmaTable; }
|
||||
protected:
|
||||
TIntermAggregate(const TIntermAggregate&); // disallow copy constructor
|
||||
TIntermAggregate& operator=(const TIntermAggregate&); // disallow assignment operator
|
||||
TIntermSequence sequence;
|
||||
TQualifierList qualifier;
|
||||
TString name;
|
||||
bool userDefined; // used for user defined function names
|
||||
bool optimize;
|
||||
bool debug;
|
||||
TPragmaTable *pragmaTable;
|
||||
};
|
||||
|
||||
//
|
||||
// For if tests. Simplified since there is no switch statement.
|
||||
//
|
||||
class TIntermSelection : public TIntermTyped {
|
||||
public:
|
||||
TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB) :
|
||||
TIntermTyped(TType(EbtVoid)), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
|
||||
TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB, const TType& type) :
|
||||
TIntermTyped(type), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
|
||||
virtual void traverse(TIntermTraverser*);
|
||||
virtual TIntermNode* getCondition() const { return condition; }
|
||||
virtual TIntermNode* getTrueBlock() const { return trueBlock; }
|
||||
virtual TIntermNode* getFalseBlock() const { return falseBlock; }
|
||||
virtual TIntermSelection* getAsSelectionNode() { return this; }
|
||||
protected:
|
||||
TIntermTyped* condition;
|
||||
TIntermNode* trueBlock;
|
||||
TIntermNode* falseBlock;
|
||||
};
|
||||
|
||||
enum Visit
|
||||
{
|
||||
PreVisit,
|
||||
InVisit,
|
||||
PostVisit
|
||||
};
|
||||
|
||||
//
|
||||
// For traversing the tree. User should derive from this,
|
||||
// put their traversal specific data in it, and then pass
|
||||
// it to a Traverse method.
|
||||
//
|
||||
// When using this, just fill in the methods for nodes you want visited.
|
||||
// Return false from a pre-visit to skip visiting that node's subtree.
|
||||
//
|
||||
class TIntermTraverser
|
||||
{
|
||||
public:
|
||||
POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
|
||||
|
||||
TIntermTraverser(bool preVisit = true, bool inVisit = false, bool postVisit = false, bool rightToLeft = false) :
|
||||
preVisit(preVisit),
|
||||
inVisit(inVisit),
|
||||
postVisit(postVisit),
|
||||
rightToLeft(rightToLeft)
|
||||
{
|
||||
depth = 0;
|
||||
}
|
||||
|
||||
virtual void visitSymbol(TIntermSymbol*) {}
|
||||
virtual void visitConstantUnion(TIntermConstantUnion*) {}
|
||||
virtual bool visitBinary(Visit visit, TIntermBinary*) {return true;}
|
||||
virtual bool visitUnary(Visit visit, TIntermUnary*) {return true;}
|
||||
virtual bool visitSelection(Visit visit, TIntermSelection*) {return true;}
|
||||
virtual bool visitAggregate(Visit visit, TIntermAggregate*) {return true;}
|
||||
virtual bool visitLoop(Visit visit, TIntermLoop*) {return true;}
|
||||
virtual bool visitBranch(Visit visit, TIntermBranch*) {return true;}
|
||||
|
||||
void incrementDepth() {depth++;}
|
||||
void decrementDepth() {depth--;}
|
||||
|
||||
const bool preVisit;
|
||||
const bool inVisit;
|
||||
const bool postVisit;
|
||||
const bool rightToLeft;
|
||||
|
||||
protected:
|
||||
int depth;
|
||||
};
|
||||
|
||||
#endif // __INTERMEDIATE_H
|
|
@ -0,0 +1,58 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef _LOCAL_INTERMEDIATE_INCLUDED_
|
||||
#define _LOCAL_INTERMEDIATE_INCLUDED_
|
||||
|
||||
#include "intermediate.h"
|
||||
#include "ShaderLang.h"
|
||||
#include "SymbolTable.h"
|
||||
|
||||
struct TVectorFields {
|
||||
int offsets[4];
|
||||
int num;
|
||||
};
|
||||
|
||||
//
|
||||
// Set of helper functions to help parse and build the tree.
|
||||
//
|
||||
class TInfoSink;
|
||||
class TIntermediate {
|
||||
public:
|
||||
POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
|
||||
|
||||
TIntermediate(TInfoSink& i) : infoSink(i) { }
|
||||
TIntermSymbol* addSymbol(int Id, const TString&, const TType&, TSourceLoc);
|
||||
TIntermTyped* addConversion(TOperator, const TType&, TIntermTyped*);
|
||||
TIntermTyped* addBinaryMath(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc, TSymbolTable&);
|
||||
TIntermTyped* addAssign(TOperator op, TIntermTyped* left, TIntermTyped* right, TSourceLoc);
|
||||
TIntermTyped* addIndex(TOperator op, TIntermTyped* base, TIntermTyped* index, TSourceLoc);
|
||||
TIntermTyped* addUnaryMath(TOperator op, TIntermNode* child, TSourceLoc, TSymbolTable&);
|
||||
TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right, TSourceLoc);
|
||||
TIntermAggregate* makeAggregate(TIntermNode* node, TSourceLoc);
|
||||
TIntermAggregate* setAggregateOperator(TIntermNode*, TOperator, TSourceLoc);
|
||||
TIntermNode* addSelection(TIntermTyped* cond, TIntermNodePair code, TSourceLoc);
|
||||
TIntermTyped* addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, TSourceLoc);
|
||||
TIntermTyped* addComma(TIntermTyped* left, TIntermTyped* right, TSourceLoc);
|
||||
TIntermConstantUnion* addConstantUnion(constUnion*, const TType&, TSourceLoc);
|
||||
TIntermTyped* promoteConstantUnion(TBasicType, TIntermConstantUnion*) ;
|
||||
bool parseConstTree(TSourceLoc, TIntermNode*, constUnion*, TOperator, TSymbolTable&, TType, bool singleConstantParam = false);
|
||||
TIntermNode* addLoop(TIntermNode*, TIntermNode*, TIntermTyped*, TIntermTyped*, bool testFirst, TSourceLoc);
|
||||
TIntermBranch* addBranch(TOperator, TSourceLoc);
|
||||
TIntermBranch* addBranch(TOperator, TIntermTyped*, TSourceLoc);
|
||||
TIntermTyped* addSwizzle(TVectorFields&, TSourceLoc);
|
||||
bool postProcess(TIntermNode*, EShLanguage);
|
||||
void remove(TIntermNode*);
|
||||
void outputTree(TIntermNode*);
|
||||
|
||||
protected:
|
||||
TInfoSink& infoSink;
|
||||
|
||||
private:
|
||||
void operator=(TIntermediate&); // prevent assignments
|
||||
};
|
||||
|
||||
#endif // _LOCAL_INTERMEDIATE_INCLUDED_
|
|
@ -0,0 +1,41 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#ifndef __OSINCLUDE_H
|
||||
#define __OSINCLUDE_H
|
||||
|
||||
//
|
||||
// This file contains contains the window's specific datatypes and
|
||||
// declares any windows specific functions.
|
||||
//
|
||||
|
||||
#if !(defined(_WIN32) || defined(_WIN64))
|
||||
#error Trying to include a windows specific file in a non windows build.
|
||||
#endif
|
||||
|
||||
#define STRICT
|
||||
#define VC_EXTRALEAN 1
|
||||
#include <windows.h>
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
//
|
||||
// Thread Local Storage Operations
|
||||
//
|
||||
typedef DWORD OS_TLSIndex;
|
||||
#define OS_INVALID_TLS_INDEX (TLS_OUT_OF_INDEXES)
|
||||
|
||||
OS_TLSIndex OS_AllocTLSIndex();
|
||||
bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue);
|
||||
bool OS_FreeTLSIndex(OS_TLSIndex nIndex);
|
||||
|
||||
inline void* OS_GetTLSValue(OS_TLSIndex nIndex)
|
||||
{
|
||||
assert(nIndex != OS_INVALID_TLS_INDEX);
|
||||
return TlsGetValue(nIndex);
|
||||
}
|
||||
|
||||
#endif // __OSINCLUDE_H
|
|
@ -0,0 +1,57 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#include "osinclude.h"
|
||||
//
|
||||
// This file contains contains the window's specific functions
|
||||
//
|
||||
|
||||
#if !(defined(_WIN32) || defined(_WIN64))
|
||||
#error Trying to build a windows specific file in a non windows build.
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// Thread Local Storage Operations
|
||||
//
|
||||
OS_TLSIndex OS_AllocTLSIndex()
|
||||
{
|
||||
DWORD dwIndex = TlsAlloc();
|
||||
if (dwIndex == TLS_OUT_OF_INDEXES) {
|
||||
assert(0 && "OS_AllocTLSIndex(): Unable to allocate Thread Local Storage");
|
||||
return OS_INVALID_TLS_INDEX;
|
||||
}
|
||||
|
||||
return dwIndex;
|
||||
}
|
||||
|
||||
|
||||
bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue)
|
||||
{
|
||||
if (nIndex == OS_INVALID_TLS_INDEX) {
|
||||
assert(0 && "OS_SetTLSValue(): Invalid TLS Index");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (TlsSetValue(nIndex, lpvValue))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool OS_FreeTLSIndex(OS_TLSIndex nIndex)
|
||||
{
|
||||
if (nIndex == OS_INVALID_TLS_INDEX) {
|
||||
assert(0 && "OS_SetTLSValue(): Invalid TLS Index");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (TlsFree(nIndex))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
|
@ -0,0 +1,227 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
#include "ParseHelper.h"
|
||||
|
||||
//
|
||||
// Use this class to carry along data from node to node in
|
||||
// the traversal
|
||||
//
|
||||
class TConstTraverser : public TIntermTraverser {
|
||||
public:
|
||||
TConstTraverser(constUnion* cUnion, bool singleConstParam, TOperator constructType, TInfoSink& sink, TSymbolTable& symTable, TType& t) : unionArray(cUnion), type(t),
|
||||
constructorType(constructType), singleConstantParam(singleConstParam), infoSink(sink), symbolTable(symTable), error(false), isMatrix(false), matrixSize(0)
|
||||
{
|
||||
index = 0;
|
||||
}
|
||||
|
||||
bool error;
|
||||
|
||||
protected:
|
||||
void visitSymbol(TIntermSymbol*);
|
||||
void visitConstantUnion(TIntermConstantUnion*);
|
||||
bool visitBinary(Visit visit, TIntermBinary*);
|
||||
bool visitUnary(Visit visit, TIntermUnary*);
|
||||
bool visitSelection(Visit visit, TIntermSelection*);
|
||||
bool visitAggregate(Visit visit, TIntermAggregate*);
|
||||
bool visitLoop(Visit visit, TIntermLoop*);
|
||||
bool visitBranch(Visit visit, TIntermBranch*);
|
||||
|
||||
int index;
|
||||
constUnion *unionArray;
|
||||
TType type;
|
||||
TOperator constructorType;
|
||||
bool singleConstantParam;
|
||||
TInfoSink& infoSink;
|
||||
TSymbolTable& symbolTable;
|
||||
int size; // size of the constructor ( 4 for vec4)
|
||||
bool isMatrix;
|
||||
int matrixSize; // dimension of the matrix (nominal size and not the instance size)
|
||||
};
|
||||
|
||||
//
|
||||
// The rest of the file are the traversal functions. The last one
|
||||
// is the one that starts the traversal.
|
||||
//
|
||||
// Return true from interior nodes to have the external traversal
|
||||
// continue on to children. If you process children yourself,
|
||||
// return false.
|
||||
//
|
||||
|
||||
void TConstTraverser::visitSymbol(TIntermSymbol* node)
|
||||
{
|
||||
infoSink.info.message(EPrefixInternalError, "Symbol Node found in constant constructor", node->getLine());
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
bool TConstTraverser::visitBinary(Visit visit, TIntermBinary* node)
|
||||
{
|
||||
TQualifier qualifier = node->getType().getQualifier();
|
||||
|
||||
if (qualifier != EvqConst) {
|
||||
char buf[200];
|
||||
sprintf(buf, "'constructor' : assigning non-constant to %s", type.getCompleteString().c_str());
|
||||
infoSink.info.message(EPrefixError, buf, node->getLine());
|
||||
error = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
infoSink.info.message(EPrefixInternalError, "Binary Node found in constant constructor", node->getLine());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TConstTraverser::visitUnary(Visit visit, TIntermUnary* node)
|
||||
{
|
||||
char buf[200];
|
||||
sprintf(buf, "'constructor' : assigning non-constant to '%s'", type.getCompleteString().c_str());
|
||||
infoSink.info.message(EPrefixError, buf, node->getLine());
|
||||
error = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TConstTraverser::visitAggregate(Visit visit, TIntermAggregate* node)
|
||||
{
|
||||
if (!node->isConstructor() && node->getOp() != EOpComma) {
|
||||
char buf[200];
|
||||
sprintf(buf, "'constructor' : assigning non-constant to '%s'", type.getCompleteString().c_str());
|
||||
infoSink.info.message(EPrefixError, buf, node->getLine());
|
||||
error = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (node->getSequence().size() == 0) {
|
||||
error = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool flag = node->getSequence().size() == 1 && node->getSequence()[0]->getAsTyped()->getAsConstantUnion();
|
||||
if (flag)
|
||||
{
|
||||
singleConstantParam = true;
|
||||
constructorType = node->getOp();
|
||||
size = node->getType().getObjectSize();
|
||||
|
||||
if (node->getType().isMatrix()) {
|
||||
isMatrix = true;
|
||||
matrixSize = node->getType().getNominalSize();
|
||||
}
|
||||
}
|
||||
|
||||
for (TIntermSequence::iterator p = node->getSequence().begin();
|
||||
p != node->getSequence().end(); p++) {
|
||||
|
||||
if (node->getOp() == EOpComma)
|
||||
index = 0;
|
||||
|
||||
(*p)->traverse(this);
|
||||
}
|
||||
if (flag)
|
||||
{
|
||||
singleConstantParam = false;
|
||||
constructorType = EOpNull;
|
||||
size = 0;
|
||||
isMatrix = false;
|
||||
matrixSize = 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TConstTraverser::visitSelection(Visit visit, TIntermSelection* node)
|
||||
{
|
||||
infoSink.info.message(EPrefixInternalError, "Selection Node found in constant constructor", node->getLine());
|
||||
error = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void TConstTraverser::visitConstantUnion(TIntermConstantUnion* node)
|
||||
{
|
||||
constUnion* leftUnionArray = unionArray;
|
||||
int instanceSize = type.getObjectSize();
|
||||
|
||||
if (index >= instanceSize)
|
||||
return;
|
||||
|
||||
if (!singleConstantParam) {
|
||||
int size = node->getType().getObjectSize();
|
||||
|
||||
constUnion *rightUnionArray = node->getUnionArrayPointer();
|
||||
for (int i=0; i < size; i++) {
|
||||
if (index >= instanceSize)
|
||||
return;
|
||||
leftUnionArray[index] = rightUnionArray[i];
|
||||
|
||||
(index)++;
|
||||
}
|
||||
} else {
|
||||
int totalSize = index + size;
|
||||
constUnion *rightUnionArray = node->getUnionArrayPointer();
|
||||
if (!isMatrix) {
|
||||
int count = 0;
|
||||
for (int i = index; i < totalSize; i++) {
|
||||
if (i >= instanceSize)
|
||||
return;
|
||||
|
||||
leftUnionArray[i] = rightUnionArray[count];
|
||||
|
||||
(index)++;
|
||||
|
||||
if (node->getType().getObjectSize() > 1)
|
||||
count++;
|
||||
}
|
||||
} else { // for matrix constructors
|
||||
int count = 0;
|
||||
int element = index;
|
||||
for (int i = index; i < totalSize; i++) {
|
||||
if (i >= instanceSize)
|
||||
return;
|
||||
if (element - i == 0 || (i - element) % (matrixSize + 1) == 0 )
|
||||
leftUnionArray[i] = rightUnionArray[count];
|
||||
else
|
||||
leftUnionArray[i].setFConst(0.0f);
|
||||
|
||||
(element)++;
|
||||
|
||||
if (node->getType().getObjectSize() > 1)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool TConstTraverser::visitLoop(Visit visit, TIntermLoop* node)
|
||||
{
|
||||
infoSink.info.message(EPrefixInternalError, "Loop Node found in constant constructor", node->getLine());
|
||||
error = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool TConstTraverser::visitBranch(Visit visit, TIntermBranch* node)
|
||||
{
|
||||
infoSink.info.message(EPrefixInternalError, "Branch Node found in constant constructor", node->getLine());
|
||||
error = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// This function is the one to call externally to start the traversal.
|
||||
// Individual functions can be initialized to 0 to skip processing of that
|
||||
// type of node. It's children will still be processed.
|
||||
//
|
||||
bool TIntermediate::parseConstTree(TSourceLoc line, TIntermNode* root, constUnion* unionArray, TOperator constructorType, TSymbolTable& symbolTable, TType t, bool singleConstantParam)
|
||||
{
|
||||
if (root == 0)
|
||||
return false;
|
||||
|
||||
TConstTraverser it(unionArray, singleConstantParam, constructorType, infoSink, symbolTable, t);
|
||||
|
||||
root->traverse(&it);
|
||||
if (it.error)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
// This is a NULL file and is meant to be empty
|
|
@ -0,0 +1,115 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Config.h: Defines the egl::Config class, describing the format, type
|
||||
// and size for an egl::Surface. Implements EGLConfig and related functionality.
|
||||
// [EGL 1.4] section 3.4 page 15.
|
||||
|
||||
#ifndef INCLUDE_CONFIG_H_
|
||||
#define INCLUDE_CONFIG_H_
|
||||
|
||||
#define EGLAPI
|
||||
#include <EGL/egl.h>
|
||||
#include <d3d9.h>
|
||||
|
||||
#include <set>
|
||||
|
||||
#include "angleutils.h"
|
||||
|
||||
namespace egl
|
||||
{
|
||||
class Config
|
||||
{
|
||||
public:
|
||||
Config(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample);
|
||||
|
||||
void setDefaults();
|
||||
void set(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample);
|
||||
EGLConfig getHandle() const;
|
||||
|
||||
const D3DDISPLAYMODE mDisplayMode;
|
||||
const D3DFORMAT mRenderTargetFormat;
|
||||
const D3DFORMAT mDepthStencilFormat;
|
||||
const EGLint mMultiSample;
|
||||
|
||||
EGLint mBufferSize; // Depth of the color buffer
|
||||
EGLint mRedSize; // Bits of Red in the color buffer
|
||||
EGLint mGreenSize; // Bits of Green in the color buffer
|
||||
EGLint mBlueSize; // Bits of Blue in the color buffer
|
||||
EGLint mLuminanceSize; // Bits of Luminance in the color buffer
|
||||
EGLint mAlphaSize; // Bits of Alpha in the color buffer
|
||||
EGLint mAlphaMaskSize; // Bits of Alpha Mask in the mask buffer
|
||||
EGLBoolean mBindToTextureRGB; // True if bindable to RGB textures.
|
||||
EGLBoolean mBindToTextureRGBA; // True if bindable to RGBA textures.
|
||||
EGLenum mColorBufferType; // Color buffer type
|
||||
EGLenum mConfigCaveat; // Any caveats for the configuration
|
||||
EGLint mConfigID; // Unique EGLConfig identifier
|
||||
EGLint mConformant; // Whether contexts created with this config are conformant
|
||||
EGLint mDepthSize; // Bits of Z in the depth buffer
|
||||
EGLint mLevel; // Frame buffer level
|
||||
EGLBoolean mMatchNativePixmap; // Match the native pixmap format
|
||||
EGLint mMaxPBufferWidth; // Maximum width of pbuffer
|
||||
EGLint mMaxPBufferHeight; // Maximum height of pbuffer
|
||||
EGLint mMaxPBufferPixels; // Maximum size of pbuffer
|
||||
EGLint mMaxSwapInterval; // Maximum swap interval
|
||||
EGLint mMinSwapInterval; // Minimum swap interval
|
||||
EGLBoolean mNativeRenderable; // EGL_TRUE if native rendering APIs can render to surface
|
||||
EGLint mNativeVisualID; // Handle of corresponding native visual
|
||||
EGLint mNativeVisualType; // Native visual type of the associated visual
|
||||
EGLint mRenderableType; // Which client rendering APIs are supported.
|
||||
EGLint mSampleBuffers; // Number of multisample buffers
|
||||
EGLint mSamples; // Number of samples per pixel
|
||||
EGLint mStencilSize; // Bits of Stencil in the stencil buffer
|
||||
EGLint mSurfaceType; // Which types of EGL surfaces are supported.
|
||||
EGLenum mTransparentType; // Type of transparency supported
|
||||
EGLint mTransparentRedValue; // Transparent red value
|
||||
EGLint mTransparentGreenValue; // Transparent green value
|
||||
EGLint mTransparentBlueValue; // Transparent blue value
|
||||
};
|
||||
|
||||
// Function object used by STL sorting routines for ordering Configs according to [EGL] section 3.4.1 page 24.
|
||||
class SortConfig
|
||||
{
|
||||
public:
|
||||
explicit SortConfig(const EGLint *attribList);
|
||||
|
||||
bool operator()(const Config *x, const Config *y) const;
|
||||
bool operator()(const Config &x, const Config &y) const;
|
||||
|
||||
private:
|
||||
void scanForWantedComponents(const EGLint *attribList);
|
||||
EGLint wantedComponentsSize(const Config &config) const;
|
||||
|
||||
bool mWantRed;
|
||||
bool mWantGreen;
|
||||
bool mWantBlue;
|
||||
bool mWantAlpha;
|
||||
bool mWantLuminance;
|
||||
};
|
||||
|
||||
class ConfigSet
|
||||
{
|
||||
public:
|
||||
ConfigSet();
|
||||
|
||||
void add(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample);
|
||||
void enumerate();
|
||||
size_t size() const;
|
||||
bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig);
|
||||
const egl::Config *get(EGLConfig configHandle);
|
||||
|
||||
typedef std::set<Config, SortConfig> Set;
|
||||
typedef Set::iterator Iterator;
|
||||
Set mSet;
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ConfigSet);
|
||||
|
||||
static const EGLint mSortAttribs[];
|
||||
};
|
||||
}
|
||||
|
||||
#endif // INCLUDE_CONFIG_H_
|
|
@ -0,0 +1,292 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Context.h: Defines the gl::Context class, managing all GL state and performing
|
||||
// rendering operations. It is the GLES2 specific implementation of EGLContext.
|
||||
|
||||
#ifndef INCLUDE_CONTEXT_H_
|
||||
#define INCLUDE_CONTEXT_H_
|
||||
|
||||
#define GL_APICALL
|
||||
#include <GLES2/gl2.h>
|
||||
#define EGLAPI
|
||||
#include <EGL/egl.h>
|
||||
#include <d3d9.h>
|
||||
|
||||
#include <map>
|
||||
|
||||
#include "angleutils.h"
|
||||
|
||||
namespace egl
|
||||
{
|
||||
class Display;
|
||||
class Surface;
|
||||
class Config;
|
||||
}
|
||||
|
||||
namespace gl
|
||||
{
|
||||
class Buffer;
|
||||
class Shader;
|
||||
class Program;
|
||||
class Texture;
|
||||
class Texture2D;
|
||||
class TextureCubeMap;
|
||||
class Framebuffer;
|
||||
class Renderbuffer;
|
||||
class Colorbuffer;
|
||||
class Depthbuffer;
|
||||
class Stencilbuffer;
|
||||
|
||||
enum
|
||||
{
|
||||
MAX_VERTEX_ATTRIBS = 8,
|
||||
MAX_VERTEX_UNIFORM_VECTORS = 128,
|
||||
MAX_VARYING_VECTORS = 8,
|
||||
MAX_COMBINED_TEXTURE_IMAGE_UNITS = 8,
|
||||
MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0,
|
||||
MAX_TEXTURE_IMAGE_UNITS = 8,
|
||||
MAX_FRAGMENT_UNIFORM_VECTORS = 16,
|
||||
MAX_RENDERBUFFER_SIZE = 4096, // FIXME: Verify
|
||||
MAX_DRAW_BUFFERS = 1,
|
||||
|
||||
IMPLEMENTATION_COLOR_READ_FORMAT = GL_RGB,
|
||||
IMPLEMENTATION_COLOR_READ_TYPE = GL_UNSIGNED_SHORT_5_6_5
|
||||
};
|
||||
|
||||
struct Color
|
||||
{
|
||||
float red;
|
||||
float green;
|
||||
float blue;
|
||||
float alpha;
|
||||
};
|
||||
|
||||
// Helper structure describing a single vertex attribute array
|
||||
struct Array
|
||||
{
|
||||
Array();
|
||||
|
||||
bool enabled;
|
||||
GLuint boundBuffer;
|
||||
GLint size;
|
||||
GLenum type;
|
||||
GLboolean normalized;
|
||||
GLsizei stride;
|
||||
const void *pointer;
|
||||
};
|
||||
|
||||
// Helper structure to store all raw state
|
||||
struct State
|
||||
{
|
||||
Color colorClearValue;
|
||||
GLclampf depthClearValue;
|
||||
int stencilClearValue;
|
||||
|
||||
bool cullFace;
|
||||
GLenum cullMode;
|
||||
GLenum frontFace;
|
||||
bool depthTest;
|
||||
GLenum depthFunc;
|
||||
bool blend;
|
||||
GLenum sourceBlendRGB;
|
||||
GLenum destBlendRGB;
|
||||
GLenum sourceBlendAlpha;
|
||||
GLenum destBlendAlpha;
|
||||
GLenum blendEquationRGB;
|
||||
GLenum blendEquationAlpha;
|
||||
Color blendColor;
|
||||
bool stencilTest;
|
||||
GLenum stencilFunc;
|
||||
GLint stencilRef;
|
||||
GLuint stencilMask;
|
||||
GLenum stencilFail;
|
||||
GLenum stencilPassDepthFail;
|
||||
GLenum stencilPassDepthPass;
|
||||
GLuint stencilWritemask;
|
||||
GLenum stencilBackFunc;
|
||||
GLint stencilBackRef;
|
||||
GLuint stencilBackMask;
|
||||
GLenum stencilBackFail;
|
||||
GLenum stencilBackPassDepthFail;
|
||||
GLenum stencilBackPassDepthPass;
|
||||
GLuint stencilBackWritemask;
|
||||
bool polygonOffsetFill;
|
||||
bool sampleAlphaToCoverage;
|
||||
bool sampleCoverage;
|
||||
GLclampf sampleCoverageValue;
|
||||
GLboolean sampleCoverageInvert;
|
||||
bool scissorTest;
|
||||
bool dither;
|
||||
|
||||
GLint viewportX;
|
||||
GLint viewportY;
|
||||
GLsizei viewportWidth;
|
||||
GLsizei viewportHeight;
|
||||
float zNear;
|
||||
float zFar;
|
||||
|
||||
GLint scissorX;
|
||||
GLint scissorY;
|
||||
GLsizei scissorWidth;
|
||||
GLsizei scissorHeight;
|
||||
|
||||
bool colorMaskRed;
|
||||
bool colorMaskGreen;
|
||||
bool colorMaskBlue;
|
||||
bool colorMaskAlpha;
|
||||
bool depthMask;
|
||||
|
||||
int activeSampler; // Active texture unit selector - GL_TEXTURE0
|
||||
GLuint arrayBuffer;
|
||||
GLuint elementArrayBuffer;
|
||||
GLuint texture2D;
|
||||
GLuint textureCubeMap;
|
||||
GLuint framebuffer;
|
||||
GLuint renderbuffer;
|
||||
GLuint currentProgram;
|
||||
|
||||
Array vertexAttribute[MAX_VERTEX_ATTRIBS];
|
||||
GLuint samplerTexture[MAX_TEXTURE_IMAGE_UNITS];
|
||||
|
||||
unsigned int startIndex;
|
||||
};
|
||||
|
||||
class Context : public State
|
||||
{
|
||||
public:
|
||||
Context(const egl::Config *config);
|
||||
|
||||
~Context();
|
||||
|
||||
void makeCurrent(egl::Display *display, egl::Surface *surface);
|
||||
|
||||
void setClearColor(float red, float green, float blue, float alpha);
|
||||
void setClearDepth(float depth);
|
||||
void setClearStencil(int stencil);
|
||||
|
||||
GLuint createBuffer();
|
||||
GLuint createShader(GLenum type);
|
||||
GLuint createProgram();
|
||||
GLuint createTexture();
|
||||
GLuint createFramebuffer();
|
||||
GLuint createRenderbuffer();
|
||||
|
||||
void deleteBuffer(GLuint buffer);
|
||||
void deleteShader(GLuint shader);
|
||||
void deleteProgram(GLuint program);
|
||||
void deleteTexture(GLuint texture);
|
||||
void deleteFramebuffer(GLuint framebuffer);
|
||||
void deleteRenderbuffer(GLuint renderbuffer);
|
||||
|
||||
void bindArrayBuffer(GLuint buffer);
|
||||
void bindElementArrayBuffer(GLuint buffer);
|
||||
void bindTexture2D(GLuint texture);
|
||||
void bindTextureCubeMap(GLuint texture);
|
||||
void bindFramebuffer(GLuint framebuffer);
|
||||
void bindRenderbuffer(GLuint renderbuffer);
|
||||
void useProgram(GLuint program);
|
||||
|
||||
void setFramebufferZero(Framebuffer *framebuffer);
|
||||
void setColorbufferZero(Colorbuffer *renderbuffer);
|
||||
void setDepthbufferZero(Depthbuffer *depthBuffer);
|
||||
void setStencilbufferZero(Stencilbuffer *stencilBuffer);
|
||||
void setRenderbuffer(Renderbuffer *renderbuffer);
|
||||
|
||||
Buffer *getBuffer(GLuint handle);
|
||||
Shader *getShader(GLuint handle);
|
||||
Program *getProgram(GLuint handle);
|
||||
Texture *getTexture(GLuint handle);
|
||||
Framebuffer *getFramebuffer(GLuint handle);
|
||||
Renderbuffer *getRenderbuffer(GLuint handle);
|
||||
Colorbuffer *getColorbuffer(GLuint handle);
|
||||
Depthbuffer *getDepthbuffer(GLuint handle);
|
||||
Stencilbuffer *getStencilbuffer(GLuint handle);
|
||||
|
||||
Buffer *getArrayBuffer();
|
||||
Buffer *getElementArrayBuffer();
|
||||
Program *getCurrentProgram();
|
||||
Texture2D *getTexture2D();
|
||||
TextureCubeMap *getTextureCubeMap();
|
||||
Texture *getSamplerTexture(unsigned int sampler);
|
||||
Framebuffer *getFramebuffer();
|
||||
|
||||
bool applyRenderTarget(bool ignoreViewport);
|
||||
void applyState();
|
||||
void applyVertexBuffer(int count);
|
||||
void applyIndexBuffer(const void *indices, int length);
|
||||
void applyShaders();
|
||||
void applyTextures();
|
||||
|
||||
void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
|
||||
void clear(GLbitfield mask);
|
||||
void drawArrays(GLenum mode, GLint first, GLsizei count);
|
||||
void drawElements(GLenum mode, GLsizei count, GLenum type, const void* indices);
|
||||
void finish();
|
||||
void flush();
|
||||
|
||||
void recordInvalidEnum();
|
||||
void recordInvalidValue();
|
||||
void recordInvalidOperation();
|
||||
void recordOutOfMemory();
|
||||
void recordInvalidFramebufferOperation();
|
||||
|
||||
GLenum getError();
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(Context);
|
||||
|
||||
void detachBuffer(GLuint buffer);
|
||||
void detachTexture(GLuint texture);
|
||||
void detachFramebuffer(GLuint framebuffer);
|
||||
void detachRenderbuffer(GLuint renderbuffer);
|
||||
|
||||
const egl::Config *const mConfig;
|
||||
|
||||
Texture2D *mTexture2DZero;
|
||||
TextureCubeMap *mTextureCubeMapZero;
|
||||
|
||||
Colorbuffer *mColorbufferZero;
|
||||
Depthbuffer *mDepthbufferZero;
|
||||
Stencilbuffer *mStencilbufferZero;
|
||||
|
||||
typedef std::map<GLuint, Buffer*> BufferMap;
|
||||
BufferMap mBufferMap;
|
||||
|
||||
typedef std::map<GLuint, Shader*> ShaderMap;
|
||||
ShaderMap mShaderMap;
|
||||
|
||||
typedef std::map<GLuint, Program*> ProgramMap;
|
||||
ProgramMap mProgramMap;
|
||||
|
||||
typedef std::map<GLuint, Texture*> TextureMap;
|
||||
TextureMap mTextureMap;
|
||||
|
||||
typedef std::map<GLuint, Framebuffer*> FramebufferMap;
|
||||
FramebufferMap mFramebufferMap;
|
||||
|
||||
typedef std::map<GLuint, Renderbuffer*> RenderbufferMap;
|
||||
RenderbufferMap mRenderbufferMap;
|
||||
|
||||
// Recorded errors
|
||||
bool mInvalidEnum;
|
||||
bool mInvalidValue;
|
||||
bool mInvalidOperation;
|
||||
bool mOutOfMemory;
|
||||
bool mInvalidFramebufferOperation;
|
||||
};
|
||||
}
|
||||
|
||||
extern "C"
|
||||
{
|
||||
// Exported functions for use by EGL
|
||||
gl::Context *glCreateContext(const egl::Config *config);
|
||||
void glDestroyContext(gl::Context *context);
|
||||
void glMakeCurrent(gl::Context *context, egl::Display *display, egl::Surface *surface);
|
||||
gl::Context *glGetCurrentContext();
|
||||
}
|
||||
|
||||
#endif // INCLUDE_CONTEXT_H_
|
|
@ -0,0 +1,74 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Display.h: Defines the egl::Display class, representing the abstract
|
||||
// display on which graphics are drawn. Implements EGLDisplay.
|
||||
// [EGL 1.4] section 2.1.2 page 3.
|
||||
|
||||
#ifndef INCLUDE_DISPLAY_H_
|
||||
#define INCLUDE_DISPLAY_H_
|
||||
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <d3d9.h>
|
||||
|
||||
#include "Config.h"
|
||||
#include "Surface.h"
|
||||
#include "Context.h"
|
||||
|
||||
#include <set>
|
||||
|
||||
namespace egl
|
||||
{
|
||||
class Display
|
||||
{
|
||||
public:
|
||||
Display(HDC deviceContext);
|
||||
|
||||
~Display();
|
||||
|
||||
bool initialize();
|
||||
void terminate();
|
||||
|
||||
bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig);
|
||||
bool getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value);
|
||||
|
||||
egl::Surface *createWindowSurface(HWND window, EGLConfig config);
|
||||
EGLContext createContext(EGLConfig configHandle);
|
||||
|
||||
void destroySurface(egl::Surface *surface);
|
||||
void destroyContext(gl::Context *context);
|
||||
|
||||
bool isInitialized();
|
||||
bool isValidConfig(EGLConfig config);
|
||||
bool isValidContext(gl::Context *context);
|
||||
bool isValidSurface(egl::Surface *surface);
|
||||
bool hasExistingWindowSurface(HWND window);
|
||||
|
||||
virtual IDirect3DDevice9 *getDevice();
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(Display);
|
||||
const HDC mDc;
|
||||
|
||||
UINT mAdapter;
|
||||
D3DDEVTYPE mDeviceType;
|
||||
IDirect3D9 *mD3d9;
|
||||
IDirect3DDevice9 *mDevice;
|
||||
|
||||
typedef std::set<Surface*> SurfaceSet;
|
||||
SurfaceSet mSurfaceSet;
|
||||
|
||||
ConfigSet mConfigSet;
|
||||
|
||||
typedef std::set<gl::Context*> ContextSet;
|
||||
ContextSet mContextSet;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // INCLUDE_DISPLAY_H_
|
|
@ -0,0 +1,329 @@
|
|||
/* -*- mode: c; tab-width: 8; -*- */
|
||||
/* vi: set sw=4 ts=8: */
|
||||
/* Reference version of egl.h for EGL 1.4.
|
||||
*/
|
||||
|
||||
/*
|
||||
** Copyright (c) 2007-2009 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are furnished to do so, subject to
|
||||
** the following conditions:
|
||||
**
|
||||
** The above copyright notice and this permission notice shall be included
|
||||
** in all copies or substantial portions of the Materials.
|
||||
**
|
||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
||||
|
||||
#ifndef __egl_h_
|
||||
#define __egl_h_
|
||||
|
||||
/* All platform-dependent types and macro boilerplate (such as EGLAPI
|
||||
* and EGLAPIENTRY) should go in eglplatform.h.
|
||||
*/
|
||||
#include <EGL/eglplatform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* EGL Types */
|
||||
/* EGLint is defined in eglplatform.h */
|
||||
typedef unsigned int EGLBoolean;
|
||||
typedef unsigned int EGLenum;
|
||||
typedef void *EGLConfig;
|
||||
typedef void *EGLContext;
|
||||
typedef void *EGLDisplay;
|
||||
typedef void *EGLSurface;
|
||||
typedef void *EGLClientBuffer;
|
||||
|
||||
/* EGL Versioning */
|
||||
#define EGL_VERSION_1_0 1
|
||||
#define EGL_VERSION_1_1 1
|
||||
#define EGL_VERSION_1_2 1
|
||||
#define EGL_VERSION_1_3 1
|
||||
#define EGL_VERSION_1_4 1
|
||||
|
||||
/* EGL Enumerants. Bitmasks and other exceptional cases aside, most
|
||||
* enums are assigned unique values starting at 0x3000.
|
||||
*/
|
||||
|
||||
/* EGL aliases */
|
||||
#define EGL_FALSE 0
|
||||
#define EGL_TRUE 1
|
||||
|
||||
/* Out-of-band handle values */
|
||||
#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0)
|
||||
#define EGL_NO_CONTEXT ((EGLContext)0)
|
||||
#define EGL_NO_DISPLAY ((EGLDisplay)0)
|
||||
#define EGL_NO_SURFACE ((EGLSurface)0)
|
||||
|
||||
/* Out-of-band attribute value */
|
||||
#define EGL_DONT_CARE ((EGLint)-1)
|
||||
|
||||
/* Errors / GetError return values */
|
||||
#define EGL_SUCCESS 0x3000
|
||||
#define EGL_NOT_INITIALIZED 0x3001
|
||||
#define EGL_BAD_ACCESS 0x3002
|
||||
#define EGL_BAD_ALLOC 0x3003
|
||||
#define EGL_BAD_ATTRIBUTE 0x3004
|
||||
#define EGL_BAD_CONFIG 0x3005
|
||||
#define EGL_BAD_CONTEXT 0x3006
|
||||
#define EGL_BAD_CURRENT_SURFACE 0x3007
|
||||
#define EGL_BAD_DISPLAY 0x3008
|
||||
#define EGL_BAD_MATCH 0x3009
|
||||
#define EGL_BAD_NATIVE_PIXMAP 0x300A
|
||||
#define EGL_BAD_NATIVE_WINDOW 0x300B
|
||||
#define EGL_BAD_PARAMETER 0x300C
|
||||
#define EGL_BAD_SURFACE 0x300D
|
||||
#define EGL_CONTEXT_LOST 0x300E /* EGL 1.1 - IMG_power_management */
|
||||
|
||||
/* Reserved 0x300F-0x301F for additional errors */
|
||||
|
||||
/* Config attributes */
|
||||
#define EGL_BUFFER_SIZE 0x3020
|
||||
#define EGL_ALPHA_SIZE 0x3021
|
||||
#define EGL_BLUE_SIZE 0x3022
|
||||
#define EGL_GREEN_SIZE 0x3023
|
||||
#define EGL_RED_SIZE 0x3024
|
||||
#define EGL_DEPTH_SIZE 0x3025
|
||||
#define EGL_STENCIL_SIZE 0x3026
|
||||
#define EGL_CONFIG_CAVEAT 0x3027
|
||||
#define EGL_CONFIG_ID 0x3028
|
||||
#define EGL_LEVEL 0x3029
|
||||
#define EGL_MAX_PBUFFER_HEIGHT 0x302A
|
||||
#define EGL_MAX_PBUFFER_PIXELS 0x302B
|
||||
#define EGL_MAX_PBUFFER_WIDTH 0x302C
|
||||
#define EGL_NATIVE_RENDERABLE 0x302D
|
||||
#define EGL_NATIVE_VISUAL_ID 0x302E
|
||||
#define EGL_NATIVE_VISUAL_TYPE 0x302F
|
||||
#define EGL_PRESERVED_RESOURCES 0x3030
|
||||
#define EGL_SAMPLES 0x3031
|
||||
#define EGL_SAMPLE_BUFFERS 0x3032
|
||||
#define EGL_SURFACE_TYPE 0x3033
|
||||
#define EGL_TRANSPARENT_TYPE 0x3034
|
||||
#define EGL_TRANSPARENT_BLUE_VALUE 0x3035
|
||||
#define EGL_TRANSPARENT_GREEN_VALUE 0x3036
|
||||
#define EGL_TRANSPARENT_RED_VALUE 0x3037
|
||||
#define EGL_NONE 0x3038 /* Attrib list terminator */
|
||||
#define EGL_BIND_TO_TEXTURE_RGB 0x3039
|
||||
#define EGL_BIND_TO_TEXTURE_RGBA 0x303A
|
||||
#define EGL_MIN_SWAP_INTERVAL 0x303B
|
||||
#define EGL_MAX_SWAP_INTERVAL 0x303C
|
||||
#define EGL_LUMINANCE_SIZE 0x303D
|
||||
#define EGL_ALPHA_MASK_SIZE 0x303E
|
||||
#define EGL_COLOR_BUFFER_TYPE 0x303F
|
||||
#define EGL_RENDERABLE_TYPE 0x3040
|
||||
#define EGL_MATCH_NATIVE_PIXMAP 0x3041 /* Pseudo-attribute (not queryable) */
|
||||
#define EGL_CONFORMANT 0x3042
|
||||
|
||||
/* Reserved 0x3041-0x304F for additional config attributes */
|
||||
|
||||
/* Config attribute values */
|
||||
#define EGL_SLOW_CONFIG 0x3050 /* EGL_CONFIG_CAVEAT value */
|
||||
#define EGL_NON_CONFORMANT_CONFIG 0x3051 /* EGL_CONFIG_CAVEAT value */
|
||||
#define EGL_TRANSPARENT_RGB 0x3052 /* EGL_TRANSPARENT_TYPE value */
|
||||
#define EGL_RGB_BUFFER 0x308E /* EGL_COLOR_BUFFER_TYPE value */
|
||||
#define EGL_LUMINANCE_BUFFER 0x308F /* EGL_COLOR_BUFFER_TYPE value */
|
||||
|
||||
/* More config attribute values, for EGL_TEXTURE_FORMAT */
|
||||
#define EGL_NO_TEXTURE 0x305C
|
||||
#define EGL_TEXTURE_RGB 0x305D
|
||||
#define EGL_TEXTURE_RGBA 0x305E
|
||||
#define EGL_TEXTURE_2D 0x305F
|
||||
|
||||
/* Config attribute mask bits */
|
||||
#define EGL_PBUFFER_BIT 0x0001 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_PIXMAP_BIT 0x0002 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_WINDOW_BIT 0x0004 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 /* EGL_SURFACE_TYPE mask bits */
|
||||
#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 /* EGL_SURFACE_TYPE mask bits */
|
||||
|
||||
#define EGL_OPENGL_ES_BIT 0x0001 /* EGL_RENDERABLE_TYPE mask bits */
|
||||
#define EGL_OPENVG_BIT 0x0002 /* EGL_RENDERABLE_TYPE mask bits */
|
||||
#define EGL_OPENGL_ES2_BIT 0x0004 /* EGL_RENDERABLE_TYPE mask bits */
|
||||
#define EGL_OPENGL_BIT 0x0008 /* EGL_RENDERABLE_TYPE mask bits */
|
||||
|
||||
/* QueryString targets */
|
||||
#define EGL_VENDOR 0x3053
|
||||
#define EGL_VERSION 0x3054
|
||||
#define EGL_EXTENSIONS 0x3055
|
||||
#define EGL_CLIENT_APIS 0x308D
|
||||
|
||||
/* QuerySurface / SurfaceAttrib / CreatePbufferSurface targets */
|
||||
#define EGL_HEIGHT 0x3056
|
||||
#define EGL_WIDTH 0x3057
|
||||
#define EGL_LARGEST_PBUFFER 0x3058
|
||||
#define EGL_TEXTURE_FORMAT 0x3080
|
||||
#define EGL_TEXTURE_TARGET 0x3081
|
||||
#define EGL_MIPMAP_TEXTURE 0x3082
|
||||
#define EGL_MIPMAP_LEVEL 0x3083
|
||||
#define EGL_RENDER_BUFFER 0x3086
|
||||
#define EGL_VG_COLORSPACE 0x3087
|
||||
#define EGL_VG_ALPHA_FORMAT 0x3088
|
||||
#define EGL_HORIZONTAL_RESOLUTION 0x3090
|
||||
#define EGL_VERTICAL_RESOLUTION 0x3091
|
||||
#define EGL_PIXEL_ASPECT_RATIO 0x3092
|
||||
#define EGL_SWAP_BEHAVIOR 0x3093
|
||||
#define EGL_MULTISAMPLE_RESOLVE 0x3099
|
||||
|
||||
/* EGL_RENDER_BUFFER values / BindTexImage / ReleaseTexImage buffer targets */
|
||||
#define EGL_BACK_BUFFER 0x3084
|
||||
#define EGL_SINGLE_BUFFER 0x3085
|
||||
|
||||
/* OpenVG color spaces */
|
||||
#define EGL_VG_COLORSPACE_sRGB 0x3089 /* EGL_VG_COLORSPACE value */
|
||||
#define EGL_VG_COLORSPACE_LINEAR 0x308A /* EGL_VG_COLORSPACE value */
|
||||
|
||||
/* OpenVG alpha formats */
|
||||
#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B /* EGL_ALPHA_FORMAT value */
|
||||
#define EGL_VG_ALPHA_FORMAT_PRE 0x308C /* EGL_ALPHA_FORMAT value */
|
||||
|
||||
/* Constant scale factor by which fractional display resolutions &
|
||||
* aspect ratio are scaled when queried as integer values.
|
||||
*/
|
||||
#define EGL_DISPLAY_SCALING 10000
|
||||
|
||||
/* Unknown display resolution/aspect ratio */
|
||||
#define EGL_UNKNOWN ((EGLint)-1)
|
||||
|
||||
/* Back buffer swap behaviors */
|
||||
#define EGL_BUFFER_PRESERVED 0x3094 /* EGL_SWAP_BEHAVIOR value */
|
||||
#define EGL_BUFFER_DESTROYED 0x3095 /* EGL_SWAP_BEHAVIOR value */
|
||||
|
||||
/* CreatePbufferFromClientBuffer buffer types */
|
||||
#define EGL_OPENVG_IMAGE 0x3096
|
||||
|
||||
/* QueryContext targets */
|
||||
#define EGL_CONTEXT_CLIENT_TYPE 0x3097
|
||||
|
||||
/* CreateContext attributes */
|
||||
#define EGL_CONTEXT_CLIENT_VERSION 0x3098
|
||||
|
||||
/* Multisample resolution behaviors */
|
||||
#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A /* EGL_MULTISAMPLE_RESOLVE value */
|
||||
#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B /* EGL_MULTISAMPLE_RESOLVE value */
|
||||
|
||||
/* BindAPI/QueryAPI targets */
|
||||
#define EGL_OPENGL_ES_API 0x30A0
|
||||
#define EGL_OPENVG_API 0x30A1
|
||||
#define EGL_OPENGL_API 0x30A2
|
||||
|
||||
/* GetCurrentSurface targets */
|
||||
#define EGL_DRAW 0x3059
|
||||
#define EGL_READ 0x305A
|
||||
|
||||
/* WaitNative engines */
|
||||
#define EGL_CORE_NATIVE_ENGINE 0x305B
|
||||
|
||||
/* EGL 1.2 tokens renamed for consistency in EGL 1.3 */
|
||||
#define EGL_COLORSPACE EGL_VG_COLORSPACE
|
||||
#define EGL_ALPHA_FORMAT EGL_VG_ALPHA_FORMAT
|
||||
#define EGL_COLORSPACE_sRGB EGL_VG_COLORSPACE_sRGB
|
||||
#define EGL_COLORSPACE_LINEAR EGL_VG_COLORSPACE_LINEAR
|
||||
#define EGL_ALPHA_FORMAT_NONPRE EGL_VG_ALPHA_FORMAT_NONPRE
|
||||
#define EGL_ALPHA_FORMAT_PRE EGL_VG_ALPHA_FORMAT_PRE
|
||||
|
||||
/* EGL extensions must request enum blocks from the Khronos
|
||||
* API Registrar, who maintains the enumerant registry. Submit
|
||||
* a bug in Khronos Bugzilla against task "Registry".
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/* EGL Functions */
|
||||
|
||||
EGLAPI EGLint EGLAPIENTRY eglGetError(void);
|
||||
|
||||
EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy);
|
||||
|
||||
EGLAPI const char * EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
|
||||
EGLint config_size, EGLint *num_config);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list,
|
||||
EGLConfig *configs, EGLint config_size,
|
||||
EGLint *num_config);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
|
||||
EGLint attribute, EGLint *value);
|
||||
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
|
||||
EGLNativeWindowType win,
|
||||
const EGLint *attrib_list);
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
|
||||
const EGLint *attrib_list);
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
|
||||
EGLNativePixmapType pixmap,
|
||||
const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface,
|
||||
EGLint attribute, EGLint *value);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api);
|
||||
EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void);
|
||||
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(
|
||||
EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
|
||||
EGLConfig config, const EGLint *attrib_list);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
|
||||
EGLint attribute, EGLint value);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
|
||||
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval);
|
||||
|
||||
|
||||
EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config,
|
||||
EGLContext share_context,
|
||||
const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw,
|
||||
EGLSurface read, EGLContext ctx);
|
||||
|
||||
EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void);
|
||||
EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw);
|
||||
EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx,
|
||||
EGLint attribute, EGLint *value);
|
||||
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface,
|
||||
EGLNativePixmapType target);
|
||||
|
||||
/* This is a generic function pointer type, whose name indicates it must
|
||||
* be cast to the proper type *and calling convention* before use.
|
||||
*/
|
||||
typedef void (*__eglMustCastToProperFunctionPointerType)(void);
|
||||
|
||||
/* Now, define eglGetProcAddress using the generic function ptr. type */
|
||||
EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY
|
||||
eglGetProcAddress(const char *procname);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __egl_h_ */
|
|
@ -0,0 +1,137 @@
|
|||
#ifndef __eglext_h_
|
||||
#define __eglext_h_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Copyright (c) 2007-2009 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are furnished to do so, subject to
|
||||
** the following conditions:
|
||||
**
|
||||
** The above copyright notice and this permission notice shall be included
|
||||
** in all copies or substantial portions of the Materials.
|
||||
**
|
||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
||||
|
||||
#include <EGL/eglplatform.h>
|
||||
|
||||
/*************************************************************/
|
||||
|
||||
/* Header file version number */
|
||||
/* Current version at http://www.khronos.org/registry/egl/ */
|
||||
#define EGL_EGLEXT_VERSION 3
|
||||
|
||||
#ifndef EGL_KHR_config_attribs
|
||||
#define EGL_KHR_config_attribs 1
|
||||
#define EGL_CONFORMANT_KHR 0x3042 /* EGLConfig attribute */
|
||||
#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 /* EGL_SURFACE_TYPE bitfield */
|
||||
#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 /* EGL_SURFACE_TYPE bitfield */
|
||||
#endif
|
||||
|
||||
#ifndef EGL_KHR_lock_surface
|
||||
#define EGL_KHR_lock_surface 1
|
||||
#define EGL_READ_SURFACE_BIT_KHR 0x0001 /* EGL_LOCK_USAGE_HINT_KHR bitfield */
|
||||
#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 /* EGL_LOCK_USAGE_HINT_KHR bitfield */
|
||||
#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 /* EGL_SURFACE_TYPE bitfield */
|
||||
#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 /* EGL_SURFACE_TYPE bitfield */
|
||||
#define EGL_MATCH_FORMAT_KHR 0x3043 /* EGLConfig attribute */
|
||||
#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 /* EGL_MATCH_FORMAT_KHR value */
|
||||
#define EGL_FORMAT_RGB_565_KHR 0x30C1 /* EGL_MATCH_FORMAT_KHR value */
|
||||
#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 /* EGL_MATCH_FORMAT_KHR value */
|
||||
#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 /* EGL_MATCH_FORMAT_KHR value */
|
||||
#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 /* eglLockSurfaceKHR attribute */
|
||||
#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 /* eglLockSurfaceKHR attribute */
|
||||
#define EGL_BITMAP_POINTER_KHR 0x30C6 /* eglQuerySurface attribute */
|
||||
#define EGL_BITMAP_PITCH_KHR 0x30C7 /* eglQuerySurface attribute */
|
||||
#define EGL_BITMAP_ORIGIN_KHR 0x30C8 /* eglQuerySurface attribute */
|
||||
#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 /* eglQuerySurface attribute */
|
||||
#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA /* eglQuerySurface attribute */
|
||||
#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB /* eglQuerySurface attribute */
|
||||
#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC /* eglQuerySurface attribute */
|
||||
#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD /* eglQuerySurface attribute */
|
||||
#define EGL_LOWER_LEFT_KHR 0x30CE /* EGL_BITMAP_ORIGIN_KHR value */
|
||||
#define EGL_UPPER_LEFT_KHR 0x30CF /* EGL_BITMAP_ORIGIN_KHR value */
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay display, EGLSurface surface);
|
||||
#endif /* EGL_EGLEXT_PROTOTYPES */
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface);
|
||||
#endif
|
||||
|
||||
#ifndef EGL_KHR_image
|
||||
#define EGL_KHR_image 1
|
||||
#define EGL_NATIVE_PIXMAP_KHR 0x30B0 /* eglCreateImageKHR target */
|
||||
typedef void *EGLImageKHR;
|
||||
#define EGL_NO_IMAGE_KHR ((EGLImageKHR)0)
|
||||
#ifdef EGL_EGLEXT_PROTOTYPES
|
||||
EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
|
||||
EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image);
|
||||
#endif /* EGL_EGLEXT_PROTOTYPES */
|
||||
typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
|
||||
typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image);
|
||||
#endif
|
||||
|
||||
#ifndef EGL_KHR_vg_parent_image
|
||||
#define EGL_KHR_vg_parent_image 1
|
||||
#define EGL_VG_PARENT_IMAGE_KHR 0x30BA /* eglCreateImageKHR target */
|
||||
#endif
|
||||
|
||||
#ifndef EGL_KHR_gl_texture_2D_image
|
||||
#define EGL_KHR_gl_texture_2D_image 1
|
||||
#define EGL_GL_TEXTURE_2D_KHR 0x30B1 /* eglCreateImageKHR target */
|
||||
#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC /* eglCreateImageKHR attribute */
|
||||
#endif
|
||||
|
||||
#ifndef EGL_KHR_gl_texture_cubemap_image
|
||||
#define EGL_KHR_gl_texture_cubemap_image 1
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 /* eglCreateImageKHR target */
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 /* eglCreateImageKHR target */
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 /* eglCreateImageKHR target */
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 /* eglCreateImageKHR target */
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 /* eglCreateImageKHR target */
|
||||
#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 /* eglCreateImageKHR target */
|
||||
#endif
|
||||
|
||||
#ifndef EGL_KHR_gl_texture_3D_image
|
||||
#define EGL_KHR_gl_texture_3D_image 1
|
||||
#define EGL_GL_TEXTURE_3D_KHR 0x30B2 /* eglCreateImageKHR target */
|
||||
#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD /* eglCreateImageKHR attribute */
|
||||
#endif
|
||||
|
||||
#ifndef EGL_KHR_gl_renderbuffer_image
|
||||
#define EGL_KHR_gl_renderbuffer_image 1
|
||||
#define EGL_GL_RENDERBUFFER_KHR 0x30B9 /* eglCreateImageKHR target */
|
||||
#endif
|
||||
|
||||
#ifndef EGL_KHR_image_base
|
||||
#define EGL_KHR_image_base 1
|
||||
/* Most interfaces defined by EGL_KHR_image_pixmap above */
|
||||
#define EGL_IMAGE_PRESERVED_KHR 0x30D2 /* eglCreateImageKHR attribute */
|
||||
#endif
|
||||
|
||||
#ifndef EGL_KHR_image_pixmap
|
||||
#define EGL_KHR_image_pixmap 1
|
||||
/* Interfaces defined by EGL_KHR_image above */
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,113 @@
|
|||
#ifndef __eglplatform_h_
|
||||
#define __eglplatform_h_
|
||||
|
||||
/*
|
||||
** Copyright (c) 2007-2009 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are furnished to do so, subject to
|
||||
** the following conditions:
|
||||
**
|
||||
** The above copyright notice and this permission notice shall be included
|
||||
** in all copies or substantial portions of the Materials.
|
||||
**
|
||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
||||
|
||||
/* Platform-specific types and definitions for egl.h
|
||||
*
|
||||
* Adopters may modify khrplatform.h and this file to suit their platform.
|
||||
* You are encouraged to submit all modifications to the Khronos group so that
|
||||
* they can be included in future versions of this file. Please submit changes
|
||||
* by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)
|
||||
* by filing a bug against product "EGL" component "Registry".
|
||||
*/
|
||||
|
||||
#include <KHR/khrplatform.h>
|
||||
|
||||
/* Macros used in EGL function prototype declarations.
|
||||
*
|
||||
* EGL functions should be prototyped as:
|
||||
*
|
||||
* EGLAPI return-type EGLAPIENTRY eglFunction(arguments);
|
||||
* typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments);
|
||||
*
|
||||
* KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h
|
||||
*/
|
||||
|
||||
#ifndef EGLAPI
|
||||
#define EGLAPI KHRONOS_APICALL
|
||||
#endif
|
||||
|
||||
#define EGLAPIENTRY KHRONOS_APIENTRY
|
||||
#define EGLAPIENTRYP KHRONOS_APIENTRY*
|
||||
|
||||
/* The types NativeDisplayType, NativeWindowType, and NativePixmapType
|
||||
* are aliases of window-system-dependent types, such as X Display * or
|
||||
* Windows Device Context. They must be defined in platform-specific
|
||||
* code below. The EGL-prefixed versions of Native*Type are the same
|
||||
* types, renamed in EGL 1.3 so all types in the API start with "EGL".
|
||||
*/
|
||||
|
||||
#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN 1
|
||||
#endif
|
||||
#include <windows.h>
|
||||
|
||||
typedef HDC EGLNativeDisplayType;
|
||||
typedef HBITMAP EGLNativePixmapType;
|
||||
typedef HWND EGLNativeWindowType;
|
||||
|
||||
#elif defined(SUPPORT_X11)
|
||||
|
||||
/* X11 (tentative) */
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
typedef Display *EGLNativeDisplayType;
|
||||
typedef Pixmap EGLNativePixmapType;
|
||||
typedef Window EGLNativeWindowType;
|
||||
|
||||
#else
|
||||
|
||||
#if defined(_WIN64) || __WORDSIZE == 64
|
||||
typedef khronos_int64_t EGLNativeDisplayType;
|
||||
#else
|
||||
typedef int EGLNativeDisplayType;
|
||||
#endif
|
||||
typedef void *EGLNativeWindowType;
|
||||
typedef void *EGLNativePixmapType;
|
||||
|
||||
#endif
|
||||
|
||||
/* EGL 1.2 types, renamed for consistency in EGL 1.3 */
|
||||
typedef EGLNativeDisplayType NativeDisplayType;
|
||||
typedef EGLNativePixmapType NativePixmapType;
|
||||
typedef EGLNativeWindowType NativeWindowType;
|
||||
|
||||
|
||||
/* Define EGLint. This must be a signed integral type large enough to contain
|
||||
* all legal attribute names and values passed into and out of EGL, whether
|
||||
* their type is boolean, bitmask, enumerant (symbolic constant), integer,
|
||||
* handle, or other. While in general a 32-bit integer will suffice, if
|
||||
* handles are 64 bit types, then EGLint should be defined as a signed 64-bit
|
||||
* integer type.
|
||||
*/
|
||||
#if defined(_WIN64) || __WORDSIZE == 64
|
||||
typedef khronos_int64_t EGLint;
|
||||
#else
|
||||
typedef khronos_int32_t EGLint;
|
||||
#endif
|
||||
|
||||
#endif /* __eglplatform_h */
|
|
@ -0,0 +1,620 @@
|
|||
#ifndef __gl2_h_
|
||||
#define __gl2_h_
|
||||
|
||||
/* $Revision: 8784 $ on $Date:: 2009-09-02 09:49:17 -0700 #$ */
|
||||
|
||||
#include <GLES2/gl2platform.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This document is licensed under the SGI Free Software B License Version
|
||||
* 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
|
||||
*/
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Data type definitions
|
||||
*-----------------------------------------------------------------------*/
|
||||
|
||||
typedef void GLvoid;
|
||||
typedef unsigned int GLenum;
|
||||
typedef unsigned char GLboolean;
|
||||
typedef unsigned int GLbitfield;
|
||||
typedef khronos_int8_t GLbyte;
|
||||
typedef short GLshort;
|
||||
typedef int GLint;
|
||||
typedef int GLsizei;
|
||||
typedef khronos_uint8_t GLubyte;
|
||||
typedef unsigned short GLushort;
|
||||
typedef unsigned int GLuint;
|
||||
typedef khronos_float_t GLfloat;
|
||||
typedef khronos_float_t GLclampf;
|
||||
typedef khronos_int32_t GLfixed;
|
||||
|
||||
/* GL types for handling large vertex buffer objects */
|
||||
typedef khronos_intptr_t GLintptr;
|
||||
typedef khronos_ssize_t GLsizeiptr;
|
||||
|
||||
/* OpenGL ES core versions */
|
||||
#define GL_ES_VERSION_2_0 1
|
||||
|
||||
/* ClearBufferMask */
|
||||
#define GL_DEPTH_BUFFER_BIT 0x00000100
|
||||
#define GL_STENCIL_BUFFER_BIT 0x00000400
|
||||
#define GL_COLOR_BUFFER_BIT 0x00004000
|
||||
|
||||
/* Boolean */
|
||||
#define GL_FALSE 0
|
||||
#define GL_TRUE 1
|
||||
|
||||
/* BeginMode */
|
||||
#define GL_POINTS 0x0000
|
||||
#define GL_LINES 0x0001
|
||||
#define GL_LINE_LOOP 0x0002
|
||||
#define GL_LINE_STRIP 0x0003
|
||||
#define GL_TRIANGLES 0x0004
|
||||
#define GL_TRIANGLE_STRIP 0x0005
|
||||
#define GL_TRIANGLE_FAN 0x0006
|
||||
|
||||
/* AlphaFunction (not supported in ES20) */
|
||||
/* GL_NEVER */
|
||||
/* GL_LESS */
|
||||
/* GL_EQUAL */
|
||||
/* GL_LEQUAL */
|
||||
/* GL_GREATER */
|
||||
/* GL_NOTEQUAL */
|
||||
/* GL_GEQUAL */
|
||||
/* GL_ALWAYS */
|
||||
|
||||
/* BlendingFactorDest */
|
||||
#define GL_ZERO 0
|
||||
#define GL_ONE 1
|
||||
#define GL_SRC_COLOR 0x0300
|
||||
#define GL_ONE_MINUS_SRC_COLOR 0x0301
|
||||
#define GL_SRC_ALPHA 0x0302
|
||||
#define GL_ONE_MINUS_SRC_ALPHA 0x0303
|
||||
#define GL_DST_ALPHA 0x0304
|
||||
#define GL_ONE_MINUS_DST_ALPHA 0x0305
|
||||
|
||||
/* BlendingFactorSrc */
|
||||
/* GL_ZERO */
|
||||
/* GL_ONE */
|
||||
#define GL_DST_COLOR 0x0306
|
||||
#define GL_ONE_MINUS_DST_COLOR 0x0307
|
||||
#define GL_SRC_ALPHA_SATURATE 0x0308
|
||||
/* GL_SRC_ALPHA */
|
||||
/* GL_ONE_MINUS_SRC_ALPHA */
|
||||
/* GL_DST_ALPHA */
|
||||
/* GL_ONE_MINUS_DST_ALPHA */
|
||||
|
||||
/* BlendEquationSeparate */
|
||||
#define GL_FUNC_ADD 0x8006
|
||||
#define GL_BLEND_EQUATION 0x8009
|
||||
#define GL_BLEND_EQUATION_RGB 0x8009 /* same as BLEND_EQUATION */
|
||||
#define GL_BLEND_EQUATION_ALPHA 0x883D
|
||||
|
||||
/* BlendSubtract */
|
||||
#define GL_FUNC_SUBTRACT 0x800A
|
||||
#define GL_FUNC_REVERSE_SUBTRACT 0x800B
|
||||
|
||||
/* Separate Blend Functions */
|
||||
#define GL_BLEND_DST_RGB 0x80C8
|
||||
#define GL_BLEND_SRC_RGB 0x80C9
|
||||
#define GL_BLEND_DST_ALPHA 0x80CA
|
||||
#define GL_BLEND_SRC_ALPHA 0x80CB
|
||||
#define GL_CONSTANT_COLOR 0x8001
|
||||
#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002
|
||||
#define GL_CONSTANT_ALPHA 0x8003
|
||||
#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004
|
||||
#define GL_BLEND_COLOR 0x8005
|
||||
|
||||
/* Buffer Objects */
|
||||
#define GL_ARRAY_BUFFER 0x8892
|
||||
#define GL_ELEMENT_ARRAY_BUFFER 0x8893
|
||||
#define GL_ARRAY_BUFFER_BINDING 0x8894
|
||||
#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
|
||||
|
||||
#define GL_STREAM_DRAW 0x88E0
|
||||
#define GL_STATIC_DRAW 0x88E4
|
||||
#define GL_DYNAMIC_DRAW 0x88E8
|
||||
|
||||
#define GL_BUFFER_SIZE 0x8764
|
||||
#define GL_BUFFER_USAGE 0x8765
|
||||
|
||||
#define GL_CURRENT_VERTEX_ATTRIB 0x8626
|
||||
|
||||
/* CullFaceMode */
|
||||
#define GL_FRONT 0x0404
|
||||
#define GL_BACK 0x0405
|
||||
#define GL_FRONT_AND_BACK 0x0408
|
||||
|
||||
/* DepthFunction */
|
||||
/* GL_NEVER */
|
||||
/* GL_LESS */
|
||||
/* GL_EQUAL */
|
||||
/* GL_LEQUAL */
|
||||
/* GL_GREATER */
|
||||
/* GL_NOTEQUAL */
|
||||
/* GL_GEQUAL */
|
||||
/* GL_ALWAYS */
|
||||
|
||||
/* EnableCap */
|
||||
#define GL_TEXTURE_2D 0x0DE1
|
||||
#define GL_CULL_FACE 0x0B44
|
||||
#define GL_BLEND 0x0BE2
|
||||
#define GL_DITHER 0x0BD0
|
||||
#define GL_STENCIL_TEST 0x0B90
|
||||
#define GL_DEPTH_TEST 0x0B71
|
||||
#define GL_SCISSOR_TEST 0x0C11
|
||||
#define GL_POLYGON_OFFSET_FILL 0x8037
|
||||
#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
|
||||
#define GL_SAMPLE_COVERAGE 0x80A0
|
||||
|
||||
/* ErrorCode */
|
||||
#define GL_NO_ERROR 0
|
||||
#define GL_INVALID_ENUM 0x0500
|
||||
#define GL_INVALID_VALUE 0x0501
|
||||
#define GL_INVALID_OPERATION 0x0502
|
||||
#define GL_OUT_OF_MEMORY 0x0505
|
||||
|
||||
/* FrontFaceDirection */
|
||||
#define GL_CW 0x0900
|
||||
#define GL_CCW 0x0901
|
||||
|
||||
/* GetPName */
|
||||
#define GL_LINE_WIDTH 0x0B21
|
||||
#define GL_ALIASED_POINT_SIZE_RANGE 0x846D
|
||||
#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E
|
||||
#define GL_CULL_FACE_MODE 0x0B45
|
||||
#define GL_FRONT_FACE 0x0B46
|
||||
#define GL_DEPTH_RANGE 0x0B70
|
||||
#define GL_DEPTH_WRITEMASK 0x0B72
|
||||
#define GL_DEPTH_CLEAR_VALUE 0x0B73
|
||||
#define GL_DEPTH_FUNC 0x0B74
|
||||
#define GL_STENCIL_CLEAR_VALUE 0x0B91
|
||||
#define GL_STENCIL_FUNC 0x0B92
|
||||
#define GL_STENCIL_FAIL 0x0B94
|
||||
#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95
|
||||
#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96
|
||||
#define GL_STENCIL_REF 0x0B97
|
||||
#define GL_STENCIL_VALUE_MASK 0x0B93
|
||||
#define GL_STENCIL_WRITEMASK 0x0B98
|
||||
#define GL_STENCIL_BACK_FUNC 0x8800
|
||||
#define GL_STENCIL_BACK_FAIL 0x8801
|
||||
#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802
|
||||
#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803
|
||||
#define GL_STENCIL_BACK_REF 0x8CA3
|
||||
#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
|
||||
#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
|
||||
#define GL_VIEWPORT 0x0BA2
|
||||
#define GL_SCISSOR_BOX 0x0C10
|
||||
/* GL_SCISSOR_TEST */
|
||||
#define GL_COLOR_CLEAR_VALUE 0x0C22
|
||||
#define GL_COLOR_WRITEMASK 0x0C23
|
||||
#define GL_UNPACK_ALIGNMENT 0x0CF5
|
||||
#define GL_PACK_ALIGNMENT 0x0D05
|
||||
#define GL_MAX_TEXTURE_SIZE 0x0D33
|
||||
#define GL_MAX_VIEWPORT_DIMS 0x0D3A
|
||||
#define GL_SUBPIXEL_BITS 0x0D50
|
||||
#define GL_RED_BITS 0x0D52
|
||||
#define GL_GREEN_BITS 0x0D53
|
||||
#define GL_BLUE_BITS 0x0D54
|
||||
#define GL_ALPHA_BITS 0x0D55
|
||||
#define GL_DEPTH_BITS 0x0D56
|
||||
#define GL_STENCIL_BITS 0x0D57
|
||||
#define GL_POLYGON_OFFSET_UNITS 0x2A00
|
||||
/* GL_POLYGON_OFFSET_FILL */
|
||||
#define GL_POLYGON_OFFSET_FACTOR 0x8038
|
||||
#define GL_TEXTURE_BINDING_2D 0x8069
|
||||
#define GL_SAMPLE_BUFFERS 0x80A8
|
||||
#define GL_SAMPLES 0x80A9
|
||||
#define GL_SAMPLE_COVERAGE_VALUE 0x80AA
|
||||
#define GL_SAMPLE_COVERAGE_INVERT 0x80AB
|
||||
|
||||
/* GetTextureParameter */
|
||||
/* GL_TEXTURE_MAG_FILTER */
|
||||
/* GL_TEXTURE_MIN_FILTER */
|
||||
/* GL_TEXTURE_WRAP_S */
|
||||
/* GL_TEXTURE_WRAP_T */
|
||||
|
||||
#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
|
||||
#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3
|
||||
|
||||
/* HintMode */
|
||||
#define GL_DONT_CARE 0x1100
|
||||
#define GL_FASTEST 0x1101
|
||||
#define GL_NICEST 0x1102
|
||||
|
||||
/* HintTarget */
|
||||
#define GL_GENERATE_MIPMAP_HINT 0x8192
|
||||
|
||||
/* DataType */
|
||||
#define GL_BYTE 0x1400
|
||||
#define GL_UNSIGNED_BYTE 0x1401
|
||||
#define GL_SHORT 0x1402
|
||||
#define GL_UNSIGNED_SHORT 0x1403
|
||||
#define GL_INT 0x1404
|
||||
#define GL_UNSIGNED_INT 0x1405
|
||||
#define GL_FLOAT 0x1406
|
||||
#define GL_FIXED 0x140C
|
||||
|
||||
/* PixelFormat */
|
||||
#define GL_DEPTH_COMPONENT 0x1902
|
||||
#define GL_ALPHA 0x1906
|
||||
#define GL_RGB 0x1907
|
||||
#define GL_RGBA 0x1908
|
||||
#define GL_LUMINANCE 0x1909
|
||||
#define GL_LUMINANCE_ALPHA 0x190A
|
||||
|
||||
/* PixelType */
|
||||
/* GL_UNSIGNED_BYTE */
|
||||
#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
|
||||
#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
|
||||
#define GL_UNSIGNED_SHORT_5_6_5 0x8363
|
||||
|
||||
/* Shaders */
|
||||
#define GL_FRAGMENT_SHADER 0x8B30
|
||||
#define GL_VERTEX_SHADER 0x8B31
|
||||
#define GL_MAX_VERTEX_ATTRIBS 0x8869
|
||||
#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
|
||||
#define GL_MAX_VARYING_VECTORS 0x8DFC
|
||||
#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D
|
||||
#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C
|
||||
#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
|
||||
#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
|
||||
#define GL_SHADER_TYPE 0x8B4F
|
||||
#define GL_DELETE_STATUS 0x8B80
|
||||
#define GL_LINK_STATUS 0x8B82
|
||||
#define GL_VALIDATE_STATUS 0x8B83
|
||||
#define GL_ATTACHED_SHADERS 0x8B85
|
||||
#define GL_ACTIVE_UNIFORMS 0x8B86
|
||||
#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87
|
||||
#define GL_ACTIVE_ATTRIBUTES 0x8B89
|
||||
#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A
|
||||
#define GL_SHADING_LANGUAGE_VERSION 0x8B8C
|
||||
#define GL_CURRENT_PROGRAM 0x8B8D
|
||||
|
||||
/* StencilFunction */
|
||||
#define GL_NEVER 0x0200
|
||||
#define GL_LESS 0x0201
|
||||
#define GL_EQUAL 0x0202
|
||||
#define GL_LEQUAL 0x0203
|
||||
#define GL_GREATER 0x0204
|
||||
#define GL_NOTEQUAL 0x0205
|
||||
#define GL_GEQUAL 0x0206
|
||||
#define GL_ALWAYS 0x0207
|
||||
|
||||
/* StencilOp */
|
||||
/* GL_ZERO */
|
||||
#define GL_KEEP 0x1E00
|
||||
#define GL_REPLACE 0x1E01
|
||||
#define GL_INCR 0x1E02
|
||||
#define GL_DECR 0x1E03
|
||||
#define GL_INVERT 0x150A
|
||||
#define GL_INCR_WRAP 0x8507
|
||||
#define GL_DECR_WRAP 0x8508
|
||||
|
||||
/* StringName */
|
||||
#define GL_VENDOR 0x1F00
|
||||
#define GL_RENDERER 0x1F01
|
||||
#define GL_VERSION 0x1F02
|
||||
#define GL_EXTENSIONS 0x1F03
|
||||
|
||||
/* TextureMagFilter */
|
||||
#define GL_NEAREST 0x2600
|
||||
#define GL_LINEAR 0x2601
|
||||
|
||||
/* TextureMinFilter */
|
||||
/* GL_NEAREST */
|
||||
/* GL_LINEAR */
|
||||
#define GL_NEAREST_MIPMAP_NEAREST 0x2700
|
||||
#define GL_LINEAR_MIPMAP_NEAREST 0x2701
|
||||
#define GL_NEAREST_MIPMAP_LINEAR 0x2702
|
||||
#define GL_LINEAR_MIPMAP_LINEAR 0x2703
|
||||
|
||||
/* TextureParameterName */
|
||||
#define GL_TEXTURE_MAG_FILTER 0x2800
|
||||
#define GL_TEXTURE_MIN_FILTER 0x2801
|
||||
#define GL_TEXTURE_WRAP_S 0x2802
|
||||
#define GL_TEXTURE_WRAP_T 0x2803
|
||||
|
||||
/* TextureTarget */
|
||||
/* GL_TEXTURE_2D */
|
||||
#define GL_TEXTURE 0x1702
|
||||
|
||||
#define GL_TEXTURE_CUBE_MAP 0x8513
|
||||
#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514
|
||||
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515
|
||||
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516
|
||||
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517
|
||||
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518
|
||||
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519
|
||||
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A
|
||||
#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C
|
||||
|
||||
/* TextureUnit */
|
||||
#define GL_TEXTURE0 0x84C0
|
||||
#define GL_TEXTURE1 0x84C1
|
||||
#define GL_TEXTURE2 0x84C2
|
||||
#define GL_TEXTURE3 0x84C3
|
||||
#define GL_TEXTURE4 0x84C4
|
||||
#define GL_TEXTURE5 0x84C5
|
||||
#define GL_TEXTURE6 0x84C6
|
||||
#define GL_TEXTURE7 0x84C7
|
||||
#define GL_TEXTURE8 0x84C8
|
||||
#define GL_TEXTURE9 0x84C9
|
||||
#define GL_TEXTURE10 0x84CA
|
||||
#define GL_TEXTURE11 0x84CB
|
||||
#define GL_TEXTURE12 0x84CC
|
||||
#define GL_TEXTURE13 0x84CD
|
||||
#define GL_TEXTURE14 0x84CE
|
||||
#define GL_TEXTURE15 0x84CF
|
||||
#define GL_TEXTURE16 0x84D0
|
||||
#define GL_TEXTURE17 0x84D1
|
||||
#define GL_TEXTURE18 0x84D2
|
||||
#define GL_TEXTURE19 0x84D3
|
||||
#define GL_TEXTURE20 0x84D4
|
||||
#define GL_TEXTURE21 0x84D5
|
||||
#define GL_TEXTURE22 0x84D6
|
||||
#define GL_TEXTURE23 0x84D7
|
||||
#define GL_TEXTURE24 0x84D8
|
||||
#define GL_TEXTURE25 0x84D9
|
||||
#define GL_TEXTURE26 0x84DA
|
||||
#define GL_TEXTURE27 0x84DB
|
||||
#define GL_TEXTURE28 0x84DC
|
||||
#define GL_TEXTURE29 0x84DD
|
||||
#define GL_TEXTURE30 0x84DE
|
||||
#define GL_TEXTURE31 0x84DF
|
||||
#define GL_ACTIVE_TEXTURE 0x84E0
|
||||
|
||||
/* TextureWrapMode */
|
||||
#define GL_REPEAT 0x2901
|
||||
#define GL_CLAMP_TO_EDGE 0x812F
|
||||
#define GL_MIRRORED_REPEAT 0x8370
|
||||
|
||||
/* Uniform Types */
|
||||
#define GL_FLOAT_VEC2 0x8B50
|
||||
#define GL_FLOAT_VEC3 0x8B51
|
||||
#define GL_FLOAT_VEC4 0x8B52
|
||||
#define GL_INT_VEC2 0x8B53
|
||||
#define GL_INT_VEC3 0x8B54
|
||||
#define GL_INT_VEC4 0x8B55
|
||||
#define GL_BOOL 0x8B56
|
||||
#define GL_BOOL_VEC2 0x8B57
|
||||
#define GL_BOOL_VEC3 0x8B58
|
||||
#define GL_BOOL_VEC4 0x8B59
|
||||
#define GL_FLOAT_MAT2 0x8B5A
|
||||
#define GL_FLOAT_MAT3 0x8B5B
|
||||
#define GL_FLOAT_MAT4 0x8B5C
|
||||
#define GL_SAMPLER_2D 0x8B5E
|
||||
#define GL_SAMPLER_CUBE 0x8B60
|
||||
|
||||
/* Vertex Arrays */
|
||||
#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
|
||||
#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
|
||||
#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
|
||||
#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
|
||||
#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
|
||||
#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
|
||||
#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F
|
||||
|
||||
/* Read Format */
|
||||
#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
|
||||
#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
|
||||
|
||||
/* Shader Source */
|
||||
#define GL_COMPILE_STATUS 0x8B81
|
||||
#define GL_INFO_LOG_LENGTH 0x8B84
|
||||
#define GL_SHADER_SOURCE_LENGTH 0x8B88
|
||||
#define GL_SHADER_COMPILER 0x8DFA
|
||||
|
||||
/* Shader Binary */
|
||||
#define GL_SHADER_BINARY_FORMATS 0x8DF8
|
||||
#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
|
||||
|
||||
/* Shader Precision-Specified Types */
|
||||
#define GL_LOW_FLOAT 0x8DF0
|
||||
#define GL_MEDIUM_FLOAT 0x8DF1
|
||||
#define GL_HIGH_FLOAT 0x8DF2
|
||||
#define GL_LOW_INT 0x8DF3
|
||||
#define GL_MEDIUM_INT 0x8DF4
|
||||
#define GL_HIGH_INT 0x8DF5
|
||||
|
||||
/* Framebuffer Object. */
|
||||
#define GL_FRAMEBUFFER 0x8D40
|
||||
#define GL_RENDERBUFFER 0x8D41
|
||||
|
||||
#define GL_RGBA4 0x8056
|
||||
#define GL_RGB5_A1 0x8057
|
||||
#define GL_RGB565 0x8D62
|
||||
#define GL_DEPTH_COMPONENT16 0x81A5
|
||||
#define GL_STENCIL_INDEX 0x1901
|
||||
#define GL_STENCIL_INDEX8 0x8D48
|
||||
|
||||
#define GL_RENDERBUFFER_WIDTH 0x8D42
|
||||
#define GL_RENDERBUFFER_HEIGHT 0x8D43
|
||||
#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
|
||||
#define GL_RENDERBUFFER_RED_SIZE 0x8D50
|
||||
#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
|
||||
#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
|
||||
#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
|
||||
#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
|
||||
#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
|
||||
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
|
||||
|
||||
#define GL_COLOR_ATTACHMENT0 0x8CE0
|
||||
#define GL_DEPTH_ATTACHMENT 0x8D00
|
||||
#define GL_STENCIL_ATTACHMENT 0x8D20
|
||||
|
||||
#define GL_NONE 0
|
||||
|
||||
#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
|
||||
#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
|
||||
#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
|
||||
#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
|
||||
#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
|
||||
|
||||
#define GL_FRAMEBUFFER_BINDING 0x8CA6
|
||||
#define GL_RENDERBUFFER_BINDING 0x8CA7
|
||||
#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
|
||||
|
||||
#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* GL core functions.
|
||||
*-----------------------------------------------------------------------*/
|
||||
|
||||
GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
|
||||
GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
|
||||
GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const char* name);
|
||||
GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
|
||||
GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
|
||||
GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer);
|
||||
GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture);
|
||||
GL_APICALL void GL_APIENTRY glBlendColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
|
||||
GL_APICALL void GL_APIENTRY glBlendEquation ( GLenum mode );
|
||||
GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
|
||||
GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
|
||||
GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
|
||||
GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void* data, GLenum usage);
|
||||
GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
|
||||
GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target);
|
||||
GL_APICALL void GL_APIENTRY glClear (GLbitfield mask);
|
||||
GL_APICALL void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
|
||||
GL_APICALL void GL_APIENTRY glClearDepthf (GLclampf depth);
|
||||
GL_APICALL void GL_APIENTRY glClearStencil (GLint s);
|
||||
GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
|
||||
GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader);
|
||||
GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data);
|
||||
GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data);
|
||||
GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
|
||||
GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
|
||||
GL_APICALL GLuint GL_APIENTRY glCreateProgram (void);
|
||||
GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type);
|
||||
GL_APICALL void GL_APIENTRY glCullFace (GLenum mode);
|
||||
GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint* buffers);
|
||||
GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers);
|
||||
GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program);
|
||||
GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint* renderbuffers);
|
||||
GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader);
|
||||
GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint* textures);
|
||||
GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func);
|
||||
GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag);
|
||||
GL_APICALL void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar);
|
||||
GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader);
|
||||
GL_APICALL void GL_APIENTRY glDisable (GLenum cap);
|
||||
GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index);
|
||||
GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
|
||||
GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void* indices);
|
||||
GL_APICALL void GL_APIENTRY glEnable (GLenum cap);
|
||||
GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index);
|
||||
GL_APICALL void GL_APIENTRY glFinish (void);
|
||||
GL_APICALL void GL_APIENTRY glFlush (void);
|
||||
GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
|
||||
GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
|
||||
GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode);
|
||||
GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint* buffers);
|
||||
GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target);
|
||||
GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint* framebuffers);
|
||||
GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint* renderbuffers);
|
||||
GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint* textures);
|
||||
GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
|
||||
GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name);
|
||||
GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
|
||||
GL_APICALL int GL_APIENTRY glGetAttribLocation (GLuint program, const char* name);
|
||||
GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean* params);
|
||||
GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint* params);
|
||||
GL_APICALL GLenum GL_APIENTRY glGetError (void);
|
||||
GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat* params);
|
||||
GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint* params);
|
||||
GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint* params);
|
||||
GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint* params);
|
||||
GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufsize, GLsizei* length, char* infolog);
|
||||
GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint* params);
|
||||
GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint* params);
|
||||
GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog);
|
||||
GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
|
||||
GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufsize, GLsizei* length, char* source);
|
||||
GL_APICALL const GLubyte* GL_APIENTRY glGetString (GLenum name);
|
||||
GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat* params);
|
||||
GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint* params);
|
||||
GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat* params);
|
||||
GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint* params);
|
||||
GL_APICALL int GL_APIENTRY glGetUniformLocation (GLuint program, const char* name);
|
||||
GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat* params);
|
||||
GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint* params);
|
||||
GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void** pointer);
|
||||
GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode);
|
||||
GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer);
|
||||
GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap);
|
||||
GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer);
|
||||
GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program);
|
||||
GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer);
|
||||
GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader);
|
||||
GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture);
|
||||
GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width);
|
||||
GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program);
|
||||
GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param);
|
||||
GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units);
|
||||
GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
|
||||
GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void);
|
||||
GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
|
||||
GL_APICALL void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert);
|
||||
GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
|
||||
GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length);
|
||||
GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const char** string, const GLint* length);
|
||||
GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask);
|
||||
GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask);
|
||||
GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask);
|
||||
GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask);
|
||||
GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
|
||||
GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
|
||||
GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
|
||||
GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param);
|
||||
GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat* params);
|
||||
GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
|
||||
GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint* params);
|
||||
GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
|
||||
GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat x);
|
||||
GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat* v);
|
||||
GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint x);
|
||||
GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint* v);
|
||||
GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat x, GLfloat y);
|
||||
GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat* v);
|
||||
GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint x, GLint y);
|
||||
GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint* v);
|
||||
GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat x, GLfloat y, GLfloat z);
|
||||
GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat* v);
|
||||
GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint x, GLint y, GLint z);
|
||||
GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint* v);
|
||||
GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
|
||||
GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat* v);
|
||||
GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint x, GLint y, GLint z, GLint w);
|
||||
GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint* v);
|
||||
GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
|
||||
GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
|
||||
GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
|
||||
GL_APICALL void GL_APIENTRY glUseProgram (GLuint program);
|
||||
GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program);
|
||||
GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x);
|
||||
GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint indx, const GLfloat* values);
|
||||
GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y);
|
||||
GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint indx, const GLfloat* values);
|
||||
GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z);
|
||||
GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat* values);
|
||||
GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
|
||||
GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat* values);
|
||||
GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr);
|
||||
GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __gl2_h_ */
|
|
@ -0,0 +1,610 @@
|
|||
#ifndef __gl2ext_h_
|
||||
#define __gl2ext_h_
|
||||
|
||||
/* $Revision: 8936 $ on $Date:: 2009-09-17 17:16:47 -0700 #$ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This document is licensed under the SGI Free Software B License Version
|
||||
* 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
|
||||
*/
|
||||
|
||||
#ifndef GL_APIENTRYP
|
||||
# define GL_APIENTRYP GL_APIENTRY*
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* OES extension tokens
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_OES_compressed_ETC1_RGB8_texture */
|
||||
#ifndef GL_OES_compressed_ETC1_RGB8_texture
|
||||
#define GL_ETC1_RGB8_OES 0x8D64
|
||||
#endif
|
||||
|
||||
/* GL_OES_compressed_paletted_texture */
|
||||
#ifndef GL_OES_compressed_paletted_texture
|
||||
#define GL_PALETTE4_RGB8_OES 0x8B90
|
||||
#define GL_PALETTE4_RGBA8_OES 0x8B91
|
||||
#define GL_PALETTE4_R5_G6_B5_OES 0x8B92
|
||||
#define GL_PALETTE4_RGBA4_OES 0x8B93
|
||||
#define GL_PALETTE4_RGB5_A1_OES 0x8B94
|
||||
#define GL_PALETTE8_RGB8_OES 0x8B95
|
||||
#define GL_PALETTE8_RGBA8_OES 0x8B96
|
||||
#define GL_PALETTE8_R5_G6_B5_OES 0x8B97
|
||||
#define GL_PALETTE8_RGBA4_OES 0x8B98
|
||||
#define GL_PALETTE8_RGB5_A1_OES 0x8B99
|
||||
#endif
|
||||
|
||||
/* GL_OES_depth24 */
|
||||
#ifndef GL_OES_depth24
|
||||
#define GL_DEPTH_COMPONENT24_OES 0x81A6
|
||||
#endif
|
||||
|
||||
/* GL_OES_depth32 */
|
||||
#ifndef GL_OES_depth32
|
||||
#define GL_DEPTH_COMPONENT32_OES 0x81A7
|
||||
#endif
|
||||
|
||||
/* GL_OES_depth_texture */
|
||||
/* No new tokens introduced by this extension. */
|
||||
|
||||
/* GL_OES_EGL_image */
|
||||
#ifndef GL_OES_EGL_image
|
||||
typedef void* GLeglImageOES;
|
||||
#endif
|
||||
|
||||
/* GL_OES_get_program_binary */
|
||||
#ifndef GL_OES_get_program_binary
|
||||
#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741
|
||||
#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE
|
||||
#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF
|
||||
#endif
|
||||
|
||||
/* GL_OES_mapbuffer */
|
||||
#ifndef GL_OES_mapbuffer
|
||||
#define GL_WRITE_ONLY_OES 0x88B9
|
||||
#define GL_BUFFER_ACCESS_OES 0x88BB
|
||||
#define GL_BUFFER_MAPPED_OES 0x88BC
|
||||
#define GL_BUFFER_MAP_POINTER_OES 0x88BD
|
||||
#endif
|
||||
|
||||
/* GL_OES_packed_depth_stencil */
|
||||
#ifndef GL_OES_packed_depth_stencil
|
||||
#define GL_DEPTH_STENCIL_OES 0x84F9
|
||||
#define GL_UNSIGNED_INT_24_8_OES 0x84FA
|
||||
#define GL_DEPTH24_STENCIL8_OES 0x88F0
|
||||
#endif
|
||||
|
||||
/* GL_OES_rgb8_rgba8 */
|
||||
#ifndef GL_OES_rgb8_rgba8
|
||||
#define GL_RGB8_OES 0x8051
|
||||
#define GL_RGBA8_OES 0x8058
|
||||
#endif
|
||||
|
||||
/* GL_OES_standard_derivatives */
|
||||
#ifndef GL_OES_standard_derivatives
|
||||
#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B
|
||||
#endif
|
||||
|
||||
/* GL_OES_stencil1 */
|
||||
#ifndef GL_OES_stencil1
|
||||
#define GL_STENCIL_INDEX1_OES 0x8D46
|
||||
#endif
|
||||
|
||||
/* GL_OES_stencil4 */
|
||||
#ifndef GL_OES_stencil4
|
||||
#define GL_STENCIL_INDEX4_OES 0x8D47
|
||||
#endif
|
||||
|
||||
/* GL_OES_texture3D */
|
||||
#ifndef GL_OES_texture3D
|
||||
#define GL_TEXTURE_WRAP_R_OES 0x8072
|
||||
#define GL_TEXTURE_3D_OES 0x806F
|
||||
#define GL_TEXTURE_BINDING_3D_OES 0x806A
|
||||
#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073
|
||||
#define GL_SAMPLER_3D_OES 0x8B5F
|
||||
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4
|
||||
#endif
|
||||
|
||||
/* GL_OES_texture_half_float */
|
||||
#ifndef GL_OES_texture_half_float
|
||||
#define GL_HALF_FLOAT_OES 0x8D61
|
||||
#endif
|
||||
|
||||
/* GL_OES_vertex_half_float */
|
||||
/* GL_HALF_FLOAT_OES defined in GL_OES_texture_half_float already. */
|
||||
|
||||
/* GL_OES_vertex_type_10_10_10_2 */
|
||||
#ifndef GL_OES_vertex_type_10_10_10_2
|
||||
#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6
|
||||
#define GL_INT_10_10_10_2_OES 0x8DF7
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* AMD extension tokens
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_AMD_compressed_3DC_texture */
|
||||
#ifndef GL_AMD_compressed_3DC_texture
|
||||
#define GL_3DC_X_AMD 0x87F9
|
||||
#define GL_3DC_XY_AMD 0x87FA
|
||||
#endif
|
||||
|
||||
/* GL_AMD_compressed_ATC_texture */
|
||||
#ifndef GL_AMD_compressed_ATC_texture
|
||||
#define GL_ATC_RGB_AMD 0x8C92
|
||||
#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93
|
||||
#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE
|
||||
#endif
|
||||
|
||||
/* GL_AMD_program_binary_Z400 */
|
||||
#ifndef GL_AMD_program_binary_Z400
|
||||
#define GL_Z400_BINARY_AMD 0x8740
|
||||
#endif
|
||||
|
||||
/* GL_AMD_performance_monitor */
|
||||
#ifndef GL_AMD_performance_monitor
|
||||
#define GL_COUNTER_TYPE_AMD 0x8BC0
|
||||
#define GL_COUNTER_RANGE_AMD 0x8BC1
|
||||
#define GL_UNSIGNED_INT64_AMD 0x8BC2
|
||||
#define GL_PERCENTAGE_AMD 0x8BC3
|
||||
#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4
|
||||
#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5
|
||||
#define GL_PERFMON_RESULT_AMD 0x8BC6
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* EXT extension tokens
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_EXT_texture_filter_anisotropic */
|
||||
#ifndef GL_EXT_texture_filter_anisotropic
|
||||
#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
|
||||
#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
|
||||
#endif
|
||||
|
||||
/* GL_EXT_texture_type_2_10_10_10_REV */
|
||||
#ifndef GL_EXT_texture_type_2_10_10_10_REV
|
||||
#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368
|
||||
#endif
|
||||
|
||||
/* GL_EXT_texture_format_BGRA8888 */
|
||||
#ifndef GL_EXT_texture_format_BGRA8888
|
||||
#define GL_BGRA 0x80E1
|
||||
#endif
|
||||
|
||||
/* GL_EXT_discard_framebuffer */
|
||||
#ifndef GL_EXT_discard_framebuffer
|
||||
#define GL_COLOR_EXT 0x1800
|
||||
#define GL_DEPTH_EXT 0x1801
|
||||
#define GL_STENCIL_EXT 0x1802
|
||||
#endif
|
||||
|
||||
#ifndef GL_EXT_blend_minmax
|
||||
#define GL_MIN_EXT 0x8007
|
||||
#define GL_MAX_EXT 0x8008
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* IMG extension tokens
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_IMG_read_format */
|
||||
#ifndef GL_IMG_read_format
|
||||
#define GL_BGRA 0x80E1
|
||||
#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
|
||||
#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
|
||||
#endif
|
||||
|
||||
/* GL_IMG_texture_compression_pvrtc */
|
||||
#ifndef GL_IMG_texture_compression_pvrtc
|
||||
#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00
|
||||
#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01
|
||||
#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02
|
||||
#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* NV extension tokens
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_NV_fence */
|
||||
#ifndef GL_NV_fence
|
||||
#define GL_ALL_COMPLETED_NV 0x84F2
|
||||
#define GL_FENCE_STATUS_NV 0x84F3
|
||||
#define GL_FENCE_CONDITION_NV 0x84F4
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* QCOM extension tokens
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_QCOM_driver_control */
|
||||
/* No new tokens introduced by this extension. */
|
||||
|
||||
/* GL_QCOM_perfmon_global_mode */
|
||||
#ifndef GL_QCOM_perfmon_global_mode
|
||||
#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0
|
||||
#endif
|
||||
|
||||
/* GL_QCOM_writeonly_rendering */
|
||||
#ifndef GL_QCOM_writeonly_rendering
|
||||
#define GL_WRITEONLY_RENDERING_AMD 0x8823
|
||||
#endif
|
||||
|
||||
/* GL_QCOM_extended_get */
|
||||
#ifndef GL_QCOM_extended_get
|
||||
#define GL_TEXTURE_WIDTH_QCOM 0x8BD2
|
||||
#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3
|
||||
#define GL_TEXTURE_DEPTH_QCOM 0x8BD4
|
||||
#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5
|
||||
#define GL_TEXTURE_FORMAT_QCOM 0x8BD6
|
||||
#define GL_TEXTURE_TYPE_QCOM 0x8BD7
|
||||
#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8
|
||||
#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9
|
||||
#define GL_TEXTURE_TARGET_QCOM 0x8BDA
|
||||
#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB
|
||||
#define GL_STATE_RESTORE 0x8BDC
|
||||
#endif
|
||||
|
||||
/* GL_QCOM_extended_get2 */
|
||||
/* No new tokens introduced by this extension. */
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* End of extension tokens, start of corresponding extension functions
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* OES extension functions
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_OES_compressed_ETC1_RGB8_texture */
|
||||
#ifndef GL_OES_compressed_ETC1_RGB8_texture
|
||||
#define GL_OES_compressed_ETC1_RGB8_texture 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_compressed_paletted_texture */
|
||||
#ifndef GL_OES_compressed_paletted_texture
|
||||
#define GL_OES_compressed_paletted_texture 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_EGL_image */
|
||||
#ifndef GL_OES_EGL_image
|
||||
#define GL_OES_EGL_image 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image);
|
||||
GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image);
|
||||
#endif
|
||||
typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image);
|
||||
typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image);
|
||||
#endif
|
||||
|
||||
/* GL_OES_depth24 */
|
||||
#ifndef GL_OES_depth24
|
||||
#define GL_OES_depth24 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_depth32 */
|
||||
#ifndef GL_OES_depth32
|
||||
#define GL_OES_depth32 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_depth_texture */
|
||||
#ifndef GL_OES_depth_texture
|
||||
#define GL_OES_depth_texture 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_element_index_uint */
|
||||
#ifndef GL_OES_element_index_uint
|
||||
#define GL_OES_element_index_uint 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_fbo_render_mipmap */
|
||||
#ifndef GL_OES_fbo_render_mipmap
|
||||
#define GL_OES_fbo_render_mipmap 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_fragment_precision_high */
|
||||
#ifndef GL_OES_fragment_precision_high
|
||||
#define GL_OES_fragment_precision_high 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_get_program_binary */
|
||||
#ifndef GL_OES_get_program_binary
|
||||
#define GL_OES_get_program_binary 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
|
||||
GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const void *binary, GLint length);
|
||||
#endif
|
||||
typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary);
|
||||
typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length);
|
||||
#endif
|
||||
|
||||
/* GL_OES_mapbuffer */
|
||||
#ifndef GL_OES_mapbuffer
|
||||
#define GL_OES_mapbuffer 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GL_APICALL void* GL_APIENTRY glMapBufferOES (GLenum target, GLenum access);
|
||||
GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target);
|
||||
GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void** params);
|
||||
#endif
|
||||
typedef void* (GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access);
|
||||
typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target);
|
||||
typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void** params);
|
||||
#endif
|
||||
|
||||
/* GL_OES_packed_depth_stencil */
|
||||
#ifndef GL_OES_packed_depth_stencil
|
||||
#define GL_OES_packed_depth_stencil 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_rgb8_rgba8 */
|
||||
#ifndef GL_OES_rgb8_rgba8
|
||||
#define GL_OES_rgb8_rgba8 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_standard_derivatives */
|
||||
#ifndef GL_OES_standard_derivatives
|
||||
#define GL_OES_standard_derivatives 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_stencil1 */
|
||||
#ifndef GL_OES_stencil1
|
||||
#define GL_OES_stencil1 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_stencil4 */
|
||||
#ifndef GL_OES_stencil4
|
||||
#define GL_OES_stencil4 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_texture_3D */
|
||||
#ifndef GL_OES_texture_3D
|
||||
#define GL_OES_texture_3D 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels);
|
||||
GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
|
||||
GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
|
||||
GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
|
||||
GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
|
||||
GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
|
||||
#endif
|
||||
typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
|
||||
typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
|
||||
typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
|
||||
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data);
|
||||
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data);
|
||||
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOES) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
|
||||
#endif
|
||||
|
||||
/* GL_OES_texture_float_linear */
|
||||
#ifndef GL_OES_texture_float_linear
|
||||
#define GL_OES_texture_float_linear 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_texture_half_float_linear */
|
||||
#ifndef GL_OES_texture_half_float_linear
|
||||
#define GL_OES_texture_half_float_linear 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_texture_float */
|
||||
#ifndef GL_OES_texture_float
|
||||
#define GL_OES_texture_float 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_texture_half_float */
|
||||
#ifndef GL_OES_texture_half_float
|
||||
#define GL_OES_texture_half_float 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_texture_npot */
|
||||
#ifndef GL_OES_texture_npot
|
||||
#define GL_OES_texture_npot 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_vertex_half_float */
|
||||
#ifndef GL_OES_vertex_half_float
|
||||
#define GL_OES_vertex_half_float 1
|
||||
#endif
|
||||
|
||||
/* GL_OES_vertex_type_10_10_10_2 */
|
||||
#ifndef GL_OES_vertex_type_10_10_10_2
|
||||
#define GL_OES_vertex_type_10_10_10_2 1
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* AMD extension functions
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_AMD_compressed_3DC_texture */
|
||||
#ifndef GL_AMD_compressed_3DC_texture
|
||||
#define GL_AMD_compressed_3DC_texture 1
|
||||
#endif
|
||||
|
||||
/* GL_AMD_compressed_ATC_texture */
|
||||
#ifndef GL_AMD_compressed_ATC_texture
|
||||
#define GL_AMD_compressed_ATC_texture 1
|
||||
#endif
|
||||
|
||||
/* GL_AMD_program_binary_Z400 */
|
||||
#ifndef GL_AMD_program_binary_Z400
|
||||
#define GL_AMD_program_binary_Z400 1
|
||||
#endif
|
||||
|
||||
/* AMD_performance_monitor */
|
||||
#ifndef GL_AMD_performance_monitor
|
||||
#define GL_AMD_performance_monitor 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups);
|
||||
GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);
|
||||
GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, char *groupString);
|
||||
GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, char *counterString);
|
||||
GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data);
|
||||
GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors);
|
||||
GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors);
|
||||
GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList);
|
||||
GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor);
|
||||
GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor);
|
||||
GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);
|
||||
#endif
|
||||
typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups);
|
||||
typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters);
|
||||
typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, char *groupString);
|
||||
typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, char *counterString);
|
||||
typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data);
|
||||
typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);
|
||||
typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors);
|
||||
typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *countersList);
|
||||
typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);
|
||||
typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);
|
||||
typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten);
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* EXT extension functions
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_EXT_texture_filter_anisotropic */
|
||||
#ifndef GL_EXT_texture_filter_anisotropic
|
||||
#define GL_EXT_texture_filter_anisotropic 1
|
||||
#endif
|
||||
|
||||
/* GL_EXT_texture_type_2_10_10_10_REV */
|
||||
#ifndef GL_EXT_texture_type_2_10_10_10_REV
|
||||
#define GL_EXT_texture_type_2_10_10_10_REV 1
|
||||
#endif
|
||||
|
||||
/* GL_EXT_texture_format_BGRA8888 */
|
||||
#ifndef GL_EXT_texture_format_BGRA8888
|
||||
#define GL_EXT_texture_format_BGRA8888 1
|
||||
#endif
|
||||
|
||||
/* GL_EXT_discard_framebuffer */
|
||||
#ifndef GL_EXT_discard_framebuffer
|
||||
#define GL_EXT_discard_framebuffer 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments);
|
||||
#endif
|
||||
typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments);
|
||||
#endif
|
||||
|
||||
/* GL_EXT_blend_minmax */
|
||||
#ifndef GL_EXT_blend_minmax
|
||||
#define GL_EXT_blend_minmax 1
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* IMG extension functions
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_IMG_read_format */
|
||||
#ifndef GL_IMG_read_format
|
||||
#define GL_IMG_read_format 1
|
||||
#endif
|
||||
|
||||
/* GL_IMG_texture_compression_pvrtc */
|
||||
#ifndef GL_IMG_texture_compression_pvrtc
|
||||
#define GL_IMG_texture_compression_pvrtc 1
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* NV extension functions
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_NV_fence */
|
||||
#ifndef GL_NV_fence
|
||||
#define GL_NV_fence 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei, const GLuint *);
|
||||
GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei, GLuint *);
|
||||
GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint);
|
||||
GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint);
|
||||
GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *);
|
||||
GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint);
|
||||
GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint, GLenum);
|
||||
#endif
|
||||
typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences);
|
||||
typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences);
|
||||
typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence);
|
||||
typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence);
|
||||
typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params);
|
||||
typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence);
|
||||
typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition);
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* QCOM extension functions
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_QCOM_driver_control */
|
||||
#ifndef GL_QCOM_driver_control
|
||||
#define GL_QCOM_driver_control 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls);
|
||||
GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, char *driverControlString);
|
||||
GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl);
|
||||
GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl);
|
||||
#endif
|
||||
typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls);
|
||||
typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, char *driverControlString);
|
||||
typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);
|
||||
typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl);
|
||||
#endif
|
||||
|
||||
/* GL_QCOM_perfmon_global_mode */
|
||||
#ifndef GL_QCOM_perfmon_global_mode
|
||||
#define GL_QCOM_perfmon_global_mode 1
|
||||
#endif
|
||||
|
||||
/* GL_QCOM_writeonly_rendering */
|
||||
#ifndef GL_QCOM_writeonly_rendering
|
||||
#define GL_QCOM_writeonly_rendering 1
|
||||
#endif
|
||||
|
||||
/* GL_QCOM_extended_get */
|
||||
#ifndef GL_QCOM_extended_get
|
||||
#define GL_QCOM_extended_get 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures);
|
||||
GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);
|
||||
GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);
|
||||
GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);
|
||||
GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);
|
||||
GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param);
|
||||
GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels);
|
||||
GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, void **params);
|
||||
#endif
|
||||
typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures);
|
||||
typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers);
|
||||
typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers);
|
||||
typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers);
|
||||
typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params);
|
||||
typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param);
|
||||
typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels);
|
||||
typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void **params);
|
||||
#endif
|
||||
|
||||
/* GL_QCOM_extended_get2 */
|
||||
#ifndef GL_QCOM_extended_get2
|
||||
#define GL_QCOM_extended_get2 1
|
||||
#ifdef GL_GLEXT_PROTOTYPES
|
||||
GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders);
|
||||
GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms);
|
||||
GL_APICALL void GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program);
|
||||
GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, char *source, GLint *length);
|
||||
#endif
|
||||
typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders);
|
||||
typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms);
|
||||
typedef void (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program);
|
||||
typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, char *source, GLint *length);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __gl2ext_h_ */
|
|
@ -0,0 +1,51 @@
|
|||
#ifndef __gl2extimg_h_
|
||||
#define __gl2extimg_h_
|
||||
|
||||
#include <GLES2/gl2.h>
|
||||
#include <GLES2/gl2ext.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* IMG extension tokens
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_IMG_binary_shader */
|
||||
#ifndef GL_IMG_binary_shader
|
||||
#define GL_SGX_BINARY_IMG 0x8C0A
|
||||
#endif
|
||||
|
||||
/* GL_IMG_texture_compression_pvrtc */
|
||||
#ifndef GL_IMG_texture_compression_pvrtc
|
||||
#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00
|
||||
#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01
|
||||
#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02
|
||||
#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03
|
||||
#endif
|
||||
|
||||
|
||||
/* GL_IMG_texture_format_BGRA8888 */
|
||||
#define GL_BGRA 0x80E1
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* IMG extension functions
|
||||
*------------------------------------------------------------------------*/
|
||||
|
||||
/* GL_IMG_binary_shader */
|
||||
#ifndef GL_IMG_binary_shader
|
||||
#define GL_IMG_binary_shader 1
|
||||
#endif
|
||||
|
||||
/* GL_IMG_texture_compression_pvrtc */
|
||||
#ifndef GL_IMG_texture_compression_pvrtc
|
||||
#define GL_IMG_texture_compression_pvrtc 1
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __gl2extimg_h_ */
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef __gl2platform_h_
|
||||
#define __gl2platform_h_
|
||||
|
||||
/* $Revision: 7173 $ on $Date:: 2009-01-09 11:18:21 -0800 #$ */
|
||||
|
||||
/*
|
||||
* This document is licensed under the SGI Free Software B License Version
|
||||
* 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
|
||||
*/
|
||||
|
||||
/* Platform-specific types and definitions for OpenGL ES 2.X gl2.h
|
||||
* Last modified on 2008/12/19
|
||||
*
|
||||
* Adopters may modify khrplatform.h and this file to suit their platform.
|
||||
* You are encouraged to submit all modifications to the Khronos group so that
|
||||
* they can be included in future versions of this file. Please submit changes
|
||||
* by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)
|
||||
* by filing a bug against product "OpenGL-ES" component "Registry".
|
||||
*/
|
||||
|
||||
#include <KHR/khrplatform.h>
|
||||
|
||||
#ifndef GL_APICALL
|
||||
#define GL_APICALL KHRONOS_APICALL
|
||||
#endif
|
||||
|
||||
#define GL_APIENTRY KHRONOS_APIENTRY
|
||||
|
||||
#endif /* __gl2platform_h_ */
|
|
@ -0,0 +1,269 @@
|
|||
#ifndef __khrplatform_h_
|
||||
#define __khrplatform_h_
|
||||
|
||||
/*
|
||||
** Copyright (c) 2008-2009 The Khronos Group Inc.
|
||||
**
|
||||
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||
** copy of this software and/or associated documentation files (the
|
||||
** "Materials"), to deal in the Materials without restriction, including
|
||||
** without limitation the rights to use, copy, modify, merge, publish,
|
||||
** distribute, sublicense, and/or sell copies of the Materials, and to
|
||||
** permit persons to whom the Materials are furnished to do so, subject to
|
||||
** the following conditions:
|
||||
**
|
||||
** The above copyright notice and this permission notice shall be included
|
||||
** in all copies or substantial portions of the Materials.
|
||||
**
|
||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||
*/
|
||||
|
||||
/* Khronos platform-specific types and definitions.
|
||||
*
|
||||
* $Revision: 7820 $ on $Date: 2009-04-03 13:46:26 -0700 (Fri, 03 Apr 2009) $
|
||||
*
|
||||
* Adopters may modify this file to suit their platform. Adopters are
|
||||
* encouraged to submit platform specific modifications to the Khronos
|
||||
* group so that they can be included in future versions of this file.
|
||||
* Please submit changes by sending them to the public Khronos Bugzilla
|
||||
* (http://khronos.org/bugzilla) by filing a bug against product
|
||||
* "Khronos (general)" component "Registry".
|
||||
*
|
||||
* A predefined template which fills in some of the bug fields can be
|
||||
* reached using http://tinyurl.com/khrplatform-h-bugreport, but you
|
||||
* must create a Bugzilla login first.
|
||||
*
|
||||
*
|
||||
* See the Implementer's Guidelines for information about where this file
|
||||
* should be located on your system and for more details of its use:
|
||||
* http://www.khronos.org/registry/implementers_guide.pdf
|
||||
*
|
||||
* This file should be included as
|
||||
* #include <KHR/khrplatform.h>
|
||||
* by Khronos client API header files that use its types and defines.
|
||||
*
|
||||
* The types in khrplatform.h should only be used to define API-specific types.
|
||||
*
|
||||
* Types defined in khrplatform.h:
|
||||
* khronos_int8_t signed 8 bit
|
||||
* khronos_uint8_t unsigned 8 bit
|
||||
* khronos_int16_t signed 16 bit
|
||||
* khronos_uint16_t unsigned 16 bit
|
||||
* khronos_int32_t signed 32 bit
|
||||
* khronos_uint32_t unsigned 32 bit
|
||||
* khronos_int64_t signed 64 bit
|
||||
* khronos_uint64_t unsigned 64 bit
|
||||
* khronos_intptr_t signed same number of bits as a pointer
|
||||
* khronos_uintptr_t unsigned same number of bits as a pointer
|
||||
* khronos_ssize_t signed size
|
||||
* khronos_usize_t unsigned size
|
||||
* khronos_float_t signed 32 bit floating point
|
||||
* khronos_time_ns_t unsigned 64 bit time in nanoseconds
|
||||
* khronos_utime_nanoseconds_t unsigned time interval or absolute time in
|
||||
* nanoseconds
|
||||
* khronos_stime_nanoseconds_t signed time interval in nanoseconds
|
||||
* khronos_boolean_enum_t enumerated boolean type. This should
|
||||
* only be used as a base type when a client API's boolean type is
|
||||
* an enum. Client APIs which use an integer or other type for
|
||||
* booleans cannot use this as the base type for their boolean.
|
||||
*
|
||||
* Tokens defined in khrplatform.h:
|
||||
*
|
||||
* KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values.
|
||||
*
|
||||
* KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0.
|
||||
* KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0.
|
||||
*
|
||||
* Calling convention macros defined in this file:
|
||||
* KHRONOS_APICALL
|
||||
* KHRONOS_APIENTRY
|
||||
* KHRONOS_APIATTRIBUTES
|
||||
*
|
||||
* These may be used in function prototypes as:
|
||||
*
|
||||
* KHRONOS_APICALL void KHRONOS_APIENTRY funcname(
|
||||
* int arg1,
|
||||
* int arg2) KHRONOS_APIATTRIBUTES;
|
||||
*/
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APICALL
|
||||
*-------------------------------------------------------------------------
|
||||
* This precedes the return type of the function in the function prototype.
|
||||
*/
|
||||
#if defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
||||
# define KHRONOS_APICALL __declspec(dllimport)
|
||||
#elif defined (__SYMBIAN32__)
|
||||
# define KHRONOS_APICALL IMPORT_C
|
||||
#else
|
||||
# define KHRONOS_APICALL
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APIENTRY
|
||||
*-------------------------------------------------------------------------
|
||||
* This follows the return type of the function and precedes the function
|
||||
* name in the function prototype.
|
||||
*/
|
||||
#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
|
||||
/* Win32 but not WinCE */
|
||||
# define KHRONOS_APIENTRY __stdcall
|
||||
#else
|
||||
# define KHRONOS_APIENTRY
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Definition of KHRONOS_APIATTRIBUTES
|
||||
*-------------------------------------------------------------------------
|
||||
* This follows the closing parenthesis of the function prototype arguments.
|
||||
*/
|
||||
#if defined (__ARMCC_2__)
|
||||
#define KHRONOS_APIATTRIBUTES __softfp
|
||||
#else
|
||||
#define KHRONOS_APIATTRIBUTES
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* basic type definitions
|
||||
*-----------------------------------------------------------------------*/
|
||||
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__)
|
||||
|
||||
|
||||
/*
|
||||
* Using <stdint.h>
|
||||
*/
|
||||
#include <stdint.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(__VMS ) || defined(__sgi)
|
||||
|
||||
/*
|
||||
* Using <inttypes.h>
|
||||
*/
|
||||
#include <inttypes.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(_WIN32) && !defined(__SCITECH_SNAP__)
|
||||
|
||||
/*
|
||||
* Win32
|
||||
*/
|
||||
typedef __int32 khronos_int32_t;
|
||||
typedef unsigned __int32 khronos_uint32_t;
|
||||
typedef __int64 khronos_int64_t;
|
||||
typedef unsigned __int64 khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif defined(__sun__) || defined(__digital__)
|
||||
|
||||
/*
|
||||
* Sun or Digital
|
||||
*/
|
||||
typedef int khronos_int32_t;
|
||||
typedef unsigned int khronos_uint32_t;
|
||||
#if defined(__arch64__) || defined(_LP64)
|
||||
typedef long int khronos_int64_t;
|
||||
typedef unsigned long int khronos_uint64_t;
|
||||
#else
|
||||
typedef long long int khronos_int64_t;
|
||||
typedef unsigned long long int khronos_uint64_t;
|
||||
#endif /* __arch64__ */
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#elif 0
|
||||
|
||||
/*
|
||||
* Hypothetical platform with no float or int64 support
|
||||
*/
|
||||
typedef int khronos_int32_t;
|
||||
typedef unsigned int khronos_uint32_t;
|
||||
#define KHRONOS_SUPPORT_INT64 0
|
||||
#define KHRONOS_SUPPORT_FLOAT 0
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Generic fallback
|
||||
*/
|
||||
#include <stdint.h>
|
||||
typedef int32_t khronos_int32_t;
|
||||
typedef uint32_t khronos_uint32_t;
|
||||
typedef int64_t khronos_int64_t;
|
||||
typedef uint64_t khronos_uint64_t;
|
||||
#define KHRONOS_SUPPORT_INT64 1
|
||||
#define KHRONOS_SUPPORT_FLOAT 1
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Types that are (so far) the same on all platforms
|
||||
*/
|
||||
typedef signed char khronos_int8_t;
|
||||
typedef unsigned char khronos_uint8_t;
|
||||
typedef signed short int khronos_int16_t;
|
||||
typedef unsigned short int khronos_uint16_t;
|
||||
typedef signed long int khronos_intptr_t;
|
||||
typedef unsigned long int khronos_uintptr_t;
|
||||
typedef signed long int khronos_ssize_t;
|
||||
typedef unsigned long int khronos_usize_t;
|
||||
|
||||
#if KHRONOS_SUPPORT_FLOAT
|
||||
/*
|
||||
* Float type
|
||||
*/
|
||||
typedef float khronos_float_t;
|
||||
#endif
|
||||
|
||||
#if KHRONOS_SUPPORT_INT64
|
||||
/* Time types
|
||||
*
|
||||
* These types can be used to represent a time interval in nanoseconds or
|
||||
* an absolute Unadjusted System Time. Unadjusted System Time is the number
|
||||
* of nanoseconds since some arbitrary system event (e.g. since the last
|
||||
* time the system booted). The Unadjusted System Time is an unsigned
|
||||
* 64 bit value that wraps back to 0 every 584 years. Time intervals
|
||||
* may be either signed or unsigned.
|
||||
*/
|
||||
typedef khronos_uint64_t khronos_utime_nanoseconds_t;
|
||||
typedef khronos_int64_t khronos_stime_nanoseconds_t;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Dummy value used to pad enum types to 32 bits.
|
||||
*/
|
||||
#ifndef KHRONOS_MAX_ENUM
|
||||
#define KHRONOS_MAX_ENUM 0x7FFFFFFF
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Enumerated boolean type
|
||||
*
|
||||
* Values other than zero should be considered to be true. Therefore
|
||||
* comparisons should not be made against KHRONOS_TRUE.
|
||||
*/
|
||||
typedef enum {
|
||||
KHRONOS_FALSE = 0,
|
||||
KHRONOS_TRUE = 1,
|
||||
KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM
|
||||
} khronos_boolean_enum_t;
|
||||
|
||||
#endif /* __khrplatform_h_ */
|
|
@ -0,0 +1,62 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Surface.h: Defines the egl::Surface class, representing a drawing surface
|
||||
// such as the client area of a window, including any back buffers.
|
||||
// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
|
||||
|
||||
#ifndef INCLUDE_SURFACE_H_
|
||||
#define INCLUDE_SURFACE_H_
|
||||
|
||||
#define EGLAPI
|
||||
#include <EGL/egl.h>
|
||||
#include <d3d9.h>
|
||||
|
||||
#include "angleutils.h"
|
||||
|
||||
namespace egl
|
||||
{
|
||||
class Surface
|
||||
{
|
||||
public:
|
||||
Surface(IDirect3DDevice9 *device, IDirect3DSwapChain9 *swapChain, EGLint configID);
|
||||
|
||||
~Surface();
|
||||
|
||||
HWND getWindowHandle();
|
||||
void swap();
|
||||
|
||||
EGLint getWidth() const;
|
||||
EGLint getHeight() const;
|
||||
|
||||
virtual IDirect3DSurface9 *getRenderTarget();
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(Surface);
|
||||
IDirect3DSwapChain9 *const mSwapChain;
|
||||
IDirect3DSurface9 *mBackBuffer;
|
||||
IDirect3DSurface9 *mRenderTarget;
|
||||
|
||||
const EGLint mConfigID; // ID of EGLConfig surface was created with
|
||||
EGLint mHeight; // Height of surface
|
||||
EGLint mWidth; // Width of surface
|
||||
// EGLint horizontalResolution; // Horizontal dot pitch
|
||||
// EGLint verticalResolution; // Vertical dot pitch
|
||||
// EGLBoolean largestPBuffer; // If true, create largest pbuffer possible
|
||||
// EGLBoolean mipmapTexture; // True if texture has mipmaps
|
||||
// EGLint mipmapLevel; // Mipmap level to render to
|
||||
// EGLenum multisampleResolve; // Multisample resolve behavior
|
||||
EGLint mPixelAspectRatio; // Display aspect ratio
|
||||
EGLenum mRenderBuffer; // Render buffer
|
||||
EGLenum mSwapBehavior; // Buffer swap behavior
|
||||
// EGLenum textureFormat; // Format of texture: RGB, RGBA, or no texture
|
||||
// EGLenum textureTarget; // Type of texture: 2D or no texture
|
||||
// EGLenum vgAlphaFormat; // Alpha format for OpenVG
|
||||
// EGLenum vgColorSpace; // Color space for OpenVG
|
||||
};
|
||||
}
|
||||
|
||||
#endif // INCLUDE_SURFACE_H_
|
|
@ -0,0 +1,14 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// angleutils.h: Common ANGLE utilities.
|
||||
|
||||
// A macro to disallow the copy constructor and operator= functions
|
||||
// This must be used in the private: declarations for a class
|
||||
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
|
||||
TypeName(const TypeName&); \
|
||||
void operator=(const TypeName&)
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// debug.h: Debugging utilities.
|
||||
|
||||
#ifndef COMMON_DEBUG_H_
|
||||
#define COMMON_DEBUG_H_
|
||||
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
namespace gl
|
||||
{
|
||||
// Outputs text to the debugging log
|
||||
void trace(const char *format, ...);
|
||||
}
|
||||
|
||||
// A macro to output a trace of a function call and its arguments to the debugging log
|
||||
#ifndef NDEBUG
|
||||
#define TRACE(arguments, ...) gl::trace("trace: %s("arguments")\n", __FUNCTION__, __VA_ARGS__)
|
||||
#else
|
||||
#define TRACE(...) ((void)0)
|
||||
#endif
|
||||
|
||||
// A macro to output a function call and its arguments to the debugging log, to denote an item in need of fixing. Will occur even in release mode.
|
||||
#define FIXME(arguments, ...) gl::trace("fixme: %s("arguments")\n", __FUNCTION__, __VA_ARGS__)
|
||||
|
||||
// A macro to output a function call and its arguments to the debugging log, in case of error. Will occur even in release mode.
|
||||
#define ERR(arguments, ...) gl::trace("err: %s("arguments")\n", __FUNCTION__, __VA_ARGS__)
|
||||
|
||||
// A macro asserting a condition and outputting failures to the debug log
|
||||
#define ASSERT(expression) do { \
|
||||
if(!(expression)) \
|
||||
ERR("\t! Assert failed in %s(%d): "#expression"\n", __FUNCTION__, __LINE__); \
|
||||
assert(expression); \
|
||||
} while(0)
|
||||
|
||||
|
||||
// A macro to indicate unimplemented functionality
|
||||
#ifndef NDEBUG
|
||||
#define UNIMPLEMENTED() do { \
|
||||
FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__); \
|
||||
assert(false); \
|
||||
} while(0)
|
||||
#else
|
||||
#define UNIMPLEMENTED() FIXME("\t! Unimplemented: %s(%d)\n", __FUNCTION__, __LINE__)
|
||||
#endif
|
||||
|
||||
// A macro for code which is not expected to be reached under valid assumptions
|
||||
#ifndef NDEBUG
|
||||
#define UNREACHABLE() do { \
|
||||
ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__); \
|
||||
assert(false); \
|
||||
} while(0)
|
||||
#else
|
||||
#define UNREACHABLE() ERR("\t! Unreachable reached: %s(%d)\n", __FUNCTION__, __LINE__)
|
||||
#endif
|
||||
|
||||
// A macro functioning as a compile-time assert to validate constant conditions
|
||||
#define META_ASSERT(condition) typedef int COMPILE_TIME_ASSERT_##__LINE__[static_cast<bool>(condition)?1:-1]
|
||||
|
||||
#endif // COMMON_DEBUG_H_
|
|
@ -0,0 +1,32 @@
|
|||
// Copyright (C) 2002-2010 The ANGLE Project Authors.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions
|
||||
// are met:
|
||||
//
|
||||
// Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
//
|
||||
// Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following
|
||||
// disclaimer in the documentation and/or other materials provided
|
||||
// with the distribution.
|
||||
//
|
||||
// Neither the name of TransGaming Inc., Google Inc., 3DLabs Inc.
|
||||
// Ltd., nor the names of their contributors may be used to endorse
|
||||
// or promote products derived from this software without specific
|
||||
// prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
@ -0,0 +1,408 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Config.cpp: Implements the egl::Config class, describing the format, type
|
||||
// and size for an egl::Surface. Implements EGLConfig and related functionality.
|
||||
// [EGL 1.4] section 3.4 page 15.
|
||||
|
||||
#include "Config.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace egl
|
||||
{
|
||||
Config::Config(D3DDISPLAYMODE displayMode, EGLint minInterval, EGLint maxInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample)
|
||||
: mDisplayMode(displayMode), mRenderTargetFormat(renderTargetFormat), mDepthStencilFormat(depthStencilFormat), mMultiSample(multiSample)
|
||||
{
|
||||
set(displayMode, minInterval, maxInterval, renderTargetFormat, depthStencilFormat, multiSample);
|
||||
}
|
||||
|
||||
void Config::setDefaults()
|
||||
{
|
||||
mBufferSize = 0;
|
||||
mRedSize = 0;
|
||||
mGreenSize = 0;
|
||||
mBlueSize = 0;
|
||||
mLuminanceSize = 0;
|
||||
mAlphaSize = 0;
|
||||
mAlphaMaskSize = 0;
|
||||
mBindToTextureRGB = EGL_DONT_CARE;
|
||||
mBindToTextureRGBA = EGL_DONT_CARE;
|
||||
mColorBufferType = EGL_RGB_BUFFER;
|
||||
mConfigCaveat = EGL_DONT_CARE;
|
||||
mConfigID = EGL_DONT_CARE;
|
||||
mConformant = 0;
|
||||
mDepthSize = 0;
|
||||
mLevel = 0;
|
||||
mMatchNativePixmap = EGL_NONE;
|
||||
mMaxPBufferWidth = 0;
|
||||
mMaxPBufferHeight = 0;
|
||||
mMaxPBufferPixels = 0;
|
||||
mMaxSwapInterval = EGL_DONT_CARE;
|
||||
mMinSwapInterval = EGL_DONT_CARE;
|
||||
mNativeRenderable = EGL_DONT_CARE;
|
||||
mNativeVisualID = 0;
|
||||
mNativeVisualType = EGL_DONT_CARE;
|
||||
mRenderableType = EGL_OPENGL_ES_BIT;
|
||||
mSampleBuffers = 0;
|
||||
mSamples = 0;
|
||||
mStencilSize = 0;
|
||||
mSurfaceType = EGL_WINDOW_BIT;
|
||||
mTransparentType = EGL_NONE;
|
||||
mTransparentRedValue = EGL_DONT_CARE;
|
||||
mTransparentGreenValue = EGL_DONT_CARE;
|
||||
mTransparentBlueValue = EGL_DONT_CARE;
|
||||
}
|
||||
|
||||
void Config::set(D3DDISPLAYMODE displayMode, EGLint minInterval, EGLint maxInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample)
|
||||
{
|
||||
switch (renderTargetFormat)
|
||||
{
|
||||
case D3DFMT_A1R5G5B5:
|
||||
mBufferSize = 16;
|
||||
mRedSize = 5;
|
||||
mGreenSize = 5;
|
||||
mBlueSize = 5;
|
||||
mAlphaSize = 1;
|
||||
break;
|
||||
case D3DFMT_A2R10G10B10:
|
||||
mBufferSize = 32;
|
||||
mRedSize = 10;
|
||||
mGreenSize = 10;
|
||||
mBlueSize = 10;
|
||||
mAlphaSize = 2;
|
||||
break;
|
||||
case D3DFMT_A8R8G8B8:
|
||||
mBufferSize = 32;
|
||||
mRedSize = 8;
|
||||
mGreenSize = 8;
|
||||
mBlueSize = 8;
|
||||
mAlphaSize = 8;
|
||||
break;
|
||||
case D3DFMT_R5G6B5:
|
||||
mBufferSize = 16;
|
||||
mRedSize = 5;
|
||||
mGreenSize = 6;
|
||||
mBlueSize = 5;
|
||||
mAlphaSize = 0;
|
||||
break;
|
||||
case D3DFMT_X1R5G5B5:
|
||||
mBufferSize = 16;
|
||||
mRedSize = 5;
|
||||
mGreenSize = 5;
|
||||
mBlueSize = 5;
|
||||
mAlphaSize = 0;
|
||||
break;
|
||||
case D3DFMT_X8R8G8B8:
|
||||
mBufferSize = 32;
|
||||
mRedSize = 8;
|
||||
mGreenSize = 8;
|
||||
mBlueSize = 8;
|
||||
mAlphaSize = 0;
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE(); // Other formats should not be valid
|
||||
}
|
||||
|
||||
mLuminanceSize = 0;
|
||||
mAlphaMaskSize = 0;
|
||||
mBindToTextureRGB = EGL_FALSE;
|
||||
mBindToTextureRGBA = EGL_FALSE;
|
||||
mColorBufferType = EGL_RGB_BUFFER;
|
||||
mConfigCaveat = (displayMode.Format == renderTargetFormat) ? EGL_NONE : EGL_SLOW_CONFIG;
|
||||
mConfigID = 0;
|
||||
mConformant = EGL_OPENGL_ES2_BIT;
|
||||
|
||||
switch (depthStencilFormat)
|
||||
{
|
||||
// case D3DFMT_D16_LOCKABLE:
|
||||
// mDepthSize = 16;
|
||||
// mStencilSize = 0;
|
||||
// break;
|
||||
case D3DFMT_D32:
|
||||
mDepthSize = 32;
|
||||
mStencilSize = 0;
|
||||
break;
|
||||
case D3DFMT_D15S1:
|
||||
mDepthSize = 16;
|
||||
mStencilSize = 1;
|
||||
break;
|
||||
case D3DFMT_D24S8:
|
||||
mDepthSize = 24;
|
||||
mStencilSize = 8;
|
||||
break;
|
||||
case D3DFMT_D24X8:
|
||||
mDepthSize = 24;
|
||||
mStencilSize = 0;
|
||||
break;
|
||||
case D3DFMT_D24X4S4:
|
||||
mDepthSize = 24;
|
||||
mStencilSize = 4;
|
||||
break;
|
||||
case D3DFMT_D16:
|
||||
mDepthSize = 16;
|
||||
mStencilSize = 0;
|
||||
break;
|
||||
// case D3DFMT_D32F_LOCKABLE:
|
||||
// mDepthSize = 32;
|
||||
// mStencilSize = 0;
|
||||
// break;
|
||||
// case D3DFMT_D24FS8:
|
||||
// mDepthSize = 24;
|
||||
// mStencilSize = 8;
|
||||
// break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
mLevel = 0;
|
||||
mMatchNativePixmap = EGL_NONE;
|
||||
mMaxPBufferWidth = 0;
|
||||
mMaxPBufferHeight = 0;
|
||||
mMaxPBufferPixels = 0;
|
||||
mMaxSwapInterval = maxInterval;
|
||||
mMinSwapInterval = minInterval;
|
||||
mNativeRenderable = EGL_FALSE;
|
||||
mNativeVisualID = 0;
|
||||
mNativeVisualType = 0;
|
||||
mRenderableType = EGL_OPENGL_ES2_BIT;
|
||||
mSampleBuffers = multiSample ? 1 : 0;
|
||||
mSamples = multiSample;
|
||||
mSurfaceType = EGL_PBUFFER_BIT | EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
|
||||
mTransparentType = EGL_NONE;
|
||||
mTransparentRedValue = 0;
|
||||
mTransparentGreenValue = 0;
|
||||
mTransparentBlueValue = 0;
|
||||
}
|
||||
|
||||
EGLConfig Config::getHandle() const
|
||||
{
|
||||
return (EGLConfig)(size_t)mConfigID;
|
||||
}
|
||||
|
||||
SortConfig::SortConfig(const EGLint *attribList)
|
||||
: mWantRed(false), mWantGreen(false), mWantBlue(false), mWantAlpha(false), mWantLuminance(false)
|
||||
{
|
||||
scanForWantedComponents(attribList);
|
||||
}
|
||||
|
||||
void SortConfig::scanForWantedComponents(const EGLint *attribList)
|
||||
{
|
||||
// [EGL] section 3.4.1 page 24
|
||||
// Sorting rule #3: by larger total number of color bits, not considering
|
||||
// components that are 0 or don't-care.
|
||||
for (const EGLint *attr = attribList; attr[0] != EGL_NONE; attr += 2)
|
||||
{
|
||||
if (attr[1] != 0 && attr[1] != EGL_DONT_CARE)
|
||||
{
|
||||
switch (attr[0])
|
||||
{
|
||||
case EGL_RED_SIZE: mWantRed = true; break;
|
||||
case EGL_GREEN_SIZE: mWantGreen = true; break;
|
||||
case EGL_BLUE_SIZE: mWantBlue = true; break;
|
||||
case EGL_ALPHA_SIZE: mWantAlpha = true; break;
|
||||
case EGL_LUMINANCE_SIZE: mWantLuminance = true; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EGLint SortConfig::wantedComponentsSize(const Config &config) const
|
||||
{
|
||||
EGLint total = 0;
|
||||
|
||||
if (mWantRed) total += config.mRedSize;
|
||||
if (mWantGreen) total += config.mGreenSize;
|
||||
if (mWantBlue) total += config.mBlueSize;
|
||||
if (mWantAlpha) total += config.mAlphaSize;
|
||||
if (mWantLuminance) total += config.mLuminanceSize;
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
bool SortConfig::operator()(const Config *x, const Config *y) const
|
||||
{
|
||||
return (*this)(*x, *y);
|
||||
}
|
||||
|
||||
bool SortConfig::operator()(const Config &x, const Config &y) const
|
||||
{
|
||||
#define SORT(attribute) \
|
||||
if (x.attribute != y.attribute) \
|
||||
{ \
|
||||
return x.attribute < y.attribute; \
|
||||
}
|
||||
|
||||
META_ASSERT(EGL_NONE < EGL_SLOW_CONFIG && EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG);
|
||||
SORT(mConfigCaveat);
|
||||
|
||||
META_ASSERT(EGL_RGB_BUFFER < EGL_LUMINANCE_BUFFER);
|
||||
SORT(mColorBufferType);
|
||||
|
||||
// By larger total number of color bits, only considering those that are requested to be > 0.
|
||||
EGLint xComponentsSize = wantedComponentsSize(x);
|
||||
EGLint yComponentsSize = wantedComponentsSize(y);
|
||||
if (xComponentsSize != yComponentsSize)
|
||||
{
|
||||
return xComponentsSize > yComponentsSize;
|
||||
}
|
||||
|
||||
SORT(mBufferSize);
|
||||
SORT(mSampleBuffers);
|
||||
SORT(mSamples);
|
||||
SORT(mDepthSize);
|
||||
SORT(mStencilSize);
|
||||
SORT(mAlphaMaskSize);
|
||||
SORT(mNativeVisualType);
|
||||
SORT(mConfigID);
|
||||
|
||||
#undef SORT
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// We'd like to use SortConfig to also eliminate duplicate configs.
|
||||
// This works as long as we never have two configs with different per-RGB-component layouts,
|
||||
// but the same total.
|
||||
// 5551 and 565 are different because R+G+B is different.
|
||||
// 5551 and 555 are different because bufferSize is different.
|
||||
const EGLint ConfigSet::mSortAttribs[] =
|
||||
{
|
||||
EGL_RED_SIZE, 1,
|
||||
EGL_GREEN_SIZE, 1,
|
||||
EGL_BLUE_SIZE, 1,
|
||||
EGL_LUMINANCE_SIZE, 1,
|
||||
// BUT NOT ALPHA
|
||||
EGL_NONE
|
||||
};
|
||||
|
||||
ConfigSet::ConfigSet()
|
||||
: mSet(SortConfig(mSortAttribs))
|
||||
{
|
||||
}
|
||||
|
||||
void ConfigSet::add(D3DDISPLAYMODE displayMode, EGLint minSwapInterval, EGLint maxSwapInterval, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat, EGLint multiSample)
|
||||
{
|
||||
Config config(displayMode, minSwapInterval, maxSwapInterval, renderTargetFormat, depthStencilFormat, multiSample);
|
||||
|
||||
mSet.insert(config);
|
||||
}
|
||||
|
||||
void ConfigSet::enumerate()
|
||||
{
|
||||
EGLint index = 1;
|
||||
|
||||
for (Iterator config = mSet.begin(); config != mSet.end(); config++)
|
||||
{
|
||||
config->mConfigID = index;
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
size_t ConfigSet::size() const
|
||||
{
|
||||
return mSet.size();
|
||||
}
|
||||
|
||||
bool ConfigSet::getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig)
|
||||
{
|
||||
if (configs)
|
||||
{
|
||||
vector<const Config*> passed;
|
||||
passed.reserve(mSet.size());
|
||||
|
||||
for (Iterator config = mSet.begin(); config != mSet.end(); config++)
|
||||
{
|
||||
bool match = true;
|
||||
const EGLint *attribute = attribList;
|
||||
|
||||
while (attribute[0] != EGL_NONE)
|
||||
{
|
||||
switch (attribute[0])
|
||||
{
|
||||
case EGL_BUFFER_SIZE: match = config->mBufferSize >= attribute[1]; break;
|
||||
case EGL_ALPHA_SIZE: match = config->mAlphaSize >= attribute[1]; break;
|
||||
case EGL_BLUE_SIZE: match = config->mBlueSize >= attribute[1]; break;
|
||||
case EGL_GREEN_SIZE: match = config->mGreenSize >= attribute[1]; break;
|
||||
case EGL_RED_SIZE: match = config->mRedSize >= attribute[1]; break;
|
||||
case EGL_DEPTH_SIZE: match = config->mDepthSize >= attribute[1]; break;
|
||||
case EGL_STENCIL_SIZE: match = config->mStencilSize >= attribute[1]; break;
|
||||
case EGL_CONFIG_CAVEAT: match = config->mConfigCaveat == attribute[1]; break;
|
||||
case EGL_CONFIG_ID: match = config->mConfigID == attribute[1]; break;
|
||||
case EGL_LEVEL: match = config->mLevel >= attribute[1]; break;
|
||||
case EGL_NATIVE_RENDERABLE: match = config->mNativeRenderable == attribute[1]; break;
|
||||
case EGL_NATIVE_VISUAL_TYPE: match = config->mNativeVisualType == attribute[1]; break;
|
||||
case EGL_SAMPLES: match = config->mSamples >= attribute[1]; break;
|
||||
case EGL_SAMPLE_BUFFERS: match = config->mSampleBuffers >= attribute[1]; break;
|
||||
case EGL_SURFACE_TYPE: match = (config->mSurfaceType & attribute[1]) == attribute[1]; break;
|
||||
case EGL_TRANSPARENT_TYPE: match = config->mTransparentType == attribute[1]; break;
|
||||
case EGL_TRANSPARENT_BLUE_VALUE: match = config->mTransparentBlueValue == attribute[1]; break;
|
||||
case EGL_TRANSPARENT_GREEN_VALUE: match = config->mTransparentGreenValue == attribute[1]; break;
|
||||
case EGL_TRANSPARENT_RED_VALUE: match = config->mTransparentRedValue == attribute[1]; break;
|
||||
case EGL_BIND_TO_TEXTURE_RGB: match = config->mBindToTextureRGB == attribute[1]; break;
|
||||
case EGL_BIND_TO_TEXTURE_RGBA: match = config->mBindToTextureRGBA == attribute[1]; break;
|
||||
case EGL_MIN_SWAP_INTERVAL: match = config->mMinSwapInterval == attribute[1]; break;
|
||||
case EGL_MAX_SWAP_INTERVAL: match = config->mMaxSwapInterval == attribute[1]; break;
|
||||
case EGL_LUMINANCE_SIZE: match = config->mLuminanceSize >= attribute[1]; break;
|
||||
case EGL_ALPHA_MASK_SIZE: match = config->mAlphaMaskSize >= attribute[1]; break;
|
||||
case EGL_COLOR_BUFFER_TYPE: match = config->mColorBufferType == attribute[1]; break;
|
||||
case EGL_RENDERABLE_TYPE: match = (config->mRenderableType & attribute[1]) == attribute[1]; break;
|
||||
case EGL_MATCH_NATIVE_PIXMAP: match = false; UNIMPLEMENTED(); break;
|
||||
case EGL_CONFORMANT: match = (config->mConformant & attribute[1]) == attribute[1]; break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!match)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
attribute += 2;
|
||||
}
|
||||
|
||||
if (match)
|
||||
{
|
||||
passed.push_back(&*config);
|
||||
}
|
||||
}
|
||||
|
||||
sort(passed.begin(), passed.end(), SortConfig(attribList));
|
||||
|
||||
EGLint index;
|
||||
for (index = 0; index < configSize && index < static_cast<EGLint>(passed.size()); index++)
|
||||
{
|
||||
configs[index] = passed[index]->getHandle();
|
||||
}
|
||||
|
||||
*numConfig = index;
|
||||
}
|
||||
else
|
||||
{
|
||||
*numConfig = (EGLint)mSet.size();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const egl::Config *ConfigSet::get(EGLConfig configHandle)
|
||||
{
|
||||
for (Iterator config = mSet.begin(); config != mSet.end(); config++)
|
||||
{
|
||||
if (config->getHandle() == configHandle)
|
||||
{
|
||||
return &(*config);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,338 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Display.cpp: Implements the egl::Display class, representing the abstract
|
||||
// display on which graphics are drawn. Implements EGLDisplay.
|
||||
// [EGL 1.4] section 2.1.2 page 3.
|
||||
|
||||
#include "Display.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "debug.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace egl
|
||||
{
|
||||
Display::Display(HDC deviceContext) : mDc(deviceContext)
|
||||
{
|
||||
mD3d9 = NULL;
|
||||
mDevice = NULL;
|
||||
|
||||
mAdapter = D3DADAPTER_DEFAULT;
|
||||
mDeviceType = D3DDEVTYPE_HAL;
|
||||
}
|
||||
|
||||
Display::~Display()
|
||||
{
|
||||
terminate();
|
||||
}
|
||||
|
||||
bool Display::initialize()
|
||||
{
|
||||
if (isInitialized())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
mD3d9 = Direct3DCreate9(D3D_SDK_VERSION);
|
||||
|
||||
if (mD3d9)
|
||||
{
|
||||
if (mDc != NULL)
|
||||
{
|
||||
// UNIMPLEMENTED(); // FIXME: Determine which adapter index the device context corresponds to
|
||||
}
|
||||
|
||||
D3DCAPS9 caps;
|
||||
HRESULT result = mD3d9->GetDeviceCaps(mAdapter, mDeviceType, &caps);
|
||||
|
||||
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
|
||||
{
|
||||
return error(EGL_BAD_ALLOC, false);
|
||||
}
|
||||
|
||||
if (caps.PixelShaderVersion < D3DPS_VERSION(2, 0) || caps.VertexShaderVersion < D3DVS_VERSION(2, 0))
|
||||
{
|
||||
mD3d9->Release();
|
||||
mD3d9 = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
EGLint minSwapInterval = 4;
|
||||
EGLint maxSwapInterval = 0;
|
||||
|
||||
if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_IMMEDIATE) {minSwapInterval = min(minSwapInterval, 0); maxSwapInterval = max(maxSwapInterval, 0);}
|
||||
if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_ONE) {minSwapInterval = min(minSwapInterval, 1); maxSwapInterval = max(maxSwapInterval, 1);}
|
||||
if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_TWO) {minSwapInterval = min(minSwapInterval, 2); maxSwapInterval = max(maxSwapInterval, 2);}
|
||||
if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_THREE) {minSwapInterval = min(minSwapInterval, 3); maxSwapInterval = max(maxSwapInterval, 3);}
|
||||
if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_FOUR) {minSwapInterval = min(minSwapInterval, 4); maxSwapInterval = max(maxSwapInterval, 4);}
|
||||
|
||||
const D3DFORMAT adapterFormats[] =
|
||||
{
|
||||
D3DFMT_A1R5G5B5,
|
||||
D3DFMT_A2R10G10B10,
|
||||
D3DFMT_A8R8G8B8,
|
||||
D3DFMT_R5G6B5,
|
||||
D3DFMT_X1R5G5B5,
|
||||
D3DFMT_X8R8G8B8
|
||||
};
|
||||
|
||||
const D3DFORMAT depthStencilFormats[] =
|
||||
{
|
||||
// D3DFMT_D16_LOCKABLE,
|
||||
D3DFMT_D32,
|
||||
D3DFMT_D15S1,
|
||||
D3DFMT_D24S8,
|
||||
D3DFMT_D24X8,
|
||||
D3DFMT_D24X4S4,
|
||||
D3DFMT_D16,
|
||||
// D3DFMT_D32F_LOCKABLE,
|
||||
// D3DFMT_D24FS8
|
||||
};
|
||||
|
||||
D3DDISPLAYMODE currentDisplayMode;
|
||||
mD3d9->GetAdapterDisplayMode(mAdapter, ¤tDisplayMode);
|
||||
|
||||
for (int formatIndex = 0; formatIndex < sizeof(adapterFormats) / sizeof(D3DFORMAT); formatIndex++)
|
||||
{
|
||||
D3DFORMAT renderTargetFormat = adapterFormats[formatIndex];
|
||||
|
||||
HRESULT result = mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, renderTargetFormat);
|
||||
|
||||
if (SUCCEEDED(result))
|
||||
{
|
||||
for (int depthStencilIndex = 0; depthStencilIndex < sizeof(depthStencilFormats) / sizeof(D3DFORMAT); depthStencilIndex++)
|
||||
{
|
||||
D3DFORMAT depthStencilFormat = depthStencilFormats[depthStencilIndex];
|
||||
HRESULT result = mD3d9->CheckDeviceFormat(mAdapter, mDeviceType, currentDisplayMode.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, depthStencilFormat);
|
||||
|
||||
if (SUCCEEDED(result))
|
||||
{
|
||||
HRESULT result = mD3d9->CheckDepthStencilMatch(mAdapter, mDeviceType, currentDisplayMode.Format, renderTargetFormat, depthStencilFormat); // FIXME: Only accept color formats available both in fullscreen and windowed?
|
||||
|
||||
if (SUCCEEDED(result))
|
||||
{
|
||||
// FIXME: Enumerate multi-sampling
|
||||
|
||||
mConfigSet.add(currentDisplayMode, minSwapInterval, maxSwapInterval, renderTargetFormat, depthStencilFormat, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mConfigSet.enumerate();
|
||||
}
|
||||
|
||||
if (!isInitialized())
|
||||
{
|
||||
terminate();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Display::terminate()
|
||||
{
|
||||
for (SurfaceSet::iterator surface = mSurfaceSet.begin(); surface != mSurfaceSet.end(); surface++)
|
||||
{
|
||||
delete *surface;
|
||||
}
|
||||
|
||||
for (ContextSet::iterator context = mContextSet.begin(); context != mContextSet.end(); context++)
|
||||
{
|
||||
glDestroyContext(*context);
|
||||
}
|
||||
|
||||
if (mDevice)
|
||||
{
|
||||
mDevice->Release();
|
||||
mDevice = NULL;
|
||||
}
|
||||
|
||||
if (mD3d9)
|
||||
{
|
||||
mD3d9->Release();
|
||||
mD3d9 = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool Display::getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig)
|
||||
{
|
||||
return mConfigSet.getConfigs(configs, attribList, configSize, numConfig);
|
||||
}
|
||||
|
||||
bool Display::getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value)
|
||||
{
|
||||
const egl::Config *configuration = mConfigSet.get(config);
|
||||
|
||||
switch (attribute)
|
||||
{
|
||||
case EGL_BUFFER_SIZE: *value = configuration->mBufferSize; break;
|
||||
case EGL_ALPHA_SIZE: *value = configuration->mAlphaSize; break;
|
||||
case EGL_BLUE_SIZE: *value = configuration->mBlueSize; break;
|
||||
case EGL_GREEN_SIZE: *value = configuration->mGreenSize; break;
|
||||
case EGL_RED_SIZE: *value = configuration->mRedSize; break;
|
||||
case EGL_DEPTH_SIZE: *value = configuration->mDepthSize; break;
|
||||
case EGL_STENCIL_SIZE: *value = configuration->mStencilSize; break;
|
||||
case EGL_CONFIG_CAVEAT: *value = configuration->mConfigCaveat; break;
|
||||
case EGL_CONFIG_ID: *value = configuration->mConfigID; break;
|
||||
case EGL_LEVEL: *value = configuration->mLevel; break;
|
||||
case EGL_NATIVE_RENDERABLE: *value = configuration->mNativeRenderable; break;
|
||||
case EGL_NATIVE_VISUAL_TYPE: *value = configuration->mNativeVisualType; break;
|
||||
case EGL_SAMPLES: *value = configuration->mSamples; break;
|
||||
case EGL_SAMPLE_BUFFERS: *value = configuration->mSampleBuffers; break;
|
||||
case EGL_SURFACE_TYPE: *value = configuration->mSurfaceType; break;
|
||||
case EGL_TRANSPARENT_TYPE: *value = configuration->mTransparentType; break;
|
||||
case EGL_TRANSPARENT_BLUE_VALUE: *value = configuration->mTransparentBlueValue; break;
|
||||
case EGL_TRANSPARENT_GREEN_VALUE: *value = configuration->mTransparentGreenValue; break;
|
||||
case EGL_TRANSPARENT_RED_VALUE: *value = configuration->mTransparentRedValue; break;
|
||||
case EGL_BIND_TO_TEXTURE_RGB: *value = configuration->mBindToTextureRGB; break;
|
||||
case EGL_BIND_TO_TEXTURE_RGBA: *value = configuration->mBindToTextureRGBA; break;
|
||||
case EGL_MIN_SWAP_INTERVAL: *value = configuration->mMinSwapInterval; break;
|
||||
case EGL_MAX_SWAP_INTERVAL: *value = configuration->mMaxSwapInterval; break;
|
||||
case EGL_LUMINANCE_SIZE: *value = configuration->mLuminanceSize; break;
|
||||
case EGL_ALPHA_MASK_SIZE: *value = configuration->mAlphaMaskSize; break;
|
||||
case EGL_COLOR_BUFFER_TYPE: *value = configuration->mColorBufferType; break;
|
||||
case EGL_RENDERABLE_TYPE: *value = configuration->mRenderableType; break;
|
||||
case EGL_MATCH_NATIVE_PIXMAP: *value = false; UNIMPLEMENTED(); break;
|
||||
case EGL_CONFORMANT: *value = configuration->mConformant; break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
egl::Surface *Display::createWindowSurface(HWND window, EGLConfig config)
|
||||
{
|
||||
const egl::Config *configuration = mConfigSet.get(config);
|
||||
|
||||
UINT adapter = D3DADAPTER_DEFAULT;
|
||||
D3DDEVTYPE deviceType = D3DDEVTYPE_HAL;
|
||||
D3DPRESENT_PARAMETERS presentParameters = {0};
|
||||
|
||||
presentParameters.AutoDepthStencilFormat = configuration->mDepthStencilFormat;
|
||||
presentParameters.BackBufferCount = 1;
|
||||
presentParameters.BackBufferFormat = configuration->mRenderTargetFormat;
|
||||
presentParameters.BackBufferWidth = 0;
|
||||
presentParameters.BackBufferHeight = 0;
|
||||
presentParameters.EnableAutoDepthStencil = configuration->mDepthSize ? TRUE : FALSE;
|
||||
presentParameters.Flags = 0;
|
||||
presentParameters.hDeviceWindow = window;
|
||||
presentParameters.MultiSampleQuality = 0; // FIXME: Unimplemented
|
||||
presentParameters.MultiSampleType = D3DMULTISAMPLE_NONE; // FIXME: Unimplemented
|
||||
presentParameters.PresentationInterval = configuration->mMinSwapInterval;
|
||||
presentParameters.SwapEffect = D3DSWAPEFFECT_COPY;
|
||||
presentParameters.Windowed = TRUE; // FIXME
|
||||
|
||||
IDirect3DSwapChain9 *swapChain = NULL;
|
||||
|
||||
if (!mDevice)
|
||||
{
|
||||
HRESULT result = mD3d9->CreateDevice(adapter, deviceType, window, D3DCREATE_FPU_PRESERVE | D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_NOWINDOWCHANGES, &presentParameters, &mDevice);
|
||||
|
||||
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
|
||||
{
|
||||
return error(EGL_BAD_ALLOC, (egl::Surface*)NULL);
|
||||
}
|
||||
|
||||
ASSERT(SUCCEEDED(result));
|
||||
|
||||
if (mDevice)
|
||||
{
|
||||
mDevice->GetSwapChain(0, &swapChain);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
HRESULT result = mDevice->CreateAdditionalSwapChain(&presentParameters, &swapChain);
|
||||
|
||||
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
|
||||
{
|
||||
return error(EGL_BAD_ALLOC, (egl::Surface*)NULL);
|
||||
}
|
||||
|
||||
ASSERT(SUCCEEDED(result));
|
||||
}
|
||||
|
||||
Surface *surface = NULL;
|
||||
|
||||
if (swapChain)
|
||||
{
|
||||
surface = new Surface(mDevice, swapChain, configuration->mConfigID);
|
||||
mSurfaceSet.insert(surface);
|
||||
|
||||
swapChain->Release();
|
||||
}
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
EGLContext Display::createContext(EGLConfig configHandle)
|
||||
{
|
||||
const egl::Config *config = mConfigSet.get(configHandle);
|
||||
|
||||
gl::Context *context = glCreateContext(config);
|
||||
mContextSet.insert(context);
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
void Display::destroySurface(egl::Surface *surface)
|
||||
{
|
||||
delete surface;
|
||||
mSurfaceSet.erase(surface);
|
||||
}
|
||||
|
||||
void Display::destroyContext(gl::Context *context)
|
||||
{
|
||||
glDestroyContext(context);
|
||||
mContextSet.erase(context);
|
||||
}
|
||||
|
||||
bool Display::isInitialized()
|
||||
{
|
||||
return mD3d9 != NULL && mConfigSet.size() > 0;
|
||||
}
|
||||
|
||||
bool Display::isValidConfig(EGLConfig config)
|
||||
{
|
||||
return mConfigSet.get(config) != NULL;
|
||||
}
|
||||
|
||||
bool Display::isValidContext(gl::Context *context)
|
||||
{
|
||||
return mContextSet.find(context) != mContextSet.end();
|
||||
}
|
||||
|
||||
bool Display::isValidSurface(egl::Surface *surface)
|
||||
{
|
||||
return mSurfaceSet.find(surface) != mSurfaceSet.end();
|
||||
}
|
||||
|
||||
bool Display::hasExistingWindowSurface(HWND window)
|
||||
{
|
||||
for (SurfaceSet::iterator surface = mSurfaceSet.begin(); surface != mSurfaceSet.end(); surface++)
|
||||
{
|
||||
if ((*surface)->getWindowHandle() == window)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
IDirect3DDevice9 *Display::getDevice()
|
||||
{
|
||||
return mDevice;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,174 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Surface.cpp: Implements the egl::Surface class, representing a drawing surface
|
||||
// such as the client area of a window, including any back buffers.
|
||||
// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.
|
||||
|
||||
#include "Surface.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "debug.h"
|
||||
|
||||
namespace egl
|
||||
{
|
||||
Surface::Surface(IDirect3DDevice9 *device, IDirect3DSwapChain9 *swapChain, EGLint configID) : mSwapChain(swapChain), mConfigID(configID)
|
||||
{
|
||||
mBackBuffer = NULL;
|
||||
mRenderTarget = NULL;
|
||||
|
||||
mPixelAspectRatio = (EGLint)(1.0 * EGL_DISPLAY_SCALING); // FIXME: Determine actual pixel aspect ratio
|
||||
mRenderBuffer = EGL_BACK_BUFFER;
|
||||
mSwapBehavior = EGL_BUFFER_PRESERVED;
|
||||
|
||||
if (mSwapChain)
|
||||
{
|
||||
mSwapChain->AddRef();
|
||||
mSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &mBackBuffer);
|
||||
|
||||
D3DSURFACE_DESC description;
|
||||
mBackBuffer->GetDesc(&description);
|
||||
|
||||
mWidth = description.Width;
|
||||
mHeight = description.Height;
|
||||
|
||||
HRESULT result = device->CreateRenderTarget(mWidth, mHeight, description.Format, description.MultiSampleType, description.MultiSampleQuality, FALSE, &mRenderTarget, NULL);
|
||||
|
||||
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
|
||||
{
|
||||
error(EGL_BAD_ALLOC);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
ASSERT(SUCCEEDED(result));
|
||||
}
|
||||
}
|
||||
|
||||
Surface::~Surface()
|
||||
{
|
||||
if (mSwapChain)
|
||||
{
|
||||
mSwapChain->Release();
|
||||
}
|
||||
|
||||
if (mBackBuffer)
|
||||
{
|
||||
mBackBuffer->Release();
|
||||
}
|
||||
|
||||
if (mRenderTarget)
|
||||
{
|
||||
mRenderTarget->Release();
|
||||
}
|
||||
}
|
||||
|
||||
HWND Surface::getWindowHandle()
|
||||
{
|
||||
if (mSwapChain)
|
||||
{
|
||||
D3DPRESENT_PARAMETERS presentParameters;
|
||||
mSwapChain->GetPresentParameters(&presentParameters);
|
||||
|
||||
return presentParameters.hDeviceWindow;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void Surface::swap()
|
||||
{
|
||||
if (mSwapChain)
|
||||
{
|
||||
IDirect3DDevice9 *device;
|
||||
mSwapChain->GetDevice(&device);
|
||||
|
||||
D3DSURFACE_DESC description;
|
||||
mBackBuffer->GetDesc(&description);
|
||||
|
||||
// Copy the render target into a texture
|
||||
IDirect3DTexture9 *texture;
|
||||
HRESULT result = device->CreateTexture(mWidth, mHeight, 1, D3DUSAGE_RENDERTARGET, description.Format, D3DPOOL_DEFAULT, &texture, NULL);
|
||||
|
||||
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
|
||||
{
|
||||
return error(EGL_BAD_ALLOC);
|
||||
}
|
||||
|
||||
ASSERT(SUCCEEDED(result));
|
||||
|
||||
IDirect3DSurface9 *textureSurface;
|
||||
texture->GetSurfaceLevel(0, &textureSurface);
|
||||
|
||||
device->StretchRect(mRenderTarget, NULL, textureSurface, NULL, D3DTEXF_POINT);
|
||||
|
||||
// Disable all pipeline operations
|
||||
device->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
|
||||
device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
|
||||
device->SetRenderState(D3DRS_ALPHATESTENABLE , FALSE);
|
||||
device->SetRenderState(D3DRS_ALPHABLENDENABLE , FALSE);
|
||||
device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
|
||||
device->SetRenderState(D3DRS_STENCILENABLE, FALSE);
|
||||
device->SetRenderState(D3DRS_CLIPPLANEENABLE, 0);
|
||||
device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA | D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_RED);
|
||||
device->SetRenderState(D3DRS_SRGBWRITEENABLE, FALSE);
|
||||
device->SetPixelShader(NULL);
|
||||
device->SetVertexShader(NULL);
|
||||
|
||||
// Just sample the texture
|
||||
device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
||||
device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
||||
device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
||||
device->SetTexture(0, texture);
|
||||
device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
|
||||
device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
|
||||
device->SetSamplerState(0, D3DSAMP_SRGBTEXTURE, FALSE);
|
||||
device->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1);
|
||||
device->SetRenderTarget(0, mBackBuffer);
|
||||
|
||||
// Render the texture upside down into the back buffer
|
||||
float quad[4][6] = {{ 0 - 0.5f, 0 - 0.5f, 0.0f, 1.0f, 0.0f, 1.0f},
|
||||
{mWidth - 0.5f, 0 - 0.5f, 0.0f, 1.0f, 1.0f, 1.0f},
|
||||
{mWidth - 0.5f, mHeight - 0.5f, 0.0f, 1.0f, 1.0f, 0.0f},
|
||||
{ 0 - 0.5f, mHeight - 0.5f, 0.0f, 1.0f, 0.0f, 0.0f}}; // x, y, z, rhw, u, v
|
||||
|
||||
device->BeginScene();
|
||||
device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, quad, 6 * sizeof(float));
|
||||
device->EndScene();
|
||||
|
||||
result = mSwapChain->Present(NULL, NULL, NULL, NULL, D3DPRESENT_INTERVAL_DEFAULT); // FIXME: Get the swap interval from the associated Display
|
||||
|
||||
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY || result == D3DERR_DRIVERINTERNALERROR)
|
||||
{
|
||||
return error(EGL_BAD_ALLOC);
|
||||
}
|
||||
|
||||
textureSurface->Release();
|
||||
texture->Release();
|
||||
device->Release();
|
||||
}
|
||||
}
|
||||
|
||||
EGLint Surface::getWidth() const
|
||||
{
|
||||
return mWidth;
|
||||
}
|
||||
|
||||
EGLint Surface::getHeight() const
|
||||
{
|
||||
return mHeight;
|
||||
}
|
||||
|
||||
IDirect3DSurface9 *Surface::getRenderTarget()
|
||||
{
|
||||
if (mRenderTarget)
|
||||
{
|
||||
mRenderTarget->AddRef();
|
||||
}
|
||||
|
||||
return mRenderTarget;
|
||||
}
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,36 @@
|
|||
LIBRARY libEGL
|
||||
EXPORTS
|
||||
eglBindAPI @14
|
||||
eglBindTexImage @20
|
||||
eglChooseConfig @7
|
||||
eglCopyBuffers @33
|
||||
eglCreateContext @23
|
||||
eglCreatePbufferFromClientBuffer @18
|
||||
eglCreatePbufferSurface @10
|
||||
eglCreatePixmapSurface @11
|
||||
eglCreateWindowSurface @9
|
||||
eglDestroyContext @24
|
||||
eglDestroySurface @12
|
||||
eglGetConfigAttrib @8
|
||||
eglGetConfigs @6
|
||||
eglGetCurrentContext @26
|
||||
eglGetCurrentDisplay @28
|
||||
eglGetCurrentSurface @27
|
||||
eglGetDisplay @2
|
||||
eglGetError @1
|
||||
eglGetProcAddress @34
|
||||
eglInitialize @3
|
||||
eglMakeCurrent @25
|
||||
eglQueryAPI @15
|
||||
eglQueryContext @29
|
||||
eglQueryString @5
|
||||
eglQuerySurface @13
|
||||
eglReleaseTexImage @21
|
||||
eglReleaseThread @17
|
||||
eglSurfaceAttrib @19
|
||||
eglSwapBuffers @32
|
||||
eglSwapInterval @22
|
||||
eglTerminate @4
|
||||
eglWaitClient @16
|
||||
eglWaitGL @30
|
||||
eglWaitNative @31
|
|
@ -0,0 +1,266 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9.00"
|
||||
Name="libEGL"
|
||||
ProjectGUID="{E746FCA9-64C3-433E-85E8-9A5A67AB7ED6}"
|
||||
RootNamespace="libEGL"
|
||||
Keyword="Win32Proj"
|
||||
TargetFrameworkVersion="131072"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
CharacterSet="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../Include/"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBEGL_EXPORTS;_CRT_SECURE_NO_DEPRECATE"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="false"
|
||||
DebugInformationFormat="4"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="d3d9.lib"
|
||||
LinkIncremental="2"
|
||||
ModuleDefinitionFile="libEGL.def"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
CharacterSet="1"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="../Include/"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBEGL_EXPORTS;_CRT_SECURE_NO_DEPRECATE"
|
||||
RuntimeLibrary="0"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="false"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="d3d9.lib"
|
||||
LinkIncremental="1"
|
||||
ModuleDefinitionFile="libEGL.def"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\Config.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\debug.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Display.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\libEGL.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\main.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Surface.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\Include\Config.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Include\Context.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Include\debug.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Include\Display.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Include\EGL\egl.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Include\EGL\eglext.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Include\EGL\eglplatform.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Include\gateutils.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\main.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Include\Surface.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||
>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath=".\libEGL.def"
|
||||
>
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
|
@ -0,0 +1,116 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// main.cpp: DLL entry point and management of thread-local data.
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
static DWORD currentTLS = TLS_OUT_OF_INDEXES;
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
|
||||
{
|
||||
switch (reason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
FILE *debug = fopen("debug.txt", "rt");
|
||||
|
||||
if (debug)
|
||||
{
|
||||
fclose(debug);
|
||||
debug = fopen("debug.txt", "wt"); // Erase
|
||||
fclose(debug);
|
||||
}
|
||||
#endif
|
||||
|
||||
currentTLS = TlsAlloc();
|
||||
|
||||
if (currentTLS == TLS_OUT_OF_INDEXES)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
// Fall throught to initialize index
|
||||
case DLL_THREAD_ATTACH:
|
||||
{
|
||||
egl::Current *current = (egl::Current*)LocalAlloc(LPTR, sizeof(egl::Current));
|
||||
|
||||
if (current)
|
||||
{
|
||||
TlsSetValue(currentTLS, current);
|
||||
|
||||
current->error = EGL_SUCCESS;
|
||||
current->API = EGL_OPENGL_ES_API;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DLL_THREAD_DETACH:
|
||||
{
|
||||
void *current = TlsGetValue(currentTLS);
|
||||
|
||||
if (current)
|
||||
{
|
||||
LocalFree((HLOCAL)current);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
{
|
||||
void *current = TlsGetValue(currentTLS);
|
||||
|
||||
if (current)
|
||||
{
|
||||
LocalFree((HLOCAL)current);
|
||||
}
|
||||
|
||||
TlsFree(currentTLS);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
namespace egl
|
||||
{
|
||||
void setCurrentError(EGLint error)
|
||||
{
|
||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
||||
|
||||
current->error = error;
|
||||
}
|
||||
|
||||
EGLint getCurrentError()
|
||||
{
|
||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
||||
|
||||
return current->error;
|
||||
}
|
||||
|
||||
void setCurrentAPI(EGLenum API)
|
||||
{
|
||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
||||
|
||||
current->API = API;
|
||||
}
|
||||
|
||||
EGLenum getCurrentAPI()
|
||||
{
|
||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
||||
|
||||
return current->API;
|
||||
}
|
||||
}
|
||||
|
||||
void error(EGLint errorCode)
|
||||
{
|
||||
egl::setCurrentError(errorCode);
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// main.h: Management of thread-local data.
|
||||
|
||||
#ifndef LIBEGL_MAIN_H_
|
||||
#define LIBEGL_MAIN_H_
|
||||
|
||||
#define EGLAPI
|
||||
#include <EGL/egl.h>
|
||||
|
||||
namespace egl
|
||||
{
|
||||
struct Current
|
||||
{
|
||||
EGLint error;
|
||||
EGLenum API;
|
||||
};
|
||||
|
||||
void setCurrentError(EGLint error);
|
||||
EGLint getCurrentError();
|
||||
|
||||
void setCurrentAPI(EGLenum API);
|
||||
EGLenum getCurrentAPI();
|
||||
}
|
||||
|
||||
void error(EGLint errorCode);
|
||||
|
||||
template<class T>
|
||||
const T &error(EGLint errorCode, const T &returnValue)
|
||||
{
|
||||
error(errorCode);
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
const T &success(const T &returnValue)
|
||||
{
|
||||
egl::setCurrentError(EGL_SUCCESS);
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
#endif // LIBEGL_MAIN_H_
|
|
@ -0,0 +1,120 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Buffer.cpp: Implements the gl::Buffer class, representing storage of vertex and/or
|
||||
// index data. Implements GL buffer objects and related functionality.
|
||||
// [OpenGL ES 2.0.24] section 2.9 page 21.
|
||||
|
||||
#include "Buffer.h"
|
||||
|
||||
#include "main.h"
|
||||
|
||||
namespace gl
|
||||
{
|
||||
Buffer::Buffer()
|
||||
{
|
||||
mSize = 0;
|
||||
mData = NULL;
|
||||
|
||||
mVertexBuffer = NULL;
|
||||
mIndexBuffer = NULL;
|
||||
}
|
||||
|
||||
Buffer::~Buffer()
|
||||
{
|
||||
erase();
|
||||
}
|
||||
|
||||
void Buffer::storeData(GLsizeiptr size, const void *data)
|
||||
{
|
||||
erase();
|
||||
|
||||
mSize = size;
|
||||
mData = new unsigned char[size];
|
||||
|
||||
if (data)
|
||||
{
|
||||
memcpy(mData, data, size);
|
||||
}
|
||||
}
|
||||
|
||||
IDirect3DVertexBuffer9 *Buffer::getVertexBuffer()
|
||||
{
|
||||
if (!mVertexBuffer)
|
||||
{
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
HRESULT result = device->CreateVertexBuffer(mSize, 0, 0, D3DPOOL_MANAGED, &mVertexBuffer, NULL);
|
||||
|
||||
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
|
||||
{
|
||||
return error(GL_OUT_OF_MEMORY, (IDirect3DVertexBuffer9*)NULL);
|
||||
}
|
||||
|
||||
ASSERT(SUCCEEDED(result));
|
||||
|
||||
if (mVertexBuffer && mData)
|
||||
{
|
||||
void *dataStore;
|
||||
mVertexBuffer->Lock(0, mSize, &dataStore, 0);
|
||||
memcpy(dataStore, mData, mSize);
|
||||
mVertexBuffer->Unlock();
|
||||
}
|
||||
}
|
||||
|
||||
return mVertexBuffer;
|
||||
}
|
||||
|
||||
IDirect3DIndexBuffer9 *Buffer::getIndexBuffer()
|
||||
{
|
||||
if (!mIndexBuffer)
|
||||
{
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
HRESULT result = device->CreateIndexBuffer(mSize, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &mIndexBuffer, NULL);
|
||||
|
||||
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
|
||||
{
|
||||
return error(GL_OUT_OF_MEMORY, (IDirect3DIndexBuffer9*)NULL);
|
||||
}
|
||||
|
||||
ASSERT(SUCCEEDED(result));
|
||||
|
||||
if (mIndexBuffer && mData)
|
||||
{
|
||||
void *dataStore;
|
||||
mIndexBuffer->Lock(0, mSize, &dataStore, 0);
|
||||
memcpy(dataStore, mData, mSize);
|
||||
mIndexBuffer->Unlock();
|
||||
}
|
||||
}
|
||||
|
||||
return mIndexBuffer;
|
||||
}
|
||||
|
||||
void Buffer::erase()
|
||||
{
|
||||
mSize = 0;
|
||||
|
||||
if (mData)
|
||||
{
|
||||
delete[] mData;
|
||||
mData = NULL;
|
||||
}
|
||||
|
||||
if (mVertexBuffer)
|
||||
{
|
||||
mVertexBuffer->Release();
|
||||
mVertexBuffer = NULL;
|
||||
}
|
||||
|
||||
if (mIndexBuffer)
|
||||
{
|
||||
mIndexBuffer->Release();
|
||||
mIndexBuffer = NULL;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Buffer.h: Defines the gl::Buffer class, representing storage of vertex and/or
|
||||
// index data. Implements GL buffer objects and related functionality.
|
||||
// [OpenGL ES 2.0.24] section 2.9 page 21.
|
||||
|
||||
#ifndef LIBGLESV2_BUFFER_H_
|
||||
#define LIBGLESV2_BUFFER_H_
|
||||
|
||||
#define GL_APICALL
|
||||
#include <GLES2/gl2.h>
|
||||
#include <d3d9.h>
|
||||
|
||||
#include "angleutils.h"
|
||||
|
||||
namespace gl
|
||||
{
|
||||
class Buffer
|
||||
{
|
||||
public:
|
||||
Buffer();
|
||||
|
||||
~Buffer();
|
||||
|
||||
void storeData(GLsizeiptr size, const void *data);
|
||||
|
||||
IDirect3DVertexBuffer9 *getVertexBuffer();
|
||||
IDirect3DIndexBuffer9 *getIndexBuffer();
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(Buffer);
|
||||
|
||||
void erase();
|
||||
|
||||
unsigned int mSize;
|
||||
void *mData;
|
||||
|
||||
IDirect3DVertexBuffer9 *mVertexBuffer;
|
||||
IDirect3DIndexBuffer9 *mIndexBuffer;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // LIBGLESV2_BUFFER_H_
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,233 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Framebuffer.cpp: Implements the gl::Framebuffer class. Implements GL framebuffer
|
||||
// objects and related functionality. [OpenGL ES 2.0.24] section 4.4 page 105.
|
||||
|
||||
#include "Framebuffer.h"
|
||||
|
||||
#include "Renderbuffer.h"
|
||||
#include "Texture.h"
|
||||
#include "main.h"
|
||||
|
||||
namespace gl
|
||||
{
|
||||
Framebuffer::Framebuffer()
|
||||
{
|
||||
mColorbufferType = GL_NONE;
|
||||
mColorbufferHandle = 0;
|
||||
|
||||
mDepthbufferType = GL_NONE;
|
||||
mDepthbufferHandle = 0;
|
||||
|
||||
mStencilbufferType = GL_NONE;
|
||||
mStencilbufferHandle = 0;
|
||||
}
|
||||
|
||||
Framebuffer::~Framebuffer()
|
||||
{
|
||||
}
|
||||
|
||||
void Framebuffer::setColorbuffer(GLenum type, GLuint colorbuffer)
|
||||
{
|
||||
mColorbufferType = type;
|
||||
mColorbufferHandle = colorbuffer;
|
||||
}
|
||||
|
||||
void Framebuffer::setDepthbuffer(GLenum type, GLuint depthbuffer)
|
||||
{
|
||||
mDepthbufferType = type;
|
||||
mDepthbufferHandle = depthbuffer;
|
||||
}
|
||||
|
||||
void Framebuffer::setStencilbuffer(GLenum type, GLuint stencilbuffer)
|
||||
{
|
||||
mStencilbufferType = type;
|
||||
mStencilbufferHandle = stencilbuffer;
|
||||
}
|
||||
|
||||
void Framebuffer::detachTexture(GLuint texture)
|
||||
{
|
||||
if (mColorbufferHandle == texture && mColorbufferType == GL_TEXTURE)
|
||||
{
|
||||
mColorbufferType = GL_NONE;
|
||||
mColorbufferHandle = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void Framebuffer::detachRenderbuffer(GLuint renderbuffer)
|
||||
{
|
||||
if (mColorbufferHandle == renderbuffer && mColorbufferType == GL_RENDERBUFFER)
|
||||
{
|
||||
mColorbufferType = GL_NONE;
|
||||
mColorbufferHandle = 0;
|
||||
}
|
||||
|
||||
if (mDepthbufferHandle == renderbuffer && mDepthbufferType == GL_RENDERBUFFER)
|
||||
{
|
||||
mDepthbufferType = GL_NONE;
|
||||
mDepthbufferHandle = 0;
|
||||
}
|
||||
|
||||
if (mStencilbufferHandle == renderbuffer && mStencilbufferType == GL_RENDERBUFFER)
|
||||
{
|
||||
mStencilbufferType = GL_NONE;
|
||||
mStencilbufferHandle = 0;
|
||||
}
|
||||
}
|
||||
|
||||
IDirect3DSurface9 *Framebuffer::getRenderTarget()
|
||||
{
|
||||
Renderbuffer *colorbuffer = getColorbuffer();
|
||||
|
||||
if (colorbuffer)
|
||||
{
|
||||
return colorbuffer->getRenderTarget();
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
IDirect3DSurface9 *Framebuffer::getDepthStencil()
|
||||
{
|
||||
gl::Context *context = gl::getContext();
|
||||
Depthbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
|
||||
|
||||
if (depthbuffer)
|
||||
{
|
||||
return depthbuffer->getDepthStencil();
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Colorbuffer *Framebuffer::getColorbuffer()
|
||||
{
|
||||
gl::Context *context = gl::getContext();
|
||||
Colorbuffer *colorbuffer = NULL;
|
||||
|
||||
if (mColorbufferType == GL_RENDERBUFFER)
|
||||
{
|
||||
colorbuffer = context->getColorbuffer(mColorbufferHandle);
|
||||
}
|
||||
else if (mColorbufferType == GL_TEXTURE)
|
||||
{
|
||||
colorbuffer = context->getTexture(mColorbufferHandle);
|
||||
}
|
||||
else UNREACHABLE();
|
||||
|
||||
if (colorbuffer && colorbuffer->isColorbuffer())
|
||||
{
|
||||
return colorbuffer;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Depthbuffer *Framebuffer::getDepthbuffer()
|
||||
{
|
||||
gl::Context *context = gl::getContext();
|
||||
Depthbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
|
||||
|
||||
if (depthbuffer && depthbuffer->isDepthbuffer())
|
||||
{
|
||||
return depthbuffer;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Stencilbuffer *Framebuffer::getStencilbuffer()
|
||||
{
|
||||
gl::Context *context = gl::getContext();
|
||||
Stencilbuffer *stencilbuffer = context->getStencilbuffer(mStencilbufferHandle);
|
||||
|
||||
if (stencilbuffer && stencilbuffer->isStencilbuffer())
|
||||
{
|
||||
return stencilbuffer;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GLenum Framebuffer::completeness()
|
||||
{
|
||||
gl::Context *context = gl::getContext();
|
||||
|
||||
int width = 0;
|
||||
int height = 0;
|
||||
|
||||
if (mColorbufferType != GL_NONE)
|
||||
{
|
||||
Colorbuffer *colorbuffer = getColorbuffer();
|
||||
|
||||
if (!colorbuffer)
|
||||
{
|
||||
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||
}
|
||||
|
||||
if (colorbuffer->getWidth() == 0 || colorbuffer->getHeight() == 0)
|
||||
{
|
||||
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||
}
|
||||
|
||||
width = colorbuffer->getWidth();
|
||||
height = colorbuffer->getHeight();
|
||||
}
|
||||
|
||||
if (mDepthbufferType != GL_NONE)
|
||||
{
|
||||
Depthbuffer *depthbuffer = context->getDepthbuffer(mDepthbufferHandle);
|
||||
|
||||
if (!depthbuffer)
|
||||
{
|
||||
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||
}
|
||||
|
||||
if (depthbuffer->getWidth() == 0 || depthbuffer->getHeight() == 0)
|
||||
{
|
||||
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||
}
|
||||
|
||||
if (width == 0)
|
||||
{
|
||||
width = depthbuffer->getWidth();
|
||||
height = depthbuffer->getHeight();
|
||||
}
|
||||
else if (width != depthbuffer->getWidth() || height != depthbuffer->getHeight())
|
||||
{
|
||||
return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
|
||||
}
|
||||
}
|
||||
|
||||
if (mStencilbufferType != GL_NONE)
|
||||
{
|
||||
Stencilbuffer *stencilbuffer = context->getStencilbuffer(mStencilbufferHandle);
|
||||
|
||||
if (!stencilbuffer)
|
||||
{
|
||||
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||
}
|
||||
|
||||
if (stencilbuffer->getWidth() == 0 || stencilbuffer->getHeight() == 0)
|
||||
{
|
||||
return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||
}
|
||||
|
||||
if (width == 0)
|
||||
{
|
||||
width = stencilbuffer->getWidth();
|
||||
height = stencilbuffer->getHeight();
|
||||
}
|
||||
else if (width != stencilbuffer->getWidth() || height != stencilbuffer->getHeight())
|
||||
{
|
||||
return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
|
||||
}
|
||||
}
|
||||
|
||||
return GL_FRAMEBUFFER_COMPLETE;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Framebuffer.h: Defines the gl::Framebuffer class. Implements GL framebuffer
|
||||
// objects and related functionality. [OpenGL ES 2.0.24] section 4.4 page 105.
|
||||
|
||||
#ifndef LIBGLESV2_FRAMEBUFFER_H_
|
||||
#define LIBGLESV2_FRAMEBUFFER_H_
|
||||
|
||||
#define GL_APICALL
|
||||
#include <GLES2/gl2.h>
|
||||
#include <d3d9.h>
|
||||
|
||||
#include "angleutils.h"
|
||||
|
||||
namespace gl
|
||||
{
|
||||
class Colorbuffer;
|
||||
class Depthbuffer;
|
||||
class Stencilbuffer;
|
||||
|
||||
class Framebuffer
|
||||
{
|
||||
public:
|
||||
Framebuffer();
|
||||
|
||||
~Framebuffer();
|
||||
|
||||
void setColorbuffer(GLenum type, GLuint colorbuffer);
|
||||
void setDepthbuffer(GLenum type, GLuint depthbuffer);
|
||||
void setStencilbuffer(GLenum type, GLuint stencilbuffer);
|
||||
|
||||
void detachTexture(GLuint texture);
|
||||
void detachRenderbuffer(GLuint renderbuffer);
|
||||
|
||||
IDirect3DSurface9 *getRenderTarget();
|
||||
IDirect3DSurface9 *getDepthStencil();
|
||||
|
||||
Colorbuffer *getColorbuffer();
|
||||
Depthbuffer *getDepthbuffer();
|
||||
Stencilbuffer *getStencilbuffer();
|
||||
|
||||
GLenum completeness();
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(Framebuffer);
|
||||
|
||||
GLuint mColorbufferHandle;
|
||||
GLenum mColorbufferType;
|
||||
|
||||
GLuint mDepthbufferHandle;
|
||||
GLenum mDepthbufferType;
|
||||
|
||||
GLuint mStencilbufferHandle;
|
||||
GLenum mStencilbufferType;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // LIBGLESV2_FRAMEBUFFER_H_
|
|
@ -0,0 +1,942 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Program.cpp: Implements the gl::Program class. Implements GL program objects
|
||||
// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28.
|
||||
|
||||
#include "Program.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "Shader.h"
|
||||
#include "debug.h"
|
||||
|
||||
namespace gl
|
||||
{
|
||||
Uniform::Uniform(UniformType type, const std::string &name, unsigned int bytes) : type(type), name(name), bytes(bytes)
|
||||
{
|
||||
this->data = new unsigned char[bytes];
|
||||
memset(this->data, 0, bytes);
|
||||
}
|
||||
|
||||
Uniform::~Uniform()
|
||||
{
|
||||
delete[] data;
|
||||
}
|
||||
|
||||
Program::Program()
|
||||
{
|
||||
mFragmentShader = NULL;
|
||||
mVertexShader = NULL;
|
||||
|
||||
mPixelExecutable = NULL;
|
||||
mVertexExecutable = NULL;
|
||||
mConstantTablePS = NULL;
|
||||
mConstantTableVS = NULL;
|
||||
|
||||
for (int index = 0; index < MAX_VERTEX_ATTRIBS; index++)
|
||||
{
|
||||
mAttributeName[index] = NULL;
|
||||
}
|
||||
|
||||
unlink();
|
||||
|
||||
mDeleteStatus = false;
|
||||
}
|
||||
|
||||
Program::~Program()
|
||||
{
|
||||
unlink(true);
|
||||
}
|
||||
|
||||
bool Program::attachShader(Shader *shader)
|
||||
{
|
||||
if (shader->getType() == GL_VERTEX_SHADER)
|
||||
{
|
||||
if (mVertexShader)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mVertexShader = (VertexShader*)shader;
|
||||
mVertexShader->attach();
|
||||
}
|
||||
else if (shader->getType() == GL_FRAGMENT_SHADER)
|
||||
{
|
||||
if (mFragmentShader)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mFragmentShader = (FragmentShader*)shader;
|
||||
mFragmentShader->attach();
|
||||
}
|
||||
else UNREACHABLE();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::detachShader(Shader *shader)
|
||||
{
|
||||
if (shader->getType() == GL_VERTEX_SHADER)
|
||||
{
|
||||
if (mVertexShader != shader)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mVertexShader->detach();
|
||||
mVertexShader = NULL;
|
||||
}
|
||||
else if (shader->getType() == GL_FRAGMENT_SHADER)
|
||||
{
|
||||
if (mFragmentShader != shader)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
mFragmentShader->detach();
|
||||
mFragmentShader = NULL;
|
||||
}
|
||||
else UNREACHABLE();
|
||||
|
||||
unlink();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
IDirect3DPixelShader9 *Program::getPixelShader()
|
||||
{
|
||||
return mPixelExecutable;
|
||||
}
|
||||
|
||||
IDirect3DVertexShader9 *Program::getVertexShader()
|
||||
{
|
||||
return mVertexExecutable;
|
||||
}
|
||||
|
||||
void Program::bindAttributeLocation(GLuint index, const char *name)
|
||||
{
|
||||
if (index < MAX_VERTEX_ATTRIBS)
|
||||
{
|
||||
delete[] mAttributeName[index];
|
||||
mAttributeName[index] = new char[strlen(name) + 1];
|
||||
strcpy(mAttributeName[index], name);
|
||||
}
|
||||
}
|
||||
|
||||
GLuint Program::getAttributeLocation(const char *name)
|
||||
{
|
||||
for (int index = 0; index < MAX_VERTEX_ATTRIBS; index++)
|
||||
{
|
||||
if (mAttributeName[index] && strcmp(mAttributeName[index], name) == 0)
|
||||
{
|
||||
return index;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool Program::isActiveAttribute(int attributeIndex)
|
||||
{
|
||||
if (attributeIndex >= 0 && attributeIndex < MAX_VERTEX_ATTRIBS)
|
||||
{
|
||||
return mInputMapping[attributeIndex] != -1;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int Program::getInputMapping(int attributeIndex)
|
||||
{
|
||||
if (attributeIndex >= 0 && attributeIndex < MAX_VERTEX_ATTRIBS)
|
||||
{
|
||||
return mInputMapping[attributeIndex];
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Returns the index of the texture unit corresponding to a Direct3D 9 sampler
|
||||
// index referenced in the compiled HLSL shader
|
||||
GLint Program::getSamplerMapping(unsigned int samplerIndex)
|
||||
{
|
||||
if (samplerIndex < MAX_TEXTURE_IMAGE_UNITS)
|
||||
{
|
||||
return mSamplerMapping[samplerIndex];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
GLint Program::getUniformLocation(const char *name)
|
||||
{
|
||||
for (unsigned int location = 0; location < mUniforms.size(); location++)
|
||||
{
|
||||
if (mUniforms[location]->name == name)
|
||||
{
|
||||
return location;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool Program::setUniform1fv(GLint location, GLsizei count, const GLfloat* v)
|
||||
{
|
||||
if (location < 0 || location >= (int)mUniforms.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mUniforms[location]->type != UNIFORM_1FV || mUniforms[location]->bytes < sizeof(GLfloat) * count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(mUniforms[location]->data, v, sizeof(GLfloat) * count);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::setUniform2fv(GLint location, GLsizei count, const GLfloat *v)
|
||||
{
|
||||
if (location < 0 || location >= (int)mUniforms.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mUniforms[location]->type != UNIFORM_2FV || mUniforms[location]->bytes < 2 * sizeof(GLfloat) * count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(mUniforms[location]->data, v, 2 * sizeof(GLfloat) * count);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::setUniform3fv(GLint location, GLsizei count, const GLfloat *v)
|
||||
{
|
||||
if (location < 0 || location >= (int)mUniforms.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mUniforms[location]->type != UNIFORM_3FV || mUniforms[location]->bytes < 3 * sizeof(GLfloat) * count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(mUniforms[location]->data, v, 3 * sizeof(GLfloat) * count);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::setUniform4fv(GLint location, GLsizei count, const GLfloat *v)
|
||||
{
|
||||
if (location < 0 || location >= (int)mUniforms.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mUniforms[location]->type != UNIFORM_4FV || mUniforms[location]->bytes < 4 * sizeof(GLfloat) * count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(mUniforms[location]->data, v, 4 * sizeof(GLfloat) * count);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value)
|
||||
{
|
||||
if (location < 0 || location >= (int)mUniforms.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mUniforms[location]->type != UNIFORM_MATRIX_2FV || mUniforms[location]->bytes < 4 * sizeof(GLfloat) * count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(mUniforms[location]->data, value, 4 * sizeof(GLfloat) * count);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value)
|
||||
{
|
||||
if (location < 0 || location >= (int)mUniforms.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mUniforms[location]->type != UNIFORM_MATRIX_3FV || mUniforms[location]->bytes < 9 * sizeof(GLfloat) * count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(mUniforms[location]->data, value, 9 * sizeof(GLfloat) * count);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value)
|
||||
{
|
||||
if (location < 0 || location >= (int)mUniforms.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mUniforms[location]->type != UNIFORM_MATRIX_4FV || mUniforms[location]->bytes < 16 * sizeof(GLfloat) * count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(mUniforms[location]->data, value, 16 * sizeof(GLfloat) * count);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::setUniform1iv(GLint location, GLsizei count, const GLint *v)
|
||||
{
|
||||
if (location < 0 || location >= (int)mUniforms.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mUniforms[location]->type != UNIFORM_1IV || mUniforms[location]->bytes < sizeof(GLint) * count)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(mUniforms[location]->data, v, sizeof(GLint) * count);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Applies all the uniforms set for this program object to the Direct3D 9 device
|
||||
void Program::applyUniforms()
|
||||
{
|
||||
for (unsigned int location = 0; location < mUniforms.size(); location++)
|
||||
{
|
||||
int bytes = mUniforms[location]->bytes;
|
||||
GLfloat *f = (GLfloat*)mUniforms[location]->data;
|
||||
GLint *i = (GLint*)mUniforms[location]->data;
|
||||
|
||||
switch (mUniforms[location]->type)
|
||||
{
|
||||
case UNIFORM_1FV: applyUniform1fv(location, bytes / sizeof(GLfloat), f); break;
|
||||
case UNIFORM_2FV: applyUniform2fv(location, bytes / 2 / sizeof(GLfloat), f); break;
|
||||
case UNIFORM_3FV: applyUniform3fv(location, bytes / 3 / sizeof(GLfloat), f); break;
|
||||
case UNIFORM_4FV: applyUniform4fv(location, bytes / 4 / sizeof(GLfloat), f); break;
|
||||
case UNIFORM_MATRIX_2FV: applyUniformMatrix2fv(location, bytes / 4 / sizeof(GLfloat), f); break;
|
||||
case UNIFORM_MATRIX_3FV: applyUniformMatrix3fv(location, bytes / 9 / sizeof(GLfloat), f); break;
|
||||
case UNIFORM_MATRIX_4FV: applyUniformMatrix4fv(location, bytes / 16 / sizeof(GLfloat), f); break;
|
||||
case UNIFORM_1IV: applyUniform1iv(location, bytes / sizeof(GLint), i); break;
|
||||
default:
|
||||
UNIMPLEMENTED(); // FIXME
|
||||
UNREACHABLE();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Compiles the HLSL code of the attached shaders into executable binaries
|
||||
ID3DXBuffer *Program::compileToBinary(const char *hlsl, const char *profile, ID3DXConstantTable **constantTable)
|
||||
{
|
||||
if (!hlsl)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ID3DXBuffer *binary = NULL;
|
||||
ID3DXBuffer *errorMessage = NULL;
|
||||
|
||||
HRESULT result = D3DXCompileShader(hlsl, (UINT)strlen(hlsl), NULL, 0, "main", profile, D3DXSHADER_USE_LEGACY_D3DX9_31_DLL, &binary, &errorMessage, constantTable);
|
||||
|
||||
if (SUCCEEDED(result))
|
||||
{
|
||||
return binary;
|
||||
}
|
||||
|
||||
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
|
||||
{
|
||||
return error(GL_OUT_OF_MEMORY, (ID3DXBuffer*)NULL);
|
||||
}
|
||||
|
||||
if (errorMessage)
|
||||
{
|
||||
const char *message = (const char*)errorMessage->GetBufferPointer();
|
||||
trace(hlsl);
|
||||
trace(message);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Links the HLSL code of the vertex and pixel shader by matching up their varyings,
|
||||
// compiling them into binaries, determining the attribute mappings, and collecting
|
||||
// a list of uniforms
|
||||
void Program::link()
|
||||
{
|
||||
if (mLinked)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
unlink();
|
||||
|
||||
if (!mFragmentShader || !mFragmentShader->isCompiled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mVertexShader || !mVertexShader->isCompiled())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const char *pixelHLSL = mFragmentShader->linkHLSL();
|
||||
const char *vertexHLSL = mVertexShader->linkHLSL(pixelHLSL);
|
||||
ID3DXBuffer *vertexBinary = compileToBinary(vertexHLSL, "vs_2_0", &mConstantTableVS);
|
||||
ID3DXBuffer *pixelBinary = compileToBinary(pixelHLSL, "ps_2_0", &mConstantTablePS);
|
||||
|
||||
if (vertexBinary && pixelBinary)
|
||||
{
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
HRESULT vertexResult = device->CreateVertexShader((DWORD*)vertexBinary->GetBufferPointer(), &mVertexExecutable);
|
||||
HRESULT pixelResult = device->CreatePixelShader((DWORD*)pixelBinary->GetBufferPointer(), &mPixelExecutable);
|
||||
|
||||
if (vertexResult == D3DERR_OUTOFVIDEOMEMORY || vertexResult == E_OUTOFMEMORY || pixelResult == D3DERR_OUTOFVIDEOMEMORY || pixelResult == E_OUTOFMEMORY)
|
||||
{
|
||||
return error(GL_OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
ASSERT(SUCCEEDED(vertexResult) && SUCCEEDED(pixelResult));
|
||||
|
||||
vertexBinary->Release();
|
||||
pixelBinary->Release();
|
||||
vertexBinary = NULL;
|
||||
pixelBinary = NULL;
|
||||
|
||||
if (mVertexExecutable && mPixelExecutable)
|
||||
{
|
||||
if (!linkAttributes())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
D3DXCONSTANTTABLE_DESC constantTableDescription;
|
||||
D3DXCONSTANT_DESC constantDescription;
|
||||
UINT descriptionCount = 1;
|
||||
|
||||
mConstantTablePS->GetDesc(&constantTableDescription);
|
||||
|
||||
for (unsigned int constantIndex = 0; constantIndex < constantTableDescription.Constants; constantIndex++)
|
||||
{
|
||||
D3DXHANDLE constantHandle = mConstantTablePS->GetConstant(0, constantIndex);
|
||||
mConstantTablePS->GetConstantDesc(constantHandle, &constantDescription, &descriptionCount);
|
||||
|
||||
UniformArray::iterator uniform = mUniforms.begin();
|
||||
|
||||
while (uniform != mUniforms.end())
|
||||
{
|
||||
if ((*uniform)->name == constantDescription.Name)
|
||||
{
|
||||
UNREACHABLE(); // Redefinition; detect at compile
|
||||
}
|
||||
|
||||
uniform++;
|
||||
}
|
||||
|
||||
if (uniform == mUniforms.end())
|
||||
{
|
||||
defineUniform(constantDescription);
|
||||
}
|
||||
}
|
||||
|
||||
mConstantTableVS->GetDesc(&constantTableDescription);
|
||||
|
||||
for (unsigned int constantIndex = 0; constantIndex < constantTableDescription.Constants; constantIndex++)
|
||||
{
|
||||
D3DXHANDLE constantHandle = mConstantTableVS->GetConstant(0, constantIndex);
|
||||
mConstantTableVS->GetConstantDesc(constantHandle, &constantDescription, &descriptionCount);
|
||||
|
||||
UniformArray::iterator uniform = mUniforms.begin();
|
||||
|
||||
while (uniform != mUniforms.end())
|
||||
{
|
||||
if ((*uniform)->name == constantDescription.Name)
|
||||
{
|
||||
UNIMPLEMENTED(); // FIXME: Verify it's the same type as the fragment uniform
|
||||
|
||||
if (true)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
uniform++;
|
||||
}
|
||||
|
||||
if (uniform == mUniforms.end())
|
||||
{
|
||||
defineUniform(constantDescription);
|
||||
}
|
||||
}
|
||||
|
||||
mLinked = true;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Determines the mapping between GL attributes and Direct3D 9 vertex stream usage indices
|
||||
bool Program::linkAttributes()
|
||||
{
|
||||
for (int attributeIndex = 0; attributeIndex < MAX_VERTEX_ATTRIBS; attributeIndex++)
|
||||
{
|
||||
const char *name = mVertexShader->getAttributeName(attributeIndex);
|
||||
|
||||
if (name)
|
||||
{
|
||||
GLuint location = getAttributeLocation(name);
|
||||
|
||||
if (location == -1) // Not set by glBindAttribLocation
|
||||
{
|
||||
int availableIndex = 0;
|
||||
|
||||
while (availableIndex < MAX_VERTEX_ATTRIBS && mAttributeName[availableIndex] && mVertexShader->isActiveAttribute(mAttributeName[availableIndex]))
|
||||
{
|
||||
availableIndex++;
|
||||
}
|
||||
|
||||
if (availableIndex == MAX_VERTEX_ATTRIBS)
|
||||
{
|
||||
return false; // Fail to link
|
||||
}
|
||||
|
||||
delete[] mAttributeName[availableIndex];
|
||||
mAttributeName[availableIndex] = new char[strlen(name) + 1]; // FIXME: Check allocation
|
||||
strcpy(mAttributeName[availableIndex], name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int attributeIndex = 0; attributeIndex < MAX_VERTEX_ATTRIBS; attributeIndex++)
|
||||
{
|
||||
mInputMapping[attributeIndex] = mVertexShader->getInputMapping(mAttributeName[attributeIndex]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Adds the description of a constant found in the binary shader to the list of uniforms
|
||||
void Program::defineUniform(const D3DXCONSTANT_DESC &constantDescription)
|
||||
{
|
||||
if (constantDescription.Rows == 1) // Vectors and scalars
|
||||
{
|
||||
switch (constantDescription.Type)
|
||||
{
|
||||
case D3DXPT_SAMPLER2D:
|
||||
case D3DXPT_SAMPLERCUBE:
|
||||
case D3DXPT_BOOL:
|
||||
switch (constantDescription.Columns)
|
||||
{
|
||||
case 1:
|
||||
mUniforms.push_back(new Uniform(UNIFORM_1IV, constantDescription.Name, 1 * sizeof(GLint) * constantDescription.Elements));
|
||||
break;
|
||||
default:
|
||||
UNIMPLEMENTED(); // FIXME
|
||||
UNREACHABLE();
|
||||
}
|
||||
break;
|
||||
case D3DXPT_FLOAT:
|
||||
switch (constantDescription.Columns)
|
||||
{
|
||||
case 1:
|
||||
mUniforms.push_back(new Uniform(UNIFORM_1FV, constantDescription.Name, 1 * sizeof(GLfloat) * constantDescription.Elements));
|
||||
break;
|
||||
case 2:
|
||||
mUniforms.push_back(new Uniform(UNIFORM_2FV, constantDescription.Name, 2 * sizeof(GLfloat) * constantDescription.Elements));
|
||||
break;
|
||||
case 3:
|
||||
mUniforms.push_back(new Uniform(UNIFORM_3FV, constantDescription.Name, 3 * sizeof(GLfloat) * constantDescription.Elements));
|
||||
break;
|
||||
case 4:
|
||||
mUniforms.push_back(new Uniform(UNIFORM_4FV, constantDescription.Name, 4 * sizeof(GLfloat) * constantDescription.Elements));
|
||||
break;
|
||||
default: UNREACHABLE();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
UNIMPLEMENTED(); // FIXME
|
||||
UNREACHABLE();
|
||||
}
|
||||
}
|
||||
else if (constantDescription.Rows == constantDescription.Columns) // Square matrices
|
||||
{
|
||||
switch (constantDescription.Type)
|
||||
{
|
||||
case D3DXPT_FLOAT:
|
||||
switch (constantDescription.Rows)
|
||||
{
|
||||
case 2:
|
||||
mUniforms.push_back(new Uniform(UNIFORM_MATRIX_2FV, constantDescription.Name, 2 * 2 * sizeof(GLfloat) * constantDescription.Elements));
|
||||
break;
|
||||
case 3:
|
||||
mUniforms.push_back(new Uniform(UNIFORM_MATRIX_3FV, constantDescription.Name, 3 * 3 * sizeof(GLfloat) * constantDescription.Elements));
|
||||
break;
|
||||
case 4:
|
||||
mUniforms.push_back(new Uniform(UNIFORM_MATRIX_4FV, constantDescription.Name, 4 * 4 * sizeof(GLfloat) * constantDescription.Elements));
|
||||
break;
|
||||
default: UNREACHABLE();
|
||||
}
|
||||
break;
|
||||
default: UNREACHABLE();
|
||||
}
|
||||
}
|
||||
else UNREACHABLE();
|
||||
}
|
||||
|
||||
bool Program::applyUniform1fv(GLint location, GLsizei count, const GLfloat *v)
|
||||
{
|
||||
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
if (constantPS)
|
||||
{
|
||||
mConstantTablePS->SetFloatArray(device, constantPS, v, count);
|
||||
}
|
||||
|
||||
if (constantVS)
|
||||
{
|
||||
mConstantTableVS->SetFloatArray(device, constantVS, v, count);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::applyUniform2fv(GLint location, GLsizei count, const GLfloat *v)
|
||||
{
|
||||
D3DXVECTOR4 *vector = new D3DXVECTOR4[count];
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vector[i] = D3DXVECTOR4(v[0], v[1], 0, 0);
|
||||
|
||||
v += 2;
|
||||
}
|
||||
|
||||
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
if (constantPS)
|
||||
{
|
||||
mConstantTablePS->SetVectorArray(device, constantPS, vector, count);
|
||||
}
|
||||
|
||||
if (constantVS)
|
||||
{
|
||||
mConstantTableVS->SetVectorArray(device, constantVS, vector, count);
|
||||
}
|
||||
|
||||
delete[] vector;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::applyUniform3fv(GLint location, GLsizei count, const GLfloat *v)
|
||||
{
|
||||
D3DXVECTOR4 *vector = new D3DXVECTOR4[count];
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
vector[i] = D3DXVECTOR4(v[0], v[1], v[2], 0);
|
||||
|
||||
v += 3;
|
||||
}
|
||||
|
||||
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
if (constantPS)
|
||||
{
|
||||
mConstantTablePS->SetVectorArray(device, constantPS, vector, count);
|
||||
}
|
||||
|
||||
if (constantVS)
|
||||
{
|
||||
mConstantTableVS->SetVectorArray(device, constantVS, vector, count);
|
||||
}
|
||||
|
||||
delete[] vector;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::applyUniform4fv(GLint location, GLsizei count, const GLfloat *v)
|
||||
{
|
||||
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
if (constantPS)
|
||||
{
|
||||
mConstantTablePS->SetVectorArray(device, constantPS, (D3DXVECTOR4*)v, count);
|
||||
}
|
||||
|
||||
if (constantVS)
|
||||
{
|
||||
mConstantTableVS->SetVectorArray(device, constantVS, (D3DXVECTOR4*)v, count);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value)
|
||||
{
|
||||
D3DXMATRIX *matrix = new D3DXMATRIX[count];
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
matrix[i] = D3DXMATRIX(value[0], value[2], 0, 0,
|
||||
value[1], value[3], 0, 0,
|
||||
0, 0, 1, 0,
|
||||
0, 0, 0, 1);
|
||||
|
||||
value += 4;
|
||||
}
|
||||
|
||||
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
if (constantPS)
|
||||
{
|
||||
mConstantTablePS->SetMatrixArray(device, constantPS, matrix, count);
|
||||
}
|
||||
|
||||
if (constantVS)
|
||||
{
|
||||
mConstantTableVS->SetMatrixArray(device, constantVS, matrix, count);
|
||||
}
|
||||
|
||||
delete[] matrix;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value)
|
||||
{
|
||||
D3DXMATRIX *matrix = new D3DXMATRIX[count];
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
matrix[i] = D3DXMATRIX(value[0], value[3], value[6], 0,
|
||||
value[1], value[4], value[7], 0,
|
||||
value[2], value[5], value[8], 0,
|
||||
0, 0, 0, 1);
|
||||
|
||||
value += 9;
|
||||
}
|
||||
|
||||
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
if (constantPS)
|
||||
{
|
||||
mConstantTablePS->SetMatrixArray(device, constantPS, matrix, count);
|
||||
}
|
||||
|
||||
if (constantVS)
|
||||
{
|
||||
mConstantTableVS->SetMatrixArray(device, constantVS, matrix, count);
|
||||
}
|
||||
|
||||
delete[] matrix;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value)
|
||||
{
|
||||
D3DXMATRIX *matrix = new D3DXMATRIX[count];
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
matrix[i] = D3DXMATRIX(value[0], value[4], value[8], value[12],
|
||||
value[1], value[5], value[9], value[13],
|
||||
value[2], value[6], value[10], value[14],
|
||||
value[3], value[7], value[11], value[15]);
|
||||
|
||||
value += 16;
|
||||
}
|
||||
|
||||
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
if (constantPS)
|
||||
{
|
||||
mConstantTablePS->SetMatrixArray(device, constantPS, matrix, count);
|
||||
}
|
||||
|
||||
if (constantVS)
|
||||
{
|
||||
mConstantTableVS->SetMatrixArray(device, constantVS, matrix, count);
|
||||
}
|
||||
|
||||
delete[] matrix;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Program::applyUniform1iv(GLint location, GLsizei count, const GLint *v)
|
||||
{
|
||||
D3DXHANDLE constantPS = mConstantTablePS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
D3DXHANDLE constantVS = mConstantTableVS->GetConstantByName(0, mUniforms[location]->name.c_str());
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
if (constantPS)
|
||||
{
|
||||
D3DXCONSTANT_DESC constantDescription;
|
||||
UINT descriptionCount = 1;
|
||||
HRESULT result = mConstantTablePS->GetConstantDesc(constantPS, &constantDescription, &descriptionCount);
|
||||
|
||||
if (SUCCEEDED(result))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (constantDescription.RegisterSet == D3DXRS_SAMPLER)
|
||||
{
|
||||
unsigned int firstIndex = mConstantTablePS->GetSamplerIndex(constantPS);
|
||||
|
||||
for (unsigned int samplerIndex = firstIndex; samplerIndex < firstIndex + count; samplerIndex++)
|
||||
{
|
||||
GLint mappedSampler = v[0];
|
||||
|
||||
if (mappedSampler >= 0 && mappedSampler < MAX_TEXTURE_IMAGE_UNITS)
|
||||
{
|
||||
if (samplerIndex >= 0 && samplerIndex < MAX_TEXTURE_IMAGE_UNITS)
|
||||
{
|
||||
mSamplerMapping[samplerIndex] = mappedSampler;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (constantPS)
|
||||
{
|
||||
mConstantTablePS->SetIntArray(device, constantPS, v, count);
|
||||
}
|
||||
|
||||
if (constantVS)
|
||||
{
|
||||
mConstantTableVS->SetIntArray(device, constantVS, v, count);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Returns the program object to an unlinked state, after detaching a shader, before re-linking, or at destruction
|
||||
void Program::unlink(bool destroy)
|
||||
{
|
||||
if (destroy) // Object being destructed
|
||||
{
|
||||
if (mFragmentShader)
|
||||
{
|
||||
mFragmentShader->detach();
|
||||
mFragmentShader = NULL;
|
||||
}
|
||||
|
||||
if (mVertexShader)
|
||||
{
|
||||
mVertexShader->detach();
|
||||
mVertexShader = NULL;
|
||||
}
|
||||
|
||||
for (int index = 0; index < MAX_VERTEX_ATTRIBS; index++)
|
||||
{
|
||||
delete[] mAttributeName[index];
|
||||
mAttributeName[index] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (mPixelExecutable)
|
||||
{
|
||||
mPixelExecutable->Release();
|
||||
mPixelExecutable = NULL;
|
||||
}
|
||||
|
||||
if (mVertexExecutable)
|
||||
{
|
||||
mVertexExecutable->Release();
|
||||
mVertexExecutable = NULL;
|
||||
}
|
||||
|
||||
if (mConstantTablePS)
|
||||
{
|
||||
mConstantTablePS->Release();
|
||||
mConstantTablePS = NULL;
|
||||
}
|
||||
|
||||
if (mConstantTableVS)
|
||||
{
|
||||
mConstantTableVS->Release();
|
||||
mConstantTableVS = NULL;
|
||||
}
|
||||
|
||||
for (int index = 0; index < MAX_VERTEX_ATTRIBS; index++)
|
||||
{
|
||||
mInputMapping[index] = 0;
|
||||
}
|
||||
|
||||
for (int index = 0; index < MAX_TEXTURE_IMAGE_UNITS; index++)
|
||||
{
|
||||
mSamplerMapping[index] = 0;
|
||||
}
|
||||
|
||||
while (!mUniforms.empty())
|
||||
{
|
||||
delete mUniforms.back();
|
||||
mUniforms.pop_back();
|
||||
}
|
||||
|
||||
mLinked = false;
|
||||
}
|
||||
|
||||
bool Program::isLinked()
|
||||
{
|
||||
return mLinked;
|
||||
}
|
||||
|
||||
void Program::flagForDeletion()
|
||||
{
|
||||
mDeleteStatus = true;
|
||||
}
|
||||
|
||||
bool Program::isFlaggedForDeletion() const
|
||||
{
|
||||
return mDeleteStatus;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,129 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Program.h: Defines the gl::Program class. Implements GL program objects
|
||||
// and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28.
|
||||
|
||||
#ifndef LIBGLESV2_PROGRAM_H_
|
||||
#define LIBGLESV2_PROGRAM_H_
|
||||
|
||||
#include "Context.h"
|
||||
|
||||
#include <d3dx9.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace gl
|
||||
{
|
||||
class FragmentShader;
|
||||
class VertexShader;
|
||||
|
||||
enum UniformType
|
||||
{
|
||||
UNIFORM_1FV,
|
||||
UNIFORM_2FV,
|
||||
UNIFORM_3FV,
|
||||
UNIFORM_4FV,
|
||||
UNIFORM_MATRIX_2FV,
|
||||
UNIFORM_MATRIX_3FV,
|
||||
UNIFORM_MATRIX_4FV,
|
||||
UNIFORM_1IV
|
||||
};
|
||||
|
||||
// Helper class representing a single shader uniform
|
||||
class Uniform
|
||||
{
|
||||
public:
|
||||
Uniform(UniformType type, const std::string &name, unsigned int bytes);
|
||||
|
||||
~Uniform();
|
||||
|
||||
const UniformType type;
|
||||
const std::string name;
|
||||
const unsigned int bytes;
|
||||
unsigned char *data;
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(Uniform);
|
||||
};
|
||||
|
||||
class Program
|
||||
{
|
||||
public:
|
||||
Program();
|
||||
|
||||
~Program();
|
||||
|
||||
bool attachShader(Shader *shader);
|
||||
bool detachShader(Shader *shader);
|
||||
|
||||
IDirect3DPixelShader9 *getPixelShader();
|
||||
IDirect3DVertexShader9 *getVertexShader();
|
||||
|
||||
void bindAttributeLocation(GLuint index, const char *name);
|
||||
GLuint getAttributeLocation(const char *name);
|
||||
bool isActiveAttribute(int attributeIndex);
|
||||
int getInputMapping(int attributeIndex);
|
||||
|
||||
GLint getSamplerMapping(unsigned int samplerIndex);
|
||||
|
||||
GLint getUniformLocation(const char *name);
|
||||
bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
|
||||
bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
|
||||
bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
|
||||
bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
|
||||
bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
|
||||
bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
|
||||
bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
|
||||
bool setUniform1iv(GLint location, GLsizei count, const GLint *v);
|
||||
|
||||
void applyUniforms();
|
||||
|
||||
void link();
|
||||
bool isLinked();
|
||||
|
||||
void flagForDeletion();
|
||||
bool isFlaggedForDeletion() const;
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(Program);
|
||||
|
||||
ID3DXBuffer *compileToBinary(const char *hlsl, const char *profile, ID3DXConstantTable **constantTable);
|
||||
void unlink(bool destroy = false);
|
||||
|
||||
bool linkAttributes();
|
||||
void defineUniform(const D3DXCONSTANT_DESC &constantDescription);
|
||||
bool applyUniform1fv(GLint location, GLsizei count, const GLfloat *v);
|
||||
bool applyUniform2fv(GLint location, GLsizei count, const GLfloat *v);
|
||||
bool applyUniform3fv(GLint location, GLsizei count, const GLfloat *v);
|
||||
bool applyUniform4fv(GLint location, GLsizei count, const GLfloat *v);
|
||||
bool applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
|
||||
bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
|
||||
bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
|
||||
bool applyUniform1iv(GLint location, GLsizei count, const GLint *v);
|
||||
|
||||
FragmentShader *mFragmentShader;
|
||||
VertexShader *mVertexShader;
|
||||
|
||||
IDirect3DPixelShader9 *mPixelExecutable;
|
||||
IDirect3DVertexShader9 *mVertexExecutable;
|
||||
ID3DXConstantTable *mConstantTablePS;
|
||||
ID3DXConstantTable *mConstantTableVS;
|
||||
|
||||
char *mAttributeName[MAX_VERTEX_ATTRIBS];
|
||||
int mInputMapping[MAX_VERTEX_ATTRIBS];
|
||||
|
||||
GLint mSamplerMapping[MAX_TEXTURE_IMAGE_UNITS];
|
||||
|
||||
typedef std::vector<Uniform*> UniformArray;
|
||||
UniformArray mUniforms;
|
||||
|
||||
bool mLinked;
|
||||
bool mDeleteStatus; // Flag to indicate that the program can be deleted when no longer in use
|
||||
};
|
||||
}
|
||||
|
||||
#endif // LIBGLESV2_PROGRAM_H_
|
|
@ -0,0 +1,264 @@
|
|||
//
|
||||
// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
|
||||
// Renderbuffer.cpp: the gl::Renderbuffer class and its derived classes
|
||||
// Colorbuffer, Depthbuffer and Stencilbuffer. Implements GL renderbuffer
|
||||
// objects and related functionality. [OpenGL ES 2.0.24] section 4.4.3 page 108.
|
||||
|
||||
#include "Renderbuffer.h"
|
||||
|
||||
#include "main.h"
|
||||
#include "utilities.h"
|
||||
|
||||
namespace gl
|
||||
{
|
||||
Renderbuffer::Renderbuffer()
|
||||
{
|
||||
mWidth = 0;
|
||||
mHeight = 0;
|
||||
}
|
||||
|
||||
Renderbuffer::~Renderbuffer()
|
||||
{
|
||||
}
|
||||
|
||||
bool Renderbuffer::isColorbuffer()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Renderbuffer::isDepthbuffer()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Renderbuffer::isStencilbuffer()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
IDirect3DSurface9 *Renderbuffer::getRenderTarget()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
IDirect3DSurface9 *Renderbuffer::getDepthStencil()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int Renderbuffer::getWidth()
|
||||
{
|
||||
return mWidth;
|
||||
}
|
||||
|
||||
int Renderbuffer::getHeight()
|
||||
{
|
||||
return mHeight;
|
||||
}
|
||||
|
||||
Colorbuffer::Colorbuffer(IDirect3DSurface9 *renderTarget) : mRenderTarget(renderTarget)
|
||||
{
|
||||
if (renderTarget)
|
||||
{
|
||||
renderTarget->AddRef();
|
||||
|
||||
D3DSURFACE_DESC description;
|
||||
renderTarget->GetDesc(&description);
|
||||
|
||||
mWidth = description.Width;
|
||||
mHeight = description.Height;
|
||||
}
|
||||
}
|
||||
|
||||
Colorbuffer::~Colorbuffer()
|
||||
{
|
||||
if (mRenderTarget)
|
||||
{
|
||||
mRenderTarget->Release();
|
||||
}
|
||||
}
|
||||
|
||||
bool Colorbuffer::isColorbuffer()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
GLuint Colorbuffer::getRedSize()
|
||||
{
|
||||
if (mRenderTarget)
|
||||
{
|
||||
D3DSURFACE_DESC description;
|
||||
mRenderTarget->GetDesc(&description);
|
||||
|
||||
return es2dx::GetRedSize(description.Format);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
GLuint Colorbuffer::getGreenSize()
|
||||
{
|
||||
if (mRenderTarget)
|
||||
{
|
||||
D3DSURFACE_DESC description;
|
||||
mRenderTarget->GetDesc(&description);
|
||||
|
||||
return es2dx::GetGreenSize(description.Format);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
GLuint Colorbuffer::getBlueSize()
|
||||
{
|
||||
if (mRenderTarget)
|
||||
{
|
||||
D3DSURFACE_DESC description;
|
||||
mRenderTarget->GetDesc(&description);
|
||||
|
||||
return es2dx::GetBlueSize(description.Format);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
GLuint Colorbuffer::getAlphaSize()
|
||||
{
|
||||
if (mRenderTarget)
|
||||
{
|
||||
D3DSURFACE_DESC description;
|
||||
mRenderTarget->GetDesc(&description);
|
||||
|
||||
return es2dx::GetAlphaSize(description.Format);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
IDirect3DSurface9 *Colorbuffer::getRenderTarget()
|
||||
{
|
||||
return mRenderTarget;
|
||||
}
|
||||
|
||||
Depthbuffer::Depthbuffer(IDirect3DSurface9 *depthStencil) : mDepthStencil(depthStencil)
|
||||
{
|
||||
if (depthStencil)
|
||||
{
|
||||
depthStencil->AddRef();
|
||||
|
||||
D3DSURFACE_DESC description;
|
||||
depthStencil->GetDesc(&description);
|
||||
|
||||
mWidth = description.Width;
|
||||
mHeight = description.Height;
|
||||
}
|
||||
}
|
||||
|
||||
Depthbuffer::Depthbuffer(int width, int height)
|
||||
{
|
||||
IDirect3DDevice9 *device = getDevice();
|
||||
|
||||
mDepthStencil = NULL;
|
||||
HRESULT result = device->CreateDepthStencilSurface(width, height, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0, FALSE, &mDepthStencil, 0);
|
||||
|
||||
if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
|
||||
{
|
||||
error(GL_OUT_OF_MEMORY);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
ASSERT(SUCCEEDED(result));
|
||||
|
||||
if (mDepthStencil)
|
||||
{
|
||||
mWidth = width;
|
||||
mHeight = height;
|
||||
}
|
||||
else
|
||||
{
|
||||
mWidth = 0;
|
||||
mHeight = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Depthbuffer::~Depthbuffer()
|
||||
{
|
||||
if (mDepthStencil)
|
||||
{
|
||||
mDepthStencil->Release();
|
||||
}
|
||||
}
|
||||
|
||||
bool Depthbuffer::isDepthbuffer()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
GLuint Depthbuffer::getDepthSize()
|
||||
{
|
||||
if (mDepthStencil)
|
||||
{
|
||||
D3DSURFACE_DESC description;
|
||||
mDepthStencil->GetDesc(&description);
|
||||
|
||||
es2dx::GetDepthSize(description.Format);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
IDirect3DSurface9 *Depthbuffer::getDepthStencil()
|
||||
{
|
||||
return mDepthStencil;
|
||||
}
|
||||
|
||||
Stencilbuffer::Stencilbuffer(IDirect3DSurface9 *depthStencil) : mDepthStencil(depthStencil)
|
||||
{
|
||||
if (depthStencil)
|
||||
{
|
||||
depthStencil->AddRef();
|
||||
|
||||
D3DSURFACE_DESC description;
|
||||
depthStencil->GetDesc(&description);
|
||||
|
||||
mWidth = description.Width;
|
||||
mHeight = description.Height;
|
||||
}
|
||||
}
|
||||
|
||||
Stencilbuffer::~Stencilbuffer()
|
||||
{
|
||||
if (mDepthStencil)
|
||||
{
|
||||
mDepthStencil->Release();
|
||||
}
|
||||
}
|
||||
|
||||
GLuint Stencilbuffer::getStencilSize()
|
||||
{
|
||||
if (mDepthStencil)
|
||||
{
|
||||
D3DSURFACE_DESC description;
|
||||
mDepthStencil->GetDesc(&description);
|
||||
|
||||
return es2dx::GetStencilSize(description.Format);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool Stencilbuffer::isStencilbuffer()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
IDirect3DSurface9 *Stencilbuffer::getDepthStencil()
|
||||
{
|
||||
return mDepthStencil;
|
||||
}
|
||||
}
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче