青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

歲月流轉,往昔空明

C++博客 首頁 新隨筆 聯系 聚合 管理
  118 Posts :: 3 Stories :: 413 Comments :: 0 Trackbacks

#

     摘要: 沒啥好說的,有圖有真相。上個逐像素光照的圖。
基本上編譯器的架構已經確定了,好多功能亟待實現。  閱讀全文
posted @ 2011-06-25 16:10 空明流轉 閱讀(2234) | 評論 (5)編輯 收藏

該項目簡報包含了近9個月SALVIA項目的工作進展。

 

項目與配置管理:

  • 源代碼管理系統由SVN更換至Mercurial。
  • SoftArt更名為SALVIA。工程、命名空間及相關文檔的更新將在Release之前完成。
  • SALVIA啟用了LOGO。LOGO在Release之前將視效果酌情調整。
  • 提交版本的LOG信息中啟用符合Issue Tracker的格式,使得版本更新可以反映到Issue中。
  • 添加了完整的Unit Test工程,并啟用Auto Test系統完成黑盒和回歸測試。
  • 合并了LLVM的源碼至版本庫中;LLVM升級至2.9并進行了適當修改以和Boost的類型系統相一致。
  • Boost升級至1.44或以上。
  • 添加了一個用于分析代碼行數的小工具。
  • 更新了部分文檔。

Graphics管線:

  • 繪制部分支持OpenGL。
  • 對Subdivision-based Rasterizer進行了進一步優化。
  • 更新了EFLIB的命名空間和文件組織。
  • 支持Centroid Sampling。
  • 支持2x與4xMSAA

SALVIA Shading Language(SASL):

  • 使用新的Combinator-based Parser系統以替換Boost.Spirit,提升了編譯速度并降低了目標文件大小。
  • 基于Boost.Wave,SASL提供了和C一致的預處理能力。
  • 添加了完整的Name Mangling和函數重載的能力。
  • 設計并完成了Shader與Host ABI的Memory Layout?,F在Shader可以被高效的調用。
  • 提供了JIT的支持。
  • 提供了多編譯器的Port。
  • 添加了命令行方式的Compiler。該Compiler接受源代碼并輸出為LLVM IR。
  • 設計并實現了多語言(General,SIMD Shader,SISD Shader)的編譯框架。
  • 提供了可測試可回歸的編譯器實現。
  • 實現了下列語言要素:
    • 基本標量類型及其變量定義
    • 基本矢量類型及其變量定義
    • 結構體定義及其變量定義
    • 順序語句
    • 函數聲明與定義
    • 算術運算符
    • 成員運算符(.)
    • Swizzle與Write Mask
posted @ 2011-06-01 20:22 空明流轉 閱讀(1578) | 評論 (0)編輯 收藏

這個PPT主要描述了SALVIA的一些設計細節。這是關于軟件渲染器SALVIA迄今為止最詳細的文檔,也是我近四年來的主要工作和研究內容之一。感謝MSRA的龔敏敏為此文做出的審校工作,他也是此項目的Owner之一。

 

在線的PPT:

原PPT下載:

http://www.shnenglu.com/Files/lingjingqiu/Introduction%20to%20SALVIA.zip

posted @ 2011-05-16 16:36 空明流轉 閱讀(1928) | 評論 (1)編輯 收藏

     摘要: 如何在CPU上高效的模擬執行類似于DirectX這樣的Shader?本文所提出的設計方案或許會對你有所啟發。
文章內容包括:
1. 什么是Shader的入口函數
2. 如何生成與管線相兼容的標準C函數
3. 如何在shader code中操作圖形管線語義值(SV_*)  閱讀全文
posted @ 2011-04-14 10:23 空明流轉 閱讀(1593) | 評論 (0)編輯 收藏

表達式值的存儲

LLVM中基本數據類型及存儲類型

值是編譯器所需要處理的基本數據。它出現在各個角落,條件分支、表達式、返回語句。甚至是函數地址也可以被視作是值類型。

對于編譯器而言,最基本的值是整數和浮點。其他的值都可以用這兩者來表達,例如布爾和指針。如果你是從一個最基本的指令集開始寫起,那么整數和浮點的數值運算、轉換、基于整數寄存器的跳轉和地址取值是一個寄存器機的最基本操作。所有更加高級的操作,例如數組、結構體、指針、函數、對象等,都可以建立在這一基礎上。

如果一個指令系統在整數和浮點數之外,額外提供了布爾、分支、函數調用和結構體的支持,那么它與高級語言將會貼近更多,生成代碼的方式也更加簡單。

