kernel.h

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2008 by Kutumov Alexey                                  *
00003  *   ru.pixel@gmail.com                                                    *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00019  ***************************************************************************/
00020 
00033 #ifndef __kernel__header__
00034 #define __kernel__header__
00035 
00036 
00037 #include "gpucalc/bindable.h"
00038 
00039 #include "gpucalc/application.h"
00040 #include "gpucalc/log_manager.h"
00041 #include "gpucalc/framebuffer.h"
00042 #include "gpucalc/exception.h"
00043 #include "gpucalc/shader.h"
00044 #include "gpucalc/graphic_core.h"
00045 #include "gpucalc/texture.h"
00046 
00047 #include "gpucalc/profiler.h"
00048 
00049 
00050 namespace gpucalc
00051 {
00052 
00053 
00054  const char _KernelClassName [] = "Kernel";
00055 
00056 
00089  class _GpuCalcExport Kernel: public Bindable
00090  {
00091 
00092 
00093   OBJ_DISABLE_COPY(Kernel)
00094   
00095   
00096   public:
00097    Kernel(const std::string & ObjectName, GraphicCore * DefaultGraphicCore): Object(_KernelClassName, ObjectName),
00098     Bindable(_KernelClassName, ObjectName), mShader(0), mFrameBuffer(0), mDefaultGraphicCore(DefaultGraphicCore)
00099    {
00100     LogManager::getSingleton().logMessage(this, "created.", LML_Trivial);
00101    }
00102 
00103 
00104    ~Kernel()
00105    {
00106     if (mShader) 
00107     {
00108      Warning<ERR_VALUE_NOT_DELETED_ERROR>(this,
00109       "Does not deleted. If you have pointer to it you must delete it manually, else there is a possible memory leak.",
00110       "Kernel::~Kernel", __FILE__, __LINE__);
00111     }
00112     LogManager::getSingleton().logMessage(this, "Deleted.", LML_Trivial);
00113    }
00114 
00115 
00119    void setShader(Shader * shader)
00120    {
00121     assert(!mShader && "This kernel already has shader!!!");
00122     mShader = shader;
00123    }
00124 
00125 
00129    Shader * removeShader()
00130    {
00131     assert(mShader && "This kernel does not have shader!!!");
00132     Shader * result = mShader;
00133     mShader = 0;
00134     return result;
00135    }
00136 
00137 
00141    Shader * getShader() const
00142    {
00143     assert(mShader && "This kernel does not have shader!!!");
00144     return mShader;
00145    }
00146 
00147 
00153    FrameBuffer * getFrameBuffer() const
00154    {
00155     assert(mFrameBuffer && "This kernel does not have framebuffer!!!");
00156     return mFrameBuffer;
00157    }
00158 
00159 
00163    void setFrameBuffer(FrameBuffer * fb)
00164    {
00165     assert(!mFrameBuffer && "This kernel already has FrameBuffer!!!");
00166     mFrameBuffer = fb;
00167    }
00168 
00169 
00173    FrameBuffer * removeFrameBuffer()
00174    {
00175     assert(mFrameBuffer && "This kernel does not have FrameBuffer");
00176     FrameBuffer * result = mFrameBuffer;
00177     mFrameBuffer = 0;
00178     return result;
00179    }
00180 
00181 
00190    void compile(const std::string & Parameters = std::string())
00191    {
00192     assert(mFrameBuffer && mShader && "This kernel does not have FrameBuffer or Shader!!!");
00193     LogManager::getSingleton().logMessage(this, "Starting compiling...", LML_Trivial);
00194     mShader->compile(Parameters);
00195     LogManager::getSingleton().logMessage(this, "Compiled kernel.", LML_Trivial);
00196    }
00197 
00198 
00206    void preCompute()
00207    {
00208     Profiler::getSingleton().beginProfile("Kernel::preCompute");
00209     assert(mFrameBuffer && mShader && "This kernel does not ready for precomputing!!!");
00210     this->bind();
00211     mShader->preCompute();
00212     Profiler::getSingleton().endProfile("Kernel::preCompute");
00213    }
00214 
00215 
00227    void compute(const Texture * RenderTarget)
00228    {
00229     LogManager::getSingleton().logMessage(this, "Computing started...", LML_Trivial);
00230 
00231     assert(mFrameBuffer && mShader && "This kernel does not ready for precomputing!!!");
00232     mDefaultGraphicCore->setMatrixMode(RenderTarget->getSizeX(), RenderTarget->getSizeY());
00233     mFrameBuffer->drawBuffer(RenderTarget);
00234     mShader->bind();
00235 
00236     Profiler::getSingleton().beginProfile("Kernel::compute");
00237     mDefaultGraphicCore->draw(RenderTarget->getSizeX(), RenderTarget->getSizeY());
00238     Profiler::getSingleton().endProfile("Kernel::compute");
00239 
00240     LogManager::getSingleton().logMessage(this, "Computing finished.", LML_Trivial);
00241    }
00242 
00243 
00251    void postCompute()
00252    {
00253     // does nothing
00254    }
00255 
00256 
00262    void bind()
00263    {
00264     assert (mFrameBuffer && "This kernel does not have FrameBuffer!!!");
00265     mFrameBuffer->bind();
00266 
00267     assert(mShader && "This kernel does not have Kernel!!!");
00268     mShader->bind();
00269    }
00270 
00271 
00277    void unbind()
00278    {
00279     assert (mFrameBuffer && "This kernel does not have FrameBuffer!!!");
00280     mFrameBuffer->unbind();
00281 
00282     assert(mShader && "This kernel does not have Kernel!!!");
00283     mShader->unbind();
00284    }
00285 
00286 
00287    bool isActive() const
00288    {
00289     assert (mFrameBuffer && "This kernel does not have FrameBuffer!!!");
00290     assert(mShader && "This kernel does not have Kernel!!!");
00291 
00292     return (mShader->isActive() && mFrameBuffer->isActive());
00293    }
00294 
00295 
00296   private:
00297 
00298 
00302    Shader * mShader;
00303 
00304 
00310    FrameBuffer * mFrameBuffer;
00311 
00312 
00313    GraphicCore * mDefaultGraphicCore;
00314  };
00315 }
00316 
00317 #endif

Generated on Thu Mar 5 22:36:42 2009 for gpucalc by  doxygen 1.5.6