1#include "RenderResources.h"
5#include "MemoryContext.h"
7#include "Resources/Mesh.h"
8#include "Resources/Texture.h"
10#include "RenderTexture.h"
11#include "RenderTarget.h"
12#include "RenderMesh.h"
13#include "RenderEffect.h"
14#include "RenderMaterial.h"
15#include "RenderMaterialInstance.h"
16#include "RenderList.h"
17#include "RenderBuffer.h"
19#include "Foundation/Collections/Pool.h"
20#include "Foundation/Logging/Logger.h"
21#include "Foundation/Platform/Threads.h"
23#include "Rendering/ITextures.h"
40 renderMeshes(1024, 1024, allocator, MemBlockType::RenderResourceStorage),
41 renderTextures(1024, 1024, allocator, MemBlockType::RenderResourceStorage),
42 renderEffects(1024, 1024, allocator, MemBlockType::RenderResourceStorage),
43 renderMaterials(128, 128, allocator, MemBlockType::RenderResourceStorage),
44 renderMaterialInstances(1024, 1024, allocator, MemBlockType::RenderResourceStorage),
45 renderTargets(128, 128, allocator, MemBlockType::RenderResourceStorage),
46 renderLists(128, 128, allocator, MemBlockType::RenderResourceStorage),
47 renderBuffers(128, 128, allocator, MemBlockType::RenderResourceStorage)
50 Mutex renderMeshMutex;
63Cogs::Core::RenderResources::RenderResources(
Context * context) :
69Cogs::Core::RenderResources::~RenderResources()
73std::string Cogs::Core::RenderResources::getReport()
const
76 size_t meshes, textures, effects, materials, materialinstances, targets, lists, buffers;
78 LockGuard guard(storage->renderMeshMutex);
79 meshes = storage->renderMeshes.size();
80 textures = storage->renderTextures.size();
81 effects = storage->renderEffects.size();
82 materials = storage->renderMaterials.size();
83 materialinstances = storage->renderMaterialInstances.size();
84 targets = storage->renderTargets.size();
85 lists = storage->renderLists.size();
86 buffers = storage->renderBuffers.size();
89 auto rv = std::snprintf(buf,
sizeof(buf),
"msh=%zu, tex=%zu, eff=%zu mat=%3zu, mit=%zu, trg=%3zu, lst=%zu, buf=%zu",
90 meshes, textures, effects, materials, materialinstances, targets, lists, buffers);
91 if (0 <= rv &&
static_cast<size_t>(rv) <
sizeof(buf)) {
92 return std::string(buf);
99void Cogs::Core::RenderResources::initialize(
Context * context,
Renderer * renderer)
101 this->context = context;
102 this->renderer = renderer;
107void Cogs::Core::RenderResources::cleanup(
Context * )
112RenderTarget * Cogs::Core::RenderResources::createRenderTarget()
114 auto renderTarget = storage->renderTargets.create();
115 renderTarget->type = RenderResourceType::RenderTarget;
119RenderTexture * Cogs::Core::RenderResources::createRenderTexture()
121 auto renderTexture = storage->renderTextures.create();
122 renderTexture->type = RenderResourceType::RenderTexture;
123 return renderTexture;
126RenderList * Cogs::Core::RenderResources::createRenderList()
128 auto renderList = storage->renderLists.create();
129 renderList->type = RenderResourceType::RenderList;
133RenderBuffer * Cogs::Core::RenderResources::createRenderBuffer()
135 auto renderBuffer = storage->renderBuffers.create();
136 renderBuffer->type = RenderResourceType::RenderBuffer;
142 LockGuard lock(storage->renderMeshMutex);
144 auto renderMesh = storage->renderMeshes.create();
145 renderMesh->type = RenderResourceType::Unknown;
149void Cogs::Core::RenderResources::destroyRenderMesh(
RenderMesh * renderMesh)
151 LockGuard lock(storage->renderMeshMutex);
153 storage->renderMeshes.destroy(renderMesh);
156uint32_t Cogs::Core::RenderResources::getRenderHandle(
RenderMesh * renderMesh)
158 return storage->renderMeshes.getHandle(renderMesh);
161RenderMesh * Cogs::Core::RenderResources::getRenderMesh(uint32_t handle)
163 LockGuard lock(storage->renderMeshMutex);
165 return storage->renderMeshes[handle];
168void Cogs::Core::RenderResources::updateResource(
RenderResource * resource)
170 switch (resource->type)
172 case RenderResourceType::RenderTarget:
173 static_cast<RenderTarget *
>(resource)->update(renderer);
175 case RenderResourceType::RenderTexture:
178 case RenderResourceType::RenderBuffer:
179 static_cast<RenderBuffer *
>(resource)->update(renderer);
186void Cogs::Core::RenderResources::releaseResource(
RenderResource * resource)
188 switch (resource->type)
190 case RenderResourceType::RenderTarget:
191 static_cast<RenderTarget *
>(resource)->release(renderer);
193 case RenderResourceType::RenderTexture:
196 case RenderResourceType::RenderBuffer:
197 static_cast<RenderBuffer *
>(resource)->release(renderer);
204void Cogs::Core::RenderResources::destroyResource(
RenderResource * resource)
206 switch (resource->type)
208 case RenderResourceType::RenderTarget:
209 storage->renderTargets.destroy(
static_cast<RenderTarget *
>(resource));
211 case RenderResourceType::RenderTexture:
212 storage->renderTextures.destroy(
reinterpret_cast<RenderTexture *
>(resource));
214 case RenderResourceType::RenderBuffer:
215 storage->renderBuffers.destroy(
reinterpret_cast<RenderBuffer *
>(resource));
217 case RenderResourceType::RenderList:
218 storage->renderLists.destroy(
reinterpret_cast<RenderList *
>(resource));
227 auto effectResource = effect.
resolve();
229 if (!effectResource || !effectResource->hasAttachedResource())
return nullptr;
250 return getRenderMaterial(material.
resolve());
255 return getRenderMaterialInstance(materialInstance.
resolve());
260 auto textureResource = texture.
resolve();
262 if (!textureResource || !textureResource->hasAttachedResource())
return nullptr;
269 LockGuard lock(storage->renderMeshMutex);
271 auto meshResource = mesh.
resolve();
273 if (!meshResource || !meshResource->hasAttachedResource())
return nullptr;
280 template<
typename Handle,
typename Resource>
283 auto resource = handle.resolve();
285 if (!resource->hasAttachedResource()) {
286 auto renderResource = resources.
create();
287 resource->attachResource(renderResource);
288 renderResource->setResource(resource);
289 renderResource->setName(resource->getName());
292 return static_cast<Resource *
>(resource->getAttachedResource());
298 LockGuard lock(storage->renderMeshMutex);
299 auto gpuResource = createGpuResource<MeshHandle, RenderMesh>(meshHandle, storage->renderMeshes,
this);
300 return gpuResource->update(meshHandle.
resolve(), device,
this);
305 auto gpuResource = createGpuResource<TextureHandle, RenderTexture>(textureHandle, storage->renderTextures,
this);
306 return gpuResource->update(textureHandle.
resolve(), device,
this);
311 auto gpuResource = createGpuResource<EffectHandle, RenderEffect>(effectHandle, storage->renderEffects,
this);
312 return gpuResource->update(effectHandle.
resolve(), device,
this);
317 auto gpuResource = createGpuResource<MaterialHandle, RenderMaterial>(materialHandle, storage->renderMaterials,
this);
318 return gpuResource->update(materialHandle.
resolve(), device,
this, renderStates);
323 auto gpuResource = createGpuResource<MaterialInstanceHandle, RenderMaterialInstance>(materialInstanceHandle, storage->renderMaterialInstances,
this);
324 return gpuResource->update(materialInstanceHandle.
resolve(), device,
this, renderStates);
329 template<
typename RenderResourceType>
333 if (renderResource) {
334 renderResource->release(renderer);
338 return renderResource;
342void Cogs::Core::RenderResources::releaseResource(
Texture * texture)
344 if (
auto renderResource = releaseGpuResource<RenderTexture>(texture, renderer)) {
345 storage->renderTextures.destroy((
RenderTexture *)renderResource);
347 if (!texture->isProxy() && texture->ownsExternalTexture.value) {
348 if (texture->externalHandle) {
349 device->getTextures()->releaseNativeTexture(texture->externalHandle);
350 texture->externalHandle = 0;
355void Cogs::Core::RenderResources::releaseResource(
Mesh * mesh)
357 LockGuard lock(storage->renderMeshMutex);
359 if (
auto renderResource = releaseGpuResource<RenderMesh>(mesh, renderer)) {
360 storage->renderMeshes.destroy((
RenderMesh *)renderResource);
364void Cogs::Core::RenderResources::releaseResource(
Material * material)
366 if (
auto renderResource = releaseGpuResource<RenderMaterial>(material, renderer)) {
367 storage->renderMaterials.destroy((
RenderMaterial *)renderResource);
371void Cogs::Core::RenderResources::releaseResource(
MaterialInstance * materialInstance)
373 if (
auto renderResource = releaseGpuResource<RenderMaterialInstance>(materialInstance, renderer)) {
378void Cogs::Core::RenderResources::releaseResource(
Effect * effect)
380 if (
auto renderResource = releaseGpuResource<RenderEffect>(effect, renderer)) {
381 storage->renderEffects.destroy((
RenderEffect *)renderResource);
A Context instance contains all the services, systems and runtime components needed to use Cogs.
Contains render resources used by the renderer.
RenderStates & getRenderStates() override
Get the reference to the RenderStates structure.
IGraphicsDevice * getDevice() override
Get the graphics device used by the renderer.
Log implementation class.
Base allocator implementation.
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
@ Resident
The resource is loaded onto the GPU.
ActivationResult
Defines results for resource activation.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Contains all Cogs related functionality.
Pool used to store elements of ElementType.
ElementType * create(ARGS &&... args)
Allocate and initialize a new element from the pool passing any arguments to the constructor of the n...
Effect resources contain data to control the shader stages of the GPU pipeline.
Material instances represent a specialized Material combined with state for all its buffers and prope...
Material resources define the how of geometry rendering (the what is defined by Mesh and Texture reso...
Meshes contain streams of vertex data in addition to index data and options defining geometry used fo...
Base class for engine resources.
void unsetFlag(ResourceFlags flag)
Unset the given flag.
void attachResource(RenderResource *attachment)
Attach the given GPU resource to the resource.
RenderResource * getAttachedResource() const
Get the attached resource.
bool hasAttachedResource() const
Check if the resource has an attachment.
ResourceType * resolve() const
Resolve the handle, returning a pointer to the actual resource.
Texture resources contain raster bitmap data to use for texturing.