kernel.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
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