标签:mini uid review scheduled elf 默认 complete isa func
读苹果文档时的笔记,给自己看。
primary goal of Metal is to minimize the CPU overhead incurred by executing GPU workloads.
用在两个方面:
Metal App 不能在后台运行,否则会被终止。
?
Command buffer 和 command encoder 是轻量级的,设计为单次使用。
下面这些的创建是比较消耗资源的,应该复用。
block 中的方法可能在任意线程调用,并且不应该是耗时的。
MTLBuffer
有两个类型。
MTLBuffer
: 无格式 (unformatted) 的内存,可以表示任意类型数据。MTLTexture
: 有格式 (formatted) 的图像数据。contents
方法返回 buffer 的 CPU 内存地址。newTextureWithDescriptor:offset:bytesPerRow:
方法创建 texture 对象,指向 buffer 的数据。可以有下面的结构
MTLDevice
调用,创建 MTLTexture
对象,分配了存储空间。使用 MTLTextureDescriptor
来描述纹理的性质。MTLTexture
调用,返回 MTLTexture
对象,和原来的纹理共享内存地址。新的纹理用新的像素格式来解释原有的纹理数据。MTLBuffer
调用,返回 MTLTexture
对象,和原来的 buffer 共享内存地址。MTLTextureDescriptor
定义了纹理的性质,只是用来创建纹理对象。在创建好纹理对象之后,对它的修改不会有任何影响。
MTLTextureDescriptor* txDesc = [[MTLTextureDescriptor alloc] init];
txDesc.textureType = MTLTextureType3D;
txDesc.height = 64;
txDesc.width = 64;
txDesc.depth = 64;
txDesc.pixelFormat = MTLPixelFormatBGRA8Unorm;
txDesc.arrayLength = 1;
txDesc.mipmapLevelCount = 1;
id <MTLTexture> aTexture = [device newTextureWithDescriptor:txDesc];
例子如下:
// pixelSize is the size of one pixel, in bytes
// width, height - number of pixels in each dimension
NSUInteger myRowBytes = width * pixelSize;
NSUInteger myImageBytes = rowBytes * height;
[tex replaceRegion:MTLRegionMake2D(0,0,width,height)
mipmapLevel:0 slice:0 withBytes:textureData
bytesPerRow:myRowBytes bytesPerImage:myImageBytes];
有三种像素类型:
MTLSamplerDescriptor
对象 MTLSamplerState
对象。MTLSamplerState
对象只是用来创建 MTLSamplerState
对象。创建完之后,对它的修改不会影响已经创建好的 MTLSamplerState
对象。
// create MTLSamplerDescriptor
MTLSamplerDescriptor *desc = [[MTLSamplerDescriptor alloc] init];
desc.minFilter = MTLSamplerMinMagFilterLinear;
desc.magFilter = MTLSamplerMinMagFilterLinear;
desc.sAddressMode = MTLSamplerAddressModeRepeat;
desc.tAddressMode = MTLSamplerAddressModeRepeat;
// all properties below have default values
desc.mipFilter = MTLSamplerMipFilterNotMipmapped;
desc.maxAnisotropy = 1U;
desc.normalizedCoords = YES;
desc.lodMinClamp = 0.0f;
desc.lodMaxClamp = FLT_MAX;
// create MTLSamplerState
id <MTLSamplerState> sampler = [device newSamplerStateWithDescriptor:desc];
CPU 和 GPU 都可以访问 MTLResource
对象。
GPU 只能记录在 MTLCommandBuffer
的 commit
方法调用之前,CPU 对 MTLResource
的改动。
CPU 只有在 GPU 完成 MTLCommandBuffer
中的指令之后,才可以看到 GPU 对 MTLResource
的改动。
只有被 vertex
、fragment
或 kernel
修饰的函数才可以表示为 MTLFunction
。
Library 中的 MTLFunction
可以有两个来源:
可以提高效率,不必在运行时编译源代码。
可以通过以下方法来获取 MTLLibrary
。
?
MTLRenderPassDescriptor
表示 encoded rendering commands 的目的地 (destination)。MTLRenderPassDescriptor
的属性可以包括至多 4 个颜色的 attachments,一个像素深度数据的 attachment,一个像素 stencil 数据的 attachment。
指定了在 rendering pass 的起始和结束时的动作。
loadAction
包括:
storeAction 包括
一个例子如下:
MTLTextureDescriptor *colorTexDesc = [MTLTextureDescriptor
texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm
width:IMAGE_WIDTH height:IMAGE_HEIGHT mipmapped:NO];
id <MTLTexture> colorTex = [device newTextureWithDescriptor:colorTexDesc];
MTLTextureDescriptor *depthTexDesc = [MTLTextureDescriptor
texture2DDescriptorWithPixelFormat:MTLPixelFormatDepth32Float
width:IMAGE_WIDTH height:IMAGE_HEIGHT mipmapped:NO];
id <MTLTexture> depthTex = [device newTextureWithDescriptor:depthTexDesc];
MTLRenderPassDescriptor *renderPassDesc = [MTLRenderPassDescriptor renderPassDescriptor];
renderPassDesc.colorAttachments[0].texture = colorTex;
renderPassDesc.colorAttachments[0].loadAction = MTLLoadActionClear;
renderPassDesc.colorAttachments[0].storeAction = MTLStoreActionStore;
renderPassDesc.colorAttachments[0].clearColor = MTLClearColorMake(0.0,1.0,0.0,1.0);
renderPassDesc.depthAttachment.texture = depthTex;
renderPassDesc.depthAttachment.loadAction = MTLLoadActionClear;
renderPassDesc.depthAttachment.storeAction = MTLStoreActionStore;
renderPassDesc.depthAttachment.clearDepth = 1.0;
id <MTLRenderCommandEncoder> renderCE = [commandBuffer
renderCommandEncoderWithDescriptor:renderPassDesc];
利用 CAMetalLayer
。
MTLRenderPipelineState
对象生命周期很长,应该缓存起来复用。
MTLRenderPipelineState
对象是不可变的。先创建一个 MTLRenderPipelineDescriptor
,设置好性质,然后再创建 MTLRenderPipelineState
。
?
例子如下:
MTLRenderPipelineDescriptor *renderPipelineDesc =
[[MTLRenderPipelineDescriptor alloc] init];
renderPipelineDesc.vertexFunction = vertFunc;
renderPipelineDesc.fragmentFunction = fragFunc;
renderPipelineDesc.colorAttachments[0].pixelFormat = MTLPixelFormatRGBA8Unorm;
// Create MTLRenderPipelineState from MTLRenderPipelineDescriptor
NSError *errors = nil;
id <MTLRenderPipelineState> pipeline = [device
newRenderPipelineStateWithDescriptor:renderPipelineDesc error:&errors];
assert(pipeline && !errors);
// Set the pipeline state for MTLRenderCommandEncoder
[renderCE setRenderPipelineState:pipeline];
?
调用 setVertex*
以及 setVertex*
方法。
调用 draw*
方法。
调用 endEncoding
方法
标签:mini uid review scheduled elf 默认 complete isa func
原文地址:http://www.cnblogs.com/huahuahu/p/Metal-Programming-Guide.html