mirror of
https://github.com/AxioDL/boo.git
synced 2025-12-09 05:27:58 +00:00
ClampToEdge mode for textures; cocoa termination exception fix
This commit is contained in:
@@ -1017,8 +1017,8 @@ struct D3D11CommandQueue : IGraphicsCommandQueue
|
||||
cbind->bind(m_deferredCtx.Get(), m_fillBuf);
|
||||
m_cmdLists[m_fillBuf].resTokens.push_back(binding.get());
|
||||
|
||||
ID3D11SamplerState* samp[] = {m_ctx->m_ss[0].Get(), m_ctx->m_ss[1].Get()};
|
||||
m_deferredCtx->PSSetSamplers(0, 2, samp);
|
||||
ID3D11SamplerState* samp[] = {m_ctx->m_ss[0].Get(), m_ctx->m_ss[1].Get(), m_ctx->m_ss[2].Get()};
|
||||
m_deferredCtx->PSSetSamplers(0, 3, samp);
|
||||
}
|
||||
|
||||
boo::ObjToken<ITextureR> m_boundTarget;
|
||||
|
||||
@@ -1681,11 +1681,13 @@ public:
|
||||
{
|
||||
CD3DX12_STATIC_SAMPLER_DESC(0),
|
||||
CD3DX12_STATIC_SAMPLER_DESC(1, D3D12_FILTER_ANISOTROPIC, D3D12_TEXTURE_ADDRESS_MODE_BORDER,
|
||||
D3D12_TEXTURE_ADDRESS_MODE_BORDER, D3D12_TEXTURE_ADDRESS_MODE_BORDER)
|
||||
D3D12_TEXTURE_ADDRESS_MODE_BORDER, D3D12_TEXTURE_ADDRESS_MODE_BORDER),
|
||||
CD3DX12_STATIC_SAMPLER_DESC(2, D3D12_FILTER_ANISOTROPIC, D3D12_TEXTURE_ADDRESS_MODE_CLAMP,
|
||||
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, D3D12_TEXTURE_ADDRESS_MODE_CLAMP)
|
||||
};
|
||||
|
||||
ThrowIfFailed(D3D12SerializeRootSignaturePROC(
|
||||
&CD3DX12_ROOT_SIGNATURE_DESC(1, rootParms, 2, samplers,
|
||||
&CD3DX12_ROOT_SIGNATURE_DESC(1, rootParms, 3, samplers,
|
||||
D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT),
|
||||
D3D_ROOT_SIGNATURE_VERSION_1, &rsOutBlob, &rsErrorBlob));
|
||||
|
||||
|
||||
@@ -172,6 +172,13 @@ static void SetClampMode(GLenum target, TextureClampMode clampMode)
|
||||
glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, color);
|
||||
break;
|
||||
}
|
||||
case TextureClampMode::ClampToEdge:
|
||||
{
|
||||
glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,6 +256,12 @@ class GLTextureS : public GraphicsDataNode<ITextureS>
|
||||
public:
|
||||
~GLTextureS() { glDeleteTextures(1, &m_tex); }
|
||||
|
||||
void setClampMode(TextureClampMode mode)
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, m_tex);
|
||||
SetClampMode(GL_TEXTURE_2D, mode);
|
||||
}
|
||||
|
||||
void bind(size_t idx) const
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE0 + idx);
|
||||
@@ -306,6 +319,12 @@ class GLTextureSA : public GraphicsDataNode<ITextureSA>
|
||||
public:
|
||||
~GLTextureSA() { glDeleteTextures(1, &m_tex); }
|
||||
|
||||
void setClampMode(TextureClampMode mode)
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D_ARRAY, m_tex);
|
||||
SetClampMode(GL_TEXTURE_2D_ARRAY, mode);
|
||||
}
|
||||
|
||||
void bind(size_t idx) const
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE0 + idx);
|
||||
@@ -389,6 +408,15 @@ public:
|
||||
m_validMask = 0;
|
||||
}
|
||||
|
||||
void setClampMode(TextureClampMode mode)
|
||||
{
|
||||
for (int i=0 ; i<3 ; ++i)
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, m_texs[i]);
|
||||
SetClampMode(GL_TEXTURE_2D, mode);
|
||||
}
|
||||
}
|
||||
|
||||
void bind(size_t idx, int b)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE0 + idx);
|
||||
@@ -409,6 +437,8 @@ class GLTextureR : public GraphicsDataNode<ITextureR>
|
||||
size_t m_width = 0;
|
||||
size_t m_height = 0;
|
||||
size_t m_samples = 0;
|
||||
size_t m_colorBindCount;
|
||||
size_t m_depthBindCount;
|
||||
GLenum m_target;
|
||||
GLTextureR(const ObjToken<BaseGraphicsData>& parent, GLCommandQueue* q, size_t width, size_t height, size_t samples,
|
||||
TextureClampMode clampMode, size_t colorBindCount, size_t depthBindCount);
|
||||
@@ -420,6 +450,20 @@ public:
|
||||
glDeleteFramebuffers(1, &m_fbo);
|
||||
}
|
||||
|
||||
void setClampMode(TextureClampMode mode)
|
||||
{
|
||||
for (int i=0 ; i<m_colorBindCount ; ++i)
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, m_bindTexs[0][i]);
|
||||
SetClampMode(GL_TEXTURE_2D, mode);
|
||||
}
|
||||
for (int i=0 ; i<m_depthBindCount ; ++i)
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, m_bindTexs[1][i]);
|
||||
SetClampMode(GL_TEXTURE_2D, mode);
|
||||
}
|
||||
}
|
||||
|
||||
void bind(size_t idx, int bindIdx, bool depth) const
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE0 + idx);
|
||||
@@ -1514,7 +1558,8 @@ GLDataFactory::Context::newDynamicTexture(size_t width, size_t height, TextureFo
|
||||
|
||||
GLTextureR::GLTextureR(const ObjToken<BaseGraphicsData>& parent, GLCommandQueue* q, size_t width, size_t height,
|
||||
size_t samples, TextureClampMode clampMode, size_t colorBindingCount, size_t depthBindingCount)
|
||||
: GraphicsDataNode<ITextureR>(parent), m_q(q), m_width(width), m_height(height), m_samples(samples)
|
||||
: GraphicsDataNode<ITextureR>(parent), m_q(q), m_width(width), m_height(height), m_samples(samples),
|
||||
m_colorBindCount(colorBindingCount), m_depthBindCount(depthBindingCount)
|
||||
{
|
||||
glGenTextures(2, m_texs);
|
||||
if (colorBindingCount)
|
||||
|
||||
@@ -608,6 +608,12 @@ void VulkanContext::initSwapChain(VulkanContext::Window& windowCtx, VkSurfaceKHR
|
||||
samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
|
||||
ThrowIfFailed(vk::CreateSampler(m_dev, &samplerInfo, nullptr, &m_linearSamplers[1]));
|
||||
|
||||
/* Create shared edge-clamped sampler */
|
||||
samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
||||
samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
||||
samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
|
||||
ThrowIfFailed(vk::CreateSampler(m_dev, &samplerInfo, nullptr, &m_linearSamplers[2]));
|
||||
|
||||
/* images */
|
||||
sc.m_bufs.resize(swapchainImageCount);
|
||||
for (uint32_t i=0 ; i<swapchainImageCount ; ++i)
|
||||
@@ -1033,6 +1039,11 @@ public:
|
||||
vk::FreeMemory(m_ctx->m_dev, m_cpuMem, nullptr);
|
||||
}
|
||||
|
||||
void setClampMode(TextureClampMode mode)
|
||||
{
|
||||
m_descInfo.sampler = m_ctx->m_linearSamplers[int(mode)];
|
||||
}
|
||||
|
||||
void deleteUploadObjects()
|
||||
{
|
||||
vk::DestroyBuffer(m_ctx->m_dev, m_cpuBuf, nullptr);
|
||||
@@ -1230,6 +1241,11 @@ public:
|
||||
vk::FreeMemory(m_ctx->m_dev, m_cpuMem, nullptr);
|
||||
}
|
||||
|
||||
void setClampMode(TextureClampMode mode)
|
||||
{
|
||||
m_descInfo.sampler = m_ctx->m_linearSamplers[int(mode)];
|
||||
}
|
||||
|
||||
void deleteUploadObjects()
|
||||
{
|
||||
vk::DestroyBuffer(m_ctx->m_dev, m_cpuBuf, nullptr);
|
||||
@@ -1438,6 +1454,12 @@ public:
|
||||
VkDescriptorImageInfo m_descInfo[2];
|
||||
~VulkanTextureD();
|
||||
|
||||
void setClampMode(TextureClampMode mode)
|
||||
{
|
||||
for (int i=0 ; i<2 ; ++i)
|
||||
m_descInfo[i].sampler = m_ctx->m_linearSamplers[int(mode)];
|
||||
}
|
||||
|
||||
void load(const void* data, size_t sz);
|
||||
void* map(size_t sz);
|
||||
void unmap();
|
||||
@@ -1723,6 +1745,14 @@ public:
|
||||
VkImageLayout m_colorBindLayout[MAX_BIND_TEXS] = {};
|
||||
VkImageLayout m_depthBindLayout[MAX_BIND_TEXS] = {};
|
||||
|
||||
void setClampMode(TextureClampMode mode)
|
||||
{
|
||||
for (size_t i=0 ; i<m_colorBindCount ; ++i)
|
||||
m_colorBindDescInfo[i].sampler = m_ctx->m_linearSamplers[int(mode)];
|
||||
for (size_t i=0 ; i<m_depthBindCount ; ++i)
|
||||
m_depthBindDescInfo[i].sampler = m_ctx->m_linearSamplers[int(mode)];
|
||||
}
|
||||
|
||||
void doDestroy();
|
||||
~VulkanTextureR();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user