在高級語義的數據結構上,LLVM提供了相當良好的支持。它支持的原生類型(First class)包括: 各種精度的整型和浮點數,指針、向量,結構體和數組。這些類型的數據存取和運算都是有指令直接支撐,而不需要自行計算并生成更加原始的指令。

在存儲類型上,LLVM提供了Value, Argument, Alloca, GlobalVariable, Pointer五種存儲類型。Value是右值,它不可取引用,不可更改。Argument表示了函數實參,它是Value的一個派生類。所以對參數的任何更改行為實際上都是不被允許的。Alloca保存了棧地址,GlobalVariable保存了全局變量的地址,Pointer則是一般意義上的指針。

除了存儲指令,LLVM所有的指令都是針對Value的操作,并返回一個Value。所以

Var a = Alloca int
Var b = Alloca int
Var c = Alloca int
c = ADD a, b

這樣的操作,在LLVM中實際上是將a和b的地址相加,并把C從變量替換成一個左值(注意,是替換,變量的值沒有任何變化)。

在LLVM中,正確的做法應當類似于下面這樣:

a = Alloca int
b = Alloca int
c = Alloca int
a_v = load a
b_v = load b
c_v = ADD a, b
store c, c_v

要先將值從變量中讀出,進行操作,再保存到另外一個變量中。

表達式值的數據結構

一個的表達式參數或結果可能是左值或右值。例如++x輸入一個左值返回一個左值,而x++就返回一個右值。A+B則是需要兩個右值并返回一個右值。

一個左值可以很方便的轉化為右值,但是右值轉化成左值通常是很困難的。地址信息被丟棄了,或者它根本就是一個字面常量,都會導致一個右值將永遠是右值。將右值構造成左值的唯一辦法,就是構造臨時對象并將右值賦予左值。當這個左值被讀取時,如果臨時對象除了初始化之外從未被寫過,并且它關聯的右值依然有效,那么這個操作會被優化成直接返回那個原始的右值,從而避免臨時左值的讀寫操作。

在Clang(一個C++編譯器的前端)中對左值和右值進行了嚴格的區分。這是由于C++需要額外的處理臨時對象。臨時對象意味著盡管它有右值的語義,但是實際上是左值的存儲。這是需要將真正的左值和臨時的左值區分開,并提供特定語境下的轉化。

SASL沒有處理復雜的臨時對象問題,因此它使用了一個相對簡單的辦法來解決左右值的判定和存儲。

我們設計了一個數據結構,用于保存任何可能的值。

struct Data{
    bool isRef;
    Value* rval;
    Alloca* local;
    GlobalVariable* global;
    struct Aggregated{
        Data* parent;
        int index;
    } agg;
};

rval用于處理Argument和右值時的情況。Local意味著它是一個局部變量,global說明它是一個全局變量,agg則用于處理structure member。Parent指向包含當前變量的聚合變量,index則指明了當前變量在聚合變量中的位次。

SASL提供了load, load_ptr 和 store 來數據的存取,而不要關心它的具體存儲類型。

左值/右值語義

在Data這個結構中,rval, local, global和agg四個值是互斥的。當然這里的我們也可以選擇union+enum的方式來表達。

首先來看,這個結構如何表達左值/右值語義。

來看isRef,這是一個標記位。它表示了data存儲的值究竟是值本身還是地址。如果是isref為真,那么data便可以被認為是一個左值。Isref為假,那么當它是rval的時候,它就是一個真正的右值了。如果是Alloca或者GlobalVariable,因為它們本身就代表了地址,那么它仍然是一個右值。如果是agg,那么要取決于它的聚合量是左值還是右值。

如果參數需要左值,那么可以直接從data拷貝,或者使用load_ptr + isRef創建一個新的右值Data。如果參數需要右值,那么可以通過load的方式獲取一個右值。

數據存取的實現

llvm::Value* load( cgllvm_sctxt* data ){
  assert(data);
  Value* val = data->val;
  do{
    if( val ){ break; }
    if( data->local ){ val = builder()->CreateLoad( data->local );
      break;
    }
    if( data->global ){
      val = builder()->CreateLoad( data->global );
      break;
    }
    if( data.agg.parent ){
      val = load( data->agg.parent );
      val = builder()->CreateExtractValue( val, data->agg.index );
      break;
    }
  } while(0);

  if( data->is_ref ){val = builder()->CreateLoad( val );}
  return val;
}


