• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    GPU based techniques for deep image merging

    2018-10-17 07:04:20JesseArcherGeoffLeachandRonvanSchyndel
    Computational Visual Media 2018年3期

    Jesse Archer(),Geoff Leach,and Ron van Schyndel

    AbstractDeep images store multiple fragments perpixel,each of which includes colour and depth,unlike traditional 2D flat images which store only a single colour value and possibly a depth value.Recently,deep images have found use in an increasing number of applications,including ones using transparency and compositing.A step in compositing deep images requires merging per-pixel fragment lists in depth order;little work has so far been presented on fast approaches.

    Keywords deep image;composite;GPU;performance

    1 Introduction

    This paper explores time and memory performance of storing and merging deep images on the GPU using OpenGL and GLSL.We assume the deep images are stored in graphics memory,leaving broader investigation of approaches which include reading deep images from persistent storage for future work.

    A topic of increasing interest[1,2],deep image compositing presents new opportunities and challenges compared to standard image compositing.Among these challenges is performance,as compositing many fragments per-pixel per-image requires more processing than just a single fragment per-pixel.GPUs are naturally suited for this task.

    Merging two deep images(see Fig.1)requires first loading them to GPU global memory,either entirely if possible,or in large blocks.Per-pixel threads then read data from both deep images,merging and compositing fragments to produce a final 2D( flat)image,or alternatively merging and saving the resulting deep image before compositing.The resulting deep image can then be used in other deep image operations,such as further merging in an iterated pairwise ork-way fashion.This paper specifically focuses on merging two deep images,either to give a merged result or for iterated pairwise merging,leaving the problem ofk-way deep image merging for future work.

    A simple merging approach is to step through fragment data in sorted order for both deep images,comparing fragments from each based on depth,and compositing before moving to the next fragment,using a basic linear time per-pixel stepwise merge of two sorted lists.Our approach improves on this by reading and processing blocks of data using registers.

    Deep images are typically stored in graphics memory using one of two main formats for GPU processing:as per-pixel linked lists,or as linearised arrays of fragments.We explore differences between these approaches in terms of memory usage and processing time;linked lists require more memory while linearised arrays require more processing during construction.We also explore an interleaved array format which improves performance of deep image merging through better memory read coherence.We investigate performance of merging deep images in graphics memory using a stepwise approach,and an improved approach using blocks of registers.Finally we introduce a blocked interleaved array format which leverages blocked merging to give a combined 2 to 6 fold performance improvement.

    Fig.1 Merged interior and exterior Atrium deep images.

    2 Related work

    Storing deep images in GPU memory as linked lists and linearised arrays has been explored in the context of transparency rendering in computer graphics[3,4].Linked lists have been found to generally provide better performance for processing data,while linearised arrays use less memory.Using fast GPU registers for sorting deep image data was presented in Ref.[5],a concept that this work extends.General image compositing operations werefirst proposed in Ref.[6],and recently expanded to deep images[2,7],using the OpenEXR format[8]for external storage. Such work focuses on how composite operations are performed.Performance of compositing deep images in memory on the GPU using different merging approaches and storage formats has to our knowledge not been presented,and is the focus of this work.

    3 Background

    3.1 Deep image formats

    Arranging fragment data into appropriate buffers in memory is critical for fast processing on the GPU.As mentioned earlier,two main approaches exist:perpixel linked lists and linearised arrays.

    Building a deep image as per-pixel linked lists requires a global atomic counter and the allocation of three storage buffers,with one integer per-pixel for the head pointers and then buffers of arbitrary size for fragment data and next pointers.The head pointers are initialised to null(0)before rendering.If the size is too small to store all fragment data,then the atomic counter is used to allocate buffers of sufficient size before re-rendering.

    As geometry is rasterized,fragments are added to the data array using a global atomic counter,and appended to the corresponding pixel’s list using an atomic exchange which inserts the fragment at the front of the list.The fragment’s next pointer is then set to the previous head node.In this fashion fragments are continuously added to the head of the corresponding pixel’s linked list.Example GLSL code for adding fragment data to a linked list,and traversing it,is shown below:

    //Building a linkedlist uintfragIdx=atomicCounterIncrement(count);if(fragIdx<size){uintheadIdx=atomicExchange(headPtrs[pixel],fragIdx);nextPtrs[fragIdx]=headIdx;data[fragIdx]=frag;}//Traversing a linkedlist uintnode=headPtrs[pixel];while(node!=0)node=nextPtrs[node];

    Building a deep image can be done quickly,as fragments can be written to the next available place as they are rendered or captured.Traversing a pixel’s fragment list starts at the index given by the pixel’s head pointer,and follows each fragment’s next pointer respectively until a null terminator is reached.

    Merging two deep images and saving the resulting merged deep image in this format reverses the order of the per-pixel fragment lists,as fragment data is,always added to the head of the list.This must be accounted for in the next merge or composite step.

    Figure 2 shows per-pixel fragment colours stored as linked lists using three separate buffers with blue/red/green,blue/green,and blue/red fragment colours for the bottom left,bottom right,and top left pixels respectively.Fragments for a given pixel can be anywhere in the data buffer.

    Linearised arrays require only two buffers:see Fig.3,which shows the same per-pixel fragment colours as Fig.2.Unlike the linked-list approach in which fragment data can be anywhere,in linearised arrays,fragment data for a given pixel is coherent:it is localised with all fragments for a given pixel stored contiguously.

    Building a deep image in this format may be summarized as follows:

    · Allocate buffer of per-pixel counts,initialised to zero.

    ·Render geometry depths and atomically increment counts in the fragment shader in an initial rendering pass.

    Fig.2 Per-pixel blue/red/green,blue/green,and blue/red fragment colours as linked lists.

    Fig.3 Per-pixel blue/red/green,blue/green,and blue/red fragment colours as linearised arrays.

    · Perform parallel prefix sums scan on counts to produce an array of offsets.These determine the location of each pixel’s memory in the global data array.

    · Allocate data buffer of size given by final offset.

    · Render full geometry data in a second rendering pass;offsets are atomically incremented in the fragment shader to give the location at which each fragment is written in the data buffer.

    Traversing a pixel’s fragment data requires reading the index offset and number of fragments,given by subtraction from the next pixel’s offset,then reading the fragment data sequentially.Example GLSL code is given below for adding fragment data to a linearised array,and traversing it;note that the same buffer is used for both counts and offsets:

    //Countingthenumber offragments per-pixel atomicAdd(offsets[pixel],1);//Buildingthelinearisedarray.uintidx=atomicAdd(offsets[pixel],1);data[idx]=frag;//Traversingthearray uintstart=pixel>0?offsets[pixel-1]:0;uintend=offsets[pixel];for(uintnode=start;node<end;node++)...

    Building a deep image in this format is typically slower,as it requires computing offsets from per-pixel fragment counts in a separate initial counting pass before writing fragment data in a second capturing pass.However,it requires less memory as there are no next pointers.

    Deep image compositing requires fragment lists in depth sorted order.As mentioned in Section 2,the currently fastest technique for deep image sorting is register-based block sort[5]which uses a sorting network of fast registers.In cases where lists are longer than the number of available per-thread registers,backwards memory allocation[9]partitions the sort into blocks.This combined approach is used for sorting deep images in this paper.

    3.2 Memory hierarchy

    Deep images can be large;on the GPU,pixels are processed per-thread in parallel.GPUs have a hierarchy of memory as shown in Fig.4,with a large amount of relatively slow global memory,and a smaller amount of fast memory such as local memory,and then an even smaller number of very fast registers.On the nVidia Pascal architecture,local memory(CUDA shared L1 memory)and registers are available per-streaming multiprocessor(SM)while global memory(CUDA local memory)and L2 cache are available to all threads.

    Fig.4 Example memory hierarchy of an nVidia GPU.

    As stated previously,compositing deep images requires first loading or capturing them to slow global memory.Global memory has high latency,particularly as fragment reads are not necessarily coherent. A stepping approach that reads then composites before reading the next fragment in turn is highly vulnerable to this latency.

    Processing data by reading blocks from slow to fast memory is an established concept,and applies to merging.One approach is to merge blocks of data by reading fragments from global memory to local memory before compositing,reducing the impact of latency.Using blocks of local memory requires copying data from global to local memory,then reading from local memory to perform the comparison and composition operations in registers.

    Registers are much faster than global and local memory. GPUs typically have on the order of thousands of registers,typically 255 per-thread or core,so fragments can be read to per-thread blocks of registers directly rather than to local memory first.This has the benefit of both reducing the impact of latency,and avoiding writing to and then reading from local memory.

    4 Deep image merging

    4.1 Register block merging

    The merging operation is performed by reading blocks of data directly from global memory to fast registers,bypassing local memory.We term this approach register block merging(RBM).It is summarised in the following steps,which performs a stepwise merge,reading to blocks of registers:

    · Begin with two per-pixel sorted fragment lists and two register blocks,one for each deep image.

    · If either register block is empty,read values from the corresponding deep image.

    · Merge values in both blocks in depth order until one block is exhausted.

    · Merged data is either written to an output deep image,or composited to a flat(2D)image.

    · After exhausting one fragment list,merge the remaining block and fragment values from the other list.

    Local variables or arrays with fixed indices known at compile time must be used in order to ensure that the GLSL compiler will store fragments in fast GPU registers.Code examples for reading fragment data from a deep image are shown below,along with the intermediate shader assembly output produced by the nVidia compiler,based on a similar example given in Ref.[5]:

    //Localmemory#defineSIZE 4 Fragmentdata[SIZE];uniformintcount;//Looplimitnotknown atcompiletime for(int i=0;i<count;i++)data[i]=readNext(...);produces:...TEMPlmem0[4];TEMP RC,HC;...MOV.S R0.x,{0,0,0,0};REP.S;SGE.S.CC HC.x,R0,c[0].x;BRK(NE.x);MOV.U R0.y,R0.x;MOV.S lmem0[R0.y].x,{0,0,0,0};ADD.S R0.x,R0,{1,0,0,0};ENDREP;...//Registers#defineSIZE 4 Fragmentdata[SIZE];uniformintcount;//Looplimitknown atcompiletime for(int i=0;i<count&&i<SIZE;i++)data[i]=readNext(...);produces:...TEMP R0,R1,R2,R3;TEMP RC,HC;...SLT.S R0.y,{0,0,0,0}.x,c[0].x;MOV.U.CC RC.x,-R0.y;IF NE.x;

    MUL.S R0.y,0,c[0].x;MUL.S R0.y,R0,{4,0,0,0}.x;MOV.U R0.y,R0;SLT.S R0.z,{1,0,0,0}.x,c[0].x;MOV.U.CC RC.x,-R0.z;LDB.S32 R3.x,sbo_buf0[R0.y];...ENDIF;...

    The first program iterates a number of times determined at runtime and therefore the loop cannot be unrolled at compile time.As register usage is decided at compile time,registers cannot be used in this case and local memory is used instead,seen by thelmem0[8]local memory allocation.The use of registers requires either manual loop unrolling or use of a bounding compile-time constant,as shown byR0,R1,R2,R3in the second example.The same unrolling technique is used when reading and merging.A block of registers can also be used when writing the merged deep image,although we found this to be faster only when using linearised arrays.

    As GPUs keep all active threads resident,the number of threads that can be scheduled and executed simultaneously is limited by available per-thread resources such as local memory and registers.However,instead of threads causing waiting when reading from global memory,other threads are executed to reduce the impact of memory latency and increase throughput.This means GPUs typically have many more active threads than available cores.Storing fragments in per-thread registers reduces the number of possible simultaneous threads.To achieve greater throughput this needs to be balanced by keeping block sizes relatively small,typically using 4 to 16 fragments.

    4.2 Interleaved arrays

    Instead of using linked lists and linearised arrays to store deep images,a faster technique is to use interleaved arrays.GPUs execute threads in groups,where instructions across the group are executed in lock-step.This means the first fragment for each pixel in a thread group is processed before the second fragment.Improved memory performance requires coherent memory reads for fragment data in a thread group,rather than for each individual pixel.Arranging fragment data in order of per-group reads instead of per-pixel reads improves memory coherence.

    One approach is to interleave fragment data across groups for all pixels,based on the group’s maximum fragment count.This requires padding each group so that all lists have the same length,consequently increasing memory requirements;this was by a factor of 2–3 for our test scenes.We instead interleave up to the shortest fragment list for any pixel in a group,with remaining fragments stored at the end of each group with no padding as shown in Fig.5.

    Building a deep image in this format is done in a similar way to the approach used for a linearised array,and requires an extra buffer for per-group minimum counts,and a buffer of per-pixel counts in addition to the offsets:

    · Minimum counts are allocated as number of pixels divided by 32,initialised to zero.

    · Per-pixel counts are determined in the same manner.

    · Compute threads are executed for each group of 32 pixels,each thread determining and writing the minimum count of its respective group to the minimum counts buffer.

    · The prefix sums scan then computes per-pixel offsets from per-pixel counts as for the linearised arrays case,and allocates a data buffer of sufficient size.

    · Complete geometry is rendered in a second pass and saved as for linearised arrays,but with modified indexing.

    Example GLSL code for adding fragment data to and traversing an interleaved array is given below:

    //Addingdata to aninterleavedarray#defineGROUP_SIZE32 uintrun=pixel%GROUP_SIZE;uintgroup=pixel/GROUP_SIZE;uintgroupOffset=offsets[group*GROUP_SIZE];uintminCount=minCounts[group];uintcurrCount=atomicAdd(counts[pixel],1);if(currCount<minCount)data[groupOffset+run+GROUP_SIZE*currCount]=frag;else{uintadjst=offsets[pixel]-minCount*run;data[minCount*GROUP_SIZE+adjst+(currCount-minCount)]=frag;}//Traversinganinterleavedarray.uintinterOffset=(pixel%GROUP_SIZE)+offsets[(pixel/GROUP_SIZE)*GROUP_SIZE];uintextraOffset=offsets[pixel]-minCounts[pixel/GROUP_SIZE]*(pixel%GROUP_SIZE);uintminCount=minCounts[pixel/GROUP_SIZE];uintend=counts[pixel];for(uintnode=0;node<end;node++)if(node<minCount)uintidx=interOffset+GROUP_SIZE*node;else uintidx=minCount*GROUP_SIZE+extraOffset+node-minCount;

    Fig.5 Per-pixel blue/red/green,blue/green,blue/red,and green/red fragment colours as an interleaved array.

    4.3 Blocked interleaving

    When using register block merging,coherence is further improved by interleaving fragments in blocks rather than individually when generating deep image data:see Fig.6. This means the first block of fragments for the first pixel is written to the deep image,then the first block for the second pixel in turn.The same block size is used when building and merging the deep images.With blocked interleaving,the per-group minimum counts must be a multiple of the block size,which can result in more noninterleaved fragments stored at the end.

    Building a deep image in this format follows the same approach as for an interleaved array,with modified indexing in the fragment shader,as shown below:

    //Addingdata to a blockedinterleavedarray....#defineBLOCK_SIZE 4 if(currCount<minCount)data[groupOffset+(currCount/BLOCK_SIZE)*GROUP_SIZE*BLOCK_SIZE+run*BLOCK_SIZE+currCount%BLOCK_SIZE]=frag;else{uintadjst=offsets[pixel]-minCount*run;data[minCount*GROUP_SIZE+adjst+(currCount-minCount)]=frag;}//Traversing a blockedinterleavedarray....for(uintnode=0;node<end;node++)if(node<minCount)idx=groupOffset+(node/BLOCK_SIZE)*GROUP_SIZE*BLOCK_SIZE+run*BLOCK_SIZE+node%BLOCK_SIZE;else idx=minCount*GROUP_SIZE+extraOffset+node-minCount;

    Fig.6 Per-pixel blue/red/green,blue/green,blue/red,and green/red fragment colours as a blocked interleaved array with block size 2.

    If the final result is written back to global memory,compute threads can be executed in order of memory layout.However,if the resulting image is rasterized,then threads are instead executed in pixel rasterization order.nVidia GPUs typically rasterize pixels in a tile-based fashion,where a 2×8 tile is rasterized in a zig-zag pattern.Figure 7 shows the rasterization order for a 4×8 block of pixels;numbers represent execution order of per-pixel fragment shader threads as determined by atomic counters.Indexing pixels to more closely match the repeating 2×8 tiled raster pattern when building the deep image improves merging performance by approximately 1.5 to 2 fold for all approaches.

    Fig.7 Typical thread execution order(raster pattern)for a 4×8 block of pixels on an nVidia GPU.

    5 Results

    We compare performance of merging two deep images using three different scenes:see Fig.8.Additionally we compare an iterated pairwise merge,where four deep images arefirst merged to give the two deep images shown,before merging the two resulting deep images.

    The first and second scenes are the Sponza Atrium and the Powerplant,each separated into interior and exterior deep images.The third referred to as the Hairball,is a synthetic scene of a hairball merged with a set of randomly generated spheres.These scenes are available from Ref.[10].Not shown is another synthetic scene referred to as the Planes,which has 256 screen-aligned quads with linked list data in approximately coherent order merged with a set of randomly generated spheres.For all measurements,deep image data is arranged in raster pattern,which is 1.5–2 times faster for all test cases.

    Fig.8 Test scenes with separated and merged deep images.Heatmap gives depth complexity with blue up to 16 fragments,green 16–64,yellow 64–128,and red 128–512.

    The Atrium scene typically has fewer than 20 per-pixel fragments in each deep image,while the other scenes have up to hundreds. The Atrium and Powerplant are divided mainly into interior and exterior geometry.Thus,as merging progresses,data is mainly read from one deep image then the other in turn.The Hairball and Planes have spheres randomly distributed,with memory being read more evenly across both deep images as a consequence.

    The storage approaches discussed in Sections 3 and 4 were compared:linked lists(LLs),linearised arrays(LAs),interleaved linearised arrays(IAs),and blocked interleaved linearised arrays(BIAs).Merging techniques were stepwise(S)and register block merging(RBM).The test platform was an nVidia GeForce GTX 1060,driver version 390.25.The deep images were HD(1920×1080)resolution.For each technique we report memory usage for the deep images and total merging time in milliseconds.We do not report the memory cost of RBM or stepwise merging,as these techniques do not require extra global memory.

    Results for compositing when merging two deep images are shown in Table 1,while those for merging and saving the resulting merged deep image are shown in Table 2.Iterated pairwise merging results are shown in Table 3 for the Atrium and Powerplant scenes,with geometry divided into two interior and two exterior deep images.

    Results are average time from rendering and capturing scenes as separate deep images on the GPU and then merging;merge time reported includes either compositing a flat(2D)image or saving the resulting deep image.

    The results in Tables 1–3 show RBM offers up to 4-fold performance improvement in the best case and no performance penalty in the worst case,regardless of whether compositing during merging,saving the merged image or using pairwise merging.This is due to memory latency for incoherent reads being reduced by reading memory in blocks.The largest performance improvement by RBM is for linearised arrays and blocked interleaved arrays,as block memory reads are typically more coherent in these formats.RBM offers a smaller performance improvement for mostly coherent data,or when there is little data to merge,as in the Atrium scene.

    Blocked interleaved arrays are faster thaninterleaved arrays when compositing,regardless of whether RBM or stepwise merging is used,being up to 1.3 times faster in the case of the Planes.When saving the merged deep image or using pairwise merging,blocked interleaved arrays are only faster when combined with RBM.

    Table 1 Merging time for two input deep images,compositing during merging

    Table 2 Merging time for two input deep images,saving result as a deep image

    Table 3 Merging time for four input deep images using iterated pairwise merging

    RBM is more effective with blocked interleaved arrays,as memory is specifically arranged to improve this approach.Compared to the worst case approach of each scene,BIA-RBM gives a 2 to 6 fold performance improvement.This improvement is less significant in the Atrium scene where less geometry is present and thus fewer merging operations performed.

    When saving the merged deep image or using an iterated pairwise approach,linked lists are typically faster for the Atrium scene.Saving a deep image using linearised arrays,interleaved arrays,or blocked interleaved arrays requires first building an array of offsets before writing any fragment data,unlike linked lists for which next pointers and fragments are written simultaneously.The cost of first building the offsets is outweighed by any potential merging improvements when less geometry is present.

    Linearised arrays use less space than other formats as shown in Table 4,while interleaved arrays and blocked interleaved arrays require a little more due to the per-group minimum fragment counts,which depend on image resolution.Linked lists use the most memory in all cases,as expected,due to the next pointers.In all cases RBM and stepwise merging require no extra global memory.

    Table 4 Data usage for different deep image formats

    6 Conclusions

    This paper has presented RBM and shown it to be a better merging approach,and has shown blocked interleaved arrays to be a better deep image format.It has also explored and compared stepwise merging and other existing deep image formats.Interleaved deep images have little memory overhead and fast merging time due to improved memory coherence,while register block merging improves performance of merging fragment data.Combined,these approaches give up to 2 to 6 fold performance improvement compared to non-interleaved stepwise merging.

    The interleaved arrays and blocked interleaved arrays approaches interleave fragment data based on per-group minimum fragment counts,with all remaining fragments stored in a non-interleaved linear fashion.Interleaving remaining fragment data past the minimum fragment list length without padding may offer further performance improvement.As iterated pairwise merging requires multiple writes to global GPU memory,an alternative is to usekway merging which we suspect may offer improved performance as it only writes to global memory once per-fragment.

    Acknowledgements

    The authors would like to thank Pyar Knowles for his original deep image software on which this work is based.It is available athttps://github.com/pknowles/lfb.

    免费女性裸体啪啪无遮挡网站| 五月天丁香电影| 91老司机精品| 午夜精品久久久久久毛片777| 91国产中文字幕| 91成人精品电影| 纯流量卡能插随身wifi吗| 老熟妇乱子伦视频在线观看| 女性被躁到高潮视频| 国产男女内射视频| 欧美日韩亚洲国产一区二区在线观看 | 老司机午夜福利在线观看视频 | 中文字幕最新亚洲高清| 国产亚洲欧美精品永久| 日本vs欧美在线观看视频| 中文字幕另类日韩欧美亚洲嫩草| 国产三级黄色录像| 又紧又爽又黄一区二区| 热re99久久国产66热| 丰满人妻熟妇乱又伦精品不卡| 91麻豆av在线| 露出奶头的视频| 亚洲av电影在线进入| 在线观看免费视频网站a站| 久久精品亚洲精品国产色婷小说| 国产99久久九九免费精品| 日本wwww免费看| 91麻豆av在线| 久久午夜亚洲精品久久| 视频区图区小说| 一进一出好大好爽视频| 三上悠亚av全集在线观看| 国产一区二区三区视频了| 色婷婷久久久亚洲欧美| 亚洲熟女毛片儿| 大型黄色视频在线免费观看| 亚洲午夜精品一区,二区,三区| www日本在线高清视频| 精品久久久精品久久久| 久久精品亚洲精品国产色婷小说| 热re99久久国产66热| 99精品在免费线老司机午夜| 亚洲国产欧美在线一区| 少妇的丰满在线观看| 日本wwww免费看| 国产一区二区在线观看av| 麻豆国产av国片精品| 极品人妻少妇av视频| 欧美精品一区二区免费开放| 欧美精品一区二区大全| 久久精品人人爽人人爽视色| 人人妻人人澡人人爽人人夜夜| 亚洲精品国产区一区二| 欧美精品亚洲一区二区| 久久人人爽av亚洲精品天堂| www.精华液| 国产色视频综合| 日本一区二区免费在线视频| av片东京热男人的天堂| 最新在线观看一区二区三区| 久久精品国产亚洲av高清一级| 免费高清在线观看日韩| 亚洲欧美色中文字幕在线| 国产不卡av网站在线观看| 999久久久精品免费观看国产| 久久久精品区二区三区| 免费久久久久久久精品成人欧美视频| 高清在线国产一区| 久久性视频一级片| 18禁黄网站禁片午夜丰满| 久久性视频一级片| 国产精品亚洲av一区麻豆| 久久人妻av系列| 一夜夜www| 精品免费久久久久久久清纯 | 99国产极品粉嫩在线观看| 十八禁高潮呻吟视频| 极品少妇高潮喷水抽搐| 日韩一区二区三区影片| 妹子高潮喷水视频| 黑人巨大精品欧美一区二区mp4| 一区二区三区激情视频| 曰老女人黄片| netflix在线观看网站| 国产成人av激情在线播放| 一本综合久久免费| 久久国产亚洲av麻豆专区| 桃花免费在线播放| 精品欧美一区二区三区在线| 日本vs欧美在线观看视频| 男女高潮啪啪啪动态图| 免费久久久久久久精品成人欧美视频| 精品午夜福利视频在线观看一区 | 无限看片的www在线观看| 最近最新中文字幕大全电影3 | 人妻久久中文字幕网| 久久99一区二区三区| 日韩视频一区二区在线观看| 黄频高清免费视频| 欧美精品高潮呻吟av久久| 久久久欧美国产精品| 久久中文看片网| 日本五十路高清| 两性午夜刺激爽爽歪歪视频在线观看 | 美女高潮到喷水免费观看| 一个人免费在线观看的高清视频| 在线观看免费视频网站a站| 亚洲中文av在线| 国产伦理片在线播放av一区| 国产高清激情床上av| 日韩 欧美 亚洲 中文字幕| 国产高清视频在线播放一区| 日韩欧美一区二区三区在线观看 | 亚洲三区欧美一区| 国产精品1区2区在线观看. | 日韩大码丰满熟妇| 国产一区二区三区综合在线观看| 少妇裸体淫交视频免费看高清 | 欧美黄色淫秽网站| 黄色视频在线播放观看不卡| 欧美一级毛片孕妇| 人人妻人人添人人爽欧美一区卜| 一本久久精品| 窝窝影院91人妻| 五月天丁香电影| 午夜日韩欧美国产| 久久国产精品人妻蜜桃| 亚洲色图综合在线观看| 国产精品99久久99久久久不卡| 国产欧美日韩一区二区三区在线| 亚洲国产欧美日韩在线播放| 男人舔女人的私密视频| 搡老岳熟女国产| 欧美在线黄色| 免费在线观看影片大全网站| 天天躁夜夜躁狠狠躁躁| 美女福利国产在线| 亚洲国产欧美网| 国产亚洲欧美精品永久| 99精品在免费线老司机午夜| 国产男女内射视频| 9191精品国产免费久久| 中文字幕人妻熟女乱码| 99香蕉大伊视频| 欧美一级毛片孕妇| 王馨瑶露胸无遮挡在线观看| av国产精品久久久久影院| 我要看黄色一级片免费的| 色视频在线一区二区三区| 大片免费播放器 马上看| 欧美国产精品va在线观看不卡| 天天躁夜夜躁狠狠躁躁| 久久久国产欧美日韩av| 精品人妻在线不人妻| 精品国产乱码久久久久久男人| 午夜福利在线观看吧| 18禁裸乳无遮挡动漫免费视频| 一本—道久久a久久精品蜜桃钙片| 如日韩欧美国产精品一区二区三区| 久久久久久亚洲精品国产蜜桃av| 亚洲第一欧美日韩一区二区三区 | 91精品国产国语对白视频| 国精品久久久久久国模美| 91精品国产国语对白视频| 免费在线观看日本一区| 高清欧美精品videossex| 精品高清国产在线一区| 午夜两性在线视频| 亚洲成人免费电影在线观看| 两性午夜刺激爽爽歪歪视频在线观看 | 巨乳人妻的诱惑在线观看| 日韩视频在线欧美| 久久中文看片网| 亚洲专区国产一区二区| 欧美av亚洲av综合av国产av| 黑人巨大精品欧美一区二区蜜桃| 一边摸一边做爽爽视频免费| 99re在线观看精品视频| 欧美黑人精品巨大| 在线永久观看黄色视频| 亚洲精品国产区一区二| 考比视频在线观看| 亚洲成av片中文字幕在线观看| a级片在线免费高清观看视频| 国产精品久久久久久人妻精品电影 | 国产欧美日韩综合在线一区二区| 亚洲精华国产精华精| 人妻久久中文字幕网| 一区二区三区国产精品乱码| e午夜精品久久久久久久| 久久热在线av| 久久国产亚洲av麻豆专区| 777久久人妻少妇嫩草av网站| www.自偷自拍.com| 国产精品麻豆人妻色哟哟久久| 亚洲专区国产一区二区| 亚洲伊人色综图| 人人妻,人人澡人人爽秒播| 国产视频一区二区在线看| 国产精品久久久av美女十八| 午夜免费成人在线视频| 在线永久观看黄色视频| 在线观看人妻少妇| 亚洲精品粉嫩美女一区| 欧美日本中文国产一区发布| 女性生殖器流出的白浆| 大型av网站在线播放| 国产av精品麻豆| 国产在线观看jvid| 国产成人欧美| 少妇被粗大的猛进出69影院| 日韩熟女老妇一区二区性免费视频| 91av网站免费观看| 欧美日韩福利视频一区二区| 久久这里只有精品19| 欧美精品av麻豆av| 亚洲av国产av综合av卡| 中文字幕色久视频| 黑人操中国人逼视频| 老司机深夜福利视频在线观看| 美女视频免费永久观看网站| 亚洲国产欧美网| 亚洲精品在线观看二区| 国产在线观看jvid| 国产精品久久久av美女十八| 亚洲中文av在线| videosex国产| 无人区码免费观看不卡 | av在线播放免费不卡| 免费高清在线观看日韩| 欧美日韩一级在线毛片| 欧美另类亚洲清纯唯美| 法律面前人人平等表现在哪些方面| 欧美精品av麻豆av| 王馨瑶露胸无遮挡在线观看| 国产深夜福利视频在线观看| av在线播放免费不卡| 欧美激情高清一区二区三区| 欧美人与性动交α欧美精品济南到| 91麻豆精品激情在线观看国产 | 精品卡一卡二卡四卡免费| 999久久久国产精品视频| 老熟妇乱子伦视频在线观看| 女人被躁到高潮嗷嗷叫费观| 久久中文看片网| 啪啪无遮挡十八禁网站| 国产男女内射视频| 亚洲国产欧美在线一区| 不卡av一区二区三区| 国产淫语在线视频| 亚洲男人天堂网一区| 一区二区三区精品91| 精品熟女少妇八av免费久了| 欧美亚洲 丝袜 人妻 在线| 国产精品 欧美亚洲| 成年女人毛片免费观看观看9 | 一区二区av电影网| 欧美另类亚洲清纯唯美| 欧美国产精品va在线观看不卡| 亚洲av成人不卡在线观看播放网| 一边摸一边抽搐一进一出视频| 欧美黑人精品巨大| 欧美成人午夜精品| 精品国产一区二区三区四区第35| 欧美精品一区二区大全| 精品少妇黑人巨大在线播放| 午夜老司机福利片| 色综合欧美亚洲国产小说| 一本大道久久a久久精品| 777久久人妻少妇嫩草av网站| h视频一区二区三区| 黄片小视频在线播放| 亚洲精品自拍成人| 深夜精品福利| 欧美人与性动交α欧美精品济南到| 午夜激情久久久久久久| 一区在线观看完整版| 美女福利国产在线| 国产在线精品亚洲第一网站| 成人av一区二区三区在线看| 日韩三级视频一区二区三区| 日韩 欧美 亚洲 中文字幕| 国产成人av激情在线播放| 操美女的视频在线观看| 亚洲精品久久午夜乱码| 五月天丁香电影| 午夜精品国产一区二区电影| 午夜福利一区二区在线看| 一二三四社区在线视频社区8| 啪啪无遮挡十八禁网站| 十分钟在线观看高清视频www| 最新在线观看一区二区三区| 精品国产国语对白av| 黄网站色视频无遮挡免费观看| 午夜福利欧美成人| 免费高清在线观看日韩| 纵有疾风起免费观看全集完整版| 一边摸一边抽搐一进一小说 | 欧美国产精品va在线观看不卡| 18禁观看日本| 久久av网站| 中国美女看黄片| 色婷婷av一区二区三区视频| 久久人人爽av亚洲精品天堂| 12—13女人毛片做爰片一| 一进一出好大好爽视频| 亚洲av欧美aⅴ国产| 欧美一级毛片孕妇| netflix在线观看网站| 久久人人97超碰香蕉20202| 日韩欧美三级三区| 91成年电影在线观看| 黄色片一级片一级黄色片| 国精品久久久久久国模美| 精品一区二区三区视频在线观看免费 | 精品人妻1区二区| 日韩欧美三级三区| 国产福利在线免费观看视频| 亚洲伊人久久精品综合| 一级毛片精品| 一二三四在线观看免费中文在| 成人国产一区最新在线观看| 91字幕亚洲| 国产在线一区二区三区精| 午夜福利视频在线观看免费| 亚洲久久久国产精品| 色精品久久人妻99蜜桃| 伦理电影免费视频| 女同久久另类99精品国产91| 日韩欧美一区视频在线观看| 大型av网站在线播放| av网站在线播放免费| 咕卡用的链子| 亚洲美女黄片视频| 亚洲国产精品一区二区三区在线| 狂野欧美激情性xxxx| 欧美性长视频在线观看| 999久久久国产精品视频| 99精品欧美一区二区三区四区| 99国产精品一区二区蜜桃av | 日本a在线网址| 亚洲人成伊人成综合网2020| 天堂8中文在线网| 亚洲午夜精品一区,二区,三区| 久久久久久人人人人人| 亚洲国产看品久久| 日韩视频一区二区在线观看| 欧美成狂野欧美在线观看| 女人精品久久久久毛片| 丰满迷人的少妇在线观看| 国产亚洲一区二区精品| 国产精品麻豆人妻色哟哟久久| 欧美老熟妇乱子伦牲交| 精品福利永久在线观看| 精品国产乱码久久久久久小说| 亚洲avbb在线观看| 亚洲 欧美一区二区三区| 午夜日韩欧美国产| 在线观看www视频免费| 最近最新中文字幕大全免费视频| 夜夜骑夜夜射夜夜干| 午夜福利免费观看在线| 91精品国产国语对白视频| 国产欧美日韩精品亚洲av| 国产高清videossex| 精品一区二区三卡| 亚洲国产欧美在线一区| 国产真人三级小视频在线观看| aaaaa片日本免费| 三上悠亚av全集在线观看| 国产精品成人在线| 最近最新中文字幕大全免费视频| 一本综合久久免费| 中文字幕人妻丝袜制服| 香蕉久久夜色| 久久中文字幕一级| 一本大道久久a久久精品| 亚洲性夜色夜夜综合| 色播在线永久视频| 日韩视频一区二区在线观看| 女人爽到高潮嗷嗷叫在线视频| 国产精品九九99| 50天的宝宝边吃奶边哭怎么回事| 久久亚洲精品不卡| 午夜久久久在线观看| 国产真人三级小视频在线观看| 18禁裸乳无遮挡动漫免费视频| 涩涩av久久男人的天堂| 国产成人欧美在线观看 | 国产亚洲欧美在线一区二区| 99国产精品99久久久久| 精品久久久久久久毛片微露脸| 成人精品一区二区免费| 90打野战视频偷拍视频| 国产成人精品久久二区二区免费| 人人妻人人爽人人添夜夜欢视频| 亚洲欧美日韩高清在线视频 | 91九色精品人成在线观看| 性高湖久久久久久久久免费观看| 国产成人精品久久二区二区免费| 黄色视频,在线免费观看| 99九九在线精品视频| 精品国产一区二区三区久久久樱花| 欧美日韩国产mv在线观看视频| 精品国产一区二区三区久久久樱花| 一区二区三区乱码不卡18| 99国产综合亚洲精品| 99九九在线精品视频| 亚洲九九香蕉| 女性被躁到高潮视频| 纵有疾风起免费观看全集完整版| 在线观看66精品国产| 一级,二级,三级黄色视频| 在线观看免费视频日本深夜| 免费人妻精品一区二区三区视频| 999久久久精品免费观看国产| 成人黄色视频免费在线看| 少妇粗大呻吟视频| 极品人妻少妇av视频| 男女午夜视频在线观看| 久久精品国产99精品国产亚洲性色 | 欧美激情 高清一区二区三区| 久久热在线av| 国产三级黄色录像| 一本综合久久免费| 啪啪无遮挡十八禁网站| 建设人人有责人人尽责人人享有的| 欧美精品一区二区免费开放| svipshipincom国产片| 极品少妇高潮喷水抽搐| 可以免费在线观看a视频的电影网站| 国产xxxxx性猛交| 多毛熟女@视频| 1024香蕉在线观看| 高潮久久久久久久久久久不卡| 国产午夜精品久久久久久| 午夜日韩欧美国产| 久久99一区二区三区| 亚洲精品一卡2卡三卡4卡5卡| 久久天躁狠狠躁夜夜2o2o| 亚洲精品成人av观看孕妇| 一边摸一边抽搐一进一小说 | a级片在线免费高清观看视频| 国产一区二区 视频在线| 亚洲成av片中文字幕在线观看| 日日摸夜夜添夜夜添小说| 午夜福利在线免费观看网站| 欧美人与性动交α欧美软件| 色精品久久人妻99蜜桃| 丝袜在线中文字幕| 精品久久久久久电影网| 在线观看一区二区三区激情| 伦理电影免费视频| 19禁男女啪啪无遮挡网站| 国产免费视频播放在线视频| 狠狠婷婷综合久久久久久88av| 757午夜福利合集在线观看| 99国产精品一区二区蜜桃av | 两个人免费观看高清视频| 丰满迷人的少妇在线观看| 国产午夜精品久久久久久| 亚洲欧美一区二区三区久久| 精品福利永久在线观看| 亚洲熟女毛片儿| 日本av免费视频播放| 自线自在国产av| 十分钟在线观看高清视频www| 国产淫语在线视频| 久久久久精品国产欧美久久久| 久久av网站| 国精品久久久久久国模美| 俄罗斯特黄特色一大片| 手机成人av网站| 久久精品成人免费网站| 午夜精品国产一区二区电影| 国产精品亚洲av一区麻豆| 巨乳人妻的诱惑在线观看| 黑人猛操日本美女一级片| 中文字幕人妻丝袜一区二区| 窝窝影院91人妻| 日韩欧美免费精品| 精品福利观看| 午夜精品久久久久久毛片777| 女人高潮潮喷娇喘18禁视频| 亚洲avbb在线观看| 精品人妻熟女毛片av久久网站| 精品卡一卡二卡四卡免费| 久久99一区二区三区| 午夜两性在线视频| 精品一区二区三区四区五区乱码| 日韩精品免费视频一区二区三区| 午夜免费鲁丝| 少妇裸体淫交视频免费看高清 | 色婷婷久久久亚洲欧美| 午夜福利在线观看吧| 少妇 在线观看| 最新的欧美精品一区二区| 亚洲精品在线美女| 99久久国产精品久久久| 女人高潮潮喷娇喘18禁视频| 欧美成人免费av一区二区三区 | av免费在线观看网站| 超色免费av| 丝袜在线中文字幕| 日本vs欧美在线观看视频| 一个人免费看片子| 美女扒开内裤让男人捅视频| a级片在线免费高清观看视频| 久久人妻av系列| 19禁男女啪啪无遮挡网站| 9191精品国产免费久久| 亚洲国产精品一区二区三区在线| 亚洲三区欧美一区| 最黄视频免费看| 女人被躁到高潮嗷嗷叫费观| 两人在一起打扑克的视频| 精品亚洲乱码少妇综合久久| av网站在线播放免费| 国产欧美日韩一区二区三| 久久久久久久久免费视频了| 国产男女超爽视频在线观看| 国产成+人综合+亚洲专区| 满18在线观看网站| 欧美成人午夜精品| 亚洲一卡2卡3卡4卡5卡精品中文| 午夜精品国产一区二区电影| 成人国语在线视频| 国产日韩欧美在线精品| 成人三级做爰电影| 亚洲第一青青草原| 亚洲中文日韩欧美视频| 国产成人精品无人区| 亚洲欧美激情在线| 久热这里只有精品99| 国产av国产精品国产| 久久人妻熟女aⅴ| 少妇 在线观看| 欧美人与性动交α欧美精品济南到| 91成人精品电影| 伦理电影免费视频| 岛国毛片在线播放| 欧美 亚洲 国产 日韩一| 18在线观看网站| 嫩草影视91久久| 亚洲avbb在线观看| 久久久水蜜桃国产精品网| 咕卡用的链子| 99国产精品一区二区蜜桃av | 成人av一区二区三区在线看| 精品国产一区二区久久| 精品人妻1区二区| 极品人妻少妇av视频| 国产亚洲精品第一综合不卡| 大片电影免费在线观看免费| 18禁国产床啪视频网站| 日日爽夜夜爽网站| 久久人妻福利社区极品人妻图片| 久热爱精品视频在线9| 99香蕉大伊视频| 亚洲国产毛片av蜜桃av| 在线播放国产精品三级| 亚洲精品美女久久久久99蜜臀| 无限看片的www在线观看| 母亲3免费完整高清在线观看| 妹子高潮喷水视频| 精品久久久久久电影网| 国产真人三级小视频在线观看| 国产一区二区 视频在线| 亚洲av电影在线进入| 久久精品亚洲精品国产色婷小说| 久久精品成人免费网站| 悠悠久久av| 精品久久蜜臀av无| 亚洲男人天堂网一区| 啦啦啦在线免费观看视频4| 精品国产一区二区三区久久久樱花| 九色亚洲精品在线播放| 在线观看免费午夜福利视频| 巨乳人妻的诱惑在线观看| 9色porny在线观看| 中文字幕人妻丝袜制服| 黄网站色视频无遮挡免费观看| 精品久久久久久电影网| 国产av一区二区精品久久| 黄片播放在线免费| 国产精品av久久久久免费| 亚洲中文字幕日韩| 色婷婷av一区二区三区视频| 精品一品国产午夜福利视频| 国精品久久久久久国模美| 精品国产乱码久久久久久男人| 国产视频一区二区在线看| 免费在线观看黄色视频的| 国产淫语在线视频| 窝窝影院91人妻| 国产福利在线免费观看视频| 另类精品久久| 操美女的视频在线观看| 久热这里只有精品99| 日日爽夜夜爽网站| 天堂中文最新版在线下载| 不卡一级毛片| 成人国语在线视频| 高清视频免费观看一区二区| 欧美乱码精品一区二区三区| 亚洲一码二码三码区别大吗| 在线观看www视频免费| 精品久久久久久电影网| 久久毛片免费看一区二区三区| 一级毛片精品| 交换朋友夫妻互换小说| 午夜精品国产一区二区电影| 精品久久蜜臀av无| 捣出白浆h1v1| 色老头精品视频在线观看|