gfxNullDevice.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #include "platform/platform.h"
  23. #include "gfx/Null/gfxNullDevice.h"
  24. #include "core/strings/stringFunctions.h"
  25. #include "gfx/gfxCubemap.h"
  26. #include "gfx/screenshot.h"
  27. #include "gfx/gfxPrimitiveBuffer.h"
  28. #include "gfx/gfxCardProfile.h"
  29. #include "gfx/gfxTextureManager.h"
  30. #include "gfx/bitmap/gBitmap.h"
  31. #include "core/util/safeDelete.h"
  32. GFXAdapter::CreateDeviceInstanceDelegate GFXNullDevice::mCreateDeviceInstance(GFXNullDevice::createInstance);
  33. class GFXNullCardProfiler: public GFXCardProfiler
  34. {
  35. private:
  36. typedef GFXCardProfiler Parent;
  37. public:
  38. ///
  39. const String &getRendererString() const override { static String sRS("GFX Null Device Renderer"); return sRS; }
  40. protected:
  41. void setupCardCapabilities() override { };
  42. bool _queryCardCap(const String &query, U32 &foundResult) override{ return false; }
  43. bool _queryFormat(const GFXFormat fmt, const GFXTextureProfile *profile, bool &inOutAutogenMips) override { inOutAutogenMips = false; return false; }
  44. public:
  45. void init() override
  46. {
  47. mCardDescription = "GFX Null Device Card";
  48. mChipSet = "NULL Device";
  49. mVersionString = "0";
  50. Parent::init(); // other code notes that not calling this is "BAD".
  51. };
  52. };
  53. class GFXNullTextureObject : public GFXTextureObject
  54. {
  55. public:
  56. GFXNullTextureObject(GFXDevice * aDevice, GFXTextureProfile *profile);
  57. ~GFXNullTextureObject() { kill(); };
  58. #ifdef TORQUE_DEBUG
  59. void pureVirtualCrash() override {}
  60. #endif
  61. GFXLockedRect * lock( U32 mipLevel = 0, RectI *inRect = NULL ) override { return NULL; };
  62. void unlock( U32 mipLevel = 0) override {};
  63. bool copyToBmp(GBitmap *) override { return false; };
  64. void zombify() override {}
  65. void resurrect() override {}
  66. };
  67. GFXNullTextureObject::GFXNullTextureObject(GFXDevice * aDevice, GFXTextureProfile *profile) :
  68. GFXTextureObject(aDevice, profile)
  69. {
  70. mProfile = profile;
  71. mTextureSize.set( 0, 0, 0 );
  72. }
  73. class GFXNullTextureManager : public GFXTextureManager
  74. {
  75. public:
  76. GFXTextureObject* createTexture(GBitmap* bmp, const String& resourceName, GFXTextureProfile* profile, bool deleteBmp) override { return nullptr; } // _createNullTextureObject();}
  77. GFXTextureObject* createTexture(DDSFile* dds, GFXTextureProfile* profile, bool deleteDDS) override { return nullptr; }
  78. GFXTextureObject* createTexture(const Torque::Path& path, GFXTextureProfile* profile) override { return nullptr; }
  79. GFXTextureObject* createTexture(U32 width, U32 height, void* pixels, GFXFormat format, GFXTextureProfile* profile) override { return nullptr; }
  80. GFXTextureObject* createTexture(U32 width, U32 height, U32 depth, GFXFormat format, GFXTextureProfile* profile, U32 numMipLevels = 1) override { return nullptr; }
  81. GFXTextureObject* createTexture(U32 width, U32 height, GFXFormat format, GFXTextureProfile* profile, U32 numMipLevels, S32 antialiasLevel) override { return nullptr; }
  82. GFXTextureObject* createCompositeTexture(GBitmap* bmp[4], U32 inputKey[4], const String& resourceName, GFXTextureProfile* profile, bool deleteBmp) override { return nullptr; }
  83. protected:
  84. GFXTextureObject *_createTextureObject( U32 height,
  85. U32 width,
  86. U32 depth,
  87. GFXFormat format,
  88. GFXTextureProfile *profile,
  89. U32 numMipLevels,
  90. bool forceMips = false,
  91. S32 antialiasLevel = 0,
  92. GFXTextureObject *inTex = NULL ) override
  93. {
  94. GFXNullTextureObject *retTex;
  95. if ( inTex )
  96. {
  97. AssertFatal( dynamic_cast<GFXNullTextureObject*>( inTex ), "GFXNullTextureManager::_createTexture() - Bad inTex type!" );
  98. retTex = static_cast<GFXNullTextureObject*>( inTex );
  99. }
  100. else
  101. {
  102. retTex = new GFXNullTextureObject( GFX, profile );
  103. retTex->registerResourceWithDevice( GFX );
  104. }
  105. SAFE_DELETE( retTex->mBitmap );
  106. retTex->mBitmap = new GBitmap(width, height);
  107. return retTex;
  108. };
  109. /// Load a texture from a proper DDSFile instance.
  110. bool _loadTexture(GFXTextureObject *texture, DDSFile *dds) override{ return true; };
  111. /// Load data into a texture from a GBitmap using the internal API.
  112. bool _loadTexture(GFXTextureObject *texture, GBitmap *bmp) override{ return true; };
  113. /// Load data into a texture from a raw buffer using the internal API.
  114. ///
  115. /// Note that the size of the buffer is assumed from the parameters used
  116. /// for this GFXTextureObject's _createTexture call.
  117. bool _loadTexture(GFXTextureObject *texture, void *raw) override{ return true; };
  118. /// Refresh a texture using the internal API.
  119. bool _refreshTexture(GFXTextureObject *texture) override{ return true; };
  120. /// Free a texture (but do not delete the GFXTextureObject) using the internal
  121. /// API.
  122. ///
  123. /// This is only called during zombification for textures which need it, so you
  124. /// don't need to do any internal safety checks.
  125. bool _freeTexture(GFXTextureObject *texture, bool zombify=false) override { return true; };
  126. virtual U32 _getTotalVideoMemory() { return 0; };
  127. virtual U32 _getFreeVideoMemory() { return 0; };
  128. };
  129. class GFXNullCubemap : public GFXCubemap
  130. {
  131. friend class GFXDevice;
  132. private:
  133. // should only be called by GFXDevice
  134. void setToTexUnit( U32 tuNum ) override { };
  135. public:
  136. void initStatic( GFXTexHandle *faces ) override { };
  137. void initStatic( DDSFile *dds ) override { };
  138. void initDynamic( U32 texSize, GFXFormat faceFormat = GFXFormatR8G8B8A8, U32 mipLevels = 0) override { };
  139. void generateMipMaps() override {}
  140. U32 getSize() const override { return 0; }
  141. GFXFormat getFormat() const override { return GFXFormatR8G8B8A8; }
  142. virtual ~GFXNullCubemap(){};
  143. void zombify() override {}
  144. void resurrect() override {}
  145. };
  146. class GFXNullCubemapArray : public GFXCubemapArray
  147. {
  148. friend class GFXDevice;
  149. private:
  150. // should only be called by GFXDevice
  151. void setToTexUnit(U32 tuNum) override { };
  152. public:
  153. void init(GFXCubemapHandle *cubemaps, const U32 cubemapCount) override { };
  154. void init(const U32 cubemapCount, const U32 cubemapFaceSize, const GFXFormat format) override { };
  155. void updateTexture(const GFXCubemapHandle &cubemap, const U32 slot) override { };
  156. void copyTo(GFXCubemapArray *pDstCubemap) override { }
  157. virtual ~GFXNullCubemapArray() {};
  158. void zombify() override {}
  159. void resurrect() override {}
  160. };
  161. class GFXNullTextureArray : public GFXTextureArray
  162. {
  163. public:
  164. void zombify() override {}
  165. void resurrect() override {}
  166. void Release() override {}
  167. void setToTexUnit(U32 tuNum) override { }
  168. void init() override { }
  169. protected:
  170. void _setTexture(const GFXTexHandle& texture, U32 slot) override { }
  171. };
  172. class GFXNullVertexBuffer : public GFXVertexBuffer
  173. {
  174. unsigned char* tempBuf;
  175. public:
  176. GFXNullVertexBuffer( GFXDevice *device,
  177. U32 numVerts,
  178. const GFXVertexFormat *vertexFormat,
  179. U32 vertexSize,
  180. GFXBufferType bufferType ) :
  181. GFXVertexBuffer(device, numVerts, vertexFormat, vertexSize, bufferType) {tempBuf =NULL;};
  182. void lock(U32 vertexStart, U32 vertexEnd, void **vertexPtr) override;
  183. void unlock() override;
  184. void prepare() override;
  185. void zombify() override {}
  186. void resurrect() override {}
  187. };
  188. void GFXNullVertexBuffer::lock(U32 vertexStart, U32 vertexEnd, void **vertexPtr)
  189. {
  190. tempBuf = new unsigned char[(vertexEnd - vertexStart) * mVertexSize];
  191. *vertexPtr = (void*) tempBuf;
  192. lockedVertexStart = vertexStart;
  193. lockedVertexEnd = vertexEnd;
  194. }
  195. void GFXNullVertexBuffer::unlock()
  196. {
  197. delete[] tempBuf;
  198. tempBuf = NULL;
  199. }
  200. void GFXNullVertexBuffer::prepare()
  201. {
  202. }
  203. class GFXNullPrimitiveBuffer : public GFXPrimitiveBuffer
  204. {
  205. private:
  206. U16* temp;
  207. public:
  208. GFXNullPrimitiveBuffer( GFXDevice *device,
  209. U32 indexCount,
  210. U32 primitiveCount,
  211. GFXBufferType bufferType ) :
  212. GFXPrimitiveBuffer(device, indexCount, primitiveCount, bufferType), temp( NULL ) {};
  213. void lock(U32 indexStart, U32 indexEnd, void **indexPtr) override; ///< locks this primitive buffer for writing into
  214. void unlock() override; ///< unlocks this primitive buffer.
  215. void prepare() override { }; ///< prepares this primitive buffer for use on the device it was allocated on
  216. void zombify() override {}
  217. void resurrect() override {}
  218. };
  219. void GFXNullPrimitiveBuffer::lock(U32 indexStart, U32 indexEnd, void **indexPtr)
  220. {
  221. temp = new U16[indexEnd - indexStart];
  222. *indexPtr = temp;
  223. }
  224. void GFXNullPrimitiveBuffer::unlock()
  225. {
  226. delete[] temp;
  227. temp = NULL;
  228. }
  229. //
  230. // GFXNullStateBlock
  231. //
  232. class GFXNullStateBlock : public GFXStateBlock
  233. {
  234. public:
  235. /// Returns the hash value of the desc that created this block
  236. U32 getHashValue() const override { return 0; };
  237. /// Returns a GFXStateBlockDesc that this block represents
  238. const GFXStateBlockDesc& getDesc() const override { return mDefaultDesc; }
  239. //
  240. // GFXResource
  241. //
  242. void zombify() override { }
  243. /// When called the resource should restore all device sensitive information destroyed by zombify()
  244. void resurrect() override { }
  245. private:
  246. GFXStateBlockDesc mDefaultDesc;
  247. };
  248. //
  249. // GFXNullDevice
  250. //
  251. GFXDevice *GFXNullDevice::createInstance( U32 adapterIndex )
  252. {
  253. return new GFXNullDevice();
  254. }
  255. GFXNullDevice::GFXNullDevice()
  256. {
  257. clip.set(0, 0, 800, 800);
  258. mTextureManager = new GFXNullTextureManager();
  259. gScreenShot = new ScreenShot();
  260. mCardProfiler = new GFXNullCardProfiler();
  261. mCardProfiler->init();
  262. }
  263. GFXNullDevice::~GFXNullDevice()
  264. {
  265. }
  266. GFXVertexBuffer *GFXNullDevice::allocVertexBuffer( U32 numVerts,
  267. const GFXVertexFormat *vertexFormat,
  268. U32 vertSize,
  269. GFXBufferType bufferType,
  270. void* data )
  271. {
  272. return new GFXNullVertexBuffer(GFX, numVerts, vertexFormat, vertSize, bufferType);
  273. }
  274. GFXPrimitiveBuffer *GFXNullDevice::allocPrimitiveBuffer( U32 numIndices,
  275. U32 numPrimitives,
  276. GFXBufferType bufferType,
  277. void* data )
  278. {
  279. return new GFXNullPrimitiveBuffer(GFX, numIndices, numPrimitives, bufferType);
  280. }
  281. GFXCubemap* GFXNullDevice::createCubemap()
  282. {
  283. return new GFXNullCubemap();
  284. };
  285. GFXCubemapArray* GFXNullDevice::createCubemapArray()
  286. {
  287. return new GFXNullCubemapArray();
  288. };
  289. GFXTextureArray* GFXNullDevice::createTextureArray()
  290. {
  291. return new GFXNullTextureArray();
  292. };
  293. void GFXNullDevice::enumerateAdapters( Vector<GFXAdapter*> &adapterList )
  294. {
  295. // Add the NULL renderer
  296. GFXAdapter *toAdd = new GFXAdapter();
  297. toAdd->mIndex = 0;
  298. toAdd->mType = NullDevice;
  299. toAdd->mCreateDeviceInstanceDelegate = mCreateDeviceInstance;
  300. GFXVideoMode vm;
  301. vm.bitDepth = 32;
  302. vm.resolution.set(800,600);
  303. toAdd->mAvailableModes.push_back(vm);
  304. dStrcpy(toAdd->mName, "GFX Null Device", GFXAdapter::MaxAdapterNameLen);
  305. adapterList.push_back(toAdd);
  306. }
  307. void GFXNullDevice::init( const GFXVideoMode &mode, PlatformWindow *window )
  308. {
  309. mCardProfiler = new GFXNullCardProfiler();
  310. mCardProfiler->init();
  311. }
  312. GFXStateBlockRef GFXNullDevice::createStateBlockInternal(const GFXStateBlockDesc& desc)
  313. {
  314. return new GFXNullStateBlock();
  315. }
  316. //
  317. // Register this device with GFXInit
  318. //
  319. class GFXNullRegisterDevice
  320. {
  321. public:
  322. GFXNullRegisterDevice()
  323. {
  324. GFXInit::getRegisterDeviceSignal().notify(&GFXNullDevice::enumerateAdapters);
  325. }
  326. };
  327. static GFXNullRegisterDevice pNullRegisterDevice;