Commit 6159a856 by Alexis Hetu Committed by Alexis Hétu

Replace uses of sw::Surface with vk::ImageView in the Renderer

sw::Surface contains a locking mechanism which is no longer required in Vulkan. The app is now responsible for making sure the lifetime of the objects is long enough for the driver to be able to use them in any operation where they are required. A few shortcuts were taken here: - ImageView::getSampleCount() currently always returns the largest available sample count. - ImageView::subresourceRange.levelCount is not taken into account - Context::getMultiSampleCount() still uses attachment 0 to get the samples count, which may be incorrect. Bug b/118619338 Change-Id: I8cd49926a1537c0f2bc20e6516f12d7de67d6c65 Reviewed-on: https://swiftshader-review.googlesource.com/c/25588Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarChris Forbes <chrisforbes@google.com>
parent fe3d4978
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "Surface.hpp" #include "Surface.hpp"
#include "System/Memory.hpp" #include "System/Memory.hpp"
#include "Vulkan/VkDebug.hpp" #include "Vulkan/VkDebug.hpp"
#include "Vulkan/VkImageView.hpp"
#include "Pipeline/SpirvShader.hpp" #include "Pipeline/SpirvShader.hpp"
#include <string.h> #include <string.h>
...@@ -714,14 +715,14 @@ namespace sw ...@@ -714,14 +715,14 @@ namespace sw
int Context::getMultiSampleCount() const int Context::getMultiSampleCount() const
{ {
return renderTarget[0] ? renderTarget[0]->getMultiSampleCount() : 1; return renderTarget[0] ? renderTarget[0]->getSampleCount() : 1;
} }
VkFormat Context::renderTargetInternalFormat(int index) VkFormat Context::renderTargetInternalFormat(int index)
{ {
if(renderTarget[index]) if(renderTarget[index])
{ {
return renderTarget[index]->getInternalFormat(); return renderTarget[index]->getFormat();
} }
else else
{ {
...@@ -736,7 +737,7 @@ namespace sw ...@@ -736,7 +737,7 @@ namespace sw
int Context::colorWriteActive(int index) int Context::colorWriteActive(int index)
{ {
if(!renderTarget[index] || renderTarget[index]->getInternalFormat() == VK_FORMAT_UNDEFINED) if(!renderTarget[index] || renderTarget[index]->getFormat() == VK_FORMAT_UNDEFINED)
{ {
return 0; return 0;
} }
......
...@@ -21,10 +21,14 @@ ...@@ -21,10 +21,14 @@
#include "Vertex.hpp" #include "Vertex.hpp"
#include "System/Types.hpp" #include "System/Types.hpp"
namespace vk
{
class ImageView;
};
namespace sw namespace sw
{ {
class Sampler; class Sampler;
class Surface;
class PixelShader; class PixelShader;
class VertexShader; class VertexShader;
class SpirvShader; class SpirvShader;
...@@ -191,15 +195,15 @@ namespace sw ...@@ -191,15 +195,15 @@ namespace sw
int colorWriteActive(int index); int colorWriteActive(int index);
bool colorUsed(); bool colorUsed();
Resource *texture[TOTAL_IMAGE_UNITS]; vk::ImageView *texture[TOTAL_IMAGE_UNITS];
Stream input[MAX_VERTEX_INPUTS]; Stream input[MAX_VERTEX_INPUTS];
Resource *indexBuffer; uint8_t *indexBuffer;
Surface *renderTarget[RENDERTARGETS]; vk::ImageView *renderTarget[RENDERTARGETS];
unsigned int renderTargetLayer[RENDERTARGETS]; unsigned int renderTargetLayer[RENDERTARGETS];
Surface *depthBuffer; vk::ImageView *depthBuffer;
unsigned int depthBufferLayer; unsigned int depthBufferLayer;
Surface *stencilBuffer; vk::ImageView *stencilBuffer;
unsigned int stencilBufferLayer; unsigned int stencilBufferLayer;
// Shaders // Shaders
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "Pipeline/PixelProgram.hpp" #include "Pipeline/PixelProgram.hpp"
#include "Pipeline/Constants.hpp" #include "Pipeline/Constants.hpp"
#include "Vulkan/VkDebug.hpp" #include "Vulkan/VkDebug.hpp"
#include "Vulkan/VkImageView.hpp"
#include <string.h> #include <string.h>
...@@ -70,24 +71,24 @@ namespace sw ...@@ -70,24 +71,24 @@ namespace sw
routineCache = nullptr; routineCache = nullptr;
} }
void PixelProcessor::setRenderTarget(int index, Surface *renderTarget, unsigned int layer) void PixelProcessor::setRenderTarget(int index, vk::ImageView* renderTarget, unsigned int layer)
{ {
context->renderTarget[index] = renderTarget; context->renderTarget[index] = renderTarget;
context->renderTargetLayer[index] = layer; context->renderTargetLayer[index] = layer;
} }
Surface *PixelProcessor::getRenderTarget(int index) vk::ImageView* PixelProcessor::getRenderTarget(int index)
{ {
return context->renderTarget[index]; return context->renderTarget[index];
} }
void PixelProcessor::setDepthBuffer(Surface *depthBuffer, unsigned int layer) void PixelProcessor::setDepthBuffer(vk::ImageView *depthBuffer, unsigned int layer)
{ {
context->depthBuffer = depthBuffer; context->depthBuffer = depthBuffer;
context->depthBufferLayer = layer; context->depthBufferLayer = layer;
} }
void PixelProcessor::setStencilBuffer(Surface *stencilBuffer, unsigned int layer) void PixelProcessor::setStencilBuffer(vk::ImageView *stencilBuffer, unsigned int layer)
{ {
context->stencilBuffer = stencilBuffer; context->stencilBuffer = stencilBuffer;
context->stencilBufferLayer = layer; context->stencilBufferLayer = layer;
...@@ -596,7 +597,7 @@ namespace sw ...@@ -596,7 +597,7 @@ namespace sw
{ {
state.depthTestActive = true; state.depthTestActive = true;
state.depthCompareMode = context->depthCompareMode; state.depthCompareMode = context->depthCompareMode;
state.quadLayoutDepthBuffer = Surface::hasQuadLayout(context->depthBuffer->getInternalFormat()); state.quadLayoutDepthBuffer = Surface::hasQuadLayout(context->depthBuffer->getFormat());
} }
state.occlusionEnabled = context->occlusionEnabled; state.occlusionEnabled = context->occlusionEnabled;
...@@ -623,7 +624,7 @@ namespace sw ...@@ -623,7 +624,7 @@ namespace sw
state.targetFormat[i] = context->renderTargetInternalFormat(i); state.targetFormat[i] = context->renderTargetInternalFormat(i);
} }
state.writeSRGB = context->writeSRGB && context->renderTarget[0] && Surface::isSRGBwritable(context->renderTarget[0]->getExternalFormat()); state.writeSRGB = context->writeSRGB && context->renderTarget[0] && Surface::isSRGBwritable(context->renderTarget[0]->getFormat());
state.multiSample = context->getMultiSampleCount(); state.multiSample = context->getMultiSampleCount();
state.multiSampleMask = context->multiSampleMask; state.multiSampleMask = context->multiSampleMask;
......
...@@ -145,10 +145,10 @@ namespace sw ...@@ -145,10 +145,10 @@ namespace sw
virtual ~PixelProcessor(); virtual ~PixelProcessor();
void setRenderTarget(int index, Surface *renderTarget, unsigned int layer = 0); void setRenderTarget(int index, vk::ImageView *renderTarget, unsigned int layer = 0);
Surface *getRenderTarget(int index); vk::ImageView *getRenderTarget(int index);
void setDepthBuffer(Surface *depthBuffer, unsigned int layer = 0); void setDepthBuffer(vk::ImageView *depthBuffer, unsigned int layer = 0);
void setStencilBuffer(Surface *stencilBuffer, unsigned int layer = 0); void setStencilBuffer(vk::ImageView *stencilBuffer, unsigned int layer = 0);
void setTexCoordIndex(unsigned int stage, int texCoordIndex); void setTexCoordIndex(unsigned int stage, int texCoordIndex);
void setConstantColor(unsigned int stage, const Color<float> &constantColor); void setConstantColor(unsigned int stage, const Color<float> &constantColor);
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "System/Math.hpp" #include "System/Math.hpp"
#include "System/Timer.hpp" #include "System/Timer.hpp"
#include "Vulkan/VkDebug.hpp" #include "Vulkan/VkDebug.hpp"
#include "Vulkan/VkImageView.hpp"
#include "Pipeline/SpirvShader.hpp" #include "Pipeline/SpirvShader.hpp"
#include "Vertex.hpp" #include "Vertex.hpp"
...@@ -325,7 +326,7 @@ namespace sw ...@@ -325,7 +326,7 @@ namespace sw
if(context->indexBuffer) if(context->indexBuffer)
{ {
data->indices = (unsigned char*)context->indexBuffer->lock(PUBLIC, PRIVATE) + indexOffset; data->indices = &context->indexBuffer[indexOffset];
} }
draw->indexBuffer = context->indexBuffer; draw->indexBuffer = context->indexBuffer;
...@@ -340,8 +341,6 @@ namespace sw ...@@ -340,8 +341,6 @@ namespace sw
if(pixelState.sampler[sampler].textureType != TEXTURE_NULL) if(pixelState.sampler[sampler].textureType != TEXTURE_NULL)
{ {
draw->texture[sampler] = context->texture[sampler]; draw->texture[sampler] = context->texture[sampler];
draw->texture[sampler]->lock(PUBLIC, isReadWriteTexture(sampler) ? MANAGED : PRIVATE); // If the texure is both read and written, use the same read/write lock as render targets
data->mipmap[sampler] = context->sampler[sampler].getTextureData(); data->mipmap[sampler] = context->sampler[sampler].getTextureData();
} }
} }
...@@ -351,8 +350,6 @@ namespace sw ...@@ -351,8 +350,6 @@ namespace sw
if(vertexState.sampler[sampler].textureType != TEXTURE_NULL) if(vertexState.sampler[sampler].textureType != TEXTURE_NULL)
{ {
draw->texture[TEXTURE_IMAGE_UNITS + sampler] = context->texture[TEXTURE_IMAGE_UNITS + sampler]; draw->texture[TEXTURE_IMAGE_UNITS + sampler] = context->texture[TEXTURE_IMAGE_UNITS + sampler];
draw->texture[TEXTURE_IMAGE_UNITS + sampler]->lock(PUBLIC, PRIVATE);
data->mipmap[TEXTURE_IMAGE_UNITS + sampler] = context->sampler[TEXTURE_IMAGE_UNITS + sampler].getTextureData(); data->mipmap[TEXTURE_IMAGE_UNITS + sampler] = context->sampler[TEXTURE_IMAGE_UNITS + sampler].getTextureData();
} }
} }
...@@ -457,10 +454,10 @@ namespace sw ...@@ -457,10 +454,10 @@ namespace sw
if(draw->renderTarget[index]) if(draw->renderTarget[index])
{ {
unsigned int layer = context->renderTargetLayer[index]; VkOffset3D offset = { 0, 0, static_cast<int32_t>(context->renderTargetLayer[index]) };
data->colorBuffer[index] = (unsigned int*)context->renderTarget[index]->lockInternal(0, 0, layer, LOCK_READWRITE, MANAGED); data->colorBuffer[index] = (unsigned int*)context->renderTarget[index]->getOffsetPointer(offset);
data->colorPitchB[index] = context->renderTarget[index]->getInternalPitchB(); data->colorPitchB[index] = context->renderTarget[index]->rowPitchBytes();
data->colorSliceB[index] = context->renderTarget[index]->getInternalSliceB(); data->colorSliceB[index] = context->renderTarget[index]->slicePitchBytes();
} }
} }
...@@ -469,18 +466,18 @@ namespace sw ...@@ -469,18 +466,18 @@ namespace sw
if(draw->depthBuffer) if(draw->depthBuffer)
{ {
unsigned int layer = context->depthBufferLayer; VkOffset3D offset = { 0, 0, static_cast<int32_t>(context->depthBufferLayer) };
data->depthBuffer = (float*)context->depthBuffer->lockInternal(0, 0, layer, LOCK_READWRITE, MANAGED); data->depthBuffer = (float*)context->depthBuffer->getOffsetPointer(offset);
data->depthPitchB = context->depthBuffer->getInternalPitchB(); data->depthPitchB = context->depthBuffer->rowPitchBytes();
data->depthSliceB = context->depthBuffer->getInternalSliceB(); data->depthSliceB = context->depthBuffer->slicePitchBytes();
} }
if(draw->stencilBuffer) if(draw->stencilBuffer)
{ {
unsigned int layer = context->stencilBufferLayer; VkOffset3D offset = { 0, 0, static_cast<int32_t>(context->stencilBufferLayer) };
data->stencilBuffer = (unsigned char*)context->stencilBuffer->lockStencil(0, 0, layer, MANAGED); data->stencilBuffer = (unsigned char*)context->stencilBuffer->getOffsetPointer(offset);
data->stencilPitchB = context->stencilBuffer->getStencilPitchB(); data->stencilPitchB = context->stencilBuffer->rowPitchBytes();
data->stencilSliceB = context->stencilBuffer->getStencilSliceB(); data->stencilSliceB = context->stencilBuffer->slicePitchBytes();
} }
} }
...@@ -842,32 +839,6 @@ namespace sw ...@@ -842,32 +839,6 @@ namespace sw
draw.queries = 0; draw.queries = 0;
} }
for(int i = 0; i < RENDERTARGETS; i++)
{
if(draw.renderTarget[i])
{
draw.renderTarget[i]->unlockInternal();
}
}
if(draw.depthBuffer)
{
draw.depthBuffer->unlockInternal();
}
if(draw.stencilBuffer)
{
draw.stencilBuffer->unlockStencil();
}
for(int i = 0; i < TOTAL_IMAGE_UNITS; i++)
{
if(draw.texture[i])
{
draw.texture[i]->unlock();
}
}
for(int i = 0; i < MAX_VERTEX_INPUTS; i++) for(int i = 0; i < MAX_VERTEX_INPUTS; i++)
{ {
if(draw.vertexStream[i]) if(draw.vertexStream[i])
...@@ -876,11 +847,6 @@ namespace sw ...@@ -876,11 +847,6 @@ namespace sw
} }
} }
if(draw.indexBuffer)
{
draw.indexBuffer->unlock();
}
draw.vertexRoutine->unbind(); draw.vertexRoutine->unbind();
draw.setupRoutine->unbind(); draw.setupRoutine->unbind();
draw.pixelRoutine->unbind(); draw.pixelRoutine->unbind();
...@@ -1614,7 +1580,7 @@ namespace sw ...@@ -1614,7 +1580,7 @@ namespace sw
} }
} }
void Renderer::setIndexBuffer(Resource *indexBuffer) void Renderer::setIndexBuffer(uint8_t *indexBuffer)
{ {
context->indexBuffer = indexBuffer; context->indexBuffer = indexBuffer;
} }
...@@ -1633,13 +1599,13 @@ namespace sw ...@@ -1633,13 +1599,13 @@ namespace sw
{ {
for(int index = 0; index < RENDERTARGETS; index++) for(int index = 0; index < RENDERTARGETS; index++)
{ {
if(context->renderTarget[index] && context->texture[sampler] == context->renderTarget[index]->getResource()) if(context->renderTarget[index] && context->texture[sampler] == context->renderTarget[index])
{ {
return true; return true;
} }
} }
if(context->depthBuffer && context->texture[sampler] == context->depthBuffer->getResource()) if(context->depthBuffer && context->texture[sampler] == context->depthBuffer)
{ {
return true; return true;
} }
...@@ -1647,7 +1613,7 @@ namespace sw ...@@ -1647,7 +1613,7 @@ namespace sw
return false; return false;
} }
void Renderer::setTextureResource(unsigned int sampler, Resource *resource) void Renderer::setTextureResource(unsigned int sampler, vk::ImageView *resource)
{ {
ASSERT(sampler < TOTAL_IMAGE_UNITS); ASSERT(sampler < TOTAL_IMAGE_UNITS);
......
...@@ -257,12 +257,12 @@ namespace sw ...@@ -257,12 +257,12 @@ namespace sw
void blit3D(Surface *source, Surface *dest); void blit3D(Surface *source, Surface *dest);
void setContext(const sw::Context& context); void setContext(const sw::Context& context);
void setIndexBuffer(Resource *indexBuffer); void setIndexBuffer(uint8_t *indexBuffer);
void setMultiSampleMask(unsigned int mask); void setMultiSampleMask(unsigned int mask);
void setTransparencyAntialiasing(TransparencyAntialiasing transparencyAntialiasing); void setTransparencyAntialiasing(TransparencyAntialiasing transparencyAntialiasing);
void setTextureResource(unsigned int sampler, Resource *resource); void setTextureResource(unsigned int sampler, vk::ImageView *resource);
void setTextureLevel(unsigned int sampler, unsigned int face, unsigned int level, Surface *surface, TextureType type); void setTextureLevel(unsigned int sampler, unsigned int face, unsigned int level, Surface *surface, TextureType type);
void setTextureFilter(SamplerType type, int sampler, FilterType textureFilter); void setTextureFilter(SamplerType type, int sampler, FilterType textureFilter);
...@@ -427,11 +427,11 @@ namespace sw ...@@ -427,11 +427,11 @@ namespace sw
SetupProcessor::State setupState; SetupProcessor::State setupState;
Resource *vertexStream[MAX_VERTEX_INPUTS]; Resource *vertexStream[MAX_VERTEX_INPUTS];
Resource *indexBuffer; uint8_t *indexBuffer;
Surface *renderTarget[RENDERTARGETS]; vk::ImageView *renderTarget[RENDERTARGETS];
Surface *depthBuffer; vk::ImageView *depthBuffer;
Surface *stencilBuffer; vk::ImageView *stencilBuffer;
Resource *texture[TOTAL_IMAGE_UNITS]; vk::ImageView *texture[TOTAL_IMAGE_UNITS];
std::list<Query*> *queries; std::list<Query*> *queries;
......
...@@ -176,7 +176,7 @@ struct Draw : public CommandBuffer::Command ...@@ -176,7 +176,7 @@ struct Draw : public CommandBuffer::Command
if (attachmentReference.attachment != VK_ATTACHMENT_UNUSED) if (attachmentReference.attachment != VK_ATTACHMENT_UNUSED)
{ {
auto attachment = executionState.renderPassFramebuffer->getAttachment(attachmentReference.attachment); auto attachment = executionState.renderPassFramebuffer->getAttachment(attachmentReference.attachment);
executionState.renderer->setRenderTarget(i, attachment->asSurface(), 0); executionState.renderer->setRenderTarget(i, attachment, 0);
} }
} }
...@@ -190,19 +190,6 @@ struct Draw : public CommandBuffer::Command ...@@ -190,19 +190,6 @@ struct Draw : public CommandBuffer::Command
// Wait for completion. We should be able to get rid of this eventually. // Wait for completion. We should be able to get rid of this eventually.
executionState.renderer->synchronize(); executionState.renderer->synchronize();
// Renderer has finished touching the color attachments; destroy the temporary Surface objects.
// We shouldn't need to do any of this at draw time.
for (auto i = 0u; i < executionState.renderPass->getCurrentSubpass().colorAttachmentCount; i++)
{
auto attachmentReference = executionState.renderPass->getCurrentSubpass().pColorAttachments[i];
if (attachmentReference.attachment != VK_ATTACHMENT_UNUSED)
{
auto surface = executionState.renderer->getRenderTarget(i);
executionState.renderer->setRenderTarget(i, nullptr, 0);
delete surface;
}
}
} }
uint32_t vertexCount; uint32_t vertexCount;
......
...@@ -48,25 +48,26 @@ public: ...@@ -48,25 +48,26 @@ public:
void clear(const VkClearValue& clearValue, const VkRect2D& renderArea, const VkImageSubresourceRange& subresourceRange); void clear(const VkClearValue& clearValue, const VkRect2D& renderArea, const VkImageSubresourceRange& subresourceRange);
void clear(const VkClearColorValue& color, const VkImageSubresourceRange& subresourceRange); void clear(const VkClearColorValue& color, const VkImageSubresourceRange& subresourceRange);
void clear(const VkClearDepthStencilValue& color, const VkImageSubresourceRange& subresourceRange); void clear(const VkClearDepthStencilValue& color, const VkImageSubresourceRange& subresourceRange);
sw::Surface* asSurface(const VkImageAspectFlags& flags, uint32_t mipLevel, uint32_t layer) const;
VkImageType getImageType() const { return imageType; } VkImageType getImageType() const { return imageType; }
VkFormat getFormat() const { return format; } VkFormat getFormat() const { return format; }
uint32_t getArrayLayers() const { return arrayLayers; } uint32_t getArrayLayers() const { return arrayLayers; }
VkSampleCountFlagBits getSampleCountFlagBits() const { return samples; }
int rowPitchBytes(const VkImageAspectFlags& flags, uint32_t mipLevel) const;
int slicePitchBytes(const VkImageAspectFlags& flags, uint32_t mipLevel) const;
void* getTexelPointer(const VkOffset3D& offset, const VkImageSubresourceLayers& subresource) const;
bool isCube() const; bool isCube() const;
private: private:
sw::Surface* asSurface(const VkImageAspectFlags& flags, uint32_t mipLevel, uint32_t layer) const;
void copy(VkBuffer buffer, const VkBufferImageCopy& region, bool bufferIsSource); void copy(VkBuffer buffer, const VkBufferImageCopy& region, bool bufferIsSource);
VkDeviceSize getStorageSize(const VkImageAspectFlags& flags) const; VkDeviceSize getStorageSize(const VkImageAspectFlags& flags) const;
VkDeviceSize getMipLevelSize(const VkImageAspectFlags& flags, uint32_t mipLevel) const; VkDeviceSize getMipLevelSize(const VkImageAspectFlags& flags, uint32_t mipLevel) const;
VkDeviceSize getLayerSize(const VkImageAspectFlags& flags) const; VkDeviceSize getLayerSize(const VkImageAspectFlags& flags) const;
VkDeviceSize getMemoryOffset(const VkImageAspectFlags& flags, uint32_t mipLevel) const; VkDeviceSize getMemoryOffset(const VkImageAspectFlags& flags, uint32_t mipLevel) const;
VkDeviceSize getMemoryOffset(const VkImageAspectFlags& flags, uint32_t mipLevel, uint32_t layer) const; VkDeviceSize getMemoryOffset(const VkImageAspectFlags& flags, uint32_t mipLevel, uint32_t layer) const;
void* getTexelPointer(const VkOffset3D& offset, const VkImageSubresourceLayers& subresource) const;
VkDeviceSize texelOffsetBytesInStorage(const VkOffset3D& offset, const VkImageSubresourceLayers& subresource) const; VkDeviceSize texelOffsetBytesInStorage(const VkOffset3D& offset, const VkImageSubresourceLayers& subresource) const;
VkDeviceSize getMemoryOffset(const VkImageAspectFlags& flags) const; VkDeviceSize getMemoryOffset(const VkImageAspectFlags& flags) const;
int rowPitchBytes(const VkImageAspectFlags& flags, uint32_t mipLevel) const;
int slicePitchBytes(const VkImageAspectFlags& flags, uint32_t mipLevel) const;
int bytesPerTexel(const VkImageAspectFlags& flags) const; int bytesPerTexel(const VkImageAspectFlags& flags) const;
VkExtent3D getMipLevelExtent(uint32_t mipLevel) const; VkExtent3D getMipLevelExtent(uint32_t mipLevel) const;
VkFormat getFormat(const VkImageAspectFlags& flags) const; VkFormat getFormat(const VkImageAspectFlags& flags) const;
......
...@@ -119,9 +119,22 @@ void ImageView::clear(const VkClearValue& clearValue, const VkImageAspectFlags a ...@@ -119,9 +119,22 @@ void ImageView::clear(const VkClearValue& clearValue, const VkImageAspectFlags a
image->clear(clearValue, renderArea.rect, sr); image->clear(clearValue, renderArea.rect, sr);
} }
sw::Surface *ImageView::asSurface() void *ImageView::getPointer() const
{ {
return image->asSurface(subresourceRange.aspectMask, subresourceRange.baseArrayLayer, subresourceRange.baseMipLevel); VkOffset3D noOffset = { 0, 0, 0 };
return getOffsetPointer(noOffset);
}
void *ImageView::getOffsetPointer(const VkOffset3D& offset) const
{
VkImageSubresourceLayers imageSubresourceLayers =
{
subresourceRange.aspectMask,
subresourceRange.baseMipLevel,
subresourceRange.baseArrayLayer,
subresourceRange.layerCount
};
return image->getTexelPointer(offset, imageSubresourceLayers);
} }
} }
\ No newline at end of file
...@@ -34,7 +34,13 @@ public: ...@@ -34,7 +34,13 @@ public:
void clear(const VkClearValue& clearValues, const VkImageAspectFlags aspectMask, const VkRect2D& renderArea); void clear(const VkClearValue& clearValues, const VkImageAspectFlags aspectMask, const VkRect2D& renderArea);
void clear(const VkClearValue& clearValue, const VkImageAspectFlags aspectMask, const VkClearRect& renderArea); void clear(const VkClearValue& clearValue, const VkImageAspectFlags aspectMask, const VkClearRect& renderArea);
sw::Surface *asSurface(); VkFormat getFormat() const { return format; }
int rowPitchBytes() const { return image->rowPitchBytes(subresourceRange.aspectMask, subresourceRange.baseMipLevel); }
int slicePitchBytes() const { return image->slicePitchBytes(subresourceRange.aspectMask, subresourceRange.baseMipLevel); }
int getSampleCount() const { return image->getSampleCountFlagBits(); }
void *getPointer() const;
void *getOffsetPointer(const VkOffset3D& offset) const;
private: private:
bool imageTypesMatch(VkImageType imageType) const; bool imageTypesMatch(VkImageType imageType) const;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment