#include "fixtures/RHITestFixture.h" #include "XCEngine/RHI/RHISampler.h" #include "XCEngine/RHI/OpenGL/OpenGLSampler.h" #include using namespace XCEngine::RHI; TEST_P(RHITestFixture, Sampler_Create) { SamplerDesc desc = {}; desc.filter = static_cast(FilterMode::Linear); desc.addressU = static_cast(TextureAddressMode::Wrap); desc.addressV = static_cast(TextureAddressMode::Wrap); desc.addressW = static_cast(TextureAddressMode::Wrap); desc.mipLodBias = 0.0f; desc.maxAnisotropy = 16; desc.comparisonFunc = static_cast(ComparisonFunc::Less); desc.borderColorR = 0.0f; desc.borderColorG = 0.0f; desc.borderColorB = 0.0f; desc.borderColorA = 0.0f; desc.minLod = 0.0f; desc.maxLod = 100.0f; RHISampler* sampler = GetDevice()->CreateSampler(desc); ASSERT_NE(sampler, nullptr); sampler->Shutdown(); delete sampler; } TEST_P(RHITestFixture, Sampler_Bind_Unbind) { SamplerDesc desc = {}; desc.filter = static_cast(FilterMode::Linear); desc.addressU = static_cast(TextureAddressMode::Wrap); desc.addressV = static_cast(TextureAddressMode::Wrap); desc.addressW = static_cast(TextureAddressMode::Wrap); RHISampler* sampler = GetDevice()->CreateSampler(desc); ASSERT_NE(sampler, nullptr); sampler->Bind(0); sampler->Unbind(0); sampler->Shutdown(); delete sampler; } TEST_P(RHITestFixture, Sampler_GetID) { SamplerDesc desc = {}; desc.filter = static_cast(FilterMode::Linear); desc.addressU = static_cast(TextureAddressMode::Wrap); desc.addressV = static_cast(TextureAddressMode::Wrap); desc.addressW = static_cast(TextureAddressMode::Wrap); RHISampler* sampler = GetDevice()->CreateSampler(desc); ASSERT_NE(sampler, nullptr); unsigned int id = sampler->GetID(); EXPECT_GE(id, 0u); sampler->Shutdown(); delete sampler; } TEST_P(RHITestFixture, Sampler_GetNativeHandle) { SamplerDesc desc = {}; desc.filter = static_cast(FilterMode::Linear); desc.addressU = static_cast(TextureAddressMode::Wrap); desc.addressV = static_cast(TextureAddressMode::Wrap); desc.addressW = static_cast(TextureAddressMode::Wrap); RHISampler* sampler = GetDevice()->CreateSampler(desc); ASSERT_NE(sampler, nullptr); EXPECT_NE(sampler->GetNativeHandle(), nullptr); sampler->Shutdown(); delete sampler; } TEST_P(RHITestFixture, Sampler_OpenGLHonorsSamplerDesc) { if (GetBackendType() != RHIType::OpenGL) { GTEST_SKIP() << "OpenGL-specific sampler parameter verification"; } SamplerDesc desc = {}; desc.filter = static_cast(FilterMode::ComparisonAnisotropic); desc.addressU = static_cast(TextureAddressMode::Clamp); desc.addressV = static_cast(TextureAddressMode::Mirror); desc.addressW = static_cast(TextureAddressMode::Border); desc.maxAnisotropy = 8; desc.comparisonFunc = static_cast(ComparisonFunc::GreaterEqual); desc.minLod = 1.0f; desc.maxLod = 4.0f; RHISampler* sampler = GetDevice()->CreateSampler(desc); ASSERT_NE(sampler, nullptr); const GLuint samplerId = static_cast(sampler)->GetID(); GLint value = 0; glGetSamplerParameteriv(samplerId, GL_TEXTURE_WRAP_S, &value); EXPECT_EQ(value, GL_CLAMP_TO_EDGE); glGetSamplerParameteriv(samplerId, GL_TEXTURE_WRAP_T, &value); EXPECT_EQ(value, GL_MIRRORED_REPEAT); glGetSamplerParameteriv(samplerId, GL_TEXTURE_WRAP_R, &value); EXPECT_EQ(value, GL_CLAMP_TO_BORDER); glGetSamplerParameteriv(samplerId, GL_TEXTURE_MIN_FILTER, &value); EXPECT_EQ(value, GL_LINEAR_MIPMAP_LINEAR); glGetSamplerParameteriv(samplerId, GL_TEXTURE_MAG_FILTER, &value); EXPECT_EQ(value, GL_LINEAR); glGetSamplerParameteriv(samplerId, GL_TEXTURE_COMPARE_MODE, &value); EXPECT_EQ(value, GL_COMPARE_REF_TO_TEXTURE); glGetSamplerParameteriv(samplerId, GL_TEXTURE_COMPARE_FUNC, &value); EXPECT_EQ(value, GL_GEQUAL); GLfloat floatValue = 0.0f; glGetSamplerParameterfv(samplerId, GL_TEXTURE_MAX_ANISOTROPY, &floatValue); EXPECT_GE(floatValue, 8.0f); glGetSamplerParameterfv(samplerId, GL_TEXTURE_MIN_LOD, &floatValue); EXPECT_FLOAT_EQ(floatValue, 1.0f); glGetSamplerParameterfv(samplerId, GL_TEXTURE_MAX_LOD, &floatValue); EXPECT_FLOAT_EQ(floatValue, 4.0f); sampler->Shutdown(); delete sampler; }