#include "fixtures/RHITestFixture.h" #include "XCEngine/RHI/RHIBuffer.h" #include "XCEngine/RHI/RHIResourceView.h" #include "XCEngine/RHI/RHITexture.h" using namespace XCEngine::RHI; TEST_P(RHITestFixture, Device_CreateRenderTargetView) { TextureDesc texDesc = {}; texDesc.width = 256; texDesc.height = 256; texDesc.format = static_cast(Format::R8G8B8A8_UNorm); texDesc.textureType = static_cast(TextureType::Texture2D); texDesc.sampleCount = 1; RHITexture* texture = GetDevice()->CreateTexture(texDesc); if (texture == nullptr) { return; } ResourceViewDesc viewDesc = {}; viewDesc.format = static_cast(Format::R8G8B8A8_UNorm); viewDesc.dimension = ResourceViewDimension::Texture2D; RHIResourceView* rtv = GetDevice()->CreateRenderTargetView(texture, viewDesc); if (rtv != nullptr) { EXPECT_TRUE(rtv->IsValid()); EXPECT_EQ(rtv->GetViewType(), ResourceViewType::RenderTarget); EXPECT_EQ(rtv->GetFormat(), Format::R8G8B8A8_UNorm); rtv->Shutdown(); delete rtv; } texture->Shutdown(); delete texture; } TEST_P(RHITestFixture, Device_CreateDepthStencilView) { TextureDesc texDesc = {}; texDesc.width = 256; texDesc.height = 256; texDesc.format = static_cast(Format::D24_UNorm_S8_UInt); texDesc.textureType = static_cast(TextureType::Texture2D); texDesc.sampleCount = 1; RHITexture* texture = GetDevice()->CreateTexture(texDesc); if (texture == nullptr) { return; } ResourceViewDesc viewDesc = {}; viewDesc.format = static_cast(Format::D24_UNorm_S8_UInt); viewDesc.dimension = ResourceViewDimension::Texture2D; RHIResourceView* dsv = GetDevice()->CreateDepthStencilView(texture, viewDesc); if (dsv != nullptr) { EXPECT_TRUE(dsv->IsValid()); EXPECT_EQ(dsv->GetViewType(), ResourceViewType::DepthStencil); dsv->Shutdown(); delete dsv; } texture->Shutdown(); delete texture; } TEST_P(RHITestFixture, Device_CreateShaderResourceView) { TextureDesc texDesc = {}; texDesc.width = 256; texDesc.height = 256; texDesc.format = static_cast(Format::R8G8B8A8_UNorm); texDesc.textureType = static_cast(TextureType::Texture2D); texDesc.sampleCount = 1; RHITexture* texture = GetDevice()->CreateTexture(texDesc); if (texture == nullptr) { return; } ResourceViewDesc viewDesc = {}; viewDesc.format = static_cast(Format::R8G8B8A8_UNorm); viewDesc.dimension = ResourceViewDimension::Texture2D; RHIResourceView* srv = GetDevice()->CreateShaderResourceView(texture, viewDesc); if (srv != nullptr) { EXPECT_TRUE(srv->IsValid()); EXPECT_EQ(srv->GetViewType(), ResourceViewType::ShaderResource); srv->Shutdown(); delete srv; } texture->Shutdown(); delete texture; } TEST_P(RHITestFixture, Device_CreateUnorderedAccessView) { TextureDesc texDesc = {}; texDesc.width = 256; texDesc.height = 256; texDesc.format = static_cast(Format::R8G8B8A8_UNorm); texDesc.textureType = static_cast(TextureType::Texture2D); texDesc.sampleCount = 1; RHITexture* texture = GetDevice()->CreateTexture(texDesc); if (texture == nullptr) { return; } ResourceViewDesc viewDesc = {}; viewDesc.format = static_cast(Format::R8G8B8A8_UNorm); viewDesc.dimension = ResourceViewDimension::Texture2D; RHIResourceView* uav = GetDevice()->CreateUnorderedAccessView(texture, viewDesc); if (uav != nullptr) { EXPECT_TRUE(uav->IsValid()); EXPECT_EQ(uav->GetViewType(), ResourceViewType::UnorderedAccess); uav->Shutdown(); delete uav; } texture->Shutdown(); delete texture; } TEST_P(RHITestFixture, Device_CreateShaderResourceView_FromInitialDataTexture) { TextureDesc texDesc = {}; texDesc.width = 1; texDesc.height = 1; texDesc.depth = 1; texDesc.mipLevels = 1; texDesc.arraySize = 1; texDesc.format = static_cast(Format::R8G8B8A8_UNorm); texDesc.textureType = static_cast(TextureType::Texture2D); texDesc.sampleCount = 1; texDesc.sampleQuality = 0; texDesc.flags = 0; const uint8_t pixel[4] = { 255, 255, 255, 255 }; RHITexture* texture = GetDevice()->CreateTexture(texDesc, pixel, sizeof(pixel), 4); ASSERT_NE(texture, nullptr); ResourceViewDesc viewDesc = {}; viewDesc.format = static_cast(Format::R8G8B8A8_UNorm); viewDesc.dimension = ResourceViewDimension::Texture2D; RHIResourceView* srv = GetDevice()->CreateShaderResourceView(texture, viewDesc); ASSERT_NE(srv, nullptr); EXPECT_TRUE(srv->IsValid()); EXPECT_EQ(srv->GetViewType(), ResourceViewType::ShaderResource); srv->Shutdown(); delete srv; texture->Shutdown(); delete texture; } TEST_P(RHITestFixture, Device_CreateVertexBufferView) { BufferDesc bufferDesc = {}; bufferDesc.size = 256; bufferDesc.stride = 32; bufferDesc.bufferType = static_cast(BufferType::Vertex); RHIBuffer* buffer = GetDevice()->CreateBuffer(bufferDesc); ASSERT_NE(buffer, nullptr); ResourceViewDesc viewDesc = {}; viewDesc.dimension = ResourceViewDimension::Buffer; viewDesc.structureByteStride = 32; RHIResourceView* vbv = GetDevice()->CreateVertexBufferView(buffer, viewDesc); ASSERT_NE(vbv, nullptr); EXPECT_TRUE(vbv->IsValid()); EXPECT_EQ(vbv->GetViewType(), ResourceViewType::VertexBuffer); EXPECT_EQ(vbv->GetDimension(), ResourceViewDimension::Buffer); vbv->Shutdown(); delete vbv; buffer->Shutdown(); delete buffer; } TEST_P(RHITestFixture, Device_CreateIndexBufferView) { BufferDesc bufferDesc = {}; bufferDesc.size = 256; bufferDesc.stride = sizeof(uint32_t); bufferDesc.bufferType = static_cast(BufferType::Index); RHIBuffer* buffer = GetDevice()->CreateBuffer(bufferDesc); ASSERT_NE(buffer, nullptr); ResourceViewDesc viewDesc = {}; viewDesc.dimension = ResourceViewDimension::Buffer; viewDesc.format = static_cast(Format::R32_UInt); RHIResourceView* ibv = GetDevice()->CreateIndexBufferView(buffer, viewDesc); ASSERT_NE(ibv, nullptr); EXPECT_TRUE(ibv->IsValid()); EXPECT_EQ(ibv->GetViewType(), ResourceViewType::IndexBuffer); EXPECT_EQ(ibv->GetDimension(), ResourceViewDimension::Buffer); ibv->Shutdown(); delete ibv; buffer->Shutdown(); delete buffer; } TEST_P(RHITestFixture, Device_CreateRenderTargetView_Multiple) { TextureDesc texDesc = {}; texDesc.width = 256; texDesc.height = 256; texDesc.format = static_cast(Format::R8G8B8A8_UNorm); texDesc.textureType = static_cast(TextureType::Texture2D); texDesc.sampleCount = 1; RHIResourceView* rtvs[4] = { nullptr }; for (int i = 0; i < 4; ++i) { RHITexture* texture = GetDevice()->CreateTexture(texDesc); if (texture == nullptr) { break; } ResourceViewDesc viewDesc = {}; viewDesc.format = static_cast(Format::R8G8B8A8_UNorm); viewDesc.dimension = ResourceViewDimension::Texture2D; rtvs[i] = GetDevice()->CreateRenderTargetView(texture, viewDesc); texture->Shutdown(); delete texture; } for (int i = 0; i < 4; ++i) { if (rtvs[i] != nullptr) { EXPECT_TRUE(rtvs[i]->IsValid()); rtvs[i]->Shutdown(); delete rtvs[i]; } } } TEST_P(RHITestFixture, Device_CreateShaderResourceView_ArrayTexture) { TextureDesc texDesc = {}; texDesc.width = 256; texDesc.height = 256; texDesc.arraySize = 4; texDesc.format = static_cast(Format::R8G8B8A8_UNorm); texDesc.textureType = static_cast(TextureType::Texture2DArray); texDesc.sampleCount = 1; RHITexture* texture = GetDevice()->CreateTexture(texDesc); if (texture == nullptr) { return; } ResourceViewDesc viewDesc = {}; viewDesc.format = static_cast(Format::R8G8B8A8_UNorm); viewDesc.dimension = ResourceViewDimension::Texture2DArray; viewDesc.arraySize = 4; RHIResourceView* srv = GetDevice()->CreateShaderResourceView(texture, viewDesc); if (srv != nullptr) { EXPECT_TRUE(srv->IsValid()); srv->Shutdown(); delete srv; } texture->Shutdown(); delete texture; } TEST_P(RHITestFixture, Device_CreateShaderResourceView_CubeTexture) { TextureDesc texDesc = {}; texDesc.width = 256; texDesc.height = 256; texDesc.arraySize = 6; texDesc.format = static_cast(Format::R8G8B8A8_UNorm); texDesc.textureType = static_cast(TextureType::TextureCube); texDesc.sampleCount = 1; RHITexture* texture = GetDevice()->CreateTexture(texDesc); if (texture == nullptr) { return; } ResourceViewDesc viewDesc = {}; viewDesc.format = static_cast(Format::R8G8B8A8_UNorm); viewDesc.dimension = ResourceViewDimension::TextureCube; RHIResourceView* srv = GetDevice()->CreateShaderResourceView(texture, viewDesc); if (srv != nullptr) { EXPECT_TRUE(srv->IsValid()); srv->Shutdown(); delete srv; } texture->Shutdown(); delete texture; } TEST_P(RHITestFixture, Device_CreateDepthStencilView_MipLevels) { TextureDesc texDesc = {}; texDesc.width = 256; texDesc.height = 256; texDesc.mipLevels = 5; texDesc.format = static_cast(Format::D24_UNorm_S8_UInt); texDesc.textureType = static_cast(TextureType::Texture2D); texDesc.sampleCount = 1; RHITexture* texture = GetDevice()->CreateTexture(texDesc); if (texture == nullptr) { return; } for (uint32_t mip = 0; mip < texDesc.mipLevels; ++mip) { ResourceViewDesc viewDesc = {}; viewDesc.format = static_cast(Format::D24_UNorm_S8_UInt); viewDesc.dimension = ResourceViewDimension::Texture2D; viewDesc.mipLevel = mip; RHIResourceView* dsv = GetDevice()->CreateDepthStencilView(texture, viewDesc); if (dsv != nullptr) { EXPECT_TRUE(dsv->IsValid()); dsv->Shutdown(); delete dsv; } } texture->Shutdown(); delete texture; }