llvm::Value* load_ptr( cgllvm_sctxt* data ){

  Value* addr = NULL;
  if( data->val ){ addr = NULL; }
  if( data->local ){
    addr = data->local;
  }
  if( data->global ){
    addr = data->global;
  }
  if( data->agg.parent ){
    addr = builder()->CreateGEP( load_ptr(data->agg.parent), 0, data->arg.index );
  }

  if( data->is_ref ){
    if( !addr ){
      addr = data->val;
    } else {
      addr = builder()->CreateLoad( addr );
    }
  }

  return addr;
}

void store( llvm::Value* v, cgllvm_sctxt* data ){
  Value* addr = load_ptr( data );
  builder()->CreateStore( v, addr );
}
posted @ 2011-04-13 11:04 空明流轉 閱讀(1670) | 評論 (1)編輯 收藏

這是我為部門內部介紹C++0x(11)時所使用的PPT。

示例代碼在

 http://www.shnenglu.com/Files/lingjingqiu/Cpp11SamplesGCC.zip

http://www.shnenglu.com/Files/lingjingqiu/Cpp11Samples.zip

如果有任何問題,歡迎跟帖詢問,我將盡可能的做出解答。

posted @ 2011-03-31 13:05 空明流轉 閱讀(2314) | 評論 (2)編輯 收藏

大家在公司用到的VCS,一般都是和Issue tracker / Bug tracker 關聯到一起的。

 

比方說,我在VCS里面填上update log:

Fixed error about animiation matrix updating.
Bug 223789 updated.
Review 1776.

然后將這個change提交,此時Bug tracker上便會更新,變成這樣:

Issues: 987654

一般這里的Bug號,review號和Issue號都會有相應的鏈接,連接到對應的內容上以方便查閱。

 

那么在Google code里如何實現這一點呢?

首先,如果你在log中涉及了某個issue,并以issue nnn或者是issue #nnn 填上對應的Issue號,那么在SVN的瀏覽中,自然會產生某個鏈接,如SALVIA里面的:

Log message

SASL:
  Add syntax_tree_builder into syntax_tree project.
  Add parse_api into parser.
  Add parse_api into syntax tree.
  Issue 49 updated.

此時,Google的Change viewer還會提供相應的超鏈接。但是當你點到Issue49之后,會發現Issue49并沒有更新當前revision的信息。這是怎么回事呢?

答案是,如果想經由Log去更新Issue tracker,必須要按照一定的格式

完整的文章,可以參見google的幫助。

這里給大家提供一個快速教程:

首先,整個命令的格式大致如下:

$COMMAND$ issue $ISSUE ID$
$FIELD$: $FIELD$ $CONTENT$
$DESCRIPTION$

COMMAND一共有三種,New,Update,Fixes。含義就不說了,大家都懂。

Field,就是類似于Summary,Owner一類,在Issue Editor的界面上大家都能看到。

Description呢,一方面用于你這次更新的詳細說明,另一方面也會提交到Issue Tracker中。

注意,在Update的時候,Field也好,Description也好,至少要填一項,否則Issue tracker是不會給你更新信息的。

下面咱們來舉個例子:

Log message

SALVIA:
  Update issue 53 (注意,這里沒有句號)
  Issue 53 will be added an new comments.
這個時候,Issue track就會更新為:

Comment 1 by project member wuye9036, Today (43 minutes ago)

This issue was updated by revision r462.

  Issue 53 will be added an new comments.

你看,自動更新了吧。但是注意哦。Update那條命令之前的內容,并沒有被更新到Issue tracker中。

哈哈,Have fun!

posted @ 2011-03-09 17:05 空明流轉 閱讀(1679) | 評論 (0)編輯 收藏

這個是我為Autodesk Technical Summit 2011,一個公開的Autodesk技術宣講會準備的PPT的5分鐘簡短介紹。在這個Presentation中,將主要討論關于光柵化的軟件渲染器的主要架構,以及在實現和優化方面的技術細節。

image

image

image

image

image

image

image

image

image

image

image

posted @ 2011-03-02 16:33 空明流轉 閱讀(1637) | 評論 (1)編輯 收藏

http://www.shnenglu.com/Files/lingjingqiu/TemplateSample.zip

 

代碼在這里。演示了如何講一個模板類中的普通成員函數和模板函數進行實例化,以實現分離編譯。

沒有對實例化的原理、編譯器關鍵字和參數進行詳細解釋,因此僅供對模板有基本常識的人參考。

這段代碼本來是在我所在的Team內部供同事參考并用作寫一些Demo以測試編譯器特性用的。

但是考慮到示例不牽涉到公司產品,并且對大家理解模板規則,縮短富模板代碼的編譯時間,減少中間文件大小是有一定幫助的,故在博客上放出。

