mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-28 18:45:54 -05:00
Cleanup.
This commit is contained in:
parent
780fbb83fa
commit
cdbe689d93
2 changed files with 127 additions and 99 deletions
|
@ -19,9 +19,9 @@
|
|||
|
||||
namespace bgfx { namespace mtl
|
||||
{
|
||||
//c++ wrapper
|
||||
// objects with creation functions starting with 'new' has a refcount 1 after creation, object must be destroyed with release.
|
||||
// commandBuffer, commandEncoders are autoreleased objects. Needs AutoreleasePool!
|
||||
// c++ wrapper
|
||||
// objects with creation functions starting with 'new' has a refcount 1 after creation, object must be destroyed with release.
|
||||
// commandBuffer, commandEncoders are autoreleased objects. Needs AutoreleasePool!
|
||||
|
||||
#define MTL_CLASS(name) \
|
||||
class name \
|
||||
|
@ -35,7 +35,6 @@ namespace bgfx { namespace mtl
|
|||
|
||||
typedef void (*mtlCallback)(void* userData);
|
||||
|
||||
//TODO: ??MTLBlitCommandEncoder??
|
||||
MTL_CLASS(Buffer)
|
||||
void* contents()
|
||||
{
|
||||
|
@ -50,7 +49,7 @@ namespace bgfx { namespace mtl
|
|||
|
||||
MTL_CLASS(CommandBuffer)
|
||||
// Creating Command Encoders
|
||||
id<MTLRenderCommandEncoder> renderCommandEncoderWithDescriptor( MTLRenderPassDescriptor *_renderPassDescriptor){
|
||||
id<MTLRenderCommandEncoder> renderCommandEncoderWithDescriptor( MTLRenderPassDescriptor* _renderPassDescriptor){
|
||||
return [m_obj renderCommandEncoderWithDescriptor:_renderPassDescriptor];
|
||||
}
|
||||
|
||||
|
@ -165,38 +164,38 @@ namespace bgfx { namespace mtl
|
|||
return [m_obj newBufferWithLength:_length options:_options ];
|
||||
}
|
||||
|
||||
id<MTLBuffer> newBufferWithBytes(const void *_pointer, NSUInteger _length, MTLResourceOptions _options)
|
||||
id<MTLBuffer> newBufferWithBytes(const void* _pointer, NSUInteger _length, MTLResourceOptions _options)
|
||||
{
|
||||
return [m_obj newBufferWithBytes:_pointer length:_length options:_options];
|
||||
}
|
||||
|
||||
id<MTLTexture> newTextureWithDescriptor(MTLTextureDescriptor * _descriptor)
|
||||
id<MTLTexture> newTextureWithDescriptor(MTLTextureDescriptor* _descriptor)
|
||||
{
|
||||
return [m_obj newTextureWithDescriptor:_descriptor];
|
||||
}
|
||||
|
||||
id<MTLSamplerState> newSamplerStateWithDescriptor(MTLSamplerDescriptor * _descriptor)
|
||||
id<MTLSamplerState> newSamplerStateWithDescriptor(MTLSamplerDescriptor* _descriptor)
|
||||
{
|
||||
return [m_obj newSamplerStateWithDescriptor:_descriptor];
|
||||
}
|
||||
|
||||
// Creating Command Objects Needed to Render Graphics
|
||||
id<MTLDepthStencilState> newDepthStencilStateWithDescriptor(MTLDepthStencilDescriptor * _descriptor)
|
||||
id<MTLDepthStencilState> newDepthStencilStateWithDescriptor(MTLDepthStencilDescriptor* _descriptor)
|
||||
{
|
||||
return [m_obj newDepthStencilStateWithDescriptor:_descriptor];
|
||||
}
|
||||
|
||||
id <MTLRenderPipelineState> newRenderPipelineStateWithDescriptor(MTLRenderPipelineDescriptor *_descriptor)
|
||||
id <MTLRenderPipelineState> newRenderPipelineStateWithDescriptor(MTLRenderPipelineDescriptor* _descriptor)
|
||||
{
|
||||
NSError *error;
|
||||
NSError* error;
|
||||
id <MTLRenderPipelineState> state = [m_obj newRenderPipelineStateWithDescriptor:_descriptor error:&error];
|
||||
BX_WARN(error==NULL,"newRenderPipelineStateWithDescriptor failed:%s", [error.localizedDescription UTF8String] );
|
||||
return state;
|
||||
}
|
||||
|
||||
id <MTLRenderPipelineState> newRenderPipelineStateWithDescriptor(MTLRenderPipelineDescriptor *_descriptor, MTLPipelineOption _options, MTLRenderPipelineReflection** _reflection)
|
||||
id <MTLRenderPipelineState> newRenderPipelineStateWithDescriptor(MTLRenderPipelineDescriptor* _descriptor, MTLPipelineOption _options, MTLRenderPipelineReflection** _reflection)
|
||||
{
|
||||
NSError *error;
|
||||
NSError* error;
|
||||
id <MTLRenderPipelineState> state = [m_obj newRenderPipelineStateWithDescriptor:_descriptor options:_options reflection:_reflection error:&error];
|
||||
|
||||
BX_WARN(error==NULL,"newRenderPipelineStateWithDescriptor failed:%s", [error.localizedDescription UTF8String] );
|
||||
|
@ -206,7 +205,7 @@ namespace bgfx { namespace mtl
|
|||
// Creating Command Objects Needed to Perform Computational Tasks
|
||||
id <MTLComputePipelineState> newComputePipelineStateWithFunction(id <MTLFunction> _computeFunction)
|
||||
{
|
||||
NSError *error;
|
||||
NSError* error;
|
||||
id <MTLComputePipelineState> state = [m_obj newComputePipelineStateWithFunction:_computeFunction error:&error];
|
||||
BX_WARN(error==NULL,"newComputePipelineStateWithFunction failed:%s", [error.localizedDescription UTF8String] );
|
||||
return state;
|
||||
|
@ -214,7 +213,7 @@ namespace bgfx { namespace mtl
|
|||
MTL_CLASS_END
|
||||
|
||||
MTL_CLASS(Function)
|
||||
NSArray *vertexAttributes() { return m_obj.vertexAttributes; }
|
||||
NSArray* vertexAttributes() { return m_obj.vertexAttributes; }
|
||||
MTL_CLASS_END
|
||||
|
||||
MTL_CLASS(Library)
|
||||
|
@ -345,13 +344,13 @@ namespace bgfx { namespace mtl
|
|||
|
||||
MTL_CLASS(Texture)
|
||||
// Copying Data into a Texture Image
|
||||
void replaceRegion(MTLRegion _region, NSUInteger _level, NSUInteger _slice, const void *_pixelBytes, NSUInteger _bytesPerRow, NSUInteger _bytesPerImage)
|
||||
void replaceRegion(MTLRegion _region, NSUInteger _level, NSUInteger _slice, const void* _pixelBytes, NSUInteger _bytesPerRow, NSUInteger _bytesPerImage)
|
||||
{
|
||||
[m_obj replaceRegion:_region mipmapLevel:_level slice:_slice withBytes:_pixelBytes bytesPerRow:_bytesPerRow bytesPerImage:_bytesPerImage];
|
||||
}
|
||||
|
||||
// Copying Data from a Texture Image
|
||||
void getBytes(void *_pixelBytes, NSUInteger _bytesPerRow, NSUInteger _bytesPerImage, MTLRegion _region, NSUInteger _mipmapLevel, NSUInteger _slice)
|
||||
void getBytes(void* _pixelBytes, NSUInteger _bytesPerRow, NSUInteger _bytesPerImage, MTLRegion _region, NSUInteger _mipmapLevel, NSUInteger _slice)
|
||||
{
|
||||
[m_obj getBytes:_pixelBytes bytesPerRow:_bytesPerRow bytesPerImage:_bytesPerImage fromRegion:_region mipmapLevel:_mipmapLevel slice:_slice];
|
||||
}
|
||||
|
@ -384,15 +383,16 @@ namespace bgfx { namespace mtl
|
|||
typedef id<MTLRenderPipelineState> RenderPipelineState;
|
||||
typedef id<MTLSamplerState> SamplerState;
|
||||
|
||||
//descriptors
|
||||
//descriptors
|
||||
//NOTE: [class new] is same as [[class alloc] init]
|
||||
typedef MTLRenderPipelineDescriptor* RenderPipelineDescriptor;
|
||||
RenderPipelineDescriptor newRenderPipelineDescriptor()
|
||||
|
||||
inline RenderPipelineDescriptor newRenderPipelineDescriptor()
|
||||
{
|
||||
return [MTLRenderPipelineDescriptor new];
|
||||
}
|
||||
|
||||
void reset(RenderPipelineDescriptor _desc)
|
||||
inline void reset(RenderPipelineDescriptor _desc)
|
||||
{
|
||||
[_desc reset];
|
||||
}
|
||||
|
@ -400,13 +400,15 @@ namespace bgfx { namespace mtl
|
|||
typedef MTLRenderPipelineColorAttachmentDescriptor* RenderPipelineColorAttachmentDescriptor;
|
||||
|
||||
typedef MTLDepthStencilDescriptor* DepthStencilDescriptor;
|
||||
MTLDepthStencilDescriptor* newDepthStencilDescriptor()
|
||||
|
||||
inline MTLDepthStencilDescriptor* newDepthStencilDescriptor()
|
||||
{
|
||||
return [MTLDepthStencilDescriptor new];
|
||||
}
|
||||
|
||||
typedef MTLStencilDescriptor* StencilDescriptor;
|
||||
MTLStencilDescriptor* newStencilDescriptor()
|
||||
|
||||
inline MTLStencilDescriptor* newStencilDescriptor()
|
||||
{
|
||||
return [MTLStencilDescriptor new];
|
||||
}
|
||||
|
@ -416,30 +418,34 @@ namespace bgfx { namespace mtl
|
|||
typedef MTLRenderPassStencilAttachmentDescriptor* RenderPassStencilAttachmentDescriptor;
|
||||
|
||||
typedef MTLRenderPassDescriptor* RenderPassDescriptor;
|
||||
MTLRenderPassDescriptor* newRenderPassDescriptor()
|
||||
|
||||
inline MTLRenderPassDescriptor* newRenderPassDescriptor()
|
||||
{
|
||||
return [MTLRenderPassDescriptor new];
|
||||
}
|
||||
|
||||
typedef MTLVertexDescriptor* VertexDescriptor;
|
||||
MTLVertexDescriptor* newVertexDescriptor()
|
||||
|
||||
inline MTLVertexDescriptor* newVertexDescriptor()
|
||||
{
|
||||
return [MTLVertexDescriptor new];
|
||||
}
|
||||
|
||||
void reset(VertexDescriptor _desc)
|
||||
inline void reset(VertexDescriptor _desc)
|
||||
{
|
||||
[_desc reset];
|
||||
}
|
||||
|
||||
typedef MTLSamplerDescriptor* SamplerDescriptor;
|
||||
MTLSamplerDescriptor* newSamplerDescriptor()
|
||||
|
||||
inline MTLSamplerDescriptor* newSamplerDescriptor()
|
||||
{
|
||||
return [MTLSamplerDescriptor new];
|
||||
}
|
||||
|
||||
typedef MTLTextureDescriptor* TextureDescriptor;
|
||||
MTLTextureDescriptor* newTextureDescriptor()
|
||||
|
||||
inline MTLTextureDescriptor* newTextureDescriptor()
|
||||
{
|
||||
return [MTLTextureDescriptor new];
|
||||
}
|
||||
|
@ -447,27 +453,29 @@ namespace bgfx { namespace mtl
|
|||
typedef MTLRenderPipelineReflection* RenderPipelineReflection;
|
||||
|
||||
//helper functions
|
||||
void release(NSObject* _obj)
|
||||
inline void release(NSObject* _obj)
|
||||
{
|
||||
[_obj release];
|
||||
}
|
||||
|
||||
void retain(NSObject* _obj)
|
||||
inline void retain(NSObject* _obj)
|
||||
{
|
||||
[_obj retain];
|
||||
}
|
||||
|
||||
const char* utf8String(NSString* _str)
|
||||
inline const char* utf8String(NSString* _str)
|
||||
{
|
||||
return [_str UTF8String];
|
||||
}
|
||||
|
||||
#define MTL_RELEASE(_obj) \
|
||||
[_obj release]; \
|
||||
_obj = nil;
|
||||
#define MTL_RELEASE(_obj) \
|
||||
BX_MACRO_BLOCK_BEGIN \
|
||||
[_obj release]; \
|
||||
_obj = nil; \
|
||||
BX_MACRO_BLOCK_END
|
||||
|
||||
#if BX_PLATFORM_IOS
|
||||
bool OsVersionEqualOrGreater(const char* _version)
|
||||
inline bool OsVersionEqualOrGreater(const char* _version)
|
||||
{
|
||||
return ([[[UIDevice currentDevice] systemVersion] compare:@(_version) options:NSNumericSearch] != NSOrderedAscending);
|
||||
}
|
||||
|
@ -587,7 +595,6 @@ namespace bgfx { namespace mtl
|
|||
Function m_function;
|
||||
};
|
||||
|
||||
|
||||
struct ProgramMtl
|
||||
{
|
||||
ProgramMtl()
|
||||
|
|
|
@ -768,14 +768,14 @@ namespace bgfx { namespace mtl
|
|||
uint32_t vertexUniformBufferSize = program.m_vshConstantBufferSize;
|
||||
uint32_t fragmentUniformBufferSize = program.m_fshConstantBufferSize;
|
||||
|
||||
if ( vertexUniformBufferSize )
|
||||
if (vertexUniformBufferSize )
|
||||
{
|
||||
m_uniformBufferVertexOffset = BX_ALIGN_MASK(m_uniformBufferVertexOffset, program.m_vshConstantBufferAlignmentMask);
|
||||
rce.setVertexBuffer(m_uniformBuffer, m_uniformBufferVertexOffset, 0);
|
||||
}
|
||||
|
||||
m_uniformBufferFragmentOffset = m_uniformBufferVertexOffset + vertexUniformBufferSize;
|
||||
if ( fragmentUniformBufferSize )
|
||||
if (fragmentUniformBufferSize )
|
||||
{
|
||||
m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, program.m_fshConstantBufferAlignmentMask);
|
||||
rce.setFragmentBuffer(m_uniformBuffer, m_uniformBufferFragmentOffset, 0);
|
||||
|
@ -869,13 +869,15 @@ namespace bgfx { namespace mtl
|
|||
|
||||
m_textureDescriptor.pixelFormat = MTLPixelFormatDepth32Float;
|
||||
|
||||
m_textureDescriptor.width = width;
|
||||
m_textureDescriptor.width = width;
|
||||
m_textureDescriptor.height = height;
|
||||
m_textureDescriptor.depth = 1;
|
||||
m_textureDescriptor.depth = 1;
|
||||
m_textureDescriptor.mipmapLevelCount = 1;
|
||||
m_textureDescriptor.sampleCount = 1;
|
||||
m_textureDescriptor.arrayLength = 1;
|
||||
//m_textureDescriptor.resourceOptions = 0;
|
||||
m_textureDescriptor.resourceOptions = MTLResourceStorageModePrivate;
|
||||
m_textureDescriptor.cpuCacheMode = MTLCPUCacheModeDefaultCache;
|
||||
m_textureDescriptor.storageMode = MTLStorageModePrivate;
|
||||
|
||||
if (NULL != m_backBufferDepth)
|
||||
{
|
||||
|
@ -883,9 +885,8 @@ namespace bgfx { namespace mtl
|
|||
}
|
||||
m_backBufferDepth = m_device.newTextureWithDescriptor(m_textureDescriptor);
|
||||
|
||||
#if 0
|
||||
m_textureDescriptor.pixelFormat = MTLPixelFormatStencil8;
|
||||
m_textureDescriptor.width = width;
|
||||
m_textureDescriptor.height = height;
|
||||
|
||||
if (NULL != m_backBufferStencil)
|
||||
{
|
||||
|
@ -893,6 +894,9 @@ namespace bgfx { namespace mtl
|
|||
}
|
||||
|
||||
m_backBufferStencil = m_device.newTextureWithDescriptor(m_textureDescriptor);
|
||||
#else
|
||||
m_backBufferStencil = m_backBufferDepth;
|
||||
#endif // 0
|
||||
|
||||
bx::HashMurmur2A murmur;
|
||||
murmur.begin();
|
||||
|
@ -1334,11 +1338,11 @@ namespace bgfx { namespace mtl
|
|||
memset(m_attributes, 0xff, sizeof(m_attributes) );
|
||||
uint32_t used = 0;
|
||||
uint32_t instUsed = 0;
|
||||
if ( NULL != _vsh->m_function.m_obj )
|
||||
if (NULL != _vsh->m_function.m_obj )
|
||||
{
|
||||
for (MTLVertexAttribute* attrib in _vsh->m_function.m_obj.vertexAttributes)
|
||||
{
|
||||
if ( attrib.active )
|
||||
if (attrib.active )
|
||||
{
|
||||
const char* name = utf8String(attrib.name);
|
||||
uint32_t loc = (uint32_t)attrib.attributeIndex;
|
||||
|
@ -1366,7 +1370,7 @@ namespace bgfx { namespace mtl
|
|||
}
|
||||
}
|
||||
m_used[used] = Attrib::Count;
|
||||
m_instanceData[instUsed] = 0xffff;
|
||||
m_instanceData[instUsed] = UINT16_MAX;
|
||||
}
|
||||
|
||||
void ProgramMtl::destroy()
|
||||
|
@ -1432,7 +1436,9 @@ namespace bgfx { namespace mtl
|
|||
murmur.add(_state);
|
||||
murmur.add(independentBlendEnable ? _rgba : 0);
|
||||
if (!isValid(_fbHandle) )
|
||||
{
|
||||
murmur.add(s_renderMtl->m_backBufferPixelFormatHash);
|
||||
}
|
||||
else
|
||||
{
|
||||
FrameBufferMtl& frameBuffer = s_renderMtl->m_frameBuffers[_fbHandle.idx];
|
||||
|
@ -1443,17 +1449,17 @@ namespace bgfx { namespace mtl
|
|||
uint32_t hash = murmur.end();
|
||||
|
||||
RenderPipelineState rps = m_renderPipelineStateCache.find(hash);
|
||||
if ( NULL == rps )
|
||||
if (NULL == rps)
|
||||
{
|
||||
RenderPipelineDescriptor& pipelineDesc = s_renderMtl->m_renderPipelineDescriptor;
|
||||
reset(pipelineDesc);
|
||||
RenderPipelineDescriptor& pd = s_renderMtl->m_renderPipelineDescriptor;
|
||||
reset(pd);
|
||||
uint32_t frameBufferAttachment = 1;
|
||||
|
||||
if (!isValid(_fbHandle) )
|
||||
{
|
||||
pipelineDesc.colorAttachments[0].pixelFormat = s_renderMtl->m_drawable.texture.pixelFormat;
|
||||
pipelineDesc.depthAttachmentPixelFormat = s_renderMtl->m_backBufferDepth.m_obj.pixelFormat;
|
||||
pipelineDesc.stencilAttachmentPixelFormat = s_renderMtl->m_backBufferStencil.m_obj.pixelFormat;
|
||||
pd.colorAttachments[0].pixelFormat = s_renderMtl->m_drawable.texture.pixelFormat;
|
||||
pd.depthAttachmentPixelFormat = s_renderMtl->m_backBufferDepth.m_obj.pixelFormat;
|
||||
pd.stencilAttachmentPixelFormat = MTLPixelFormatInvalid; //s_renderMtl->m_backBufferStencil.m_obj.pixelFormat;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1463,15 +1469,17 @@ namespace bgfx { namespace mtl
|
|||
for (uint32_t ii = 0; ii < frameBuffer.m_num; ++ii)
|
||||
{
|
||||
const TextureMtl& texture = s_renderMtl->m_textures[frameBuffer.m_colorHandle[ii].idx];
|
||||
pipelineDesc.colorAttachments[ii].pixelFormat = texture.m_ptr.m_obj.pixelFormat;
|
||||
pd.colorAttachments[ii].pixelFormat = texture.m_ptr.m_obj.pixelFormat;
|
||||
}
|
||||
|
||||
if (isValid(frameBuffer.m_depthHandle))
|
||||
{
|
||||
const TextureMtl& texture = s_renderMtl->m_textures[frameBuffer.m_depthHandle.idx];
|
||||
pipelineDesc.depthAttachmentPixelFormat = texture.m_ptr.m_obj.pixelFormat;
|
||||
if ( NULL != texture.m_ptrStencil)
|
||||
pipelineDesc.stencilAttachmentPixelFormat = texture.m_ptrStencil.m_obj.pixelFormat;
|
||||
pd.depthAttachmentPixelFormat = texture.m_ptr.m_obj.pixelFormat;
|
||||
if (NULL != texture.m_ptrStencil)
|
||||
{
|
||||
pd.stencilAttachmentPixelFormat = MTLPixelFormatInvalid; //texture.m_ptrStencil.m_obj.pixelFormat;
|
||||
}
|
||||
//todo: stencil attachment should be the same as depth for packed depth/stencil
|
||||
}
|
||||
}
|
||||
|
@ -1493,17 +1501,17 @@ namespace bgfx { namespace mtl
|
|||
|
||||
for (uint32_t ii = 0; ii < (independentBlendEnable ? 1 : frameBufferAttachment); ++ii)
|
||||
{
|
||||
RenderPipelineColorAttachmentDescriptor drt = pipelineDesc.colorAttachments[ii];
|
||||
RenderPipelineColorAttachmentDescriptor drt = pd.colorAttachments[ii];
|
||||
|
||||
drt.blendingEnabled = !!(BGFX_STATE_BLEND_MASK & _state);
|
||||
|
||||
drt.sourceRGBBlendFactor = s_blendFactor[srcRGB][0];
|
||||
drt.destinationRGBBlendFactor = s_blendFactor[dstRGB][0];
|
||||
drt.rgbBlendOperation = s_blendEquation[equRGB];
|
||||
drt.sourceRGBBlendFactor = s_blendFactor[srcRGB][0];
|
||||
drt.destinationRGBBlendFactor = s_blendFactor[dstRGB][0];
|
||||
drt.rgbBlendOperation = s_blendEquation[equRGB];
|
||||
|
||||
drt.sourceAlphaBlendFactor = s_blendFactor[srcA][1];
|
||||
drt.sourceAlphaBlendFactor = s_blendFactor[srcA][1];
|
||||
drt.destinationAlphaBlendFactor = s_blendFactor[dstA][1];
|
||||
drt.alphaBlendOperation = s_blendEquation[equA];
|
||||
drt.alphaBlendOperation = s_blendEquation[equA];
|
||||
|
||||
drt.writeMask = writeMask;
|
||||
}
|
||||
|
@ -1512,28 +1520,28 @@ namespace bgfx { namespace mtl
|
|||
{
|
||||
for (uint32_t ii = 1, rgba = _rgba; ii < frameBufferAttachment; ++ii, rgba >>= 11)
|
||||
{
|
||||
RenderPipelineColorAttachmentDescriptor drt = pipelineDesc.colorAttachments[ii];
|
||||
RenderPipelineColorAttachmentDescriptor drt = pd.colorAttachments[ii];
|
||||
|
||||
drt.blendingEnabled = 0 != (rgba&0x7ff);
|
||||
|
||||
const uint32_t src = (rgba )&0xf;
|
||||
const uint32_t dst = (rgba>>4)&0xf;
|
||||
const uint32_t src = (rgba )&0xf;
|
||||
const uint32_t dst = (rgba>>4)&0xf;
|
||||
const uint32_t equationIndex = (rgba>>8)&0x7;
|
||||
|
||||
drt.sourceRGBBlendFactor = s_blendFactor[src][0];
|
||||
drt.destinationRGBBlendFactor = s_blendFactor[dst][0];
|
||||
drt.rgbBlendOperation = s_blendEquation[equationIndex];
|
||||
drt.sourceRGBBlendFactor = s_blendFactor[src][0];
|
||||
drt.destinationRGBBlendFactor = s_blendFactor[dst][0];
|
||||
drt.rgbBlendOperation = s_blendEquation[equationIndex];
|
||||
|
||||
drt.sourceAlphaBlendFactor = s_blendFactor[src][1];
|
||||
drt.sourceAlphaBlendFactor = s_blendFactor[src][1];
|
||||
drt.destinationAlphaBlendFactor = s_blendFactor[dst][1];
|
||||
drt.alphaBlendOperation = s_blendEquation[equationIndex];
|
||||
drt.alphaBlendOperation = s_blendEquation[equationIndex];
|
||||
|
||||
drt.writeMask = writeMask;
|
||||
}
|
||||
}
|
||||
|
||||
pipelineDesc.vertexFunction = m_vsh->m_function;
|
||||
pipelineDesc.fragmentFunction = m_fsh->m_function;
|
||||
pd.vertexFunction = m_vsh->m_function;
|
||||
pd.fragmentFunction = m_fsh->m_function;
|
||||
|
||||
if (isValid(_declHandle))
|
||||
{
|
||||
|
@ -1551,9 +1559,9 @@ namespace bgfx { namespace mtl
|
|||
bool normalized;
|
||||
bool asInt;
|
||||
vertexDecl.decode(attr, num, type, normalized, asInt);
|
||||
BX_CHECK(num<=4, "num must be <=4");
|
||||
BX_CHECK(num <= 4, "num must be <=4");
|
||||
|
||||
if (0xff != vertexDecl.m_attributes[attr])
|
||||
if (UINT16_MAX != vertexDecl.m_attributes[attr])
|
||||
{
|
||||
vertexDesc.attributes[loc].format = s_attribType[type][num-1][normalized?1:0];
|
||||
vertexDesc.attributes[loc].bufferIndex = 1;
|
||||
|
@ -1576,7 +1584,7 @@ namespace bgfx { namespace mtl
|
|||
|
||||
if (_numInstanceData > 0)
|
||||
{
|
||||
for (uint32_t ii = 0; 0xffff != m_instanceData[ii]; ++ii)
|
||||
for (uint32_t ii = 0; UINT16_MAX != m_instanceData[ii]; ++ii)
|
||||
{
|
||||
uint32_t loc = m_instanceData[ii];
|
||||
vertexDesc.attributes[loc].format = MTLVertexFormatFloat4;
|
||||
|
@ -1589,37 +1597,38 @@ namespace bgfx { namespace mtl
|
|||
vertexDesc.layouts[2].stepRate = 1;
|
||||
}
|
||||
|
||||
pipelineDesc.vertexDescriptor = vertexDesc;
|
||||
pd.vertexDescriptor = vertexDesc;
|
||||
}
|
||||
|
||||
if (m_processedUniforms)
|
||||
{
|
||||
rps = s_renderMtl->m_device.newRenderPipelineStateWithDescriptor(pipelineDesc);
|
||||
rps = s_renderMtl->m_device.newRenderPipelineStateWithDescriptor(pd);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_numPredefined = 0;
|
||||
RenderPipelineReflection reflection = NULL;
|
||||
rps = s_renderMtl->m_device.newRenderPipelineStateWithDescriptor(pipelineDesc, MTLPipelineOptionBufferTypeInfo, &reflection);
|
||||
rps = s_renderMtl->m_device.newRenderPipelineStateWithDescriptor(pd, MTLPipelineOptionBufferTypeInfo, &reflection);
|
||||
|
||||
if ( NULL != reflection )
|
||||
if (NULL != reflection)
|
||||
{
|
||||
for (uint32_t shaderType = 0; shaderType < 2; ++shaderType)
|
||||
{
|
||||
UniformBuffer*& constantBuffer = (shaderType == 0 ? m_vshConstantBuffer : m_fshConstantBuffer);
|
||||
uint8_t fragmentBit = (1 == shaderType ? BGFX_UNIFORM_FRAGMENTBIT : 0);
|
||||
|
||||
for( MTLArgument* arg in (shaderType == 0 ? reflection.vertexArguments : reflection.fragmentArguments))
|
||||
for (MTLArgument* arg in (shaderType == 0 ? reflection.vertexArguments : reflection.fragmentArguments))
|
||||
{
|
||||
BX_TRACE("arg: %s type:%d", utf8String(arg.name), arg.type);
|
||||
if (arg.active)
|
||||
{
|
||||
if (arg.type == MTLArgumentTypeBuffer && !strcmp(utf8String(arg.name),SHADER_UNIFORM_NAME) )
|
||||
if (arg.type == MTLArgumentTypeBuffer
|
||||
&& 0 == strcmp(utf8String(arg.name), SHADER_UNIFORM_NAME) )
|
||||
{
|
||||
BX_CHECK( arg.index == 0, "Uniform buffer must be in the buffer slot 0.");
|
||||
BX_CHECK( MTLDataTypeStruct == arg.bufferDataType, "%s's type must be a struct",SHADER_UNIFORM_NAME );
|
||||
|
||||
if ( MTLDataTypeStruct == arg.bufferDataType )
|
||||
if (MTLDataTypeStruct == arg.bufferDataType)
|
||||
{
|
||||
if (shaderType == 0)
|
||||
{
|
||||
|
@ -1632,7 +1641,7 @@ namespace bgfx { namespace mtl
|
|||
m_fshConstantBufferAlignmentMask = (uint32_t)arg.bufferAlignment - 1;
|
||||
}
|
||||
|
||||
for( MTLStructMember* uniform in arg.bufferStructType.members )
|
||||
for (MTLStructMember* uniform in arg.bufferStructType.members )
|
||||
{
|
||||
const char* name = utf8String(uniform.name);
|
||||
BX_TRACE("uniform: %s type:%d", name, uniform.dataType);
|
||||
|
@ -1687,21 +1696,27 @@ namespace bgfx { namespace mtl
|
|||
|
||||
}
|
||||
}
|
||||
} else if (arg.type == MTLArgumentTypeTexture)
|
||||
}
|
||||
else if (arg.type == MTLArgumentTypeTexture)
|
||||
{
|
||||
const char* name = utf8String(arg.name);
|
||||
BX_TRACE("texture: %s index:%d", name, arg.index);
|
||||
} else if (arg.type == MTLArgumentTypeSampler)
|
||||
}
|
||||
else if (arg.type == MTLArgumentTypeSampler)
|
||||
{
|
||||
const char* name = utf8String(arg.name);
|
||||
BX_TRACE("sampler: %s index:%d", name, arg.index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (NULL != constantBuffer)
|
||||
{
|
||||
constantBuffer->finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_processedUniforms = true;
|
||||
}
|
||||
|
||||
|
@ -1829,11 +1844,15 @@ namespace bgfx { namespace mtl
|
|||
desc.depth = bx::uint32_max(1,imageContainer.m_depth);
|
||||
desc.mipmapLevelCount = imageContainer.m_numMips;
|
||||
desc.sampleCount = 1; //TODO: set samplecount - If textureType is not MTLTextureType2DMultisample, the value must be 1.
|
||||
desc.resourceOptions = MTLResourceStorageModePrivate;
|
||||
desc.cpuCacheMode = MTLCPUCacheModeDefaultCache;
|
||||
desc.storageMode = MTLStorageModePrivate;
|
||||
|
||||
//TODO: set resource flags depending on usage(renderTarget/computeWrite/etc) on iOS9/OSX
|
||||
|
||||
m_ptr = s_renderMtl->m_device.newTextureWithDescriptor(desc);
|
||||
if ( m_requestedFormat == TextureFormat::D24S8 && desc.pixelFormat == MTLPixelFormatDepth32Float )
|
||||
if (m_requestedFormat == TextureFormat::D24S8
|
||||
&& desc.pixelFormat == MTLPixelFormatDepth32Float)
|
||||
{
|
||||
desc.pixelFormat = MTLPixelFormatStencil8;
|
||||
m_ptrStencil = s_renderMtl->m_device.newTextureWithDescriptor(desc);
|
||||
|
@ -1879,7 +1898,7 @@ namespace bgfx { namespace mtl
|
|||
uint32_t bytesPerRow;
|
||||
uint32_t bytesPerImage;
|
||||
|
||||
if ( compressed && !convert)
|
||||
if (compressed && !convert)
|
||||
{
|
||||
if (format >= 160 /*MTLPixelFormatPVRTC_RGB_2BPP*/
|
||||
&& format <= 167 /*MTLPixelFormatPVRTC_RGBA_4BPP_sRGB*/)
|
||||
|
@ -2217,7 +2236,7 @@ namespace bgfx { namespace mtl
|
|||
|
||||
//TODO: optimize store actions use discard flag
|
||||
RenderPassDepthAttachmentDescriptor depthAttachment = renderPassDescriptor.depthAttachment;
|
||||
if ( NULL != depthAttachment.texture)
|
||||
if (NULL != depthAttachment.texture)
|
||||
{
|
||||
depthAttachment.clearDepth = clr.m_depth;
|
||||
depthAttachment.loadAction = (BGFX_CLEAR_DEPTH & clr.m_flags) ? MTLLoadActionClear : MTLLoadActionLoad;
|
||||
|
@ -2225,14 +2244,14 @@ namespace bgfx { namespace mtl
|
|||
}
|
||||
|
||||
RenderPassStencilAttachmentDescriptor stencilAttachment = renderPassDescriptor.stencilAttachment;
|
||||
if ( NULL != stencilAttachment.texture )
|
||||
if (NULL != stencilAttachment.texture)
|
||||
{
|
||||
stencilAttachment.clearStencil = clr.m_stencil;
|
||||
stencilAttachment.loadAction = (BGFX_CLEAR_STENCIL & clr.m_flags) ? MTLLoadActionClear : MTLLoadActionLoad;
|
||||
stencilAttachment.storeAction = MTLStoreActionStore;
|
||||
stencilAttachment.loadAction = (BGFX_CLEAR_STENCIL & clr.m_flags) ? MTLLoadActionClear : MTLLoadActionLoad;
|
||||
stencilAttachment.storeAction = MTLStoreActionStore;
|
||||
}
|
||||
|
||||
if ( 0 != m_renderCommandEncoder)
|
||||
if (0 != m_renderCommandEncoder)
|
||||
{
|
||||
m_renderCommandEncoder.endEncoding();
|
||||
}
|
||||
|
@ -2249,7 +2268,7 @@ namespace bgfx { namespace mtl
|
|||
|
||||
if (BX_ENABLED(BGFX_CONFIG_DEBUG_MTL) )
|
||||
{
|
||||
if ( item != 1) //ASK: better check ? I don't get the whole restart thing
|
||||
if (item != 1) //ASK: better check ? I don't get the whole restart thing
|
||||
rce.popDebugGroup();
|
||||
|
||||
rce.pushDebugGroup(s_viewName[view]);
|
||||
|
@ -2351,13 +2370,13 @@ namespace bgfx { namespace mtl
|
|||
rce.setScissorRect(rc);
|
||||
}
|
||||
|
||||
if ( (BGFX_STATE_DEPTH_WRITE|BGFX_STATE_DEPTH_TEST_MASK) & changedFlags
|
||||
if ((BGFX_STATE_DEPTH_WRITE|BGFX_STATE_DEPTH_TEST_MASK) & changedFlags
|
||||
|| 0 != changedStencil)
|
||||
{
|
||||
setDepthStencilState(newFlags,newStencil);
|
||||
}
|
||||
|
||||
if ( (0
|
||||
if ((0
|
||||
| BGFX_STATE_CULL_MASK
|
||||
| BGFX_STATE_ALPHA_REF_MASK
|
||||
| BGFX_STATE_PT_MASK
|
||||
|
@ -2385,7 +2404,7 @@ namespace bgfx { namespace mtl
|
|||
}
|
||||
}
|
||||
|
||||
if ( (blendFactor != draw.m_rgba) && !(newFlags & BGFX_STATE_BLEND_INDEPENDENT) )
|
||||
if ((blendFactor != draw.m_rgba) && !(newFlags & BGFX_STATE_BLEND_INDEPENDENT) )
|
||||
{
|
||||
const uint32_t rgba = draw.m_rgba;
|
||||
float rr = ( (rgba>>24) )/255.0f;
|
||||
|
@ -2428,7 +2447,7 @@ namespace bgfx { namespace mtl
|
|||
decl.idx = !isValid(vb.m_decl) ? draw.m_vertexDecl.idx : vb.m_decl.idx;
|
||||
|
||||
RenderPipelineState pipelineState = program.getRenderPipelineState(newFlags, draw.m_rgba, fbh, decl, draw.m_instanceDataStride/16);
|
||||
if ( NULL == pipelineState )
|
||||
if (NULL == pipelineState )
|
||||
{ //call with invalid program
|
||||
currentProgram = NULL;
|
||||
programIdx = invalidHandle;
|
||||
|
@ -2449,14 +2468,14 @@ namespace bgfx { namespace mtl
|
|||
uint32_t vertexUniformBufferSize = program.m_vshConstantBufferSize;
|
||||
uint32_t fragmentUniformBufferSize = program.m_fshConstantBufferSize;
|
||||
|
||||
if ( vertexUniformBufferSize )
|
||||
if (vertexUniformBufferSize )
|
||||
{
|
||||
m_uniformBufferVertexOffset = BX_ALIGN_MASK(m_uniformBufferVertexOffset, program.m_vshConstantBufferAlignmentMask);
|
||||
rce.setVertexBuffer(m_uniformBuffer, m_uniformBufferVertexOffset, 0);
|
||||
}
|
||||
|
||||
m_uniformBufferFragmentOffset = m_uniformBufferVertexOffset + vertexUniformBufferSize;
|
||||
if ( fragmentUniformBufferSize )
|
||||
if (fragmentUniformBufferSize )
|
||||
{
|
||||
m_uniformBufferFragmentOffset = BX_ALIGN_MASK(m_uniformBufferFragmentOffset, program.m_fshConstantBufferAlignmentMask);
|
||||
rce.setFragmentBuffer(m_uniformBuffer, m_uniformBufferFragmentOffset, 0);
|
||||
|
@ -2626,8 +2645,10 @@ namespace bgfx { namespace mtl
|
|||
|
||||
if (BX_ENABLED(BGFX_CONFIG_DEBUG_MTL) )
|
||||
{
|
||||
if ( 0 < _render->m_num)
|
||||
if (0 < _render->m_num)
|
||||
{
|
||||
rce.popDebugGroup();
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: debug stats
|
||||
|
|
Loading…
Reference in a new issue