Files
FlaxEngine/Source/Engine/Graphics/GPUContext.cpp

121 lines
3.0 KiB
C++

// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
#include "GPUContext.h"
#include "GPUDevice.h"
#include "RenderTask.h"
#include "Textures/GPUTexture.h"
GPUContext::GPUContext(GPUDevice* device)
: ScriptingObject(ScriptingObjectSpawnParams(Guid::New(), TypeInitializer))
, _device(device)
{
}
#if !BUILD_RELEASE
#include "Engine/Core/Log.h"
void GPUContext::LogInvalidResourceUsage(int32 slot, const GPUResourceView* view, InvalidBindPoint bindPoint)
{
GPUResource* resource = view ? view->GetParent() : nullptr;
const Char* resourceType = TEXT("resource");
const Char* flagType = TEXT("flags");
if (resource)
{
switch (resource->GetResourceType())
{
case GPUResourceType::RenderTarget:
case GPUResourceType::Texture:
case GPUResourceType::CubeTexture:
case GPUResourceType::VolumeTexture:
resourceType = TEXT("texture");
flagType = TEXT("GPUTextureFlags");
break;
case GPUResourceType::Buffer:
resourceType = TEXT("buffer");
flagType = TEXT("GPUBufferFlags");
break;
}
}
const Char* usage = TEXT("-");
switch (bindPoint)
{
case InvalidBindPoint::SRV:
usage = TEXT("shader resource");
break;
case InvalidBindPoint::UAV:
usage = TEXT("unordered access");
break;
case InvalidBindPoint::DSV:
usage = TEXT("depth stencil");
break;
case InvalidBindPoint::RTV:
usage = TEXT("render target");
break;
}
LOG(Error, "Incorrect {} bind at slot {} as {} (ensure to setup correct {} when creating that resource)", resourceType, slot, usage, flagType);
}
#endif
void GPUContext::FrameBegin()
{
_lastRenderTime = Platform::GetTimeSeconds();
}
void GPUContext::FrameEnd()
{
ClearState();
FlushState();
}
void GPUContext::BindSR(int32 slot, GPUTexture* t)
{
ASSERT_LOW_LAYER(t == nullptr || t->ResidentMipLevels() == 0 || t->IsShaderResource());
BindSR(slot, GET_TEXTURE_VIEW_SAFE(t));
}
void GPUContext::DrawFullscreenTriangle(int32 instanceCount)
{
auto vb = _device->GetFullscreenTriangleVB();
BindVB(ToSpan(&vb, 1));
DrawInstanced(3, instanceCount);
}
void GPUContext::Draw(GPUTexture* dst, GPUTexture* src)
{
ASSERT_LOW_LAYER(dst && src);
ResetRenderTarget();
const float width = (float)dst->Width();
const float height = (float)dst->Height();
SetViewport(width, height);
SetRenderTarget(dst->View());
BindSR(0, src->View());
SetState(_device->GetCopyLinearPS());
DrawFullscreenTriangle();
}
void GPUContext::Draw(GPUTexture* rt)
{
ASSERT_LOW_LAYER(rt);
BindSR(0, rt);
SetState(_device->GetCopyLinearPS());
DrawFullscreenTriangle();
}
void GPUContext::Draw(GPUTextureView* rt)
{
ASSERT_LOW_LAYER(rt);
BindSR(0, rt);
SetState(_device->GetCopyLinearPS());
DrawFullscreenTriangle();
}
void GPUContext::SetResourceState(GPUResource* resource, uint64 state, int32 subresource)
{
}
void GPUContext::ForceRebindDescriptors()
{
}