如有不妥之處,請指正。

 

代碼在MSVC10和MINGW GCC 4.5.0下通過。

如果有希望其他示例或在其他編譯器(平臺限Linux,Mac OS,Windows;編譯器限GCC 4.0+(含4.0,下同), MSVC 2005+,Intel 11.0+)上測試不通過的,請聯系我,謝謝。

posted @ 2011-01-28 19:04 空明流轉 閱讀(2273) | 評論 (2)編輯 收藏

最近一段時間,SoftArt的所有更新,都集中在編譯器上。雖然沒有辦法趕上在2011年的SoftArt第一版本的alpha發布(也許會更名為Salvia,版本代號為Cryptic Era),但是整體進度還是比較理想的。今天提交了r425,這是一個比較重要的更新。到這個更新為止,編譯器在后端的所有API便基本確定了。除去以后對參數和簽名的小改動,基本結構已經成型。

Parser,AST,Semantic和Code gen都已經有了相應的原型和對應的測試。接下來基本就是堆代碼的體力活了。

接下來,有以下工作比較重要:

0. 未實現的語言特性及對應的測試用例。

1. automatic regression tests的框架。這個框架的名稱就叫fart,framework of auto regression tests的簡寫。這個Test與現有的unit tests稍有不同,他在第一次生成代碼的時候,是要人工去檢查并執行驗證的。以后所有的測試,都是將結論與藍本進行比較。

2. semantic階段的出錯處理,以及code generate階段的容錯機制。這一部分的將隨著編譯器的逐步完善而完善。

3. 并行化的代碼生成。生成以SIMD方式執行的代碼是這個編譯器開發的初衷,它也是整個編譯器功能中最重要的部分。

4. Host和Runtime部分。這一部分主要負責編譯器的初始化,內建函數的注冊,與腳本的交互等功能。在這一部分完成后,SoftArt就可以正式將SASL集成進來。

5. Shader API的設計和實現。

簡易的計劃表:

1.0(~Jun 2011):

不隨SoftArt發布。完成進度:0: >60% 1: >80% 2: >20% 3: – 4: – 5: -

2.0(~Q1 2012):

編譯器隨SoftArt發布。未集成。進度: 0: >75% 1: >90% 2: >40% 3: – 4: – 5: -

3.0(~2013):

集成進softart。進度: 0: >85% 1: >90% 2: >50% 3: – 4: >50% 5: >30%

posted @ 2011-01-26 21:21 空明流轉 閱讀(1756) | 評論 (2)編輯 收藏

