| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- //
- // Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
- // 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 3Dlabs Inc. Ltd. nor the names of its
- // 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 HOLDERS 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.
- //
- #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.
- //
- #define SH_EXPORTING
- #include "../Public/ShaderLang.h"
- #include "../MachineIndependent/Versions.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() { pool = new glslang::TPoolAllocator; }
- virtual ~TShHandleBase() { delete pool; }
- virtual TCompiler* getAsCompiler() { return 0; }
- virtual TLinker* getAsLinker() { return 0; }
- virtual TUniformMap* getAsUniformMap() { return 0; }
- virtual glslang::TPoolAllocator* getPool() const { return pool; }
- private:
- glslang::TPoolAllocator* pool;
- };
- //
- // 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, int version = 0, EProfile profile = ENoProfile) = 0;
- virtual TCompiler* getAsCompiler() { return this; }
- virtual bool linkable() { return haveValidObjectCode; }
- TInfoSink& infoSink;
- protected:
- TCompiler& operator=(TCompiler&);
- EShLanguage language;
- bool haveValidObjectCode;
- };
- //
- // Link operations are based on a list of compile results...
- //
- typedef glslang::TVector<TCompiler*> TCompilerList;
- typedef glslang::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:
- TLinker& operator=(TLinker&);
- 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);
- TShHandleBase* ConstructBindings();
- void DeleteLinker(TShHandleBase*);
- void DeleteBindingList(TShHandleBase* bindingList);
- TUniformMap* ConstructUniformMap();
- void DeleteCompiler(TCompiler*);
- void DeleteUniformMap(TUniformMap*);
- #endif // _SHHANDLE_INCLUDED_
|