1#include "ExtensionRegistry.h"
2#include "Renderer/Renderer.h"
3#include "Renderer/RenderList.h"
4#include "Renderer/RenderStateUpdater.h"
5#include "Renderer/RenderTarget.h"
6#include "Renderer/Tasks/RenderListTask.h"
7#include "Renderer/Tasks/FilterListTask.h"
8#include "Renderer/Tasks/GenerateListTask.h"
10#include "Image360System.h"
12#include "Rendering/IGraphicsDevice.h"
13#include "Rendering/ITextures.h"
14#include "Rendering/ICapabilities.h"
15#include "Rendering/IRenderTargets.h"
16#include "Foundation/Logging/Logger.h"
25 using namespace Cogs::Core::Image360;
31 glm::mat4 worldFromLocal;
32 glm::mat4 localFromWorld;
33 float clipSpaceNearPlane;
44 const auto* camData = drawContext->cameraData;
45 if (camData ==
nullptr)
return;
47 Renderer* renderer = taskContext->renderer;
60 if (drawContext->task->viewportFromTarget && drawContext->renderTarget) {
61 iContext->
setViewport(0.f, 0.f,
float(drawContext->renderTarget->width), float(drawContext->renderTarget->height));
64 iContext->
setViewport(camData->viewportOrigin.x, camData->viewportOrigin.y, camData->viewportSize.x, camData->viewportSize.y);
68 iContext->
setBlendState(taskContext->states->blendStates[renderItem->blendState].handle);
70 const RenderPassOptions passOptions = initRenderPassOptions(*camData , renderItem->materialInstance);
71 iContext->
setRasterizerState(taskContext->states->rasterizerStateHandles[getRasterizerState(renderer, *renderItem, passOptions, camData->flipWindingOrder,
true)]);
75 applyMaterialPermutation(taskContext, drawContext, drawContext->binding, renderItem->renderMaterialInstance);
79 drawContext->task->applyMaterial(*drawContext, *renderItem, drawContext->binding);
82 applyMaterialInstance(drawContext, drawContext->binding, renderItem->renderMaterialInstance);
84 updateSceneBindings(drawContext, drawContext->cameraData, drawContext->binding);
86 updateMaterialBindings(drawContext, renderItem->renderMaterialInstance, drawContext->binding,
true);
90 const glm::mat3 viewFromLocal = glm::mat3(drawContext->cameraData->viewMatrix) * rendererData->worldFromLocal;
91 const glm::mat3 localFromView = rendererData->localFromWorld * glm::mat3(drawContext->cameraData->inverseViewMatrix);
92 const float clipSpaceNearPlane = drawContext->context->
variables->get(
"renderer.reverseDepth",
false) ? 1.f : -1.f;
94 const EngineBuffers& engineBuffers = *drawContext->engineBuffers;
98 .worldFromLocal = rendererData->worldFromLocal,
99 .localFromWorld = rendererData->localFromWorld,
100 .clipSpaceNearPlane = clipSpaceNearPlane,
101 .valueScale = rendererData->value.scale,
102 .valueBias = rendererData->value.bias,
103 .depthScale = rendererData->depth.scale,
104 .depthBias = rendererData->depth.bias,
105 .baseSize = float(rendererData->baseSize),
106 .noDataDepth = rendererData->noDataDepth
108 iContext->
updateBuffer(rendererData->constants, &constants,
sizeof(constants));
114 objectBuffer.encodeObjectId(renderItem->
objectId);
115 iContext->
updateBuffer(rendererData->constants, &objectBuffer,
sizeof(objectBuffer));
116 iContext->
setConstantBuffer(bindings->objectBufferBinding, engineBuffers.objectBufferHandle);
119 iContext->
setTexture(
"encodedTrees", 0, rendererData->encodedTreesTex);
122 if (rendererData->isValueUint) {
123 iContext->
setTexture(
"tilesValue_uint", 1, rendererData->value.tilesTex);
128 iContext->
setTexture(
"tilesValue_srgb", 1, rendererData->value.tilesTex);
132 iContext->
setTexture(
"tilesDepth", 2, rendererData->depth.tilesTex);
140 constexpr const char* atlasBlitVS_es30 = R
"(#version 300 es
141precision highp float;
145 gl_Position = vec4(a_POSITION, 0, 1);
149 constexpr const char* atlasBlitFloatPS_es30 = R
"(#version 300 es
150precision highp float;
151precision highp sampler2DArray;
155uniform sampler2DArray source;
159 destination = texelFetch(source, ivec3(floor(gl_FragCoord.xy), sourceLayer), 0);
163 constexpr const char* atlasBlitUIntPS_es30 = R
"(#version 300 es
164precision highp float;
166precision highp usampler2DArray;
170uniform usampler2DArray source;
171out uvec4 destination;
174 destination = texelFetch(source, ivec3(floor(gl_FragCoord.xy), sourceLayer), 0);
184 auto& atlasBlit = rendererExtension->atlasBlit;
194 atlasBlit.f.effect = effects->
loadEffectSource(atlasBlitVS_es30, atlasBlitFloatPS_es30);
195 atlasBlit.u.effect = effects->
loadEffectSource(atlasBlitVS_es30, atlasBlitUIntPS_es30);
204 .comparisonFunction = Cogs::SamplerState::ComparisonFunction::Never,
206 .borderColor = { 0, 0, 0, 1 }
210 .depthEnabled =
false,
211 .writeEnabled =
true,
217 .sourceBlend = Cogs::BlendState::Blend::One,
218 .destinationBlend = Cogs::BlendState::Blend::Zero,
219 .operation = Cogs::BlendState::BlendOperation::Add
226 uint32_t w, uint32_t h, Cogs::TextureFormat fmt)
228 bool formatIsFloat =
true;
230 case Cogs::DataFormat::R8G8B8A8_UNORM:
231 case Cogs::DataFormat::R8G8B8A8_UNORM_SRGB:
232 formatIsFloat =
true;
237 case Cogs::DataFormat::R16_UINT:
238 formatIsFloat =
false;
244 LOG_ERROR_ONCE(logger,
"Trying to blit unsupported format: %d",
static_cast<uint32_t
>(fmt));
254 .layerIndex =
static_cast<uint16_t
>(dstLayer),
262 info.renderTargetHandle = renderTarget;
264 info.loadOp[0] = Cogs::LoadOp::Clear;
265 info.storeOp[0] = Cogs::StoreOp::Store;
266 info.clearValue[0][0] = 0.0;
267 info.clearValue[0][1] = 0.0;
268 info.clearValue[0][2] = 0.0;
269 info.clearValue[0][3] = 0.0;
270 info.depthLoadOp = Cogs::LoadOp::Undefined;
271 info.depthStoreOp = Cogs::StoreOp::Discard;
277 immediateContext->
setViewport(0.f, 0.f,
static_cast<float>(w),
static_cast<float>(h));
278 immediateContext->
updateBuffer(rendererExtension->atlasBlit.paramBuffer, &srcLayer,
sizeof(uint32_t));
280 immediateContext->
setEffect(rendererExtension->atlasBlit.f.effect);
281 immediateContext->
setInputLayout(rendererExtension->atlasBlit.f.inputLayout);
282 immediateContext->
setConstantBuffer(rendererExtension->atlasBlit.f.paramBinding, rendererExtension->atlasBlit.paramBuffer);
283 immediateContext->
setTexture(rendererExtension->atlasBlit.f.srcTexBinding, srcTex);
284 immediateContext->
setSamplerState(rendererExtension->atlasBlit.f.srcSamplerBinding, rendererExtension->atlasBlit.samplerState);
287 immediateContext->
setEffect(rendererExtension->atlasBlit.u.effect);
288 immediateContext->
setInputLayout(rendererExtension->atlasBlit.u.inputLayout);
289 immediateContext->
setConstantBuffer(rendererExtension->atlasBlit.u.paramBinding, rendererExtension->atlasBlit.paramBuffer);
290 immediateContext->
setTexture(rendererExtension->atlasBlit.u.srcTexBinding, srcTex);
291 immediateContext->
setSamplerState(rendererExtension->atlasBlit.u.srcSamplerBinding, rendererExtension->atlasBlit.samplerState);
293 immediateContext->
setVertexBuffers(&rendererExtension->fullScreenTriangle.vertices, 1);
295 immediateContext->
setBlendState(rendererExtension->atlasBlit.blendState);
317 variant.inputLayout = buffers->
loadInputLayout(&rendererExtension->fullScreenTriangle.streamsLayout.
vertexFormats[0], 1, variant.effect);
324 LOG_ERROR(logger,
"Image360::RendererExtension: Failed to build atlas blit effect.");
327 variant.effectStatus = status;
344 bool fSettled = pollAtlasBlitVariant(
this, atlasBlit.f);
345 bool uSettled = pollAtlasBlitVariant(
this, atlasBlit.u);
346 return fSettled && uSettled;
352 this->device = device;
353 this->context = context;
354 im360System = ExtensionRegistry::getExtensionSystem<Image360System>(context);
362 fullScreenTriangle.streamsLayout.vertexFormats[0] = VertexFormats::createVertexFormat(element);
363 fullScreenTriangle.streamsLayout.numStreams = 1;
364 fullScreenTriangle.streamsLayout.updateHash();
366 static const float fullScreenTriangleVertexData[] = {
371 fullScreenTriangle.vertices = buffers->
loadVertexBuffer(fullScreenTriangleVertexData,
372 sizeof(fullScreenTriangleVertexData) /
sizeof(fullScreenTriangleVertexData[0]),
373 fullScreenTriangle.streamsLayout.vertexFormats[0]);
374 atlasBlitInit(context,
this);
378void Cogs::Core::Image360::RendererExtension::release()
390 texturesToRelease.clear();
394void Cogs::Core::Image360::RendererExtension::releaseRenderingResources(
RendererExtensionData& rendererData)
419 rendererData.depth.tilesData.clear();
425 if (!renderingContext)
return;
429 RenderResources & resources = renderingContext->renderer->getRenderResources();
431 IContext* deviceContext = renderingContext->deviceContext;
439 texturesToRelease.clear();
444 Image360Data& im360Data = im360System->getData(&im360Comp);
447 if ((im360Data.state == Image360Data::State::WaitingForBaseLevel) || (im360Data.state == Image360Data::State::Running))
449 im360Data.rendererData.baseSize = im360Data.config.
baseSize;
450 im360Data.rendererData.noDataDepth = im360Data.config.
noDataDepth;
453 rendererData.value.scale = channel.scale;
454 rendererData.value.bias = channel.bias;
455 switch (channel.dataType) {
458 rendererData.value.sampler = 3;
461 rendererData.value.sampler = 1;
466 rendererData.value.scale = 1.f;
467 rendererData.value.bias = 0.f;
475 rendererData.depth.scale = channel.scale;
476 rendererData.depth.bias = channel.bias;
477 switch (channel.dataType) {
480 rendererData.depth.sampler = 3;
483 rendererData.depth.sampler = 1;
493 texturesToRelease.push_back(rendererData.encodedTreesTex);
497 if(!im360Data.lodTree.data.empty()) {
499 desc.target = Cogs::ResourceDimensions::Texture2D;
500 desc.width =
static_cast<uint32_t
>(im360Data.lodTree.data.size());
502 desc.format = Cogs::TextureFormat::R16_SINT;
506 rendererData.encodedTreesTex = textures->
loadTexture(desc, &textureData);
508 if (rendererData.currentTreeSize != desc.width) {
509 rendererData.currentTreeSize = desc.width;
510 LOG_TRACE(logger,
"Current tree size: %u", rendererData.currentTreeSize);
515 uint32_t cacheItemCount = std::max(6u,
static_cast<uint32_t
>(im360Data.cache.items.size()));
516 bool resizeCache = (!
HandleIsValid(im360Data.rendererData.value.tilesTex) ||
522 Cogs::ResourceDimensions target = Cogs::ResourceDimensions::Unknown;
525 rendererData.cacheLayout.cols = 1;
526 rendererData.cacheLayout.rows = 1;
528 target = Cogs::ResourceDimensions::Texture2DArray;
533 desc.target = target;
534 desc.width = rendererData.cacheLayout.cols * im360Data.config.
baseSize;
535 desc.height = rendererData.cacheLayout.rows * im360Data.config.
baseSize;
536 desc.layers = rendererData.cacheLayout.layers;
545 desc.format = Cogs::DataFormat::R8G8B8A8_UNORM_SRGB;
549 desc.format = Cogs::DataFormat::R16_UINT;
552 assert(
false &&
"Invalid enum value");
556 rendererData.value.tilesTex = textures->
loadTexture(desc,
nullptr);
559 for (uint32_t i = 0; i < toCopy; i++) {
560 if (im360Data.cache.items[i].value.state == Cache::Item::State::Resident) {
561 if (!atlasTileBlit(context,
this,
562 rendererData.value.tilesTex, i,
566 deviceContext->copyTexture(rendererData.value.tilesTex,
568 tilesValueOldTex, i);
572 texturesToRelease.push_back(tilesValueOldTex);
580 desc.target = target;
581 desc.width = rendererData.cacheLayout.cols * im360Data.config.
baseSize;
582 desc.height = rendererData.cacheLayout.rows * im360Data.config.
baseSize;
583 desc.layers = rendererData.cacheLayout.layers;
588 desc.format = Cogs::DataFormat::R16_UINT;
591 assert(
false &&
"Invalid enum value");
595 rendererData.depth.tilesTex = textures->
loadTexture(desc,
nullptr);
598 for (uint32_t i = 0; i < toCopy; i++) {
599 if (im360Data.cache.items[i].depth.state == Cache::Item::State::Resident) {
600 if (!atlasTileBlit(context,
this,
601 rendererData.depth.tilesTex, i,
605 deviceContext->copyTexture(rendererData.depth.tilesTex,
607 tilesDepthOldTex, i);
611 texturesToRelease.push_back(tilesDepthOldTex);
621 Cache::Item& item = im360Data.cache.items[loadItem.slotIx];
623 bool consumed =
false;
624 if (loadItem.channelIx == im360Data.config.
valueChannel) {
625 if (item.value.state == Cache::Item::State::Loaded) {
628 uint32_t slice = loadItem.slotIx;
630 RenderTexture* texture = resources.getRenderTexture(loadItem.texture);
631 deviceContext->copyTexture(rendererData.value.tilesTex,
633 texture->textureHandle, 0);
634 item.value.state = Cache::Item::State::Resident;
639 if (loadItem.channelIx == im360Data.config.
depthChannel) {
640 if (item.depth.state == Cache::Item::State::Loaded) {
643 uint32_t slice = loadItem.slotIx;
645 RenderTexture* texture = resources.getRenderTexture(loadItem.texture);
646 deviceContext->copyTexture(rendererData.depth.tilesTex,
648 texture->textureHandle, 0);
649 item.depth.state = Cache::Item::State::Resident;
651 size_t tileByteSize =
sizeof(uint16_t) * im360Data.config.
baseSize * im360Data.config.
baseSize;
652 if (loadItem.buffer && loadItem.buffer->size() == tileByteSize) {
654 if (0 <= loadItem.slotIx &&
size_t(loadItem.slotIx) < rendererData.depth.tilesData.size()) {
655 rendererData.depth.tilesData[loadItem.slotIx] = std::move(loadItem.buffer);
663 LOG_WARNING(logger,
"Unexpected load item not uploaded to GPU");
666 im360Data.fetcher.itemsUploading.clear();
671 releaseRenderingResources(rendererData);
687 if (!renderingContext)
return;
693 Image360Data& im360Data = im360System->getData(&im360Comp);
694 if (im360Data.state != Image360Data::State::Running)
continue;
699 RenderItem& renderItem = renderList->createCustom(&fullScreenTriangle.streamsLayout);
700 renderItem.lod = im360Comp.lod;
702 renderItem.cullingIndex = ~0u;;
705 renderItem.flags |= materialInstance->
hasTransparency() ? RenderItemFlags::Transparent : RenderItemFlags::None;
706 if (materialInstance->
isBackdrop() || ((renderItem.
layer & RenderLayers::Sky)) != RenderLayers::None) {
707 renderItem.flags |= RenderItemFlags::Backdrop;
709 renderItem.materialInstance = materialInstance;
710 getTransparencyState(renderingContext->renderer->
getRenderStates(), materialInstance, renderItem);
712 renderItem.setCallbackData(
this);
713 renderItem.setCallbackData2(&im360Data.rendererData);
714 renderItem.callback = image360RenderCallback;
A Context instance contains all the services, systems and runtime components needed to use Cogs.
class IRenderer * renderer
Renderer.
std::unique_ptr< class Variables > variables
Variables service instance.
virtual IGraphicsDevice * getDevice()=0
Get the graphics device used by the renderer.
RenderLayers layer
Layer mask used to determine visibility for a given camera viewport.
int32_t drawOrder
Draw order within a render bucke.
constexpr bool isVisible() const
Check if the entity is visible or not.
uint32_t objectId
Object identifier passed to rendering commands.
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.
Represents a graphics device used to manage graphics resources and issue drawing commands.
virtual IEffects * getEffects()=0
Get a pointer to the effect management interface.
virtual ITextures * getTextures()=0
Get a pointer to the texture management interface.
virtual ICapabilities * getCapabilities()=0
Get a pointer to the capability management interface used to query the graphics device capability fla...
virtual IContext * getImmediateContext()=0
Get a pointer to the immediate context used to issue commands to the graphics device.
virtual IBuffers * getBuffers()=0
Get a pointer to the buffer management interface.
virtual IRenderTargets * getRenderTargets()=0
Get a pointer to the render target management interface.
Log implementation class.
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
bool HandleIsValid(const ResourceHandle_t< T > &handle)
Check if the given resource is valid, that is not equal to NoHandle or InvalidHandle.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
@ OpenGLES30
Graphics device using the OpenGLES 3.0 API.
ResourceStatus
Status of an asynchronously loaded resource, such as an effect or a pipeline.
@ Pending
The resource is still loading.
@ Error
The resource failed to load.
@ Ready
The resource has loaded successfully and is ready for use.
@ VertexData
Per vertex data.
@ TriangleStrip
Triangle strip.
@ TriangleList
List of triangles.
@ Position
Position semantic.
@ Write
The buffer can be mapped and written to by the CPU after creation.
@ ConstantBuffer
The buffer can be bound as input to effects as a constant buffer.
float valueDomainMin
Set the source domain for scalar values, see 360.json's bias and scale to account for datatype.
float valueDomainMax
Set the source domain for scalar values, see 360.json's bias and scale to account for datatype.
@ SRGB8_JPEG
8-bit colors in SRGB color space stored as JPEG (.jpg).
@ U16_ZST
16-bit unsigned values stored as little endian raw values that are subsequently zstd compressed.
@ SRGBA8_PNG
8-bit colors in SRGB color space and a alpha channel (zero is transparent) stored as PNG (....
@ SRGB8_PNG
8-bit colors in SRGB color space stored as PNG (.png).
@ U16
16-bit unsigned values stored as little endian raw values.
uint32_t noDataDepth
Depth value that corresponds to noData.
uint32_t baseSize
Base image size of a cached tile. From json.
uint8_t valueChannel
Data channel to be used as value data. From component.
uint8_t depthChannel
Data channel that contains depth data. From json.
std::vector< Channel > channels
Data channels to use. From json.
bool hasDepth
If data has depth and component wants depth.
uint32_t gpuAllocatedCacheItemCount
Number of tiles allocated in current GPU cache texture.
uint32_t gpuActiveCacheItemCount
Number of tiles in current GPU cache that contain data.
void handleEvent(uint32_t eventId, const DrawContext *renderingContext) override
Called when rendering events occur.
void initialize(Context *context, IGraphicsDevice *device) override
Initialize the extension using the given context and device.
@ CustomBucket
Items with this flag should be put in Custom rendering buckets.
Material instances represent a specialized Material combined with state for all its buffers and prope...
bool hasTransparency() const
Get if this instance has any transparency and should be rendered with blending enabled.
bool isBackdrop() const
Get if geometry rendered with this material instance is to be treated as backdrops.
MaterialOptions options
Material rendering options used by this instance.
uint16_t instanceFlags
Material instance flags.
VertexFormatHandle vertexFormats[maxStreams]
int32_t drawOrder
Ordering of draw items within a bucket.
uint32_t objectId
Lower 6 of upper 8 bits are instance id bits, lower 24 bits are object id.
RenderLayers layer
Visibility mask.
@ PostRender
Rendering has finished for a given rendering context.
@ PreRender
Pre rendering happening for a given rendering context.
ResourceType * resolve() const
Resolve the handle, returning a pointer to the actual resource.
@ Always
Always evaluates to true.
static const Handle_t NoHandle
Represents a handle to nothing.
Provides buffer management functionality.
virtual InputLayoutHandle loadInputLayout(const VertexFormatHandle *vertexFormats, const size_t count, EffectHandle effectHandle)=0
Loads a new input layout to map vertex flow between vertex buffers with the given vertexFormats to ef...
virtual BufferHandle loadBuffer(const void *data, const size_t size, Usage::EUsage usage, uint32_t accessMode, uint32_t bindFlags, uint32_t stride=0)=0
Loads a new buffer using the given data to populate the buffer.
virtual void releaseBuffer(BufferHandle bufferHandle)=0
Releases the buffer with the given bufferHandle.
virtual VertexBufferHandle loadVertexBuffer(const void *vertexData, const size_t count, const VertexFormat &vertexFormat)=0
Loads a new vertex buffer and populates it with the given data.
virtual const GraphicsDeviceCapabilities & getDeviceCapabilities() const
Gets the device capabilities in a structure.
Represents a graphics device context which can receive rendering commands.
virtual void setTexture(const StringView &name, unsigned int unit, TextureHandle textureHandle)=0
Sets the texture slot given by unit with the given name to contain the given texture.
virtual void setRasterizerState(const RasterizerStateHandle handle)=0
Set the current rasterizer state.
virtual void setBlendState(const BlendStateHandle handle, const float *constant=nullptr)=0
Set the current blend state.
virtual void setInputLayout(const InputLayoutHandle inputLayoutHandle)=0
Sets the current input layout.
virtual void setDepthStencilState(const DepthStencilStateHandle handle)=0
Set the current depth stencil state.
virtual void setConstantBuffer(const StringView &name, const BufferHandle bufferHandle, const uint32_t offset=0, const uint32_t size=~0u)=0
Sets a constant buffer to be bound to the given name and slot.
virtual void updateBuffer(BufferHandle bufferHandle, const void *data, size_t size)=0
Replace contents of buffer with new data.
virtual void setViewport(const float x, const float y, const float width, const float height)=0
Sets the current viewport to the given location and dimensions.
virtual void draw(PrimitiveType primitiveType, const size_t startVertex, const size_t numVertexes)=0
Draws non-indexed, non-instanced primitives.
virtual void beginRenderPass(const RenderPassInfo &info)=0
Begin a render pass.
virtual void setSamplerState(const StringView &name, unsigned int unit, SamplerStateHandle samplerStateHandle)=0
Sets the sampler slot given by unit with the given name to contain the given sampler state.
virtual void setVertexBuffers(const VertexBufferHandle *vertexBufferHandles, const size_t count, const uint32_t *strides, const uint32_t *offsets)=0
Sets the current vertex buffers.
virtual void setEffect(EffectHandle handle)=0
Set the current effect.
virtual void setRenderTarget(const RenderTargetHandle handle, const DepthStencilHandle depthStencilHandle)=0
Sets the current render target and an associated depth stencil target.
Provides effects and shader management functionality.
virtual SamplerStateBindingHandle getSamplerStateBinding(EffectHandle effectHandle, const StringView &name, const unsigned int slot)=0
Get a handle to a sampler state object binding, mapping how to bind the sampler state to the given ef...
virtual ConstantBufferBindingHandle getConstantBufferBinding(EffectHandle effectHandle, const StringView &name)=0
Get a handle to a constant buffer binding, mapping how to bind a constant buffer to the given effect.
virtual TextureBindingHandle getTextureBinding(EffectHandle effectHandle, const StringView &name, const unsigned int slot)=0
Get a handle to a texture object binding, mapping how to bind textures to the given effect.
virtual EffectHandle loadEffectSource(const StringView &vsSource, const StringView &psSource, EffectFlags::EEffectFlags effectFlags=EffectFlags::None)=0
Load an effect created from the vertex and pixel shader sources given.
virtual ResourceStatus checkEffect(EffectHandle effectHandle)=0
Check the load status of the effect with the given effectHandle.
Provides render target management functionality.
virtual BlendStateHandle loadBlendState(const BlendState &blendState)=0
Load a blend state object.
virtual DepthStencilStateHandle loadDepthStencilState(const DepthStencilState &depthStencilState)=0
Load a depth stencil state object.
virtual void releaseRenderTarget(RenderTargetHandle renderTargetHandle)=0
Release the render target with the given renderTargetHandle.
virtual RenderTargetHandle createRenderTarget(TextureHandle textureHandle)
Create a render target using the given texture to render into.
Provides texture management functionality.
virtual SamplerStateHandle loadSamplerState(const SamplerState &state)=0
Load a sampler state object.
virtual void releaseTexture(TextureHandle textureHandle)=0
Release the texture with the given textureHandle.
virtual TextureHandle loadTexture(const unsigned char *bytes, unsigned int width, unsigned int height, TextureFormat format, unsigned int flags=0)=0
Load a texture using the given data to populate the texture contents.
Describes a single render target view and which resources to use from the underlying texture.
TextureHandle texture
Texture handle.
@ Clamp
Texture coordinates are clamped to the [0, 1] range.
@ MinMagMipPoint
Point sampling for both minification and magnification.
@ Default
Default usage, the texture can be loaded once and bound and sampled in shaders.
@ Dynamic
Buffer will be loaded and modified with some frequency.
Vertex element structure used to describe a single data element in a vertex for the input assembler.