僅列出標題
共12頁: 1 2 3 4 5 6 7 8 9 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲人成人77777线观看| 亚洲国产一区二区三区a毛片| 久久免费视频在线观看| 中文国产成人精品久久一| 欧美一区二区三区视频免费播放| 亚洲高清在线观看一区| 久久经典综合| 久久久国产精彩视频美女艺术照福利| 欧美日韩精品在线播放| 亚洲高清网站| 欧美一区二区观看视频| 亚洲午夜精品久久久久久app| 欧美高清一区二区| 亚洲精品久久久久久久久久久| 美女国产一区| 91久久精品美女| 欧美sm重口味系列视频在线观看| 亚洲成色777777女色窝| 欧美成人精品在线| 亚洲精品国产精品乱码不99 | 亚洲无线观看| 国产精品一区二区三区观看| 亚洲国产精品一区二区www在线| 久久精彩视频| 久久一综合视频| 欧美一二三区精品| 国产伦精品一区二区| 欧美福利视频| 国产亚洲一区二区三区| 亚洲看片一区| 亚洲第一黄网| 亚洲专区国产精品| 一区二区三区av| 久久免费国产精品| 欧美伊人久久大香线蕉综合69| 欧美+亚洲+精品+三区| 久久久精品国产免费观看同学 | 亚洲精品乱码| 合欧美一区二区三区| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 性欧美video另类hd性玩具| 男女精品网站| 麻豆精品网站| 国产精品久久久久99| 亚洲国产天堂久久综合| 一区二区在线不卡| 欧美在线电影| 久久精品女人的天堂av| 国产精品视频一区二区高潮| 亚洲美女福利视频网站| 亚洲日本va午夜在线影院| 亚洲激情二区| 亚洲欧洲另类| 亚洲韩日在线| 久久综合综合久久综合| 美乳少妇欧美精品| 一色屋精品视频免费看| 欧美在线视频网站| 久久婷婷久久| 狠狠色狠色综合曰曰| 欧美一区高清| 亚洲欧美国产精品va在线观看| 欧美精品久久久久久久| 亚洲高清在线精品| 日韩一级精品视频在线观看| 欧美久久99| 亚洲美女视频在线观看| 亚洲一区二区三区乱码aⅴ| 欧美日韩国产综合视频在线观看中文 | 影音国产精品| 久久久人人人| 亚洲高清视频中文字幕| 一本久久精品一区二区| 欧美性生交xxxxx久久久| 亚洲手机视频| 久久精品一区二区| 亚洲国产精品99久久久久久久久| 噜噜噜噜噜久久久久久91| 91久久国产综合久久91精品网站| 99精品欧美一区二区蜜桃免费| 欧美日韩国产二区| 中文国产一区| 久久人人爽国产| 亚洲黄色大片| 欧美三区美女| 久久国产精品99国产| 亚洲高清色综合| 亚洲自啪免费| 亚洲国产精品久久久久久女王| 欧美高清不卡在线| 亚洲影院色无极综合| 欧美11—12娇小xxxx| 一本久久a久久精品亚洲| 国产精品视频免费在线观看| 久久久久成人精品免费播放动漫| 亚洲丰满在线| 亚洲一区激情| 亚洲国产婷婷| 国产精品一区三区| 欧美ed2k| 午夜精品久久久久影视| 亚洲大片在线| 久久久久国产精品一区三寸| 亚洲精品专区| 国内自拍一区| 国产精品久久久亚洲一区 | 美脚丝袜一区二区三区在线观看 | 欧美高清在线一区| 亚洲欧美伊人| 91久久精品国产91久久| 国产精品久久久久毛片大屁完整版 | 韩国av一区二区| 欧美日韩中文| 蜜桃av一区二区三区| 亚洲一区二区三区四区中文| 欧美激情视频免费观看| 久久久www| 午夜在线视频观看日韩17c| 亚洲美女视频| 亚洲国产一区视频| 尤物精品国产第一福利三区| 国产欧美日韩三级| 国产精品国产三级国产a| 欧美日韩精品免费观看视频完整 | 亚洲三级视频| 亚洲国产黄色片| 美女视频网站黄色亚洲| 久久精品中文| 久久不见久久见免费视频1| 亚洲视频在线观看一区| 亚洲精品久久久久| 亚洲精品一区二区三区福利| 亚洲国产精品小视频| 国产真实精品久久二三区| 国产精品女主播一区二区三区| 欧美日韩黄色大片| 欧美日韩免费高清| 欧美日韩免费在线视频| 欧美激情中文不卡| 欧美片第1页综合| 欧美日韩综合另类| 欧美色123| 国产精品久久久久久久一区探花 | 一区二区三区精品视频| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲国产高清在线| 亚洲美女视频在线观看| 在线综合视频| 亚洲欧美日韩国产综合| 欧美在线一二三区| 久久久久久网| 欧美电影免费观看高清完整版| 欧美成人午夜激情| 日韩视频在线观看| 亚洲一区二区三区精品在线| 午夜一级在线看亚洲| 久久aⅴ国产紧身牛仔裤| 男女av一区三区二区色多| 欧美日韩 国产精品| 国产精品久久国产愉拍 | 伊伊综合在线| 亚洲伦理一区| 午夜精品久久久久久久99水蜜桃 | 亚洲色图自拍| 久久国产精品亚洲77777| 模特精品裸拍一区| 亚洲人成毛片在线播放女女| 亚洲午夜av| 久久精品国产欧美亚洲人人爽| 麻豆精品一区二区av白丝在线| 欧美精品在线免费播放| 国产免费一区二区三区香蕉精| 狠狠色伊人亚洲综合网站色| 日韩午夜在线视频| 亚洲尤物视频网| 欧美顶级大胆免费视频| 亚洲色诱最新| 男同欧美伦乱| 国产日本亚洲高清| 亚洲成色www久久网站| 欧美在线91| 女主播福利一区| 国产美女精品视频| 亚洲免费成人| 久久久青草青青国产亚洲免观| 亚洲精品国精品久久99热| 欧美一区二区三区四区高清 | 欧美激情精品久久久久久蜜臀| 国产日韩欧美精品在线| 亚洲裸体在线观看| 久久免费视频网| 亚洲欧美国产va在线影院| 欧美片第一页| 亚洲激情av| 免费看的黄色欧美网站| 性欧美在线看片a免费观看| 欧美日韩在线不卡一区| 亚洲国产精品久久精品怡红院 | 亚洲一区网站| 亚洲精品欧洲精品|