diff --git a/Data/User/GameConfig/GMSE01.ini b/Data/User/GameConfig/GMSE01.ini index 6c4191405b..e37c4ec387 100644 --- a/Data/User/GameConfig/GMSE01.ini +++ b/Data/User/GameConfig/GMSE01.ini @@ -152,6 +152,7 @@ PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = PH_ZFar = +PerformanceQueriesEnable = True [Video_Settings] wideScreenHack = False diff --git a/Data/User/GameConfig/GMSP01.ini b/Data/User/GameConfig/GMSP01.ini index 4903413a33..fdac93eb91 100644 --- a/Data/User/GameConfig/GMSP01.ini +++ b/Data/User/GameConfig/GMSP01.ini @@ -74,6 +74,7 @@ PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = PH_ZFar = +PerformanceQueriesEnable = True [Video_Settings] wideScreenHack = False diff --git a/Source/Android/res/layout/folderbrowser.xml b/Source/Android/res/layout/folderbrowser.xml index adfd72ed35..d3ee4538fa 100644 --- a/Source/Android/res/layout/folderbrowser.xml +++ b/Source/Android/res/layout/folderbrowser.xml @@ -39,5 +39,15 @@ android:gravity="center_vertical" android:text="Title" - android:textStyle="bold" />/> + android:textStyle="bold" /> + + diff --git a/Source/Android/res/layout/sidemenu.xml b/Source/Android/res/layout/sidemenu.xml index 76bc937489..6f4b8d3e5d 100644 --- a/Source/Android/res/layout/sidemenu.xml +++ b/Source/Android/res/layout/sidemenu.xml @@ -5,10 +5,6 @@ android:gravity="left" android:orientation="vertical" > - - - diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java index 4905027ae1..e05d1c7db2 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/AboutFragment.java @@ -16,7 +16,8 @@ import java.util.List; * Licensed under GPLv2 * Refer to the license.txt file included. */ -public class AboutFragment extends Fragment { +public final class AboutFragment extends Fragment +{ private static Activity m_activity; private ListView mMainList; @@ -25,13 +26,14 @@ public class AboutFragment extends Fragment { boolean Configuring = false; boolean firstEvent = true; - public AboutFragment() { + public AboutFragment() + { // Empty constructor required for fragment subclasses } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) + { View rootView = inflater.inflate(R.layout.gamelist_listview, container, false); mMainList = (ListView) rootView.findViewById(R.id.gamelist); @@ -47,15 +49,20 @@ public class AboutFragment extends Fragment { return mMainList; } + @Override - public void onAttach(Activity activity) { + public void onAttach(Activity activity) + { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception - try { + try + { m_activity = activity; - } catch (ClassCastException e) { + } + catch (ClassCastException e) + { throw new ClassCastException(activity.toString() + " must implement OnGameListZeroListener"); } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java index d4177de5a4..d1e23d1e53 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/DolphinEmulator.java @@ -17,7 +17,7 @@ import android.view.WindowManager; import java.io.*; import java.util.List; -public class DolphinEmulator extends Activity +public final class DolphinEmulator extends Activity { static private NativeGLSurfaceView GLview = null; static private boolean Running = false; @@ -25,24 +25,32 @@ public class DolphinEmulator extends Activity private float screenWidth; private float screenHeight; - private void CopyAsset(String asset, String output) { + private void CopyAsset(String asset, String output) + { InputStream in = null; OutputStream out = null; - try { + + try + { in = getAssets().open(asset); out = new FileOutputStream(output); copyFile(in, out); in.close(); out.close(); - } catch(IOException e) { + } + catch(IOException e) + { Log.e("DolphinEmulator", "Failed to copy asset file: " + asset, e); } } - private void copyFile(InputStream in, OutputStream out) throws IOException { + private void copyFile(InputStream in, OutputStream out) throws IOException + { byte[] buffer = new byte[1024]; int read; - while((read = in.read(buffer)) != -1){ + + while((read = in.read(buffer)) != -1) + { out.write(buffer, 0, read); } } @@ -54,6 +62,7 @@ public class DolphinEmulator extends Activity if (Running) NativeLibrary.StopEmulation(); } + @Override public void onPause() { @@ -61,6 +70,7 @@ public class DolphinEmulator extends Activity if (Running) NativeLibrary.PauseEmulation(); } + @Override public void onResume() { @@ -71,7 +81,8 @@ public class DolphinEmulator extends Activity /** Called when the activity is first created. */ @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) + { super.onCreate(savedInstanceState); if (savedInstanceState == null) { @@ -158,7 +169,8 @@ public class DolphinEmulator extends Activity // Gets button presses @Override - public boolean dispatchKeyEvent(KeyEvent event) { + public boolean dispatchKeyEvent(KeyEvent event) + { int action = 0; // Special catch for the back key @@ -180,7 +192,8 @@ public class DolphinEmulator extends Activity if (Running) { - switch (event.getAction()) { + switch (event.getAction()) + { case KeyEvent.ACTION_DOWN: action = 0; break; @@ -198,8 +211,10 @@ public class DolphinEmulator extends Activity } @Override - public boolean dispatchGenericMotionEvent(MotionEvent event) { - if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0) || !Running) { + public boolean dispatchGenericMotionEvent(MotionEvent event) + { + if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0) || !Running) + { return super.dispatchGenericMotionEvent(event); } @@ -213,5 +228,4 @@ public class DolphinEmulator extends Activity return true; } - } \ No newline at end of file diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowser.java b/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowser.java index aa44ad83ca..3e2c93a3eb 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowser.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowser.java @@ -14,7 +14,8 @@ import android.widget.Toast; import java.io.File; import java.util.*; -public class FolderBrowser extends Fragment { +public final class FolderBrowser extends Fragment +{ private Activity m_activity; private FolderBrowserAdapter adapter; private ListView mDrawerList; @@ -44,7 +45,7 @@ public class FolderBrowser extends Fragment { { if(entry.isDirectory()) { - dir.add(new FolderBrowserItem(m_activity, entryName, getString(R.string.folder), entry.getAbsolutePath(), true)); + dir.add(new FolderBrowserItem(m_activity, entryName, entry.getAbsolutePath(), true)); } else { @@ -77,9 +78,9 @@ public class FolderBrowser extends Fragment { mDrawerList.setAdapter(adapter); mDrawerList.setOnItemClickListener(mMenuItemClickListener); } + @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(currentDir == null) currentDir = new File(Environment.getExternalStorageDirectory().getPath()); @@ -111,14 +112,18 @@ public class FolderBrowser extends Fragment { }; @Override - public void onAttach(Activity activity) { + public void onAttach(Activity activity) + { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception - try { + try + { m_activity = activity; - } catch (ClassCastException e) { + } + catch (ClassCastException e) + { throw new ClassCastException(activity.toString() + " must implement OnGameListZeroListener"); } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserAdapter.java index 0c38aa7b2f..979ad35865 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserAdapter.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserAdapter.java @@ -1,7 +1,7 @@ package org.dolphinemu.dolphinemu; import android.content.Context; -import android.util.Log; +import android.content.res.Resources; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,13 +11,14 @@ import android.widget.TextView; import java.util.List; -public class FolderBrowserAdapter extends ArrayAdapter{ +public final class FolderBrowserAdapter extends ArrayAdapter +{ + private final Context c; + private final int id; + private final List items; - private Context c; - private int id; - private List items; - - public FolderBrowserAdapter(Context context, int textViewResourceId, List objects) { + public FolderBrowserAdapter(Context context, int textViewResourceId, List objects) + { super(context, textViewResourceId, objects); c = context; id = textViewResourceId; @@ -58,7 +59,15 @@ public class FolderBrowserAdapter extends ArrayAdapter{ if(subtitleText != null) { - subtitleText.setText(item.getSubtitle()); + // Remove the subtitle for all folders, except for the parent directory folder. + if (item.isDirectory() && !item.getSubtitle().equals(c.getResources().getString(R.string.parent_directory))) + { + subtitleText.setVisibility(View.GONE); + } + else + { + subtitleText.setText(item.getSubtitle()); + } } if (iconView != null) diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserItem.java index d2f8773e24..a895da8c43 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserItem.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/FolderBrowserItem.java @@ -37,6 +37,24 @@ public final class FolderBrowserItem implements Comparable this.underlyingFile = new File(path); } + /** + * Constructor. Initializes a FolderBrowserItem with an empty subtitle. + * + * @param ctx Context this FolderBrowserItem is being used in. + * @param name The name of the file/folder represented by this item. + * @param path The path of the file/folder represented by this item. + * @param isValid Whether or not this item represents a file type that can be handled. + */ + public FolderBrowserItem(Context ctx, String name, String path, boolean isValid) + { + this.ctx = ctx; + this.name = name; + this.subtitle = ""; + this.path = path; + this.isValid = isValid; + this.underlyingFile = new File(path); + } + /** * Gets the name of the file/folder represented by this FolderBrowserItem. * diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListActivity.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListActivity.java index 845bf72bdd..2bd61cb0f2 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListActivity.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/GameListActivity.java @@ -22,8 +22,9 @@ import java.util.List; * Licensed under GPLv2 * Refer to the license.txt file included. */ -public class GameListActivity extends Activity - implements GameListFragment.OnGameListZeroListener{ +public final class GameListActivity extends Activity + implements GameListFragment.OnGameListZeroListener +{ private int mCurFragmentNum = 0; private Fragment mCurFragment; @@ -43,7 +44,8 @@ public class GameListActivity extends Activity } @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) + { super.onCreate(savedInstanceState); setContentView(R.layout.gamelist_activity); mMe = this; @@ -94,16 +96,19 @@ public class GameListActivity extends Activity FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); } + public void SwitchPage(int toPage) { if (mCurFragmentNum == toPage) return; + switch (mCurFragmentNum) { // Folder browser case 1: recreateFragment(); - break; + break; + // Settings case 2: { @@ -147,6 +152,7 @@ public class GameListActivity extends Activity } } break; + case 3: // Gamepad settings { InputConfigAdapter adapter = ((InputConfigFragment)mCurFragment).getAdapter(); @@ -162,11 +168,13 @@ public class GameListActivity extends Activity } } break; + case 0: // Game List case 4: // About /* Do Nothing */ break; } + switch(toPage) { case 0: @@ -177,6 +185,7 @@ public class GameListActivity extends Activity fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); } break; + case 1: { Toast.makeText(mMe, getString(R.string.loading_browser), Toast.LENGTH_SHORT).show(); @@ -186,6 +195,7 @@ public class GameListActivity extends Activity fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); } break; + case 2: { Toast.makeText(mMe, getString(R.string.loading_settings), Toast.LENGTH_SHORT).show(); @@ -195,6 +205,7 @@ public class GameListActivity extends Activity fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); } break; + case 3: { Toast.makeText(mMe, getString(R.string.loading_gamepad), Toast.LENGTH_SHORT).show(); @@ -204,6 +215,7 @@ public class GameListActivity extends Activity fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); } break; + case 4: { Toast.makeText(mMe, getString(R.string.about), Toast.LENGTH_SHORT).show(); @@ -213,10 +225,12 @@ public class GameListActivity extends Activity fragmentManager.beginTransaction().replace(R.id.content_frame, mCurFragment).commit(); } break; + default: break; } } + private AdapterView.OnItemClickListener mMenuItemClickListener = new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) @@ -232,57 +246,75 @@ public class GameListActivity extends Activity */ @Override - protected void onPostCreate(Bundle savedInstanceState) { + protected void onPostCreate(Bundle savedInstanceState) + { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } @Override - public void onConfigurationChanged(Configuration newConfig) { + public void onConfigurationChanged(Configuration newConfig) + { super.onConfigurationChanged(newConfig); - // Pass any configuration change to the drawer toggls + // Pass any configuration change to the drawer toggle mDrawerToggle.onConfigurationChanged(newConfig); } /* Called whenever we call invalidateOptionsMenu() */ @Override - public boolean onPrepareOptionsMenu(Menu menu) { + public boolean onPrepareOptionsMenu(Menu menu) + { return super.onPrepareOptionsMenu(menu); } @Override - public boolean onOptionsItemSelected(MenuItem item) { + public boolean onOptionsItemSelected(MenuItem item) + { // The action bar home/up action should open or close the drawer. // ActionBarDrawerToggle will take care of this. - if (mDrawerToggle.onOptionsItemSelected(item)) { + if (mDrawerToggle.onOptionsItemSelected(item)) + { return true; } + return super.onOptionsItemSelected(item); } + public void onBackPressed() { SwitchPage(0); } - public interface OnGameConfigListener { + public interface OnGameConfigListener + { public boolean onMotionEvent(MotionEvent event); public boolean onKeyEvent(KeyEvent event); } + // Gets move(triggers, joystick) events @Override - public boolean dispatchGenericMotionEvent(MotionEvent event) { + public boolean dispatchGenericMotionEvent(MotionEvent event) + { if (mCurFragmentNum == 3) + { if (((OnGameConfigListener)mCurFragment).onMotionEvent(event)) return true; + } + return super.dispatchGenericMotionEvent(event); } + // Gets button presses @Override - public boolean dispatchKeyEvent(KeyEvent event) { + public boolean dispatchKeyEvent(KeyEvent event) + { if (mCurFragmentNum == 3) + { if (((OnGameConfigListener)mCurFragment).onKeyEvent(event)) return true; + } + return super.dispatchKeyEvent(event); } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListAdapter.java index 986f33555b..d7170bb474 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListAdapter.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/GameListAdapter.java @@ -10,13 +10,14 @@ import android.widget.TextView; import java.util.List; -public class GameListAdapter extends ArrayAdapter{ +public final class GameListAdapter extends ArrayAdapter +{ + private final Context c; + private final int id; + private final Listitems; - private Context c; - private int id; - private Listitems; - - public GameListAdapter(Context context, int textViewResourceId, List objects) { + public GameListAdapter(Context context, int textViewResourceId, List objects) + { super(context, textViewResourceId, objects); c = context; id = textViewResourceId; @@ -29,26 +30,30 @@ public class GameListAdapter extends ArrayAdapter{ } @Override - public View getView(int position, View convertView, ViewGroup parent) { + public View getView(int position, View convertView, ViewGroup parent) + { View v = convertView; - if (v == null) { + if (v == null) + { LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(id, null); } - final GameListItem o = items.get(position); - if (o != null) { - TextView t1 = (TextView) v.findViewById(R.id.GameItemTitle); - TextView t2 = (TextView) v.findViewById(R.id.GameItemSubText); - ImageView v1 = (ImageView) v.findViewById(R.id.GameItemIcon); + final GameListItem item = items.get(position); + if (item != null) + { + TextView title = (TextView) v.findViewById(R.id.GameItemTitle); + TextView subtitle = (TextView) v.findViewById(R.id.GameItemSubText); + ImageView icon = (ImageView) v.findViewById(R.id.GameItemIcon); - if(t1!=null) - t1.setText(o.getName()); - if(t2!=null) - t2.setText(o.getData()); - if(v1!=null) - v1.setImageBitmap(o.getImage()); - } + if(title != null) + title.setText(item.getName()); + if(subtitle != null) + subtitle.setText(item.getData()); + if(icon != null) + icon.setImageBitmap(item.getImage()); + } + return v; } } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListFragment.java index 8e4d2cb244..13f66c1c83 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/GameListFragment.java @@ -24,20 +24,23 @@ import java.util.Set; * Licensed under GPLv2 * Refer to the license.txt file included. */ -public class GameListFragment extends Fragment +public final class GameListFragment extends Fragment { private ListView mMainList; private GameListAdapter mGameAdapter; private static GameListActivity mMe; OnGameListZeroListener mCallback; - public interface OnGameListZeroListener { + public interface OnGameListZeroListener + { public void onZeroFiles(); } - public GameListFragment() { + public GameListFragment() + { // Empty constructor required for fragment subclasses } + private void Fill() { List fls = new ArrayList(); @@ -51,7 +54,7 @@ public class GameListFragment extends Fragment { String BrowseDir = NativeLibrary.GetConfig("Dolphin.ini", "General", "GCMPath" + a, ""); File currentDir = new File(BrowseDir); - File[]dirs = currentDir.listFiles(); + File[] dirs = currentDir.listFiles(); try { for(File entry : dirs) @@ -81,8 +84,8 @@ public class GameListFragment extends Fragment } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) + { View rootView = inflater.inflate(R.layout.gamelist_listview, container, false); mMainList = (ListView) rootView.findViewById(R.id.gamelist); mMainList.setOnItemClickListener(mGameItemClickListener); @@ -91,6 +94,7 @@ public class GameListFragment extends Fragment return mMainList; } + private AdapterView.OnItemClickListener mGameItemClickListener = new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) @@ -102,6 +106,7 @@ public class GameListFragment extends Fragment } } }; + private void onFileClick(String o) { Toast.makeText(mMe, getString(R.string.file_clicked) + o, Toast.LENGTH_SHORT).show(); @@ -111,16 +116,21 @@ public class GameListFragment extends Fragment mMe.setResult(Activity.RESULT_OK, intent); mMe.finish(); } + @Override - public void onAttach(Activity activity) { + public void onAttach(Activity activity) + { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception - try { + try + { mCallback = (OnGameListZeroListener) activity; mMe = (GameListActivity) activity; - } catch (ClassCastException e) { + } + catch (ClassCastException e) + { throw new ClassCastException(activity.toString() + " must implement OnGameListZeroListener"); } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java index 427cd132f8..a9ef41c6d4 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/GameListItem.java @@ -8,36 +8,44 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; -public class GameListItem implements Comparable{ - private String name; - private String data; - private String path; +public final class GameListItem implements Comparable +{ + private final String name; + private final String data; + private final String path; + private final boolean isValid; private Bitmap image; - private boolean m_valid; - public GameListItem(Context ctx, String n,String d,String p, boolean valid) + public GameListItem(Context ctx, String name, String data, String path, boolean isValid) { - name = n; - data = d; - path = p; - m_valid = valid; + this.name = name; + this.data = data; + this.path = path; + this.isValid = isValid; + File file = new File(path); if (!file.isDirectory() && !path.equals("")) { int[] Banner = NativeLibrary.GetBanner(path); if (Banner[0] == 0) { - try { - InputStream path = ctx.getAssets().open("NoBanner.png"); - image = BitmapFactory.decodeStream(path); - } catch (IOException e) { + try + { + InputStream noBannerPath = ctx.getAssets().open("NoBanner.png"); + image = BitmapFactory.decodeStream(noBannerPath); + } + catch (IOException e) + { // TODO Auto-generated catch block e.printStackTrace(); } } else + { image = Bitmap.createBitmap(Banner, 96, 32, Bitmap.Config.ARGB_8888); + } + name = NativeLibrary.GetTitle(path); } } @@ -56,13 +64,15 @@ public class GameListItem implements Comparable{ { return path; } + public Bitmap getImage() { return image; } + public boolean isValid() { - return m_valid; + return isValid; } public int compareTo(GameListItem o) diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java index b0984dd08a..12541b8b37 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigAdapter.java @@ -14,13 +14,14 @@ import java.util.List; * Licensed under GPLv2 * Refer to the license.txt file included. */ -public class InputConfigAdapter extends ArrayAdapter { - private Context c; - private int id; - private List items; +public final class InputConfigAdapter extends ArrayAdapter +{ + private final Context c; + private final int id; + private final List items; - public InputConfigAdapter(Context context, int textViewResourceId, - List objects) { + public InputConfigAdapter(Context context, int textViewResourceId, List objects) + { super(context, textViewResourceId, objects); c = context; id = textViewResourceId; @@ -31,26 +32,30 @@ public class InputConfigAdapter extends ArrayAdapter { { return items.get(i); } + @Override - public View getView(int position, View convertView, ViewGroup parent) { + public View getView(int position, View convertView, ViewGroup parent) + { View v = convertView; - if (v == null) { + if (v == null) + { LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - v = vi.inflate(id, null); + v = vi.inflate(id, parent, false); } - final InputConfigItem o = items.get(position); - if (o != null) { - TextView t1 = (TextView) v.findViewById(R.id.FolderTitle); - TextView t2 = (TextView) v.findViewById(R.id.FolderSubTitle); + + final InputConfigItem item = items.get(position); + if (item != null) + { + TextView title = (TextView) v.findViewById(R.id.FolderTitle); + TextView subtitle = (TextView) v.findViewById(R.id.FolderSubTitle); - if(t1!=null) - t1.setText(o.getName()); - if(t2!=null) - t2.setText(o.getBind()); + if(title != null) + title.setText(item.getName()); + + if(subtitle != null) + subtitle.setText(item.getBind()); } + return v; } - - - } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigFragment.java index b11dc4a34b..530f8b1d3b 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigFragment.java @@ -18,8 +18,9 @@ import java.util.List; * Licensed under GPLv2 * Refer to the license.txt file included. */ -public class InputConfigFragment extends Fragment - implements GameListActivity.OnGameConfigListener{ +public final class InputConfigFragment extends Fragment + implements GameListActivity.OnGameConfigListener +{ private Activity m_activity; private ListView mDrawerList; private InputConfigAdapter adapter; @@ -31,20 +32,24 @@ public class InputConfigFragment extends Fragment { if (input == null) return "null"; // Happens when the inputdevice is from an unknown source + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) + { return input.getDescriptor(); + } else { List motions = input.getMotionRanges(); String fakeid = ""; + for (InputDevice.MotionRange range : motions) fakeid += range.getAxis(); + return fakeid; } } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { List Input = new ArrayList(); Input.add(new InputConfigItem(getString(R.string.draw_onscreen_controls), "Android-ScreenControls", "True")); @@ -77,6 +82,7 @@ public class InputConfigFragment extends Fragment mDrawerList.setOnItemClickListener(mMenuItemClickListener); return mDrawerList; } + private AdapterView.OnItemClickListener mMenuItemClickListener = new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) @@ -100,6 +106,7 @@ public class InputConfigFragment extends Fragment o.setBind(newBind); adapter.insert(o, position); break; + default: // gamepad controls Toast.makeText(m_activity, getString(R.string.press_button_to_config, o.getName()), Toast.LENGTH_SHORT).show(); @@ -111,19 +118,21 @@ public class InputConfigFragment extends Fragment } }; - static ArrayList m_values = new ArrayList(); + private static ArrayList m_values = new ArrayList(); - void AssignBind(String bind) + private void AssignBind(String bind) { InputConfigItem o = adapter.getItem(configPosition); adapter.remove(o); o.setBind(bind); adapter.insert(o, configPosition); } + public InputConfigAdapter getAdapter() { return adapter; } + // Called from GameListActivity public boolean onMotionEvent(MotionEvent event) { @@ -149,8 +158,8 @@ public class InputConfigFragment extends Fragment { for (int a = 0; a < motions.size(); ++a) { - InputDevice.MotionRange range; - range = motions.get(a); + InputDevice.MotionRange range = motions.get(a); + if (m_values.get(a) > (event.getAxisValue(range.getAxis()) + 0.5f)) { AssignBind("Device '" + InputConfigFragment.getInputDesc(input) + "'-Axis " + range.getAxis() + "-"); @@ -166,10 +175,12 @@ public class InputConfigFragment extends Fragment } return true; } + public boolean onKeyEvent(KeyEvent event) { Log.w("InputConfigFragment", "Got Event " + event.getAction()); - switch (event.getAction()) { + switch (event.getAction()) + { case KeyEvent.ACTION_DOWN: case KeyEvent.ACTION_UP: if (Configuring) @@ -179,6 +190,7 @@ public class InputConfigFragment extends Fragment Configuring = false; return true; } + default: break; } @@ -187,14 +199,18 @@ public class InputConfigFragment extends Fragment } @Override - public void onAttach(Activity activity) { + public void onAttach(Activity activity) + { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception - try { + try + { m_activity = activity; - } catch (ClassCastException e) { + } + catch (ClassCastException e) + { throw new ClassCastException(activity.toString() + " must implement OnGameListZeroListener"); } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java index 0a6f69a1d0..70e68261ec 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/InputConfigItem.java @@ -9,7 +9,8 @@ package org.dolphinemu.dolphinemu; /** * Represents a controller input item (button, stick, etc). */ -public class InputConfigItem implements Comparable{ +public final class InputConfigItem implements Comparable +{ private String m_name; private String m_Config; private String m_bind; diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java b/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java index 030c7ed823..ffe89714be 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/NativeGLSurfaceView.java @@ -4,12 +4,14 @@ import android.content.Context; import android.view.SurfaceHolder; import android.view.SurfaceView; -public class NativeGLSurfaceView extends SurfaceView { +public final class NativeGLSurfaceView extends SurfaceView +{ static private Thread myRun; static private boolean Running = false; static private boolean Created = false; - public NativeGLSurfaceView(Context context) { + public NativeGLSurfaceView(Context context) + { super(context); if (!Created) { @@ -20,8 +22,10 @@ public class NativeGLSurfaceView extends SurfaceView { NativeLibrary.Run(getHolder().getSurface()); } }; + getHolder().addCallback(new SurfaceHolder.Callback() { - public void surfaceCreated(SurfaceHolder holder) { + public void surfaceCreated(SurfaceHolder holder) + { // TODO Auto-generated method stub if (!Running) { @@ -30,17 +34,17 @@ public class NativeGLSurfaceView extends SurfaceView { } } - public void surfaceChanged(SurfaceHolder arg0, int arg1, - int arg2, int arg3) { + public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) + { // TODO Auto-generated method stub - } - public void surfaceDestroyed(SurfaceHolder arg0) { + public void surfaceDestroyed(SurfaceHolder arg0) + { // TODO Auto-generated method stub - } }); + Created = true; } } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java index da58274c5f..14f7527c1d 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -13,7 +13,8 @@ import android.view.Surface; * Class which contains methods that interact * with the native side of the Dolphin code. */ -public class NativeLibrary { +public final class NativeLibrary +{ public static native void onTouchEvent(int Action, float X, float Y); public static native void onGamePadEvent(String Device, int Button, int Action); public static native void onGamePadMoveEvent(String Device, int Axis, float Value); diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/PrefsFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/PrefsFragment.java index 4f088a58b4..ad69a89a9d 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/PrefsFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/PrefsFragment.java @@ -17,10 +17,12 @@ import javax.microedition.khronos.opengles.GL10; * Licensed under GPLv2 * Refer to the license.txt file included. */ -public class PrefsFragment extends PreferenceFragment { +public final class PrefsFragment extends PreferenceFragment +{ private Activity m_activity; - static public class VersionCheck { + static public class VersionCheck + { EGL10 mEGL; EGLDisplay mEGLDisplay; EGLConfig[] mEGLConfigs; @@ -31,8 +33,8 @@ public class PrefsFragment extends PreferenceFragment { String mThreadOwner; - public VersionCheck() { - + public VersionCheck() + { int[] version = new int[2]; int[] attribList = new int[] { EGL10.EGL_WIDTH, 1, @@ -69,11 +71,14 @@ public class PrefsFragment extends PreferenceFragment { { return mGL.glGetString(GL10.GL_VENDOR); } + public String getRenderer() { return mGL.glGetString(GL10.GL_RENDERER); } - private EGLConfig chooseConfig() { + + private EGLConfig chooseConfig() + { int[] attribList = new int[] { EGL10.EGL_DEPTH_SIZE, 0, EGL10.EGL_STENCIL_SIZE, 0, @@ -95,6 +100,7 @@ public class PrefsFragment extends PreferenceFragment { return mEGLConfigs[0]; // Best match is probably the first configuration } } + static public boolean SupportsGLES3() { VersionCheck mbuffer = new VersionCheck(); @@ -134,8 +140,10 @@ public class PrefsFragment extends PreferenceFragment { } return mSupportsGLES3; } + @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) + { super.onCreate(savedInstanceState); // Load the preferences from an XML resource @@ -197,14 +205,18 @@ public class PrefsFragment extends PreferenceFragment { } @Override - public void onAttach(Activity activity) { + public void onAttach(Activity activity) + { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception - try { + try + { m_activity = activity; - } catch (ClassCastException e) { + } + catch (ClassCastException e) + { throw new ClassCastException(activity.toString() + " must implement OnGameListZeroListener"); } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuAdapter.java b/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuAdapter.java index eb2143becb..11c071b026 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuAdapter.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuAdapter.java @@ -9,14 +9,13 @@ import android.widget.TextView; import java.util.List; -public class SideMenuAdapter extends ArrayAdapter{ - - private Context c; - private int id; - private Listitems; +public final class SideMenuAdapter extends ArrayAdapter +{ + private final Context c; + private final int id; + private final Listitems; - public SideMenuAdapter(Context context, int textViewResourceId, - List objects) + public SideMenuAdapter(Context context, int textViewResourceId, List objects) { super(context, textViewResourceId, objects); c = context; @@ -28,6 +27,7 @@ public class SideMenuAdapter extends ArrayAdapter{ { return items.get(i); } + @Override public View getView(int position, View convertView, ViewGroup parent) { @@ -38,13 +38,13 @@ public class SideMenuAdapter extends ArrayAdapter{ v = vi.inflate(id, null); } - final SideMenuItem o = items.get(position); - if (o != null) + final SideMenuItem item = items.get(position); + if (item != null) { - TextView t1 = (TextView) v.findViewById(R.id.SideMenuTitle); + TextView title = (TextView) v.findViewById(R.id.SideMenuTitle); - if(t1!=null) - t1.setText(o.getName()); + if(title != null) + title.setText(item.getName()); } return v; diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuItem.java b/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuItem.java index 6d204d0d69..51ebc93c19 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuItem.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/SideMenuItem.java @@ -10,10 +10,10 @@ package org.dolphinemu.dolphinemu; /** * Represents an item that goes in the sidemenu of the app. */ -public class SideMenuItem implements Comparable +public final class SideMenuItem implements Comparable { - private String m_name; - private int m_id; + private final String m_name; + private final int m_id; /** * Constructor diff --git a/Source/Core/Common/CMakeLists.txt b/Source/Core/Common/CMakeLists.txt index 480a08a0fc..0a1a26e530 100644 --- a/Source/Core/Common/CMakeLists.txt +++ b/Source/Core/Common/CMakeLists.txt @@ -20,7 +20,6 @@ set(SRCS Src/BreakPoints.cpp Src/Thread.cpp Src/Timer.cpp Src/Version.cpp - Src/VideoBackendBase.cpp Src/x64ABI.cpp Src/x64Analyzer.cpp Src/x64Emitter.cpp diff --git a/Source/Core/Common/Common.vcxproj b/Source/Core/Common/Common.vcxproj index 822fafe74b..2982a5c720 100644 --- a/Source/Core/Common/Common.vcxproj +++ b/Source/Core/Common/Common.vcxproj @@ -195,7 +195,6 @@ - @@ -250,7 +249,6 @@ - @@ -261,4 +259,4 @@ - \ No newline at end of file + diff --git a/Source/Core/Common/Common.vcxproj.filters b/Source/Core/Common/Common.vcxproj.filters index d427b70cdd..ae434219fd 100644 --- a/Source/Core/Common/Common.vcxproj.filters +++ b/Source/Core/Common/Common.vcxproj.filters @@ -23,7 +23,6 @@ - @@ -92,7 +91,6 @@ - @@ -134,4 +132,4 @@ {f078f36e-a0ff-4cd0-95f8-476100d68e68} - \ No newline at end of file + diff --git a/Source/Core/Common/Src/MemArena.cpp b/Source/Core/Common/Src/MemArena.cpp index 487788dc45..7be7c98c89 100644 --- a/Source/Core/Common/Src/MemArena.cpp +++ b/Source/Core/Common/Src/MemArena.cpp @@ -20,6 +20,7 @@ #include #endif #endif +#include #if defined(__APPLE__) static const char* ram_temp_file = "/tmp/gc_mem.tmp"; @@ -214,27 +215,7 @@ static bool Memory_TryBase(u8 *base, const MemoryView *views, int num_views, u32 bail: // Argh! ERROR! Free what we grabbed so far so we can try again. - for (int j = 0; j <= i; j++) - { - SKIP(flags, views[i].flags); - if (views[j].out_ptr_low && *views[j].out_ptr_low) - { - arena->ReleaseView(*views[j].out_ptr_low, views[j].size); - *views[j].out_ptr_low = NULL; - } - if (*views[j].out_ptr) - { -#ifdef _M_X64 - arena->ReleaseView(*views[j].out_ptr, views[j].size); -#else - if (!(views[j].flags & MV_MIRROR_PREVIOUS)) - { - arena->ReleaseView(*views[j].out_ptr, views[j].size); - } -#endif - *views[j].out_ptr = NULL; - } - } + MemoryMap_Shutdown(views, i+1, flags, arena); return false; } @@ -300,15 +281,20 @@ u8 *MemoryMap_Setup(const MemoryView *views, int num_views, u32 flags, MemArena void MemoryMap_Shutdown(const MemoryView *views, int num_views, u32 flags, MemArena *arena) { + std::set freeset; for (int i = 0; i < num_views; i++) { - SKIP(flags, views[i].flags); - if (views[i].out_ptr_low && *views[i].out_ptr_low) - arena->ReleaseView(*views[i].out_ptr_low, views[i].size); - if (*views[i].out_ptr && (views[i].out_ptr_low && *views[i].out_ptr != *views[i].out_ptr_low)) - arena->ReleaseView(*views[i].out_ptr, views[i].size); - *views[i].out_ptr = NULL; - if (views[i].out_ptr_low) - *views[i].out_ptr_low = NULL; + const MemoryView* view = &views[i]; + u8** outptrs[2] = {view->out_ptr_low, view->out_ptr}; + for (int j = 0; j < 2; j++) + { + u8** outptr = outptrs[j]; + if (outptr && *outptr && !freeset.count(*outptr)) + { + arena->ReleaseView(*outptr, view->size); + freeset.insert(*outptr); + *outptr = NULL; + } + } } } diff --git a/Source/Core/Core/Src/NetPlayServer.cpp b/Source/Core/Core/Src/NetPlayServer.cpp index 505e6a8f76..eaf02ea2c8 100644 --- a/Source/Core/Core/Src/NetPlayServer.cpp +++ b/Source/Core/Core/Src/NetPlayServer.cpp @@ -581,6 +581,8 @@ bool NetPlayServer::StopGame() std::lock_guard lks(m_crit.send); SendToClients(spac); + m_is_running = false; + return true; } diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index 30d5cd7bb3..8a7e3bf1e3 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -1049,6 +1049,7 @@ void CFrame::DoStop() DoRecordingSave(); if(Movie::IsPlayingInput() || Movie::IsRecordingInput()) Movie::EndPlayInput(false); + NetPlay::StopGame(); wxBeginBusyCursor(); BootManager::Stop(); diff --git a/Source/Core/DolphinWX/Src/NetWindow.cpp b/Source/Core/DolphinWX/Src/NetWindow.cpp index e4bc377f37..ac315025ba 100644 --- a/Source/Core/DolphinWX/Src/NetWindow.cpp +++ b/Source/Core/DolphinWX/Src/NetWindow.cpp @@ -17,6 +17,7 @@ #include #define NETPLAY_TITLEBAR "Dolphin NetPlay" +#define INITIAL_PAD_BUFFER_SIZE 20 BEGIN_EVENT_TABLE(NetPlayDiag, wxFrame) EVT_COMMAND(wxID_ANY, wxEVT_THREAD, NetPlayDiag::OnThread) @@ -246,6 +247,7 @@ void NetPlaySetupDiag::OnHost(wxCommandEvent&) m_host_port_text->GetValue().ToULong(&port); netplay_server = new NetPlayServer(u16(port)); netplay_server->ChangeGame(game); + netplay_server->AdjustPadBufferSize(INITIAL_PAD_BUFFER_SIZE); if (netplay_server->is_connected) { #ifdef USE_UPNP @@ -281,6 +283,7 @@ NetPlayDiag::NetPlayDiag(wxWindow* const parent, const CGameListCtrl* const game : wxFrame(parent, wxID_ANY, wxT(NETPLAY_TITLEBAR), wxDefaultPosition, wxDefaultSize) , m_selected_game(game) , m_game_list(game_list) + , m_start_btn(NULL) { wxPanel* const panel = new wxPanel(this); @@ -338,15 +341,13 @@ NetPlayDiag::NetPlayDiag(wxWindow* const parent, const CGameListCtrl* const game wxBoxSizer* const bottom_szr = new wxBoxSizer(wxHORIZONTAL); if (is_hosting) { - wxButton* const start_btn = new wxButton(panel, wxID_ANY, _("Start")); - start_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &NetPlayDiag::OnStart, this); - bottom_szr->Add(start_btn); - wxButton* const stop_btn = new wxButton(panel, wxID_ANY, _("Stop")); - stop_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &NetPlayDiag::OnStop, this); - bottom_szr->Add(stop_btn); + m_start_btn = new wxButton(panel, wxID_ANY, _("Start")); + m_start_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &NetPlayDiag::OnStart, this); + bottom_szr->Add(m_start_btn); + bottom_szr->Add(new wxStaticText(panel, wxID_ANY, _("Buffer:")), 0, wxLEFT | wxCENTER, 5 ); wxSpinCtrl* const padbuf_spin = new wxSpinCtrl(panel, wxID_ANY, wxT("20") - , wxDefaultPosition, wxSize(64, -1), wxSP_ARROW_KEYS, 0, 200, 20); + , wxDefaultPosition, wxSize(64, -1), wxSP_ARROW_KEYS, 0, 200, INITIAL_PAD_BUFFER_SIZE); padbuf_spin->Bind(wxEVT_COMMAND_SPINCTRL_UPDATED, &NetPlayDiag::OnAdjustBuffer, this); bottom_szr->Add(padbuf_spin, 0, wxCENTER); } @@ -428,11 +429,6 @@ void NetPlayDiag::OnStart(wxCommandEvent&) netplay_server->StartGame(FindGame()); } -void NetPlayDiag::OnStop(wxCommandEvent&) -{ - netplay_server->StopGame(); -} - void NetPlayDiag::BootGame(const std::string& filename) { main_frame->BootGame(filename); @@ -469,12 +465,16 @@ void NetPlayDiag::OnMsgStartGame() { wxCommandEvent evt(wxEVT_THREAD, NP_GUI_EVT_START_GAME); GetEventHandler()->AddPendingEvent(evt); + if (m_start_btn) + m_start_btn->Disable(); } void NetPlayDiag::OnMsgStopGame() { wxCommandEvent evt(wxEVT_THREAD, NP_GUI_EVT_STOP_GAME); GetEventHandler()->AddPendingEvent(evt); + if (m_start_btn) + m_start_btn->Enable(); } void NetPlayDiag::OnAdjustBuffer(wxCommandEvent& event) @@ -659,3 +659,11 @@ void PadMapDiag::OnAdjust(wxCommandEvent& event) for (unsigned int i=0; i<4; ++i) m_mapping[i] = m_map_cbox[i]->GetSelection() - 1; } + +void NetPlay::StopGame() +{ + if (netplay_server != NULL) + netplay_server->StopGame(); + + // TODO: allow non-hosting clients to close the window +} diff --git a/Source/Core/DolphinWX/Src/NetWindow.h b/Source/Core/DolphinWX/Src/NetWindow.h index e798033eab..75f9964e9d 100644 --- a/Source/Core/DolphinWX/Src/NetWindow.h +++ b/Source/Core/DolphinWX/Src/NetWindow.h @@ -67,7 +67,6 @@ public: Common::FifoQueue chat_msgs; void OnStart(wxCommandEvent& event); - void OnStop(wxCommandEvent& event); // implementation of NetPlayUI methods void BootGame(const std::string& filename); @@ -101,6 +100,7 @@ private: std::string m_selected_game; wxButton* m_game_btn; + wxButton* m_start_btn; std::vector m_playerids; @@ -133,5 +133,10 @@ private: int* const m_mapping; }; +namespace NetPlay +{ + void StopGame(); +} + #endif // _NETWINDOW_H_ diff --git a/Source/Core/VideoCommon/CMakeLists.txt b/Source/Core/VideoCommon/CMakeLists.txt index a4dad8293b..8503377779 100644 --- a/Source/Core/VideoCommon/CMakeLists.txt +++ b/Source/Core/VideoCommon/CMakeLists.txt @@ -33,6 +33,7 @@ set(SRCS Src/BPFunctions.cpp Src/VertexManagerBase.cpp Src/VertexShaderGen.cpp Src/VertexShaderManager.cpp + Src/VideoBackendBase.cpp Src/VideoConfig.cpp Src/VideoState.cpp Src/XFMemory.cpp diff --git a/Source/Core/VideoCommon/Src/BPStructs.cpp b/Source/Core/VideoCommon/Src/BPStructs.cpp index ce0346b523..00cecf0082 100644 --- a/Source/Core/VideoCommon/Src/BPStructs.cpp +++ b/Source/Core/VideoCommon/Src/BPStructs.cpp @@ -153,7 +153,10 @@ void BPWritten(const BPCmd& bp) bpmem.genMode.numtexgens, bpmem.genMode.numcolchans, bpmem.genMode.multisampling, bpmem.genMode.numtevstages+1, bpmem.genMode.cullmode, bpmem.genMode.numindstages, bpmem.genMode.zfreeze); - SetGenerationMode(); + + // Only call SetGenerationMode when cull mode changes. + if (bp.changes & 0xC000) + SetGenerationMode(); break; } case BPMEM_IND_MTXA: // Index Matrix Changed diff --git a/Source/Core/VideoCommon/Src/PerfQueryBase.cpp b/Source/Core/VideoCommon/Src/PerfQueryBase.cpp index c537d176f6..af8bfa72e5 100644 --- a/Source/Core/VideoCommon/Src/PerfQueryBase.cpp +++ b/Source/Core/VideoCommon/Src/PerfQueryBase.cpp @@ -1,3 +1,9 @@ #include "PerfQueryBase.h" +#include "VideoConfig.h" PerfQueryBase* g_perf_query = 0; + +bool PerfQueryBase::ShouldEmulate() const +{ + return g_ActiveConfig.bPerfQueriesEnable; +} diff --git a/Source/Core/VideoCommon/Src/PerfQueryBase.h b/Source/Core/VideoCommon/Src/PerfQueryBase.h index b979449edb..bf5474b4db 100644 --- a/Source/Core/VideoCommon/Src/PerfQueryBase.h +++ b/Source/Core/VideoCommon/Src/PerfQueryBase.h @@ -25,9 +25,12 @@ enum PerfQueryGroup class PerfQueryBase { public: - PerfQueryBase() {}; + PerfQueryBase() {} virtual ~PerfQueryBase() {} + // Checks if performance queries are enabled in the gameini configuration. + bool ShouldEmulate() const; + // Begin querying the specified value for the following host GPU commands virtual void EnableQuery(PerfQueryGroup type) {} diff --git a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp index e44e01a13b..ad090fb839 100644 --- a/Source/Core/VideoCommon/Src/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/VertexShaderGen.cpp @@ -92,8 +92,6 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ _assert_(bpmem.genMode.numtexgens == xfregs.numTexGen.numTexGens); _assert_(bpmem.genMode.numcolchans == xfregs.numChan.numColorChans); - bool is_d3d = (api_type & API_D3D9 || api_type == API_D3D11); - // uniforms if (g_ActiveConfig.backend_info.bSupportsGLSLUBO) out.Write("layout(std140) uniform VSBlock {\n"); @@ -177,19 +175,9 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ if (components & VB_HAS_NRM0) out.Write(" float3 rawnorm0 : NORMAL0,\n"); if (components & VB_HAS_NRM1) - { - if (is_d3d) - out.Write(" float3 rawnorm1 : NORMAL1,\n"); - else - out.Write(" float3 rawnorm1 : ATTR%d,\n", SHADER_NORM1_ATTRIB); - } + out.Write(" float3 rawnorm1 : NORMAL1,\n"); if (components & VB_HAS_NRM2) - { - if (is_d3d) - out.Write(" float3 rawnorm2 : NORMAL2,\n"); - else - out.Write(" float3 rawnorm2 : ATTR%d,\n", SHADER_NORM2_ATTRIB); - } + out.Write(" float3 rawnorm2 : NORMAL2,\n"); if (components & VB_HAS_COL0) out.Write(" float4 color0 : COLOR0,\n"); if (components & VB_HAS_COL1) @@ -201,12 +189,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ out.Write(" float%d tex%d : TEXCOORD%d,\n", hastexmtx ? 3 : 2, i, i); } if (components & VB_HAS_POSMTXIDX) - { - if (is_d3d) - out.Write(" float4 blend_indices : BLENDINDICES,\n"); - else - out.Write(" float fposmtx : ATTR%d,\n", SHADER_POSMTX_ATTRIB); - } + out.Write(" float4 blend_indices : BLENDINDICES,\n"); out.Write(" float4 rawpos : POSITION) {\n"); } out.Write("VS_OUTPUT o;\n"); @@ -471,7 +454,7 @@ static inline void GenerateVertexShader(T& out, u32 components, API_TYPE api_typ //write the true depth value, if the game uses depth textures pixel shaders will override with the correct values //if not early z culling will improve speed - if (is_d3d) + if (api_type & API_D3D9 || api_type == API_D3D11) { out.Write("o.pos.z = " I_DEPTHPARAMS".x * o.pos.w + o.pos.z * " I_DEPTHPARAMS".y;\n"); } diff --git a/Source/Core/Common/Src/VideoBackendBase.cpp b/Source/Core/VideoCommon/Src/VideoBackendBase.cpp similarity index 99% rename from Source/Core/Common/Src/VideoBackendBase.cpp rename to Source/Core/VideoCommon/Src/VideoBackendBase.cpp index 99bce01156..4769ede3a0 100644 --- a/Source/Core/Common/Src/VideoBackendBase.cpp +++ b/Source/Core/VideoCommon/Src/VideoBackendBase.cpp @@ -19,6 +19,8 @@ VideoBackend* g_video_backend = NULL; static VideoBackend* s_default_backend = NULL; #ifdef _WIN32 +#include + // http://msdn.microsoft.com/en-us/library/ms725491.aspx static bool IsGteVista() { diff --git a/Source/Core/Common/Src/VideoBackendBase.h b/Source/Core/VideoCommon/Src/VideoBackendBase.h similarity index 100% rename from Source/Core/Common/Src/VideoBackendBase.h rename to Source/Core/VideoCommon/Src/VideoBackendBase.h diff --git a/Source/Core/VideoCommon/Src/VideoConfig.cpp b/Source/Core/VideoCommon/Src/VideoConfig.cpp index e8c87774d4..b05f964891 100644 --- a/Source/Core/VideoCommon/Src/VideoConfig.cpp +++ b/Source/Core/VideoCommon/Src/VideoConfig.cpp @@ -182,6 +182,7 @@ void VideoConfig::GameIniLoad(const char *ini_file) iniFile.GetIfExists("Video", "PH_ZFar", &sPhackvalue[1]); iniFile.GetIfExists("Video", "ZTPSpeedupHack", &bZTPSpeedHack); iniFile.GetIfExists("Video", "UseBBox", &bUseBBox); + iniFile.GetIfExists("Video", "PerfQueriesEnable", &bPerfQueriesEnable); } void VideoConfig::VerifyValidity() diff --git a/Source/Core/VideoCommon/Src/VideoConfig.h b/Source/Core/VideoCommon/Src/VideoConfig.h index dff1beb77f..c1b0c87c72 100644 --- a/Source/Core/VideoCommon/Src/VideoConfig.h +++ b/Source/Core/VideoCommon/Src/VideoConfig.h @@ -108,6 +108,7 @@ struct VideoConfig // Hacks bool bEFBAccessEnable; bool bDlistCachingEnable; + bool bPerfQueriesEnable; bool bEFBCopyEnable; bool bEFBCopyCacheEnable; diff --git a/Source/Core/VideoCommon/VideoCommon.vcxproj b/Source/Core/VideoCommon/VideoCommon.vcxproj index 1e7a56f578..c5896af1a6 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcxproj +++ b/Source/Core/VideoCommon/VideoCommon.vcxproj @@ -213,6 +213,7 @@ + @@ -266,6 +267,7 @@ + diff --git a/Source/Core/VideoCommon/VideoCommon.vcxproj.filters b/Source/Core/VideoCommon/VideoCommon.vcxproj.filters index 785e55877f..3f864b0e7e 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcxproj.filters +++ b/Source/Core/VideoCommon/VideoCommon.vcxproj.filters @@ -4,6 +4,7 @@ + Vertex Loading @@ -128,6 +129,7 @@ + Vertex Loading diff --git a/Source/Plugins/Plugin_VideoDX11/Src/D3DBase.cpp b/Source/Plugins/Plugin_VideoDX11/Src/D3DBase.cpp index c786c16e17..8ea7e88e3e 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/D3DBase.cpp +++ b/Source/Plugins/Plugin_VideoDX11/Src/D3DBase.cpp @@ -333,11 +333,7 @@ HRESULT Create(HWND wnd) swap_chain_desc.BufferDesc.Width = xres; swap_chain_desc.BufferDesc.Height = yres; -#if defined(_DEBUG) || defined(DEBUGFAST) - D3D11_CREATE_DEVICE_FLAG device_flags = (D3D11_CREATE_DEVICE_FLAG)(D3D11_CREATE_DEVICE_DEBUG|D3D11_CREATE_DEVICE_SINGLETHREADED); -#else D3D11_CREATE_DEVICE_FLAG device_flags = D3D11_CREATE_DEVICE_SINGLETHREADED; -#endif hr = PD3D11CreateDeviceAndSwapChain(adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, device_flags, supported_feature_levels, NUM_SUPPORTED_FEATURE_LEVELS, D3D11_SDK_VERSION, &swap_chain_desc, &swapchain, &device, diff --git a/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp b/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp index c634593361..3ba5e098ef 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp +++ b/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp @@ -28,6 +28,9 @@ PerfQuery::~PerfQuery() void PerfQuery::EnableQuery(PerfQueryGroup type) { + if (!ShouldEmulate()) + return; + // Is this sane? if (m_query_count > ARRAYSIZE(m_query_buffer) / 2) WeakFlush(); @@ -53,6 +56,9 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) void PerfQuery::DisableQuery(PerfQueryGroup type) { + if (!ShouldEmulate()) + return; + // stop query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { @@ -69,6 +75,9 @@ void PerfQuery::ResetQuery() u32 PerfQuery::GetQueryResult(PerfQueryType type) { + if (!ShouldEmulate()) + return 0; + u32 result = 0; if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC) @@ -93,6 +102,9 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type) void PerfQuery::FlushOne() { + if (!ShouldEmulate()) + return; + auto& entry = m_query_buffer[m_query_read_pos]; UINT64 result = 0; @@ -113,12 +125,18 @@ void PerfQuery::FlushOne() // TODO: could selectively flush things, but I don't think that will do much void PerfQuery::FlushResults() { + if (!ShouldEmulate()) + return; + while (!IsFlushed()) FlushOne(); } void PerfQuery::WeakFlush() { + if (!ShouldEmulate()) + return; + while (!IsFlushed()) { auto& entry = m_query_buffer[m_query_read_pos]; @@ -143,6 +161,9 @@ void PerfQuery::WeakFlush() bool PerfQuery::IsFlushed() const { + if (!ShouldEmulate()) + return true; + return 0 == m_query_count; } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp b/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp index 31d2af6107..a1582c0c62 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp @@ -23,6 +23,9 @@ PerfQuery::~PerfQuery() void PerfQuery::EnableQuery(PerfQueryGroup type) { + if (!ShouldEmulate()) + return; + // Is this sane? if (m_query_count > ARRAYSIZE(m_query_buffer) / 2) WeakFlush(); @@ -47,6 +50,9 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) void PerfQuery::DisableQuery(PerfQueryGroup type) { + if (!ShouldEmulate()) + return; + // stop query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { @@ -56,11 +62,17 @@ void PerfQuery::DisableQuery(PerfQueryGroup type) bool PerfQuery::IsFlushed() const { + if (!ShouldEmulate()) + return true; + return 0 == m_query_count; } void PerfQuery::FlushOne() { + if (!ShouldEmulate()) + return; + auto& entry = m_query_buffer[m_query_read_pos]; GLuint result = 0; @@ -76,12 +88,18 @@ void PerfQuery::FlushOne() // TODO: could selectively flush things, but I don't think that will do much void PerfQuery::FlushResults() { + if (!ShouldEmulate()) + return; + while (!IsFlushed()) FlushOne(); } void PerfQuery::WeakFlush() { + if (!ShouldEmulate()) + return; + while (!IsFlushed()) { auto& entry = m_query_buffer[m_query_read_pos]; @@ -108,6 +126,9 @@ void PerfQuery::ResetQuery() u32 PerfQuery::GetQueryResult(PerfQueryType type) { + if (!ShouldEmulate()) + return 0; + u32 result = 0; if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC)