日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Metal之Shading Language Specification(着色语言规范)

發(fā)布時間:2024/5/21 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Metal之Shading Language Specification(着色语言规范) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Metal簡述

  • Metal著色器語言是用來編寫 3D圖形渲染邏輯、并行Metal計算核心邏輯 的一門編程語言,當(dāng)你使用Metal框架來完成APP的實現(xiàn)時則需要使用Metal編程語言。
  • Metal語言使用Clang 和LLVM進(jìn)行編譯處理,編譯器對于在GPU上的代碼執(zhí)行效率有更好的控制。
  • Metal基于C++ 11.0語言設(shè)計的,在C++基礎(chǔ)上多了一些擴(kuò)展和限制,主要用來編寫在GPU上執(zhí)行的圖像渲染邏輯代碼以及通用并行計算邏輯代碼。
  • Metal 像素坐標(biāo)系統(tǒng):Metal中紋理 或者 幀緩存區(qū)attachment的像素使用的坐標(biāo)系統(tǒng)的原點是左上角。
  • Metal 與 C++ 11.0:Metal 這?語?是基于C++ 11.0標(biāo)準(zhǔn)設(shè)計的, 它在C++基礎(chǔ)是?多了?些拓展和限制。

Metal Restrictions 限制

① Metal中不支持C++11.0的如下特性:

  • Lambda表達(dá)式
  • 遞歸函數(shù)調(diào)用
  • 動態(tài)轉(zhuǎn)換操作符
  • 類型識別
  • 對象創(chuàng)建new和銷毀delete操作符
  • 操作符noexcept
  • go跳轉(zhuǎn)
  • 變量存儲修飾符 register 和thread_local
  • 虛函數(shù)修飾符
  • 派生類
  • 異常處理

② C++標(biāo)準(zhǔn)庫在Metal語言中也不可使用

③ Metal語言對于指針使用的限制

  • Metal圖形和并行計算函數(shù)用到的入?yún)?#xff08;比如指針 / 引用),如果是指針 / 引用必須使用地址空間修飾符(比如device、threadgroup、constant)
  • 不支持函數(shù)指針
  • 函數(shù)名不能出現(xiàn)main

Metal數(shù)據(jù)類型

一、Metal支持的標(biāo)量類型

類型描述
bool布爾類型,取值范圍true、false;true可以拓展為整數(shù)常量1,false可以拓展為整數(shù)常量0
char有符號8-bit整數(shù)
unsigned char uchar無符號8-bit整數(shù)
short有符號16-bit整數(shù)
unsigned short ushort無符號16-bit整數(shù)
int有符號32-bit整數(shù)
unsigned int uint無符號32-bit整數(shù)
half一個16-bit浮點數(shù)
float一個32-bit浮點數(shù)
size-t64-bit無符號整數(shù),表示sizeof操作符的結(jié)果
ptrdiff_t64-bit有符號整數(shù),表示2個指針的差
void表示一個空的值集合
  • 常用的主要有 bool、int、uint 、half
  • undigned char 可以簡寫為 uchar
  • unsigned short 可以簡寫為 ushort
  • unsigned int 可以簡寫為 uint
  • 其中 half 相當(dāng)于OC中的float,float 相當(dāng)于OC中的double
  • size_t用來表示內(nèi)存空間, 相當(dāng)于OC中 sizeof

二、Metal支持的向量類型

① 支持類型
  • booln、charn、shortn、intn、ucharn、ushortn、uintn、halfn、floatn,其中 n 表示向量的維度,最多不超過4維向量;
  • 在OpenGL ES的GLSL語言中,例如2.0f,在著色器中書寫時,是不能加f,寫成2.0,而在Metal中則可以寫成2.0f,其中f可以是大寫,也可以是小寫;
② 訪問規(guī)則
  • 通過向量字母獲取元素: 向量中的向量字母僅有2種,分別為xyzw、rgba;
int4 test = int4(0,1,2,3); int a = test.x; // 獲取的向量元素0 int b = test.y; // 獲取的向量元素1 int c = test.z; // 獲取的向量元素2 int d = test.w; // 獲取的向量元素3int e = test.r; // 獲取的向量元素0 int f = test.g; // 獲取的向量元素1 int g = test.b; // 獲取的向量元素2 int h = test.a; // 獲取的向量元素3
  • 多個分量同時訪問
float4 c; c.xyzw = float4(1.0f,2.0f,3.0f,4.0f); c.z = 1.0f; c.xy = float2(3.0f,4.0f); c.xyz = float3(3.0f,4.0f,5.0f);
  • 多分量訪問可以亂序/重復(fù)
    賦值時分量不可重復(fù),取值時分量可重復(fù)
    右邊取值和左邊賦值都合法
    xyzw與rgba不能混合使用
    GLSL中向量不能亂序訪問
float4 pos = float4(1.0f,2.0f,3.0f,4.0f); // 向量分量逆序訪問 float4 swiz = pos.wxyz; // swiz = (4.0,1.0,2.0,3.0); // 向量分量重復(fù)訪問 float4 dup = pos.xxyy; // dup = (1.0f,1.0f,2.0f,2.0f);// 可以僅對 xw / wx 修改 // pos = (5.0f,2.0,3.0,6.0) pos.xw = float2(5.0f,6.0f);// pos = (8.0f,2.0f,3.0f,7.0f) pos.wx = float2(7.0f,8.0f);// 可以僅對 xyz 進(jìn)行修改 // pos = (3.0f,5.0f,9.0f,7.0f); pos.xyz = float3(3.0f,5.0f,9.0f);float2 pos; pos.x = 1.0f; // 合法 pos.z = 1.0f; // 非法,pos是二維向量,沒有z這個索引float3 pos2; pos2.z = 1.0f; // 合法 pos2.w = 1.0f; // 非法// 賦值時分量不可重復(fù),取值時分量可重復(fù) // 非法,x出現(xiàn)2次 pos.xx = float2(3.0,4.0f); pos.xy = swiz.xx;// 向量中xyzw與rgba兩組分量不能混合使用 float4 pos4 = float4(1.0f,2.0f,3.0f,4.0f); pos4.x = 1.0f; pos4.y = 2.0f; // 非法, .rgba 與 .xyzw 混合使用 pos4.xg = float2(2.0f,3.0f); // 非法, .rgba 與 .xyzw 混合使用 float3 coord = pos4.ryz;

三、Metal支持的矩陣類型

① 支持類型
  • halfnxm、floatnxm,其中 nxm表示矩陣的行數(shù)和列數(shù),最多4行4列,其中half、float相當(dāng)于OC中的float、double;
  • 普通的矩陣其本質(zhì)就是一個數(shù)組;
float4x4 m; // 將第二行的所有值都設(shè)置為2.0 m[1] = float4(2.0f);// 設(shè)置第一行/第一列為1.0f m[0][0] = 1.0f;// 設(shè)置第三行第四列的元素為3.0f m[2][3] = 3.0f;
② 構(gòu)造方式
  • float4 類型向量的構(gòu)造方式
    1個float構(gòu)成,表示一行都是這個值
    4個float構(gòu)成
    2個float2構(gòu)成
    1個float2+2個float構(gòu)成(順序可以任意組合)
    1個float2+1個float
    1個float4
// float4類型向量的所有可能構(gòu)造方式 // 1個一維向量,表示一行都是x float4(float x);/ // 4個一維向量 --> 4維向量 float4(float x,float y,float z,float w); // 2個二維向量 --> 4維向量 float4(float2 a,float2 b); // 1個二維向量+2個一維向量 --> 4維向量 float4(float2 a,float b,float c); float4(float a,float2 b,float c); float4(float a,float b,float2 c); // 1個三維向量+1個一維向量 --> 4維向量 float4(float3 a,float b); float4(float a,float3 b); // 1個四維向量 --> 4維向量 float4(float4 x);

Metal其他類型

一、紋理類型
  • 紋理類型是一個句柄,指向一維/二維/三維紋理數(shù)據(jù),而紋理數(shù)據(jù)對應(yīng)一個紋理的某個level的mipmap的全部或者一部分;

  • 紋理的訪問權(quán)限
    在一個函數(shù)中描述紋理對象的類型, access枚舉值由Metal定義,定義了紋理的訪問權(quán)利 enum class access {sample, read, write};,有以下3種訪問權(quán)利,當(dāng)沒設(shè)定access時,默認(rèn)的access 就是 sample;
    ① sample: 紋理對象可以被采樣(即使用采樣器去紋理中讀取數(shù)據(jù),相當(dāng)于OpenGL ES的GLSL中sampler2D),采樣一維這時使用 或者 不使用都可以從紋理中讀取數(shù)據(jù)(即可讀可寫可采樣);
    ② read:不使用采樣器,一個圖形渲染函數(shù) 或者 一個并行計算函數(shù)可以讀取紋理對象(即僅可讀);
    ③ write:一個圖形渲染函數(shù)或者一個并行計算可以向紋理對象寫入數(shù)據(jù)(即可讀可寫);

  • 定義紋理類型
    描述一個紋理對象/類型,有以下三種方式,分別對應(yīng)一維/二維/三維,其中T代表 泛型,設(shè)定了從紋理中讀取數(shù)據(jù) 或是 寫入時的顏色類型,T可以是half、float、short、int等
    access表示紋理訪問權(quán)限,當(dāng)access沒設(shè)定時,默認(rèn)是sample:
    texture1d<T, access a = access::sample>
    texture2d<T, access a = access::sample>
    texture3d<T, access a = access::sample>

// 類型 變量 修飾符 /*類型- texture2d<float>,讀取的數(shù)據(jù)類型是float,沒寫access,默認(rèn)是sample- texture2d<float,access::read>,讀取的數(shù)據(jù)類型是float,讀取的方式是read- texture2d<float,access::write>,讀取的數(shù)據(jù)類型是float,讀取的方式是write變量名- imgA- imgB- imgC修飾符- [[texture(0)]] 對應(yīng)紋理0- [[texture(1)]] 對應(yīng)紋理1- [[texture(2)]] 對應(yīng)紋理2*/ void foo (texture2d<float> imgA[[texture(0)]],texture2d<float,access::read> imgB[[texture(1)]],texture2d<float,access::write> imgC[[texture(2)]]) {//... }
二、采樣器類型 Samplers

采樣器類型決定了如何對一個紋理進(jìn)行采樣操作,在Metal框架中有一個對應(yīng)著色器語言的采樣器的對象MTLSamplerState,這個對象作為圖形渲染著色器函數(shù)參數(shù)或是并行計算函數(shù)的參數(shù)傳遞,有以下幾種狀態(tài):

  • coord:從紋理中采樣時,紋理坐標(biāo)是否需要歸一化; enum class coord { normalized, pixel };
  • filter:紋理采樣過濾方式,放大/縮小過濾方式; enum class filter { nearest, linear };
  • min_filter:設(shè)置紋理采樣的縮小過濾方式; enum class min_filter { nearest, linear };
  • mag_filter:設(shè)置紋理采樣的放大過濾方式; enum class mag_filter { nearest, linear };
  • s_address、t_address、r_address:設(shè)置紋理s、t、r坐標(biāo)(對應(yīng)紋理坐標(biāo)的x、y、z)的尋址方式
    s坐標(biāo):enum class s_address { clamp_to_zero, clamp_to_edge, repeat, mirrored_repeat };
    t坐標(biāo):enum class t_address { clamp_to_zero, clamp_to_edge, repeat, mirrored_repeat };
    r坐標(biāo):enum class r_address { clamp_to_zero, clamp_to_edge, repeat, mirrored_repeat };
  • address:設(shè)置所有紋理坐標(biāo)的尋址方式; enum class address { clamp_to_zero, clamp_to_edge, repeat, mirrored_repeat };
  • mip_filter:設(shè)置紋理采樣的mipMap過濾模式, 如果是none,那么只有一層紋理生效; enum class mip_filter { none, nearest, linear };
  • 注意:
    openGL ES中紋理坐標(biāo)對應(yīng)的是stq,Metal中紋理坐標(biāo)對應(yīng)是str;
    在Metal程序中初始化的采樣器必須使用constexpr修飾符聲明;
/* constexpr:修飾符(必須寫) sampler:類型 s:采樣器變量名稱 參數(shù)- coord: 是否需要歸一化,不需要歸一化,用的是像素pixel- address: 地址環(huán)繞方式- filter: 過濾方式 */ constexpr sampler s(coord::pixel, address::clamp_to_zero, filter::linear);constexpr sampler a(coord::normalized);constexpr sampler b(address::repeat);

函數(shù)修飾符

Metal 著?器語??持下列的函數(shù)修飾符:

  • kernel:表示該函數(shù)是一個數(shù)據(jù)并行計算著色函數(shù),它可以被分配在一維/二維/三維線程組中去執(zhí)行,表示函數(shù)要并行計算,其返回值類型必須是void類型,是一個高并發(fā)函數(shù);
  • vertex:表示該函數(shù)是一個頂點著色函數(shù),它將為頂點數(shù)據(jù)流中的每個頂點數(shù)據(jù)執(zhí)行一次,然后為每個頂點生成數(shù)據(jù)輸出到繪制管線;
  • fragment:表示該函數(shù)是一個片元著色函數(shù),它將為片元數(shù)據(jù)流中的每個片元 和其相關(guān)聯(lián)的數(shù)據(jù)執(zhí)行一次,然后將每個片元生成的顏色數(shù)據(jù)輸出到繪制管線中;

注意:

  • 使用kernel修飾的函數(shù),其返回值類型必須是void類型
  • 一個被函數(shù)修飾符修飾的函數(shù)不能在調(diào)用其他也被函數(shù)修飾符修飾的函數(shù),這樣會導(dǎo)致編譯失敗,即Kernel、vertex、fragment修飾的函數(shù)不能相互調(diào)用,也不能同修飾符函數(shù)相互調(diào)用,但是可以調(diào)用普通函數(shù);
  • 被函數(shù)修飾符修飾過的函數(shù),只允許在客戶端對其進(jìn)行操作. 不允許被普通的函數(shù)調(diào)用;
  • Metal中并不是所有函數(shù)都需要上述3個修飾符修飾,是可以在Metal中定義普通函數(shù)的,即不帶任何修飾符的函數(shù);
  • 只有圖形著色函數(shù)才可以被vertex和fragment修飾,對于圖形著色函數(shù),通過返回值類型可以辨認(rèn)出是為頂點計算還是像素計算,其返回值也可以是void,意味著不產(chǎn)生數(shù)據(jù)輸出到繪制管線,是一個無意義的動作;
// 并行計算函數(shù)(kernel) kernel void CCTestKernelFunctionA(int a,int b) { /*注意:1. 使用kernel 修飾的函數(shù)返回值必須是void 類型2. 一個被函數(shù)修飾符修飾過的函數(shù),不允許在調(diào)用其他的被函數(shù)修飾過的函數(shù). 非法3. 被函數(shù)修飾符修飾過的函數(shù),只允許在客戶端對其進(jìn)行操作. 不允許被普通的函數(shù)調(diào)用.*/// 不可以的!// 一個被函數(shù)修飾符修飾過的函數(shù),不允許在調(diào)用其他的被函數(shù)修飾過的函數(shù). 非法CCTestKernelFunctionB(1,2);//非法,錯誤調(diào)用!!!CCTestVertexFunctionB(1,2);//非法,錯誤調(diào)用!!!// 可以! 你可以調(diào)用普通函數(shù).而且在Metal 不僅僅只有這3種被修飾過的函數(shù).普通函數(shù)也可以存在CCTest();}// 并行計算函數(shù) kernel void CCTestKernelFunctionB(int a,int b) {..... }// 頂點函數(shù) vertex int CCTestVertexFunctionB(int a,int b) {..... }// 片元函數(shù) fragment int CCTestVertexFunctionB(int a,int b) {..... }// 普通函數(shù) void CCTest() {..... }

變量、參數(shù)的地址空間修飾符

一、概念

① Metal著色器語言使用地址空間修飾符來表示一個函數(shù)變量或者參數(shù)變量被分配于哪一片內(nèi)存區(qū)域,有以下4中地址空間修飾符:

  • device: 設(shè)備地址空間
  • threadgroup: 線程組地址空間
  • constant 常量地址空間
  • thread 線程地址空間

② 注意:

  • 所有的著色函數(shù)(vertex、fragment、kernel)的參數(shù),如果是指針/引用,都必須帶有地址空間修飾符號;
  • 對于圖形著色器函數(shù)(即vertex/fragment修飾的函數(shù)),其指針/引用類型的參數(shù)必須定義為 device、constant地址空間;
  • 對于并行計算函數(shù)(即kernel修飾的函數(shù)),其指針/引用類型的參數(shù)必須定義為 device、threadgroup、constant;
  • 并不是所有的變量都需要修飾符,也可以定義普通變量(即無修飾符的變量);
/*注意:1. 所有被(kernel,vertex,fragment)所修飾的參數(shù)變量,如果其類型是指針/引用 都必須帶有地址空間修飾符.2. 被fragment修飾的片元函數(shù), 指針/引用必須被device/constant/threadgroup*/// 變量/參數(shù)地址空間修飾符 void CCTestFouncitionE(device int *g_data,threadgroup int *l_data,constant float *c_data) {//...}
二、device:設(shè)備地址空間修飾符
  • 設(shè)備地址空間指向設(shè)備內(nèi)存池分配出來的緩存對象(設(shè)備指顯存,即GPU),即GPU空間分配的緩存對象,它是可讀可寫的,一個緩存對象可以被聲明成一個標(biāo)量、向量或是用戶自定義結(jié)構(gòu)體的指針/引用;
  • device放在變量類型之前;
  • 除了可以修飾 圖形著色器函數(shù) / 并行計算函數(shù)參數(shù),還可以修飾指針變量 和 結(jié)構(gòu)體指針變量:
// 設(shè)備地址空間: device 用來修飾指針.引用 // 修飾指針變量 device float4 *color;struct CCStruct{float a[3];int b[2]; }; // 修飾結(jié)構(gòu)體類的指針變量 device CCStruct *my_CS;
  • 紋理對象總是在設(shè)備地址空間分配內(nèi)存,即紋理對象默認(rèn)在GPU分配內(nèi)存;
  • device地址空間修飾符不必出現(xiàn)在紋理類型定義中;
  • 一個紋理對象的內(nèi)容無法直接訪問,Metal提供讀寫紋理的內(nèi)建函數(shù),通過內(nèi)建函數(shù)訪問紋理對象;
三、threadgroup:線程組地址空間修飾符
  • 線程組地址空間用于為并行計算著色器函數(shù)分配內(nèi)存變量,這些變量被一個線程組的所有線程共享,在線程組地址空間分配的變量不能用于圖形繪制著色函數(shù)(即頂點著色函數(shù) / 片元著色函數(shù)),即在圖形繪制著色函數(shù)中不能使用線程組;
  • 在并行計算著色函數(shù)中,在線程組地址空間分配的變量為一個線程組使用,生命周期和線程組相同;
/*1. threadgroup 被并行計算計算分配內(nèi)存變量, 這些變量被一個線程組的所有線程共享. 在線程組分配變量不能被用于圖像繪制2. thread 指向每個線程準(zhǔn)備的地址空間. 在其他線程是不可見切不可用*/ kernel void CCTestFouncitionF(threadgroup float *a) {// 在線程組地址空間分配一個浮點類型變量xthreadgroup float x;// 在線程組地址空間分配一個10個浮點類型數(shù)的數(shù)組y;threadgroup float y[10];}
四、constant:常量地址空間修飾符
  • 常量地址空間指向的緩存對象也是從設(shè)備內(nèi)存池分配存儲,僅可讀;
  • 在程序域的變量必須定義在常量地址空間并且聲明時初始化,用來初始化的值必須是編譯時的常量;
  • 在程序域的變量的生命周期和程序一樣,在程序中的并行計算著色函數(shù)或者圖形繪制著色函數(shù)調(diào)用,但是constant的值會保持不變;
  • 常量地址空間的指針/引用可以作為函數(shù)的參數(shù),向聲明為常量的變量賦值會產(chǎn)生編譯錯誤;
  • 聲明常量但是沒有賦予初值也會產(chǎn)生編譯錯誤;
constant float samples[] = { 1.0f, 2.0f, 3.0f, 4.0f };// 對一個常量地址空間的變量進(jìn)行修改也會失敗,因為它只讀 sampler[4] = {3,3,3,3}; //編譯失敗; // 定義為常量地址空間聲明時不賦初值也會編譯失敗 constant float a;
五、thread:線程地址空間修飾符
  • 線程地址空間指向每個線程準(zhǔn)備的地址空間,也是在GPU中,該線程的地址空間定義的變量在其他線程不可見(即變量不共享);
  • 在圖形繪制著色函數(shù) 或者 并行計算著色函數(shù)中聲明的變量,在線程地址空間分配存儲;
kernel void CCTestFouncitionG(void) {// 在線程空間分配空間給x,pfloat x;thread float p = &x; }

內(nèi)建變量修飾符

  • [[vertex_id]] :頂點id標(biāo)識符,并不由開發(fā)者傳遞;
  • [[position]]: 在頂點著色函數(shù)中,表示當(dāng)前的頂點信息,類型是float4; 還可以表示描述了片元的窗口的相對坐標(biāo)(x,y,z,1/w),即該像素點在屏幕上的位置信息;
  • [[point_size]] :點的大小,類型是float;
  • [[color(m)]] :顏色,m在編譯前就必須確定;
  • [[stage_in]] :片元著色函數(shù)使用的單個片元輸入數(shù)據(jù)是由頂點著色函數(shù)輸出然后經(jīng)過光柵化生成的(即由頂點著色函數(shù)之后的顏色傳遞到片元著色函數(shù)),類似于GLSL中的varying傳遞紋理/顏色;
    頂點和片元著色器函數(shù)都只能有一個參數(shù)被聲明為使用stage_in修飾符(即有且僅有一個);
    對于一個使用了stage_in修飾符的自定義結(jié)構(gòu)體,其成員可以為一個整型/浮點類型標(biāo)量,或是整型/浮點類型向量。
// 定義了片元輸入的結(jié)構(gòu)體 struct MyFragmentOutput {// color attachment 0 顏色附著點0float4 clr_f [[color(0)]]; // color attachment 1 顏色附著點1int4 clr_i [[color(1)]]; // color attachment 2 顏色附著點2uint4 clr_ui [[color(2)]]; };fragment MyFragmentOutput my_frag_shader( ... ) {MyFragmentOutput f;....f.clr_f = ...;....return f; }

總結(jié)

以上是生活随笔為你收集整理的Metal之Shading Language Specification(着色语言规范)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人香蕉视频在线观看 | 无码一区二区三区 | 中文无码一区二区三区在线观看 | 国产精品美女在线观看 | 亚洲天天操 | www.男人天堂 | 成年人网站免费视频 | 亚洲AV无码精品一区二区三区 | 国产又爽又黄游戏 | 亚洲在线观看一区二区 | 91看片成人 | 狠狠干2019| 久久久久一级 | 成年人在线免费看 | 日本激情视频一区二区三区 | 麻豆porn| 女生隐私免费看 | 黄色网免费观看 | 欧美亚洲激情视频 | 国产三级伦理片 | 91美女片黄在线观看 | 亚洲欧洲视频在线观看 | 亚洲三级黄色 | 黄片毛片在线 | 日韩精品1区2区 | www.久久婷婷 | 182av| 免费吸乳羞羞网站视频 | 国产91综合一区在线观看 | 性视频在线 | 男人天堂久久久 | 国产精品一区网站 | 小泽玛丽亚在线观看 | 亚洲国产不卡 | 日韩色中色| 少妇精品无码一区二区三区 | 狠狠干免费视频 | 麻豆视频免费网站 | 69超碰| 日本黄色成人 | 亚洲一区精品视频在线观看 | 国内视频一区二区 | 福利精品| 992tv人人草 国产第6页 | 国产乡下妇女三片 | 国产精品熟女久久久久久 | 日日噜噜噜噜人人爽亚洲精品 | 伊人66 | xxx69美国 | 蜜臀免费av | 538任你躁在线精品免费 | 操你妹影院| 第一页在线| 日韩欧美在线一区二区三区 | 欧美日韩高清一区二区 国产亚洲免费看 | 精品美女一区二区三区 | 欧美自拍偷拍一区 | bl无遮挡高h动漫 | 亚洲影视网 | 国产激情视频在线 | 国产做爰免费视频观看 | 国产免费叼嘿网站免费 | 麻豆精品久久久久久久99蜜桃 | 色妞综合 | c逼| 成人人人人人欧美片做爰 | 骚黄网站| 天天插插插 | 国语播放老妇呻吟对白 | 欧美老熟妇乱大交xxxxx | 亚洲男女av | 欧美片在线观看 | 97福利网 | 国产日韩精品在线观看 | 久久久视频在线观看 | 怒海潜沙秦岭神树 | 日韩小视频在线观看 | 成人伊人网站 | 国产福利一区二区三区在线观看 | 亚洲a一区二区 | 成人毛片网 | 日韩欧美在线观看 | 欧美91精品久久久久国产性生爱 | 成人区人妻精品一熟女 | 风韵丰满熟妇啪啪区老熟熟女 | 日本视频在线观看免费 | 第一章婶婶的性事 | 韩国成年人网站 | 一级片视频网站 | 国产色无码精品视频国产 | 精品免费视频一区二区 | 久久精品导航 | 国产精选第一页 | 欧美啪啪网站 | 久久久久亚洲av片无码v | 国产精品福利网站 | 日韩最新视频 | 狠狠丁香 | wwwav网站|